Lines Matching +full:tp +full:- +full:sensitive +full:- +full:adjust
1 //===--- ItaniumMangle.cpp - Itanium C++ Name Mangling ----------*- C++ -*-===//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
11 // ABI-compatible with GCC):
13 // http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling
15 //===----------------------------------------------------------------------===//
51 if (const FunctionTemplateDecl *ftd = fn->getPrimaryTemplate()) in getStructor()
52 return ftd->getTemplatedDecl(); in getStructor()
67 return Record->isLambda(); in isLambda()
146 if (Tag->getName().empty() && !Tag->getTypedefNameForAnonDecl()) in getNextDiscriminator()
151 if (ND->isExternallyVisible()) { in getNextDiscriminator()
155 disc = discriminator - 2; in getNextDiscriminator()
163 discriminator = ++Discriminator[std::make_pair(DC, ND->getIdentifier())]; in getNextDiscriminator()
167 disc = discriminator-2; in getNextDiscriminator()
174 assert(Lambda->isLambda() && "RD must be a lambda!"); in getLambdaString()
176 Decl *LambdaContextDecl = Lambda->getLambdaContextDecl(); in getLambdaString()
177 unsigned LambdaManglingNumber = Lambda->getLambdaManglingNumber(); in getLambdaString()
181 Parm ? dyn_cast<FunctionDecl>(Parm->getDeclContext()) : nullptr; in getLambdaString()
185 Func->getNumParams() - Parm->getFunctionScopeIndex(); in getLambdaString()
220 /// Normalize integer types for cross-language CFI support with other
231 /// The "structor" is the top-level declaration being mangled, if
308 ND = cast<NamedDecl>(ND->getCanonicalDecl()); in write()
314 if (const auto *AbiTag = NS->getAttr<AbiTagAttr>()) { in write()
315 UsedAbiTags.insert(UsedAbiTags.end(), AbiTag->tags().begin(), in write()
316 AbiTag->tags().end()); in write()
324 if (const auto *AbiTag = ND->getAttr<AbiTagAttr>()) { in write()
325 UsedAbiTags.insert(UsedAbiTags.end(), AbiTag->tags().begin(), in write()
326 AbiTag->tags().end()); in write()
327 TagList.insert(TagList.end(), AbiTag->tags().begin(), in write()
328 AbiTag->tags().end()); in write()
332 UsedAbiTags.insert(UsedAbiTags.end(), AdditionalAbiTags->begin(), in write()
333 AdditionalAbiTags->end()); in write()
334 TagList.insert(TagList.end(), AdditionalAbiTags->begin(), in write()
335 AdditionalAbiTags->end()); in write()
373 Parent->UsedAbiTags.insert(Parent->UsedAbiTags.end(), in pop()
375 Parent->EmittedAbiTags.insert(Parent->EmittedAbiTags.end(), in pop()
485 ND = cast<NamedDecl>(ND->getCanonicalDecl()); in addSubstitution()
517 mangleUnqualifiedName(GD, cast<NamedDecl>(GD.getDecl())->getDeclName(), DC, in mangleUnqualifiedName()
646 StdNamespace->setImplicit(); in getStdNamespace()
662 if (RD->isLambda()) in getEffectiveDeclContext()
664 dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl())) in getEffectiveDeclContext()
665 return ContextParam->getDeclContext(); in getEffectiveDeclContext()
671 dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) in getEffectiveDeclContext()
672 return ContextParam->getDeclContext(); in getEffectiveDeclContext()
679 // mangling in order for -fsanitize=cfi-icall to work. in getEffectiveDeclContext()
686 const DeclContext *DC = D->getDeclContext(); in getEffectiveDeclContext()
693 if (VD->isExternC()) in getEffectiveDeclContext()
697 if (FD->isExternC()) in getEffectiveDeclContext()
699 // Member-like constrained friends are mangled as if they were members of in getEffectiveDeclContext()
701 if (FD->isMemberLikeConstrainedFriend() && in getEffectiveDeclContext()
704 return D->getLexicalDeclContext()->getRedeclContext(); in getEffectiveDeclContext()
707 return DC->getRedeclContext(); in getEffectiveDeclContext()
711 if (ND && ND->getFormalLinkage() == Linkage::Internal && in isInternalLinkageDecl()
712 !ND->isExternallyVisible() && in isInternalLinkageDecl()
713 getEffectiveDeclContext(ND)->isFileContext() && in isInternalLinkageDecl()
714 !ND->isInAnonymousNamespace()) in isInternalLinkageDecl()
731 if (!FD->getType()->getAs<FunctionProtoType>()) in isUniqueInternalLinkageDecl()
742 LanguageLinkage L = FD->getLanguageLinkage(); in shouldMangleCXXName()
744 if (FD->hasAttr<OverloadableAttr>()) in shouldMangleCXXName()
748 if (FD->isMain()) in shouldMangleCXXName()
752 // user-defined entry points regardless of visibility or freestanding-ness. in shouldMangleCXXName()
756 // user-defined entry points are outside of the purview of the standard. in shouldMangleCXXName()
760 if (FD->isMSVCRTEntryPoint()) in shouldMangleCXXName()
765 if (!FD->getDeclName().isIdentifier() || L == CXXLanguageLinkage) in shouldMangleCXXName()
783 if (VD->isExternC()) in shouldMangleCXXName()
790 if (DC->isFunctionOrMethod() && D->hasLinkage()) in shouldMangleCXXName()
791 while (!DC->isFileContext()) in shouldMangleCXXName()
793 if (DC->isTranslationUnit() && D->getFormalLinkage() != Linkage::Internal && in shouldMangleCXXName()
796 !VD->getOwningModuleForLinkage()) in shouldMangleCXXName()
806 AbiTags->write(Out, ND, DisableDerivedAbiTags ? nullptr : AdditionalAbiTags); in writeAbiTags()
811 mangleSourceName(ND->getIdentifier()); in mangleSourceNameWithAbiTags()
816 // <mangled-name> ::= _Z <encoding> in mangle()
818 // ::= <special-name> in mangle()
827 mangleName(IFD->getAnonField()); in mangle()
834 // <encoding> ::= <function name> <bare-function-type> in mangleFunctionEncoding()
899 if (FD->hasAttr<EnableIfAttr>()) { in mangleFunctionEncodingBareType()
902 for (AttrVec::const_iterator I = FD->getAttrs().begin(), in mangleFunctionEncodingBareType()
903 E = FD->getAttrs().end(); in mangleFunctionEncodingBareType()
909 // Prior to Clang 12, we hardcoded the X/E around enable-if's argument, in mangleFunctionEncodingBareType()
910 // even though <template-arg> should not include an X/E around in mangleFunctionEncodingBareType()
911 // <expr-primary>. in mangleFunctionEncodingBareType()
913 mangleExpression(EIA->getCond()); in mangleFunctionEncodingBareType()
916 mangleTemplateArgExpr(EIA->getCond()); in mangleFunctionEncodingBareType()
926 if (auto Inherited = CD->getInheritedConstructor()) in mangleFunctionEncodingBareType()
938 // 3. Non-template function names do not have return types encoded. in mangleFunctionEncodingBareType()
946 if (FunctionTemplateDecl *PrimaryTemplate = FD->getPrimaryTemplate()) { in mangleFunctionEncodingBareType()
952 FD = PrimaryTemplate->getTemplatedDecl(); in mangleFunctionEncodingBareType()
955 mangleBareFunctionType(FD->getType()->castAs<FunctionProtoType>(), in mangleFunctionEncodingBareType()
961 if (!Context.getEffectiveParentContext(NS)->isTranslationUnit()) in isStd()
964 const IdentifierInfo *II = NS->getFirstDecl()->getIdentifier(); in isStd()
965 return II && II->isStr("std"); in isStd()
968 // isStdNamespace - Return whether a given decl context is a toplevel 'std'
971 if (!DC->isNamespace()) in isStdNamespace()
982 if (const TemplateDecl *TD = FD->getPrimaryTemplate()) { in isTemplate()
983 TemplateArgs = FD->getTemplateSpecializationArgs(); in isTemplate()
991 TemplateArgs = &Spec->getTemplateArgs(); in isTemplate()
992 return GD.getWithDecl(Spec->getSpecializedTemplate()); in isTemplate()
998 TemplateArgs = &Spec->getTemplateArgs(); in isTemplate()
999 return GD.getWithDecl(Spec->getSpecializedTemplate()); in isTemplate()
1046 while (!DC->isNamespace() && !DC->isTranslationUnit()) { in GetLocalClassDecl()
1058 // <name> ::= [<module-name>] <nested-name> in mangleNameWithAbiTags()
1059 // ::= [<module-name>] <unscoped-name> in mangleNameWithAbiTags()
1060 // ::= [<module-name>] <unscoped-template-name> <template-args> in mangleNameWithAbiTags()
1061 // ::= <local-name> in mangleNameWithAbiTags()
1070 if (isLocalContainerContext(DC) && ND->hasLinkage() && !IsLambda) in mangleNameWithAbiTags()
1071 while (!DC->isNamespace() && !DC->isTranslationUnit()) in mangleNameWithAbiTags()
1081 // Closures can require a nested-name mangling even if they're semantically in mangleNameWithAbiTags()
1093 if (DC->isTranslationUnit() || isStdNamespace(DC)) { in mangleNameWithAbiTags()
1110 if (ND->isExternallyVisible()) in mangleModuleName()
1111 if (Module *M = ND->getOwningModuleForLinkage()) in mangleModuleName()
1112 mangleModuleNamePrefix(M->getPrimaryModuleInterfaceName()); in mangleModuleName()
1115 // <module-name> ::= <module-subname>
1116 // ::= <module-name> <module-subname>
1118 // <module-subname> ::= W <source-name>
1119 // ::= W P <source-name>
1121 // <substitution> ::= S <seq-id> _ in mangleModuleNamePrefix()
1125 mangleSeqID(It->second); in mangleModuleNamePrefix()
1150 if (DC->isTranslationUnit() || isStdNamespace(DC)) { in mangleTemplateName()
1160 // <unscoped-name> ::= <unqualified-name> in mangleUnscopedName()
1161 // ::= St <unqualified-name> # ::std:: in mangleUnscopedName()
1173 // <unscoped-template-name> ::= <unscoped-name> in mangleUnscopedTemplateName()
1178 // <template-template-param> ::= <template-param> in mangleUnscopedTemplateName()
1182 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex()); in mangleUnscopedTemplateName()
1186 mangleUnscopedName(GD.getWithDecl(ND->getTemplatedDecl()), DC, in mangleUnscopedTemplateName()
1195 // Floating-point literals are encoded using a fixed-length in mangleFloat()
1197 // representation (IEEE on Itanium), high-order bytes first, in mangleFloat()
1198 // without leading zeroes. For example: "Lf bf800000 E" is -1.0f in mangleFloat()
1201 // mistake; see the discussion on cxx-abi-dev beginning on in mangleFloat()
1202 // 2012-01-16. in mangleFloat()
1205 // using a custom algorithm instead of post-processing APInt::toString(). in mangleFloat()
1214 // Fill the buffer left-to-right. in mangleFloat()
1216 // The bit-index of the next hex digit. in mangleFloat()
1217 unsigned digitBitIndex = 4 * (numCharacters - stringIndex - 1); in mangleFloat()
1250 // <expr-primary> ::= L <type> 0 E in mangleNullPointer()
1266 // <number> ::= [n] <non-negative decimal integer> in mangleNumber()
1269 Number = -Number; in mangleNumber()
1276 // <call-offset> ::= h <nv-offset> _ in mangleCallOffset()
1277 // ::= v <v-offset> _ in mangleCallOffset()
1278 // <nv-offset> ::= <offset number> # non-virtual base override in mangleCallOffset()
1279 // <v-offset> ::= <offset number> _ <virtual offset number> in mangleCallOffset()
1296 if (const auto *TST = type->getAs<TemplateSpecializationType>()) { in manglePrefix()
1298 mangleTemplatePrefix(TST->getTemplateName()); in manglePrefix()
1303 mangleTemplateArgs(TST->getTemplateName(), TST->template_arguments()); in manglePrefix()
1307 type->getAs<DependentTemplateSpecializationType>()) { in manglePrefix()
1310 DTST->getQualifier(), DTST->getIdentifier()); in manglePrefix()
1316 mangleTemplateArgs(Template, DTST->template_arguments()); in manglePrefix()
1326 /// Mangle everything prior to the base-unresolved-name in an unresolved-name.
1328 /// \param recursive - true if this is being called recursively,
1334 // <unresolved-name> ::= [gs] <base-unresolved-name> in mangleUnresolvedPrefix()
1337 // <unresolved-name> ::= sr <unresolved-type> <base-unresolved-name> in mangleUnresolvedPrefix()
1340 // <unresolved-name> ::= srN <unresolved-type> <unresolved-qualifier-level>+ E in mangleUnresolvedPrefix()
1341 // <base-unresolved-name> in mangleUnresolvedPrefix()
1344 // <unresolved-name> ::= [gs] sr <unresolved-qualifier-level>+ E in mangleUnresolvedPrefix()
1345 // <base-unresolved-name> in mangleUnresolvedPrefix()
1347 switch (qualifier->getKind()) { in mangleUnresolvedPrefix()
1362 if (qualifier->getPrefix()) in mangleUnresolvedPrefix()
1363 mangleUnresolvedPrefix(qualifier->getPrefix(), in mangleUnresolvedPrefix()
1367 mangleSourceNameWithAbiTags(qualifier->getAsNamespace()); in mangleUnresolvedPrefix()
1370 if (qualifier->getPrefix()) in mangleUnresolvedPrefix()
1371 mangleUnresolvedPrefix(qualifier->getPrefix(), in mangleUnresolvedPrefix()
1375 mangleSourceNameWithAbiTags(qualifier->getAsNamespaceAlias()); in mangleUnresolvedPrefix()
1380 const Type *type = qualifier->getAsType(); in mangleUnresolvedPrefix()
1382 // We only want to use an unresolved-type encoding if this is one of: in mangleUnresolvedPrefix()
1383 // - a decltype in mangleUnresolvedPrefix()
1384 // - a template type parameter in mangleUnresolvedPrefix()
1385 // - a template template parameter with arguments in mangleUnresolvedPrefix()
1387 if (qualifier->getPrefix()) { in mangleUnresolvedPrefix()
1388 mangleUnresolvedPrefix(qualifier->getPrefix(), in mangleUnresolvedPrefix()
1403 if (qualifier->getPrefix()) in mangleUnresolvedPrefix()
1404 mangleUnresolvedPrefix(qualifier->getPrefix(), in mangleUnresolvedPrefix()
1409 mangleSourceName(qualifier->getAsIdentifier()); in mangleUnresolvedPrefix()
1420 /// Mangle an unresolved-name, which is generally used for names which
1428 // <base-unresolved-name> ::= <simple-id> in mangleUnresolvedName()
1432 // <base-unresolved-name> ::= dn <destructor-name> in mangleUnresolvedName()
1437 // <base-unresolved-name> ::= on <operator-name> in mangleUnresolvedName()
1453 llvm_unreachable("Can't mangle Objective-C selector names here!"); in mangleUnresolvedName()
1456 // The <simple-id> and on <operator-name> productions end in an optional in mangleUnresolvedName()
1457 // <template-args>. in mangleUnresolvedName()
1466 // <unqualified-name> ::= [<module-name>] [F] <operator-name> in mangleUnqualifiedName()
1467 // ::= <ctor-dtor-name> in mangleUnqualifiedName()
1468 // ::= [<module-name>] [F] <source-name> in mangleUnqualifiedName()
1469 // ::= [<module-name>] DC <source-name>* E in mangleUnqualifiedName()
1471 if (ND && DC && DC->isFileContext()) in mangleUnqualifiedName()
1474 // A member-like constrained friend is mangled with a leading 'F'. in mangleUnqualifiedName()
1475 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/24. in mangleUnqualifiedName()
1478 if ((FD && FD->isMemberLikeConstrainedFriend()) || in mangleUnqualifiedName()
1479 (FTD && FTD->getTemplatedDecl()->isMemberLikeConstrainedFriend())) { in mangleUnqualifiedName()
1491 // FIXME: Non-standard mangling for decomposition declarations: in mangleUnqualifiedName()
1493 // <unqualified-name> ::= DC <source-name>* E in mangleUnqualifiedName()
1495 // Proposed on cxx-abi-dev on 2016-08-12 in mangleUnqualifiedName()
1497 for (auto *BD : DD->bindings()) in mangleUnqualifiedName()
1498 mangleSourceName(BD->getDeclName().getAsIdentifierInfo()); in mangleUnqualifiedName()
1515 // Proposed in https://github.com/itanium-cxx-abi/cxx-abi/issues/63. in mangleUnqualifiedName()
1517 mangleValueInTemplateArg(TPO->getType().getUnqualifiedType(), in mangleUnqualifiedName()
1518 TPO->getValue(), /*TopLevel=*/true); in mangleUnqualifiedName()
1540 FD->getType()->castAs<FunctionType>()->getCallConv() == in mangleUnqualifiedName()
1543 FD && FD->hasAttr<CUDAGlobalAttr>() && in mangleUnqualifiedName()
1560 if (NS->isAnonymousNamespace()) { in mangleUnqualifiedName()
1569 const RecordDecl *RD = VD->getType()->castAs<RecordType>()->getDecl(); in mangleUnqualifiedName()
1575 // pre-order, depth-first, declaration-order walk of the data members of in mangleUnqualifiedName()
1580 assert(RD->isAnonymousStructOrUnion() in mangleUnqualifiedName()
1582 const FieldDecl *FD = RD->findFirstNamedDataMember(); in mangleUnqualifiedName()
1588 assert(FD->getIdentifier() && "Data member name isn't an identifier!"); in mangleUnqualifiedName()
1590 mangleSourceName(FD->getIdentifier()); in mangleUnqualifiedName()
1606 if (const TypedefNameDecl *D = TD->getTypedefNameForAnonDecl()) { in mangleUnqualifiedName()
1607 assert(TD->getDeclContext() == D->getDeclContext() && in mangleUnqualifiedName()
1609 assert(D->getDeclName().getAsIdentifierInfo() && in mangleUnqualifiedName()
1611 mangleSourceName(D->getDeclName().getAsIdentifierInfo()); in mangleUnqualifiedName()
1619 // <unnamed-type-name> ::= <closure-type-name> in mangleUnqualifiedName()
1621 // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ in mangleUnqualifiedName()
1622 // <lambda-sig> ::= <template-param-decl>* <parameter-type>+ in mangleUnqualifiedName()
1628 // If we have a device-number via the discriminator, use that to mangle in mangleUnqualifiedName()
1629 // the lambda, otherwise use the typical lambda-mangling-number. In either in mangleUnqualifiedName()
1632 if (Record->isLambda() && in mangleUnqualifiedName()
1634 (!DeviceNumber && Record->getLambdaManglingNumber() > 0))) { in mangleUnqualifiedName()
1642 if (TD->isExternallyVisible()) { in mangleUnqualifiedName()
1647 Out << UnnamedMangle - 2; in mangleUnqualifiedName()
1674 llvm_unreachable("Can't mangle Objective-C selector names here!"); in mangleUnqualifiedName()
1681 cast<CXXConstructorDecl>(ND)->getInheritedConstructor()) { in mangleUnqualifiedName()
1682 InheritedFrom = Inherited.getConstructor()->getParent(); in mangleUnqualifiedName()
1684 TemplateName(Inherited.getConstructor()->getPrimaryTemplate()); in mangleUnqualifiedName()
1686 Inherited.getConstructor()->getTemplateSpecializationArgs(); in mangleUnqualifiedName()
1699 // nested-name, but it's more convenient to mangle them here. in mangleUnqualifiedName()
1722 Arity = cast<FunctionDecl>(ND)->getNumParams(); in mangleUnqualifiedName()
1726 if (MD->isImplicitObjectMemberFunction()) in mangleUnqualifiedName()
1745 // <source-name> ::= <positive length number> __regcall3__ <identifier> in mangleRegCallName()
1746 // <number> ::= [n] <non-negative decimal integer> in mangleRegCallName()
1749 Out << II->getLength() + sizeof("__regcall4__") - 1 << "__regcall4__" in mangleRegCallName()
1750 << II->getName(); in mangleRegCallName()
1752 Out << II->getLength() + sizeof("__regcall3__") - 1 << "__regcall3__" in mangleRegCallName()
1753 << II->getName(); in mangleRegCallName()
1757 // <source-name> ::= <positive length number> __device_stub__ <identifier> in mangleDeviceStubName()
1758 // <number> ::= [n] <non-negative decimal integer> in mangleDeviceStubName()
1760 Out << II->getLength() + sizeof("__device_stub__") - 1 << "__device_stub__" in mangleDeviceStubName()
1761 << II->getName(); in mangleDeviceStubName()
1765 // <source-name> ::= <positive length number> <identifier> in mangleSourceName()
1766 // <number> ::= [n] <non-negative decimal integer> in mangleSourceName()
1768 Out << II->getLength() << II->getName(); in mangleSourceName()
1776 // <nested-name> in mangleNestedName()
1777 // ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E in mangleNestedName()
1778 // ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> in mangleNestedName()
1779 // <template-args> E in mangleNestedName()
1783 Qualifiers MethodQuals = Method->getMethodQualifiers(); in mangleNestedName()
1786 if (Method->isExplicitObjectMemberFunction()) in mangleNestedName()
1790 mangleRefQualifier(Method->getRefQualifier()); in mangleNestedName()
1807 // <nested-name> ::= N [<CV-qualifiers>] <template-prefix> <template-args> E in mangleNestedName()
1820 // A <closure-prefix> represents a variable or field, not a regular in mangleNestedNameWithClosurePrefix()
1822 // limited form of <nested-name>: in mangleNestedNameWithClosurePrefix()
1824 // <nested-name> ::= N <closure-prefix> <closure-type-name> E in mangleNestedNameWithClosurePrefix()
1852 // <local-name> := Z <function encoding> E <entity name> [<discriminator>] in mangleLocalName()
1854 // <local-name> := Z <function encoding> E d [ <parameter number> ] in mangleLocalName()
1856 // <discriminator> := _ <non-negative number> in mangleLocalName()
1885 // second-to-last parameter, 1 for the third-to-last parameter, etc. The in mangleLocalName()
1886 // <entity name> will of course contain a <closure-type-name>: Its in mangleLocalName()
1888 // -- other default arguments do not affect its encoding. in mangleLocalName()
1890 if (CXXRD && CXXRD->isLambda()) { in mangleLocalName()
1892 = dyn_cast_or_null<ParmVarDecl>(CXXRD->getLambdaContextDecl())) { in mangleLocalName()
1894 = dyn_cast<FunctionDecl>(Parm->getDeclContext())) { in mangleLocalName()
1896 unsigned Num = Func->getNumParams() - Parm->getFunctionScopeIndex(); in mangleLocalName()
1898 mangleNumber(Num - 2); in mangleLocalName()
1924 = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) { in mangleLocalName()
1926 = dyn_cast<FunctionDecl>(Parm->getDeclContext())) { in mangleLocalName()
1928 unsigned Num = Func->getNumParams() - Parm->getFunctionScopeIndex(); in mangleLocalName()
1930 mangleNumber(Num - 2); in mangleLocalName()
1970 // When trying to be ABI-compatibility with clang 12 and before, mangle a in mangleUnqualifiedBlock()
1971 // <data-member-prefix> now, with no substitutions and no <template-args>. in mangleUnqualifiedBlock()
1972 if (Decl *Context = Block->getBlockManglingContextDecl()) { in mangleUnqualifiedBlock()
1975 Context->getDeclContext()->isRecord()) { in mangleUnqualifiedBlock()
1977 if (ND->getIdentifier()) { in mangleUnqualifiedBlock()
1985 unsigned Number = Block->getBlockManglingNumber(); in mangleUnqualifiedBlock()
1991 // Stored mangling numbers are 1-based. in mangleUnqualifiedBlock()
1992 --Number; in mangleUnqualifiedBlock()
1996 Out << Number - 1; in mangleUnqualifiedBlock()
2000 // <template-param-decl>
2002 // ::= Tk <concept name> [<template-args>] # constrained type parameter
2003 // ::= Tn <type> # template non-type parameter
2004 // ::= Tt <template-param-decl>* E [Q <requires-clause expr>]
2006 // ::= Tp <template-param-decl> # template parameter pack
2008 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/47. in mangleTemplateParamDecl()
2010 if (Ty->isParameterPack()) in mangleTemplateParamDecl()
2011 Out << "Tp"; in mangleTemplateParamDecl()
2012 const TypeConstraint *Constraint = Ty->getTypeConstraint(); in mangleTemplateParamDecl()
2014 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/24. in mangleTemplateParamDecl()
2021 if (Tn->isExpandedParameterPack()) { in mangleTemplateParamDecl()
2022 for (unsigned I = 0, N = Tn->getNumExpansionTypes(); I != N; ++I) { in mangleTemplateParamDecl()
2024 mangleType(Tn->getExpansionType(I)); in mangleTemplateParamDecl()
2027 QualType T = Tn->getType(); in mangleTemplateParamDecl()
2028 if (Tn->isParameterPack()) { in mangleTemplateParamDecl()
2029 Out << "Tp"; in mangleTemplateParamDecl()
2030 if (auto *PackExpansion = T->getAs<PackExpansionType>()) in mangleTemplateParamDecl()
2031 T = PackExpansion->getPattern(); in mangleTemplateParamDecl()
2037 if (Tt->isExpandedParameterPack()) { in mangleTemplateParamDecl()
2038 for (unsigned I = 0, N = Tt->getNumExpansionTemplateParameters(); I != N; in mangleTemplateParamDecl()
2040 mangleTemplateParameterList(Tt->getExpansionTemplateParameters(I)); in mangleTemplateParamDecl()
2042 if (Tt->isParameterPack()) in mangleTemplateParamDecl()
2043 Out << "Tp"; in mangleTemplateParamDecl()
2044 mangleTemplateParameterList(Tt->getTemplateParameters()); in mangleTemplateParamDecl()
2054 mangleRequiresClause(Params->getRequiresClause()); in mangleTemplateParameterList()
2063 else if (DC->isTranslationUnit() || isStdNamespace(DC)) in mangleTypeConstraint()
2071 if (Constraint->getTemplateArgsAsWritten()) { in mangleTypeConstraint()
2073 Constraint->getTemplateArgsAsWritten()->arguments()) in mangleTypeConstraint()
2076 return mangleTypeConstraint(Constraint->getNamedConcept(), Args); in mangleTypeConstraint()
2080 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/24. in mangleRequiresClause()
2088 // When trying to be ABI-compatibility with clang 12 and before, mangle a in mangleLambda()
2089 // <data-member-prefix> now, with no substitutions. in mangleLambda()
2090 if (Decl *Context = Lambda->getLambdaContextDecl()) { in mangleLambda()
2095 = cast<NamedDecl>(Context)->getIdentifier()) { in mangleLambda()
2110 // <lambda-sig> in a given context; it is n-2 for the nth closure type in mangleLambda()
2111 // (in lexical order) with that same <lambda-sig> and context. in mangleLambda()
2115 // In CUDA/HIP, to ensure the consistent lamba numbering between the device- in mangleLambda()
2116 // and host-side compilations, an extra device mangle context may be created in mangleLambda()
2117 // if the host-side CXX ABI has different numbering for lambda. In such case, in mangleLambda()
2118 // if the mangle context is that device-side one, use the device-side lambda in mangleLambda()
2123 DeviceNumber ? *DeviceNumber : Lambda->getLambdaManglingNumber(); in mangleLambda()
2127 mangleNumber(Number - 2); in mangleLambda()
2132 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/31. in mangleLambdaSig()
2133 for (auto *D : Lambda->getLambdaExplicitTemplateParameters()) in mangleLambdaSig()
2136 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/24. in mangleLambdaSig()
2137 if (auto *TPL = Lambda->getGenericLambdaTemplateParameterList()) in mangleLambdaSig()
2138 mangleRequiresClause(TPL->getRequiresClause()); in mangleLambdaSig()
2141 Lambda->getLambdaTypeInfo()->getType()->castAs<FunctionProtoType>(); in mangleLambdaSig()
2143 Lambda->getLambdaStaticInvoker()); in mangleLambdaSig()
2147 switch (qualifier->getKind()) { in manglePrefix()
2156 mangleName(qualifier->getAsNamespace()); in manglePrefix()
2160 mangleName(qualifier->getAsNamespaceAlias()->getNamespace()); in manglePrefix()
2165 manglePrefix(QualType(qualifier->getAsType(), 0)); in manglePrefix()
2176 assert(qualifier->getPrefix()); in manglePrefix()
2177 manglePrefix(qualifier->getPrefix()); in manglePrefix()
2179 mangleSourceName(qualifier->getAsIdentifier()); in manglePrefix()
2190 // <prefix> ::= <prefix> <unqualified-name> in manglePrefix()
2191 // ::= <template-prefix> <template-args> in manglePrefix()
2192 // ::= <closure-prefix> in manglePrefix()
2193 // ::= <template-param> in manglePrefix()
2199 if (DC->isTranslationUnit()) in manglePrefix()
2209 // Check if we have a template-prefix or a closure-prefix. in manglePrefix()
2227 // <template-prefix> ::= <prefix> <template unqualified-name> in mangleTemplatePrefix()
2228 // ::= <template-param> in mangleTemplatePrefix()
2242 if (NestedNameSpecifier *Qualifier = Dependent->getQualifier()) in mangleTemplatePrefix()
2248 if (const IdentifierInfo *Id = Dependent->getIdentifier()) in mangleTemplatePrefix()
2251 mangleOperatorName(Dependent->getOperator(), UnknownArity); in mangleTemplatePrefix()
2259 // <template-prefix> ::= <prefix> <template unqualified-name> in mangleTemplatePrefix()
2260 // ::= <template-param> in mangleTemplatePrefix()
2262 // <template-template-param> ::= <template-param> in mangleTemplatePrefix()
2268 // <template-template-param> ::= <template-param> in mangleTemplatePrefix()
2270 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex()); in mangleTemplatePrefix()
2277 mangleUnqualifiedName(GD.getWithDecl(ND->getTemplatedDecl()), DC, in mangleTemplatePrefix()
2290 Context = dyn_cast_or_null<NamedDecl>(Block->getBlockManglingContextDecl()); in getClosurePrefix()
2292 if (RD->isLambda()) in getClosurePrefix()
2293 Context = dyn_cast_or_null<NamedDecl>(RD->getLambdaContextDecl()); in getClosurePrefix()
2298 // Only lambdas within the initializer of a non-local variable or non-static in getClosurePrefix()
2299 // data member get a <closure-prefix>. in getClosurePrefix()
2300 if ((isa<VarDecl>(Context) && cast<VarDecl>(Context)->hasGlobalStorage()) || in getClosurePrefix()
2308 // <closure-prefix> ::= [ <prefix> ] <unqualified-name> M in mangleClosurePrefix()
2309 // ::= <template-prefix> <template-args> M in mangleClosurePrefix()
2330 /// <type> ::= <class-enum-type>
2331 /// ::= <template-param>
2348 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex()); in mangleType()
2359 assert(Dependent->isIdentifier()); in mangleType()
2361 // <class-enum-type> ::= <name> in mangleType()
2362 // <name> ::= <nested-name> in mangleType()
2363 mangleUnresolvedPrefix(Dependent->getQualifier()); in mangleType()
2364 mangleSourceName(Dependent->getIdentifier()); in mangleType()
2375 mangleType(subst->getReplacement()); in mangleType()
2395 switch (Ty->getTypeClass()) { in mangleUnresolvedTypeOrSimpleId()
2445 // <unresolved-type> ::= <template-param> in mangleUnresolvedTypeOrSimpleId()
2447 // ::= <template-template-param> <template-args> in mangleUnresolvedTypeOrSimpleId()
2464 // We never want to print 'E' directly after an unresolved-type, in mangleUnresolvedTypeOrSimpleId()
2469 mangleSourceNameWithAbiTags(cast<TypedefType>(Ty)->getDecl()); in mangleUnresolvedTypeOrSimpleId()
2474 cast<UnresolvedUsingType>(Ty)->getDecl()); in mangleUnresolvedTypeOrSimpleId()
2479 mangleSourceNameWithAbiTags(cast<TagType>(Ty)->getDecl()); in mangleUnresolvedTypeOrSimpleId()
2485 TemplateName TN = TST->getTemplateName(); in mangleUnresolvedTypeOrSimpleId()
2509 mangleExistingSubstitution(subst->getReplacement()); in mangleUnresolvedTypeOrSimpleId()
2530 // original source-level template arguments, so we shouldn't consider in mangleUnresolvedTypeOrSimpleId()
2532 // FIXME: Other compilers mangle partially-resolved template arguments in in mangleUnresolvedTypeOrSimpleId()
2533 // unresolved-qualifier-levels. in mangleUnresolvedTypeOrSimpleId()
2534 mangleTemplateArgs(TemplateName(), TST->template_arguments()); in mangleUnresolvedTypeOrSimpleId()
2540 cast<InjectedClassNameType>(Ty)->getDecl()); in mangleUnresolvedTypeOrSimpleId()
2544 mangleSourceName(cast<DependentNameType>(Ty)->getIdentifier()); in mangleUnresolvedTypeOrSimpleId()
2551 DTST->getQualifier(), DTST->getIdentifier()); in mangleUnresolvedTypeOrSimpleId()
2552 mangleSourceName(DTST->getIdentifier()); in mangleUnresolvedTypeOrSimpleId()
2553 mangleTemplateArgs(Template, DTST->template_arguments()); in mangleUnresolvedTypeOrSimpleId()
2558 return mangleUnresolvedTypeOrSimpleId(cast<UsingType>(Ty)->desugar(), in mangleUnresolvedTypeOrSimpleId()
2562 cast<ElaboratedType>(Ty)->getNamedType(), Prefix); in mangleUnresolvedTypeOrSimpleId()
2581 // <operator-name> ::= cv <type> # (cast) in mangleOperatorName()
2600 // <operator-name> ::= nw # new in mangleOperatorName()
2612 // ::= ng # - (unary) in mangleOperatorName()
2613 // ::= mi # - (binary or unknown) in mangleOperatorName()
2639 // ::= mI # -= in mangleOperatorName()
2681 // ::= mm # -- in mangleOperatorName()
2685 // ::= pm # ->* in mangleOperatorName()
2687 // ::= pt # -> in mangleOperatorName()
2698 // Proposal on cxx-abi-dev, 2015-10-21. in mangleOperatorName()
2701 // Proposed in cxx-abi github issue 43. in mangleOperatorName()
2712 // Vendor qualifiers come first and if they are order-insensitive they must in mangleQualifiers()
2715 // <type> ::= U <addrspace-expr> in mangleQualifiers()
2718 mangleExpression(DAST->getAddrSpaceExpr()); in mangleQualifiers()
2726 // <type> ::= U <target-addrspace> in mangleQualifiers()
2727 // <type> ::= U <OpenCL-addrspace> in mangleQualifiers()
2728 // <type> ::= U <CUDA-addrspace> in mangleQualifiers()
2734 // <target-addrspace> ::= "AS" <address-space-number> in mangleQualifiers()
2742 // <OpenCL-addrspace> ::= "CL" [ "global" | "local" | "constant" | in mangleQualifiers()
2766 // <SYCL-addrspace> ::= "SY" [ "global" | "local" | "private" | in mangleQualifiers()
2783 // <CUDA-addrspace> ::= "CU" [ "device" | "constant" | "shared" ] in mangleQualifiers()
2793 // <ptrsize-addrspace> ::= [ "ptr32_sptr" | "ptr32_uptr" | "ptr64" ] in mangleQualifiers()
2810 // Objective-C ARC Extension: in mangleQualifiers()
2821 // __unaligned (from -fms-extensions) in mangleQualifiers()
2845 // equivalent (but, naturally, unqualified) types in non-ARC, providing in mangleQualifiers()
2853 // <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const in mangleQualifiers()
2867 // <ref-qualifier> ::= R # lvalue reference in mangleRefQualifier()
2868 // ::= O # rvalue-reference in mangleRefQualifier()
2891 if (Ty->isSpecificBuiltinType(BuiltinType::ObjCSel)) in isTypeSubstitutable()
2893 if (Ty->isOpenCLSpecificType()) in isTypeSubstitutable()
2896 if (Ty->isSVESizelessBuiltinType() && in isTypeSubstitutable()
2899 if (Ty->isBuiltinType()) in isTypeSubstitutable()
2909 if (auto *DeducedTST = Ty->getAs<DeducedTemplateSpecializationType>()) in isTypeSubstitutable()
2910 if (DeducedTST->getDeducedType().isNull()) in isTypeSubstitutable()
2916 // If our type is instantiation-dependent but not dependent, we mangle in mangleType()
2917 // it as it was written in the source, removing any top-level sugar. in mangleType()
2920 // FIXME: This is an approximation of the instantiation-dependent name in mangleType()
2923 // default template arguments) for any instantiation-dependent type. in mangleType()
2925 // - Instantiation-dependent TemplateSpecializationTypes will need to be in mangleType()
2927 // - Default template arguments will need to be represented in the in mangleType()
2930 // - Conversions on non-type template arguments need to be expressed, since in mangleType()
2934 // type discards instantiation-dependent portions of the type, such as for: in mangleType()
2937 // template<typename T> void f(T() throw(typename T::type)); (pre-C++17) in mangleType()
2939 // It's also wrong in the opposite direction when instantiation-dependent, in mangleType()
2940 // canonically-equivalent types differ in some irrelevant portion of inner in mangleType()
2945 // We should instead canonicalize the non-instantiation-dependent parts, in mangleType()
2948 if (!T->isInstantiationDependentType() || T->isDependentType()) in mangleType()
2957 if (!TST->isTypeAlias()) in mangleType()
2961 // instantation-dependent qualifiers. See in mangleType()
2962 // https://github.com/itanium-cxx-abi/cxx-abi/issues/114. in mangleType()
2991 if (quals || ty->isDependentAddressSpaceType()) { in mangleType()
2994 SplitQualType splitDAST = DAST->getPointeeType().split(); in mangleType()
3005 switch (ty->getTypeClass()) { in mangleType()
3009 llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \ in mangleType()
3030 // <type> ::= <builtin-type> in mangleType()
3031 // <builtin-type> ::= v # void in mangleType()
3055 // ::= Dh # IEEE 754r half-precision floating point (16 bits) in mangleType()
3060 // ::= [DS] DA # N1169 fixed-point [_Sat] T _Accum in mangleType()
3061 // ::= [DS] DR # N1169 fixed-point [_Sat] T _Fract in mangleType()
3062 // ::= u <source-name> # vendor extended type in mangleType()
3064 // <fixed-point-size> in mangleType()
3075 if (NormalizeIntegers && T->isInteger()) { in mangleType()
3076 if (T->isSignedInteger()) { in mangleType()
3151 switch (T->getKind()) { in mangleType()
3301 Out << TI->getLongDoubleMangling(); in mangleType()
3310 Out << TI->getFloat128Mangling(); in mangleType()
3320 Out << TI->getBFloat16Mangling(); in mangleType()
3325 Out << TI->getIbm128Mangling(); in mangleType()
3376 // The SVE types are effectively target-specific. The mangling scheme in mangleType()
3382 if (T->getKind() == BuiltinType::SveBFloat16 && \ in mangleType()
3412 // TODO: Check the mangling scheme for RISC-V V. in mangleType()
3484 if (T->getExtInfo() == FunctionType::ExtInfo()) in mangleExtFunctionInfo()
3487 // Vendor-specific qualifiers are emitted in reverse alphabetical order. in mangleExtFunctionInfo()
3491 StringRef CCQualifier = getCallingConvQualifierName(T->getExtInfo().getCC()); in mangleExtFunctionInfo()
3501 // Vendor-specific qualifiers are emitted in reverse alphabetical order. in mangleExtParameterInfo()
3526 // <type> ::= <function-type>
3527 // <function-type> ::= [<CV-qualifiers>] F [Y]
3528 // <bare-function-type> [<ref-qualifier>] E
3532 // Mangle CV-qualifiers, if present. These are 'this' qualifiers, in mangleType()
3534 mangleQualifiers(T->getMethodQuals()); in mangleType()
3536 // Mangle instantiation-dependent exception-specification, if present, in mangleType()
3537 // per cxx-abi-dev proposal on 2016-10-11. in mangleType()
3538 if (T->hasInstantiationDependentExceptionSpec()) { in mangleType()
3539 if (isComputedNoexcept(T->getExceptionSpecType())) { in mangleType()
3541 mangleExpression(T->getNoexceptExpr()); in mangleType()
3544 assert(T->getExceptionSpecType() == EST_Dynamic); in mangleType()
3546 for (auto ExceptTy : T->exceptions()) in mangleType()
3550 } else if (T->isNothrow()) { in mangleType()
3560 // Mangle the ref-qualifier, if present. in mangleType()
3561 mangleRefQualifier(T->getRefQualifier()); in mangleType()
3575 mangleType(T->getReturnType()); in mangleType()
3589 // <bare-function-type> ::= <signature type>+ in mangleBareFunctionType()
3593 // Mangle ns_returns_retained as an order-sensitive qualifier here. in mangleBareFunctionType()
3594 if (Proto->getExtInfo().getProducesResult() && FD == nullptr) in mangleBareFunctionType()
3598 QualType ReturnTy = Proto->getReturnType(); in mangleBareFunctionType()
3609 if (Proto->getNumParams() == 0 && !Proto->isVariadic()) { in mangleBareFunctionType()
3610 // <builtin-type> ::= v # void in mangleBareFunctionType()
3613 assert(!FD || FD->getNumParams() == Proto->getNumParams()); in mangleBareFunctionType()
3614 for (unsigned I = 0, E = Proto->getNumParams(); I != E; ++I) { in mangleBareFunctionType()
3615 // Mangle extended parameter info as order-sensitive qualifiers here. in mangleBareFunctionType()
3616 if (Proto->hasExtParameterInfos() && FD == nullptr) { in mangleBareFunctionType()
3617 mangleExtParameterInfo(Proto->getExtParameterInfo(I)); in mangleBareFunctionType()
3621 QualType ParamTy = Proto->getParamType(I); in mangleBareFunctionType()
3625 if (auto *Attr = FD->getParamDecl(I)->getAttr<PassObjectSizeAttr>()) { in mangleBareFunctionType()
3628 assert(Attr->getType() <= 9 && Attr->getType() >= 0); in mangleBareFunctionType()
3629 if (Attr->isDynamic()) in mangleBareFunctionType()
3630 Out << "U25pass_dynamic_object_size" << Attr->getType(); in mangleBareFunctionType()
3632 Out << "U17pass_object_size" << Attr->getType(); in mangleBareFunctionType()
3637 // <builtin-type> ::= z # ellipsis in mangleBareFunctionType()
3638 if (Proto->isVariadic()) in mangleBareFunctionType()
3644 mangleRequiresClause(FD->getTrailingRequiresClause()); in mangleBareFunctionType()
3650 // <type> ::= <class-enum-type>
3651 // <class-enum-type> ::= <name>
3653 mangleName(T->getDecl()); in mangleType()
3656 // <type> ::= <class-enum-type>
3657 // <class-enum-type> ::= <name>
3665 mangleName(T->getDecl()); in mangleType()
3668 // <type> ::= <array-type>
3669 // <array-type> ::= A <positive dimension number> _ <element type>
3672 Out << 'A' << T->getSize() << '_'; in mangleType()
3673 mangleType(T->getElementType()); in mangleType()
3678 if (T->getSizeExpr()) in mangleType()
3679 mangleExpression(T->getSizeExpr()); in mangleType()
3681 mangleType(T->getElementType()); in mangleType()
3688 if (T->getSizeExpr()) in mangleType()
3689 mangleExpression(T->getSizeExpr()); in mangleType()
3691 mangleType(T->getElementType()); in mangleType()
3695 mangleType(T->getElementType()); in mangleType()
3698 // <type> ::= <pointer-to-member-type>
3699 // <pointer-to-member-type> ::= M <class type> <member type>
3702 mangleType(QualType(T->getClass(), 0)); in mangleType()
3703 QualType PointeeType = T->getPointeeType(); in mangleType()
3709 // The type of a non-static member function is considered to be different, in mangleType()
3710 // for the purposes of substitution, from the type of a namespace-scope or in mangleType()
3712 // non-static member functions are considered to be different, for the in mangleType()
3728 // <type> ::= <template-param>
3730 mangleTemplateParameter(T->getDepth(), T->getIndex()); in mangleType()
3733 // <type> ::= <template-param>
3742 // <type> ::= P <type> # pointer-to
3745 mangleType(T->getPointeeType()); in mangleType()
3749 mangleType(T->getPointeeType()); in mangleType()
3752 // <type> ::= R <type> # reference-to
3755 mangleType(T->getPointeeType()); in mangleType()
3758 // <type> ::= O <type> # rvalue reference-to (C++0x)
3761 mangleType(T->getPointeeType()); in mangleType()
3767 mangleType(T->getElementType()); in mangleType()
3774 QualType EltType = T->getElementType(); in mangleNeonVectorType()
3775 assert(EltType->isBuiltinType() && "Neon vector element not a BuiltinType"); in mangleNeonVectorType()
3777 if (T->getVectorKind() == VectorKind::NeonPoly) { in mangleNeonVectorType()
3778 switch (cast<BuiltinType>(EltType)->getKind()) { in mangleNeonVectorType()
3794 switch (cast<BuiltinType>(EltType)->getKind()) { in mangleNeonVectorType()
3812 unsigned BitSize = (T->getNumElements() * in mangleNeonVectorType()
3829 Diags.Report(T->getAttributeLoc(), DiagID); in mangleNeonVectorType()
3833 switch (EltType->getKind()) { in mangleAArch64VectorBase()
3869 QualType EltType = T->getElementType(); in mangleAArch64NeonVectorType()
3870 assert(EltType->isBuiltinType() && "Neon vector element not a BuiltinType"); in mangleAArch64NeonVectorType()
3872 (T->getNumElements() * getASTContext().getTypeSize(EltType)); in mangleAArch64NeonVectorType()
3879 if (T->getVectorKind() == VectorKind::NeonPoly) { in mangleAArch64NeonVectorType()
3880 switch (cast<BuiltinType>(EltType)->getKind()) { in mangleAArch64NeonVectorType()
3898 ("__" + EltName + "x" + Twine(T->getNumElements()) + "_t").str(); in mangleAArch64NeonVectorType()
3906 Diags.Report(T->getAttributeLoc(), DiagID); in mangleAArch64NeonVectorType()
3909 // The AArch64 ACLE specifies that fixed-length SVE vector and predicate types
3932 // https://github.com/ARM-software/abi-aa/blob/main/aapcs64/aapcs64.rst#appendix-c-mangling
3934 assert((T->getVectorKind() == VectorKind::SveFixedLengthData || in mangleAArch64FixedSveVectorType()
3935 T->getVectorKind() == VectorKind::SveFixedLengthPredicate) && in mangleAArch64FixedSveVectorType()
3936 "expected fixed-length SVE vector!"); in mangleAArch64FixedSveVectorType()
3938 QualType EltType = T->getElementType(); in mangleAArch64FixedSveVectorType()
3939 assert(EltType->isBuiltinType() && in mangleAArch64FixedSveVectorType()
3940 "expected builtin type for fixed-length SVE vector!"); in mangleAArch64FixedSveVectorType()
3943 switch (cast<BuiltinType>(EltType)->getKind()) { in mangleAArch64FixedSveVectorType()
3948 if (T->getVectorKind() == VectorKind::SveFixedLengthData) in mangleAArch64FixedSveVectorType()
3985 llvm_unreachable("unexpected element type for fixed-length SVE vector!"); in mangleAArch64FixedSveVectorType()
3990 if (T->getVectorKind() == VectorKind::SveFixedLengthPredicate) in mangleAArch64FixedSveVectorType()
4002 "cannot mangle this dependent fixed-length SVE vector type yet"); in mangleAArch64FixedSveVectorType()
4003 Diags.Report(T->getAttributeLoc(), DiagID); in mangleAArch64FixedSveVectorType()
4007 assert((T->getVectorKind() == VectorKind::RVVFixedLengthData || in mangleRISCVFixedRVVVectorType()
4008 T->getVectorKind() == VectorKind::RVVFixedLengthMask) && in mangleRISCVFixedRVVVectorType()
4009 "expected fixed-length RVV vector!"); in mangleRISCVFixedRVVVectorType()
4011 QualType EltType = T->getElementType(); in mangleRISCVFixedRVVVectorType()
4012 assert(EltType->isBuiltinType() && in mangleRISCVFixedRVVVectorType()
4013 "expected builtin type for fixed-length RVV vector!"); in mangleRISCVFixedRVVVectorType()
4018 switch (cast<BuiltinType>(EltType)->getKind()) { in mangleRISCVFixedRVVVectorType()
4023 if (T->getVectorKind() == VectorKind::RVVFixedLengthData) in mangleRISCVFixedRVVVectorType()
4056 llvm_unreachable("unexpected element type for fixed-length RVV vector!"); in mangleRISCVFixedRVVVectorType()
4064 unsigned VLen = VScale->first * llvm::RISCV::RVVBitsPerBlock; in mangleRISCVFixedRVVVectorType()
4066 if (T->getVectorKind() == VectorKind::RVVFixedLengthData) { in mangleRISCVFixedRVVVectorType()
4086 "cannot mangle this dependent fixed-length RVV vector type yet"); in mangleRISCVFixedRVVVectorType()
4087 Diags.Report(T->getAttributeLoc(), DiagID); in mangleRISCVFixedRVVVectorType()
4091 // <type> ::= <vector-type>
4092 // <vector-type> ::= Dv <positive dimension number> _
4099 if ((T->getVectorKind() == VectorKind::Neon || in mangleType()
4100 T->getVectorKind() == VectorKind::NeonPoly)) { in mangleType()
4110 } else if (T->getVectorKind() == VectorKind::SveFixedLengthData || in mangleType()
4111 T->getVectorKind() == VectorKind::SveFixedLengthPredicate) { in mangleType()
4114 } else if (T->getVectorKind() == VectorKind::RVVFixedLengthData || in mangleType()
4115 T->getVectorKind() == VectorKind::RVVFixedLengthMask) { in mangleType()
4119 Out << "Dv" << T->getNumElements() << '_'; in mangleType()
4120 if (T->getVectorKind() == VectorKind::AltiVecPixel) in mangleType()
4122 else if (T->getVectorKind() == VectorKind::AltiVecBool) in mangleType()
4125 mangleType(T->getElementType()); in mangleType()
4129 if ((T->getVectorKind() == VectorKind::Neon || in mangleType()
4130 T->getVectorKind() == VectorKind::NeonPoly)) { in mangleType()
4140 } else if (T->getVectorKind() == VectorKind::SveFixedLengthData || in mangleType()
4141 T->getVectorKind() == VectorKind::SveFixedLengthPredicate) { in mangleType()
4144 } else if (T->getVectorKind() == VectorKind::RVVFixedLengthData) { in mangleType()
4150 mangleExpression(T->getSizeExpr()); in mangleType()
4152 if (T->getVectorKind() == VectorKind::AltiVecPixel) in mangleType()
4154 else if (T->getVectorKind() == VectorKind::AltiVecBool) in mangleType()
4157 mangleType(T->getElementType()); in mangleType()
4165 mangleExpression(T->getSizeExpr()); in mangleType()
4167 mangleType(T->getElementType()); in mangleType()
4181 Rows = T->getNumRows(); in mangleType()
4184 Columns = T->getNumColumns(); in mangleType()
4186 mangleType(T->getElementType()); in mangleType()
4197 mangleTemplateArgExpr(T->getRowExpr()); in mangleType()
4198 mangleTemplateArgExpr(T->getColumnExpr()); in mangleType()
4199 mangleType(T->getElementType()); in mangleType()
4204 SplitQualType split = T->getPointeeType().split(); in mangleType()
4212 mangleType(T->getPattern()); in mangleType()
4216 if (!T->hasSelectedType()) in mangleType()
4217 mangleType(T->getPattern()); in mangleType()
4219 mangleType(T->getSelectedType()); in mangleType()
4223 mangleSourceName(T->getDecl()->getIdentifier()); in mangleType()
4228 if (T->isKindOfType()) in mangleType()
4231 if (!T->qual_empty()) { in mangleType()
4236 for (const auto *I : T->quals()) { in mangleType()
4237 StringRef name = I->getName(); in mangleType()
4243 mangleType(T->getBaseType()); in mangleType()
4245 if (T->isSpecialized()) { in mangleType()
4248 for (auto typeArg : T->getTypeArgs()) in mangleType()
4256 mangleType(T->getPointeeType()); in mangleType()
4263 mangleType(T->getInjectedSpecializationType()); in mangleType()
4267 if (TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl()) { in mangleType()
4268 mangleTemplateName(TD, T->template_arguments()); in mangleType()
4273 mangleTemplatePrefix(T->getTemplateName()); in mangleType()
4278 mangleTemplateArgs(T->getTemplateName(), T->template_arguments()); in mangleType()
4284 // Proposal by cxx-abi-dev, 2014-03-26 in mangleType()
4285 // <class-enum-type> ::= <name> # non-dependent or dependent type name or in mangleType()
4294 switch (T->getKeyword()) { in mangleType()
4312 manglePrefix(T->getQualifier()); in mangleType()
4313 mangleSourceName(T->getIdentifier()); in mangleType()
4318 // Dependently-scoped template types are nested if they have a prefix. in mangleType()
4323 getASTContext().getDependentTemplateName(T->getQualifier(), in mangleType()
4324 T->getIdentifier()); in mangleType()
4330 mangleTemplateArgs(Prefix, T->template_arguments()); in mangleType()
4347 Expr *E = T->getUnderlyingExpr(); in mangleType()
4349 // type ::= Dt <expression> E # decltype of an id-expression in mangleType()
4353 // This purports to be an exhaustive list of id-expressions and in mangleType()
4373 if (T->isDependentType()) { in mangleType()
4377 switch (T->getUTTKind()) { in mangleType()
4388 mangleType(T->getBaseType()); in mangleType()
4393 assert(T->getDeducedType().isNull() && in mangleType()
4395 assert(T->getKeyword() != AutoTypeKeyword::GNUAutoType && in mangleType()
4397 // <builtin-type> ::= Da # auto in mangleType()
4401 if (T->isConstrained() && !isCompatibleWith(LangOptions::ClangABI::Ver17)) { in mangleType()
4402 Out << (T->isDecltypeAuto() ? "DK" : "Dk"); in mangleType()
4403 mangleTypeConstraint(T->getTypeConstraintConcept(), in mangleType()
4404 T->getTypeConstraintArguments()); in mangleType()
4406 Out << (T->isDecltypeAuto() ? "Dc" : "Da"); in mangleType()
4411 QualType Deduced = T->getDeducedType(); in mangleType()
4415 TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl(); in mangleType()
4426 // <type> ::= U <source-name> <type> # vendor extended type qualifier in mangleType()
4429 mangleType(T->getValueType()); in mangleType()
4441 // <type> ::= DB <number | instantiation-dependent expression> _ in mangleType()
4442 // ::= DU <number | instantiation-dependent expression> _ in mangleType()
4443 Out << "D" << (T->isUnsigned() ? "U" : "B") << T->getNumBits() << "_"; in mangleType()
4448 // <type> ::= DB <number | instantiation-dependent expression> _ in mangleType()
4449 // ::= DU <number | instantiation-dependent expression> _ in mangleType()
4450 Out << "D" << (T->isUnsigned() ? "U" : "B"); in mangleType()
4451 mangleExpression(T->getNumBitsExpr()); in mangleType()
4461 // <expr-primary> ::= L <type> <value number> E # integer literal in mangleIntegerLiteral()
4465 if (T->isBooleanType()) { in mangleIntegerLiteral()
4477 while (const auto *RT = Base->getType()->getAs<RecordType>()) { in mangleMemberExprBase()
4478 if (!RT->getDecl()->isAnonymousStructOrUnion()) in mangleMemberExprBase()
4483 Base = ME->getBase(); in mangleMemberExprBase()
4484 IsArrow = ME->isArrow(); in mangleMemberExprBase()
4487 if (Base->isImplicitCXXThis()) { in mangleMemberExprBase()
4489 // *this., whereas we represent them as this->. The Itanium C++ ABI in mangleMemberExprBase()
4507 // <expression> ::= dt <expression> <unresolved-name> in mangleMemberExpr()
4508 // ::= pt <expression> <unresolved-name> in mangleMemberExpr()
4515 /// it's a parenthesized id-expression which would have triggered ADL
4518 const Expr *callee = call->getCallee(); in isParenthesizedADLCallee()
4519 const Expr *fn = callee->IgnoreParens(); in isParenthesizedADLCallee()
4530 assert(!lookup->requiresADL()); in isParenthesizedADLCallee()
4533 if (lookup->getQualifier()) return false; in isParenthesizedADLCallee()
4537 if (lookup->getNumDecls() > 0 && in isParenthesizedADLCallee()
4538 (*lookup->decls_begin())->isCXXClassMember()) in isParenthesizedADLCallee()
4548 mangleType(ECE->getType()); in mangleCastExpression()
4549 mangleExpression(ECE->getSubExpr()); in mangleCastExpression()
4553 if (auto *Syntactic = InitList->getSyntacticForm()) in mangleInitListElements()
4555 for (unsigned i = 0, e = InitList->getNumInits(); i != e; ++i) in mangleInitListElements()
4556 mangleExpression(InitList->getInit(i)); in mangleInitListElements()
4570 DiagnosticsEngine::Error, "cannot mangle this requires-expression " in mangleRequirement()
4576 switch (Req->getKind()) { in mangleRequirement()
4579 if (TR->isSubstitutionFailure()) in mangleRequirement()
4581 TR->getSubstitutionDiagnostic()->DiagLoc); in mangleRequirement()
4584 mangleType(TR->getType()->getType()); in mangleRequirement()
4591 if (ER->isExprSubstitutionFailure()) in mangleRequirement()
4593 ER->getExprSubstitutionDiagnostic()->DiagLoc); in mangleRequirement()
4596 mangleExpression(ER->getExpr()); in mangleRequirement()
4598 if (ER->hasNoexceptRequirement()) in mangleRequirement()
4601 if (!ER->getReturnTypeRequirement().isEmpty()) { in mangleRequirement()
4602 if (ER->getReturnTypeRequirement().isSubstitutionFailure()) in mangleRequirement()
4603 return HandleSubstitutionFailure(ER->getReturnTypeRequirement() in mangleRequirement()
4605 ->DiagLoc); in mangleRequirement()
4608 mangleTypeConstraint(ER->getReturnTypeRequirement().getTypeConstraint()); in mangleRequirement()
4615 if (NR->hasInvalidConstraint()) { in mangleRequirement()
4622 mangleExpression(NR->getConstraintExpr()); in mangleRequirement()
4629 // <expression> ::= <unary operator-name> <expression> in mangleExpression()
4630 // ::= <binary operator-name> <expression> <expression> in mangleExpression()
4631 // ::= <trinary operator-name> <expression> <expression> <expression> in mangleExpression()
4640 // ::= <template-param> in mangleExpression()
4641 // ::= <function-param> in mangleExpression()
4642 // ::= fpT # 'this' expression (part of <function-param>) in mangleExpression()
4643 // ::= sr <type> <unqualified-name> # dependent name in mangleExpression()
4644 // ::= sr <type> <unqualified-name> <template-args> # dependent template-id in mangleExpression()
4646 // ::= sZ <template-param> # size of a parameter pack in mangleExpression()
4647 // ::= sZ <function-param> # size of a function parameter pack in mangleExpression()
4648 // ::= u <source-name> <template-arg>* E # vendor extended expression in mangleExpression()
4649 // ::= <expr-primary> in mangleExpression()
4650 // <expr-primary> ::= L <type> <value number> E # integer literal in mangleExpression()
4655 …// ::= L <type> <real-part float> _ <imag-part float> E # complex floating point… in mangleExpression()
4656 // ::= L <mangled-name> E # external name in mangleExpression()
4659 // A top-level expression that's not <expr-primary> needs to be wrapped in in mangleExpression()
4669 switch (D->getKind()) { in mangleExpression()
4671 // <expr-primary> ::= L <mangled-name> E # external name in mangleExpression()
4683 // <expr-primary> in mangleExpression()
4685 mangleIntegerLiteral(ED->getType(), ED->getInitVal()); in mangleExpression()
4692 mangleTemplateParameter(PD->getDepth(), PD->getIndex()); in mangleExpression()
4701 switch (E->getStmtClass()) { in mangleExpression()
4710 // These all can only appear in local or variable-initialization in mangleExpression()
4732 E = cast<ConstantExpr>(E)->getSubExpr(); in mangleExpression()
4777 Diags.Report(E->getExprLoc(), DiagID) in mangleExpression()
4778 << E->getStmtClassName() << E->getSourceRange(); in mangleExpression()
4788 // mangling. Previously, it used a special-cased nonstandard extension. in mangleExpression()
4791 if (UE->isTypeOperand()) in mangleExpression()
4792 mangleType(UE->getTypeOperand(Context.getASTContext())); in mangleExpression()
4794 mangleTemplateArgExpr(UE->getExprOperand()); in mangleExpression()
4797 if (UE->isTypeOperand()) { in mangleExpression()
4798 QualType UuidT = UE->getTypeOperand(Context.getASTContext()); in mangleExpression()
4802 Expr *UuidExp = UE->getExprOperand(); in mangleExpression()
4810 // Even gcc-4.5 doesn't mangle this. in mangleExpression()
4817 Diags.Report(E->getExprLoc(), DiagID) in mangleExpression()
4818 << E->getStmtClassName() << E->getSourceRange(); in mangleExpression()
4837 for (const auto &Designator : DIE->designators()) { in mangleExpression()
4843 mangleExpression(DIE->getArrayIndex(Designator)); in mangleExpression()
4848 mangleExpression(DIE->getArrayRangeStart(Designator)); in mangleExpression()
4849 mangleExpression(DIE->getArrayRangeEnd(Designator)); in mangleExpression()
4852 mangleExpression(DIE->getInit()); in mangleExpression()
4857 E = cast<CXXDefaultArgExpr>(E)->getExpr(); in mangleExpression()
4861 E = cast<CXXDefaultInitExpr>(E)->getExpr(); in mangleExpression()
4865 E = cast<CXXStdInitializerListExpr>(E)->getSubExpr(); in mangleExpression()
4872 if (auto *CE = dyn_cast<ConstantExpr>(SNTTPE->getReplacement())) { in mangleExpression()
4874 QualType ParamType = SNTTPE->getParameterType(Context.getASTContext()); in mangleExpression()
4875 assert(CE->hasAPValueResult() && "expected the NTTP to have an APValue"); in mangleExpression()
4876 mangleValueInTemplateArg(ParamType, CE->getAPValueResult(), false, in mangleExpression()
4882 E = cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(); in mangleExpression()
4894 // <expression> ::= cp <simple-id> <expression>* E in mangleExpression()
4901 // no qualifier and should always get mangled as a <simple-id> in mangleExpression()
4909 unsigned CallArity = CE->getNumArgs(); in mangleExpression()
4910 for (const Expr *Arg : CE->arguments()) in mangleExpression()
4914 mangleExpression(CE->getCallee(), CallArity); in mangleExpression()
4915 for (const Expr *Arg : CE->arguments()) in mangleExpression()
4924 if (New->isGlobalNew()) Out << "gs"; in mangleExpression()
4925 Out << (New->isArray() ? "na" : "nw"); in mangleExpression()
4926 for (CXXNewExpr::const_arg_iterator I = New->placement_arg_begin(), in mangleExpression()
4927 E = New->placement_arg_end(); I != E; ++I) in mangleExpression()
4930 mangleType(New->getAllocatedType()); in mangleExpression()
4931 if (New->hasInitializer()) { in mangleExpression()
4932 if (New->getInitializationStyle() == CXXNewInitializationStyle::Braces) in mangleExpression()
4936 const Expr *Init = New->getInitializer(); in mangleExpression()
4939 for (CXXConstructExpr::const_arg_iterator I = CCE->arg_begin(), in mangleExpression()
4940 E = CCE->arg_end(); in mangleExpression()
4944 for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i) in mangleExpression()
4945 mangleExpression(PLE->getExpr(i)); in mangleExpression()
4946 } else if (New->getInitializationStyle() == in mangleExpression()
4949 // Only take InitListExprs apart for list-initialization. in mangleExpression()
4961 if (const Expr *Base = PDE->getBase()) in mangleExpression()
4962 mangleMemberExprBase(Base, PDE->isArrow()); in mangleExpression()
4963 NestedNameSpecifier *Qualifier = PDE->getQualifier(); in mangleExpression()
4964 if (TypeSourceInfo *ScopeInfo = PDE->getScopeTypeInfo()) { in mangleExpression()
4968 mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType()); in mangleExpression()
4972 if (!mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType())) in mangleExpression()
4978 // <base-unresolved-name> ::= dn <destructor-name> in mangleExpression()
4980 QualType DestroyedType = PDE->getDestroyedType(); in mangleExpression()
4988 mangleMemberExpr(ME->getBase(), ME->isArrow(), in mangleExpression()
4989 ME->getQualifier(), nullptr, in mangleExpression()
4990 ME->getMemberDecl()->getDeclName(), in mangleExpression()
4991 ME->getTemplateArgs(), ME->getNumTemplateArgs(), in mangleExpression()
4999 mangleMemberExpr(ME->isImplicitAccess() ? nullptr : ME->getBase(), in mangleExpression()
5000 ME->isArrow(), ME->getQualifier(), nullptr, in mangleExpression()
5001 ME->getMemberName(), in mangleExpression()
5002 ME->getTemplateArgs(), ME->getNumTemplateArgs(), in mangleExpression()
5011 mangleMemberExpr(ME->isImplicitAccess() ? nullptr : ME->getBase(), in mangleExpression()
5012 ME->isArrow(), ME->getQualifier(), in mangleExpression()
5013 ME->getFirstQualifierFoundInScope(), in mangleExpression()
5014 ME->getMember(), in mangleExpression()
5015 ME->getTemplateArgs(), ME->getNumTemplateArgs(), in mangleExpression()
5023 mangleUnresolvedName(ULE->getQualifier(), ULE->getName(), in mangleExpression()
5024 ULE->getTemplateArgs(), ULE->getNumTemplateArgs(), in mangleExpression()
5032 unsigned N = CE->getNumArgs(); in mangleExpression()
5034 if (CE->isListInitialization()) { in mangleExpression()
5036 auto *IL = cast<InitListExpr>(CE->getArg(0)); in mangleExpression()
5038 mangleType(CE->getType()); in mangleExpression()
5045 mangleType(CE->getType()); in mangleExpression()
5047 for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I)); in mangleExpression()
5053 // An implicit cast is silent, thus may contain <expr-primary>. in mangleExpression()
5055 if (!CE->isListInitialization() || CE->isStdInitListInitialization()) { in mangleExpression()
5057 CE->getNumArgs() >= 1 && in mangleExpression()
5058 (CE->getNumArgs() == 1 || isa<CXXDefaultArgExpr>(CE->getArg(1))) && in mangleExpression()
5060 E = cast<CXXConstructExpr>(E)->getArg(0); in mangleExpression()
5065 for (auto *E : CE->arguments()) in mangleExpression()
5074 unsigned N = CE->getNumArgs(); in mangleExpression()
5075 bool List = CE->isListInitialization(); in mangleExpression()
5081 mangleType(CE->getType()); in mangleExpression()
5084 if (CE->isStdInitListInitialization()) { in mangleExpression()
5089 cast<CXXStdInitializerListExpr>(CE->getArg(0)->IgnoreImplicit()); in mangleExpression()
5090 auto *ILE = cast<InitListExpr>(SILE->getSubExpr()->IgnoreImplicit()); in mangleExpression()
5093 for (auto *E : CE->arguments()) in mangleExpression()
5104 mangleType(E->getType()); in mangleExpression()
5111 mangleExpression(cast<CXXNoexceptExpr>(E)->getOperand()); in mangleExpression()
5115 // Non-instantiation-dependent traits are an <expr-primary> integer literal. in mangleExpression()
5118 if (!SAE->isInstantiationDependent()) { in mangleExpression()
5121 // instantiation-dependent it is encoded as an integer literal in mangleExpression()
5132 !ImplicitlyConvertedToType->isIntegerType())? SAE->getType() in mangleExpression()
5134 llvm::APSInt V = SAE->EvaluateKnownConstInt(Context.getASTContext()); in mangleExpression()
5142 if (SAE->isArgumentType()) { in mangleExpression()
5144 mangleType(SAE->getArgumentType()); in mangleExpression()
5147 mangleExpression(SAE->getArgumentExpr()); in mangleExpression()
5151 switch(SAE->getKind()) { in mangleExpression()
5162 if (SAE->isArgumentType()) in mangleExpression()
5163 mangleType(SAE->getArgumentType()); in mangleExpression()
5165 mangleTemplateArgExpr(SAE->getArgumentExpr()); in mangleExpression()
5187 Diags.Report(E->getExprLoc(), DiagID); in mangleExpression()
5218 // <expression> ::= u <source-name> <template-arg>* E # vendor extension in mangleExpression()
5222 llvm::StringRef Spelling = getTraitSpelling(TTE->getTrait()); in mangleExpression()
5224 for (TypeSourceInfo *TSI : TTE->getArgs()) { in mangleExpression()
5225 mangleType(TSI->getType()); in mangleExpression()
5236 if (TE->getSubExpr()) { in mangleExpression()
5238 mangleExpression(TE->getSubExpr()); in mangleExpression()
5250 if (TIE->isTypeOperand()) { in mangleExpression()
5252 mangleType(TIE->getTypeOperand(Context.getASTContext())); in mangleExpression()
5255 mangleExpression(TIE->getExprOperand()); in mangleExpression()
5265 if (DE->isGlobalDelete()) Out << "gs"; in mangleExpression()
5266 Out << (DE->isArrayForm() ? "da" : "dl"); in mangleExpression()
5267 mangleExpression(DE->getArgument()); in mangleExpression()
5274 mangleOperatorName(UnaryOperator::getOverloadedOperator(UO->getOpcode()), in mangleExpression()
5276 mangleExpression(UO->getSubExpr()); in mangleExpression()
5287 mangleExpression(AE->getLHS()); in mangleExpression()
5288 mangleExpression(AE->getRHS()); in mangleExpression()
5296 mangleExpression(ME->getBase()); in mangleExpression()
5297 mangleExpression(ME->getRowIdx()); in mangleExpression()
5298 mangleExpression(ME->getColumnIdx()); in mangleExpression()
5306 if (BO->getOpcode() == BO_PtrMemD) in mangleExpression()
5309 mangleOperatorName(BinaryOperator::getOverloadedOperator(BO->getOpcode()), in mangleExpression()
5311 mangleExpression(BO->getLHS()); in mangleExpression()
5312 mangleExpression(BO->getRHS()); in mangleExpression()
5320 cast<CXXRewrittenBinaryOperator>(E)->getDecomposedForm(); in mangleExpression()
5332 mangleExpression(CO->getCond()); in mangleExpression()
5333 mangleExpression(CO->getLHS(), Arity); in mangleExpression()
5334 mangleExpression(CO->getRHS(), Arity); in mangleExpression()
5339 ImplicitlyConvertedToType = E->getType(); in mangleExpression()
5340 E = cast<ImplicitCastExpr>(E)->getSubExpr(); in mangleExpression()
5348 StringRef Kind = cast<ObjCBridgedCastExpr>(E)->getBridgeKindName(); in mangleExpression()
5361 auto *Sub = cast<ExplicitCastExpr>(E)->getSubExpr()->IgnoreImplicit(); in mangleExpression()
5364 if (CCE->getParenOrBraceRange().isInvalid()) in mangleExpression()
5365 Sub = CCE->getArg(0)->IgnoreImplicit(); in mangleExpression()
5367 Sub = StdInitList->getSubExpr()->IgnoreImplicit(); in mangleExpression()
5370 mangleType(E->getType()); in mangleExpression()
5403 unsigned NumArgs = CE->getNumArgs(); in mangleExpression()
5406 if (CE->getOperator() != OO_Arrow) in mangleExpression()
5407 mangleOperatorName(CE->getOperator(), /*Arity=*/NumArgs); in mangleExpression()
5410 mangleExpression(CE->getArg(i)); in mangleExpression()
5415 E = cast<ParenExpr>(E)->getSubExpr(); in mangleExpression()
5421 // Clang 17 and before mangled concept-ids as if they resolved to an in mangleExpression()
5425 mangleTemplateName(CSE->getNamedConcept(), CSE->getTemplateArguments()); in mangleExpression()
5429 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/24. in mangleExpression()
5432 CSE->getNestedNameSpecifierLoc().getNestedNameSpecifier(), in mangleExpression()
5433 CSE->getConceptNameInfo().getName(), in mangleExpression()
5434 CSE->getTemplateArgsAsWritten()->getTemplateArgs(), in mangleExpression()
5435 CSE->getTemplateArgsAsWritten()->getNumTemplateArgs()); in mangleExpression()
5440 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/24. in mangleExpression()
5442 // This is a primary-expression in the C++ grammar, but does not have an in mangleExpression()
5443 // <expr-primary> mangling (starting with 'L'). in mangleExpression()
5445 if (RE->getLParenLoc().isValid()) { in mangleExpression()
5448 if (RE->getLocalParameters().empty()) { in mangleExpression()
5451 for (ParmVarDecl *Param : RE->getLocalParameters()) { in mangleExpression()
5453 Param->getType())); in mangleExpression()
5460 for (const concepts::Requirement *Req : RE->getRequirements()) in mangleExpression()
5461 mangleRequirement(RE->getExprLoc(), Req); in mangleExpression()
5466 for (const concepts::Requirement *Req : RE->getRequirements()) in mangleExpression()
5467 mangleRequirement(RE->getExprLoc(), Req); in mangleExpression()
5474 // MangleDeclRefExpr helper handles primary-vs-nonprimary in mangleExpression()
5475 MangleDeclRefExpr(cast<DeclRefExpr>(E)->getDecl()); in mangleExpression()
5492 MangleDeclRefExpr(FPPE->getParameterPack()); in mangleExpression()
5499 mangleUnresolvedName(DRE->getQualifier(), DRE->getDeclName(), in mangleExpression()
5500 DRE->getTemplateArgs(), DRE->getNumTemplateArgs(), in mangleExpression()
5506 E = cast<CXXBindTemporaryExpr>(E)->getSubExpr(); in mangleExpression()
5510 E = cast<ExprWithCleanups>(E)->getSubExpr(); in mangleExpression()
5514 // <expr-primary> in mangleExpression()
5516 mangleFloatLiteral(FL->getType(), FL->getValue()); in mangleExpression()
5521 // Currently unimplemented -- might be <expr-primary> in future? in mangleExpression()
5526 // <expr-primary> in mangleExpression()
5528 mangleType(E->getType()); in mangleExpression()
5529 Out << cast<CharacterLiteral>(E)->getValue(); in mangleExpression()
5535 // <expr-primary> in mangleExpression()
5537 Out << (cast<ObjCBoolLiteralExpr>(E)->getValue() ? '1' : '0'); in mangleExpression()
5542 // <expr-primary> in mangleExpression()
5544 Out << (cast<CXXBoolLiteralExpr>(E)->getValue() ? '1' : '0'); in mangleExpression()
5549 // <expr-primary> in mangleExpression()
5550 llvm::APSInt Value(cast<IntegerLiteral>(E)->getValue()); in mangleExpression()
5551 if (E->getType()->isSignedIntegerType()) in mangleExpression()
5553 mangleIntegerLiteral(E->getType(), Value); in mangleExpression()
5558 // <expr-primary> in mangleExpression()
5563 mangleType(E->getType()); in mangleExpression()
5565 dyn_cast<FloatingLiteral>(IE->getSubExpr())) { in mangleExpression()
5566 // Mangle a floating-point zero of the appropriate type. in mangleExpression()
5567 mangleFloat(llvm::APFloat(Imag->getValue().getSemantics())); in mangleExpression()
5569 mangleFloat(Imag->getValue()); in mangleExpression()
5572 llvm::APSInt Value(cast<IntegerLiteral>(IE->getSubExpr())->getValue()); in mangleExpression()
5573 if (IE->getSubExpr()->getType()->isSignedIntegerType()) in mangleExpression()
5582 // <expr-primary> in mangleExpression()
5585 assert(isa<ConstantArrayType>(E->getType())); in mangleExpression()
5586 mangleType(E->getType()); in mangleExpression()
5592 // <expr-primary> in mangleExpression()
5594 mangleIntegerLiteral(E->getType(), llvm::APSInt(32)); in mangleExpression()
5598 // <expr-primary> in mangleExpression()
5604 // A lambda-expression can't appear in the signature of an in mangleExpression()
5605 // externally-visible declaration, so there's no standard mangling for in mangleExpression()
5608 mangleType(Context.getASTContext().getRecordType(cast<LambdaExpr>(E)->getLambdaClass())); in mangleExpression()
5616 mangleExpression(cast<PackExpansionExpr>(E)->getPattern()); in mangleExpression()
5622 if (SPE->isPartiallySubstituted()) { in mangleExpression()
5624 for (const auto &A : SPE->getPartialArguments()) in mangleExpression()
5631 const NamedDecl *Pack = SPE->getPack(); in mangleExpression()
5633 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex()); in mangleExpression()
5636 mangleTemplateParameter(NTTP->getDepth(), NTTP->getIndex()); in mangleExpression()
5639 mangleTemplateParameter(TempTP->getDepth(), TempTP->getIndex()); in mangleExpression()
5646 E = cast<MaterializeTemporaryExpr>(E)->getSubExpr(); in mangleExpression()
5652 if (FE->isLeftFold()) in mangleExpression()
5653 Out << (FE->getInit() ? "fL" : "fl"); in mangleExpression()
5655 Out << (FE->getInit() ? "fR" : "fr"); in mangleExpression()
5657 if (FE->getOperator() == BO_PtrMemD) in mangleExpression()
5661 BinaryOperator::getOverloadedOperator(FE->getOperator()), in mangleExpression()
5664 if (FE->getLHS()) in mangleExpression()
5665 mangleExpression(FE->getLHS()); in mangleExpression()
5666 if (FE->getRHS()) in mangleExpression()
5667 mangleExpression(FE->getRHS()); in mangleExpression()
5677 // FIXME: Propose a non-vendor mangling. in mangleExpression()
5680 mangleExpression(cast<CoawaitExpr>(E)->getOperand()); in mangleExpression()
5684 // FIXME: Propose a non-vendor mangling. in mangleExpression()
5687 mangleExpression(cast<DependentCoawaitExpr>(E)->getOperand()); in mangleExpression()
5691 // FIXME: Propose a non-vendor mangling. in mangleExpression()
5694 mangleExpression(cast<CoawaitExpr>(E)->getOperand()); in mangleExpression()
5701 mangleType(USN->getTypeSourceInfo()->getType()); in mangleExpression()
5714 /// <expression> ::= <function-param>
5715 /// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, I == 0
5716 /// <function-param> ::= fp <top-level CV-qualifiers>
5717 /// <parameter-2 non-negative number> _ # L == 0, I > 0
5718 /// <function-param> ::= fL <L-1 non-negative number>
5719 /// p <top-level CV-qualifiers> _ # L > 0, I == 0
5720 /// <function-param> ::= fL <L-1 non-negative number>
5721 /// p <top-level CV-qualifiers>
5722 /// <I-1 non-negative number> _ # L > 0, I > 0
5737 /// I is the zero-based index of the parameter within its parameter
5739 /// this using 1-based ordinals.
5741 unsigned parmDepth = parm->getFunctionScopeDepth(); in mangleFunctionParam()
5742 unsigned parmIndex = parm->getFunctionScopeIndex(); in mangleFunctionParam()
5748 unsigned nestingDepth = FunctionTypeDepth.getDepth() - parmDepth; in mangleFunctionParam()
5750 nestingDepth--; in mangleFunctionParam()
5755 Out << "fL" << (nestingDepth - 1) << 'p'; in mangleFunctionParam()
5758 // Top-level qualifiers. We don't have to worry about arrays here, in mangleFunctionParam()
5761 // get mangled if used as an rvalue of a known non-class type? in mangleFunctionParam()
5762 assert(!parm->getType()->isArrayType() in mangleFunctionParam()
5766 dyn_cast<DependentAddressSpaceType>(parm->getType())) { in mangleFunctionParam()
5767 mangleQualifiers(DAST->getPointeeType().getQualifiers(), DAST); in mangleFunctionParam()
5769 mangleQualifiers(parm->getType().getQualifiers()); in mangleFunctionParam()
5774 Out << (parmIndex - 1); in mangleFunctionParam()
5781 // <ctor-dtor-name> ::= C1 # complete object constructor in mangleCXXCtorType()
5809 // <ctor-dtor-name> ::= D0 # deleting destructor in mangleCXXDtorType()
5860 auto *RD = dyn_cast<CXXRecordDecl>(FTD->getDeclContext()); in isOverloadable()
5861 if (!RD || !RD->isGenericLambda()) in isOverloadable()
5870 /// Determine whether we need to prefix this <template-arg> mangling with a
5871 /// <template-param-decl>. This happens if the natural template parameter for
5878 return TTP->hasTypeConstraint(); in needToMangleTemplateParam()
5890 // For a non-type template parameter, the natural parameter is `T V` (for a in needToMangleTemplateParam()
5893 // parameter has a deduced or instantiation-dependent type, it is not in needToMangleTemplateParam()
5896 return NTTP->getType()->isInstantiationDependentType() || in needToMangleTemplateParam()
5897 NTTP->getType()->getContainedDeducedType(); in needToMangleTemplateParam()
5899 // For a template template parameter, the template-head might differ from in needToMangleTemplateParam()
5910 // necessarily have the same definition of "identical" that we use here -- in needToMangleTemplateParam()
5922 TTP->getTemplateParameters(), 0); in needToMangleTemplateParam()
5927 ArgTemplate->getTemplateParameters(), in needToMangleTemplateParam()
5928 TTP->getTemplateParameters()->getDepth()); in needToMangleTemplateParam()
5936 // We need correct types when the template-name is unresolved or when it in getArgInfo()
5944 assert(ParamIdx < ResolvedTemplate->getTemplateParameters()->size() && in getArgInfo()
5946 Param = ResolvedTemplate->getTemplateParameters()->getParam(ParamIdx); in getArgInfo()
5955 if (Param->isParameterPack() && Arg.getKind() != TemplateArgument::Pack) { in getArgInfo()
5960 // If we encounter a pack argument that is expanded into a non-pack in getArgInfo()
5964 (!Param->isParameterPack() || UnresolvedExpandedPack)) { in getArgInfo()
5982 bool NeedExactType = NTTP && NTTP->getType()->getContainedDeducedType(); in getArgInfo()
5986 /// Determine if we should mangle a requires-clause after the template
5991 return ResolvedTemplate->getTemplateParameters()->getRequiresClause(); in getTrailingRequiresClauseToMangle()
5998 // <template-args> ::= I <template-arg>+ [Q <requires-clause expr>] E in mangleTemplateArgs()
6010 // <template-args> ::= I <template-arg>+ [Q <requires-clause expr>] E in mangleTemplateArgs()
6022 // <template-args> ::= I <template-arg>+ [Q <requires-clause expr>] E in mangleTemplateArgs()
6036 // Proposed on https://github.com/itanium-cxx-abi/cxx-abi/issues/47. in mangleTemplateArg()
6042 // <template-arg> ::= <template-param-decl> <template-arg> in mangleTemplateArg()
6052 // <template-arg> ::= <type> # type or template in mangleTemplateArg()
6054 // ::= <expr-primary> # simple expressions in mangleTemplateArg()
6055 // ::= J <template-arg>* E # argument pack in mangleTemplateArg()
6082 // <expr-primary> ::= L <mangled-name> E # external name in mangleTemplateArg()
6087 if (A.getParamTypeForDecl()->isRecordType()) { in mangleTemplateArg()
6089 mangleValueInTemplateArg(TPO->getType().getUnqualifiedType(), in mangleTemplateArg()
6090 TPO->getValue(), /*TopLevel=*/true, in mangleTemplateArg()
6097 if (D->isCXXInstanceMember()) in mangleTemplateArg()
6098 // Simple pointer-to-member with no conversion. in mangleTemplateArg()
6100 else if (D->getType()->isArrayType() && in mangleTemplateArg()
6101 Ctx.hasSimilarType(Ctx.getDecayedType(D->getType()), in mangleTemplateArg()
6104 // Build a value corresponding to this implicit array-to-pointer decay. in mangleTemplateArg()
6127 // <template-arg> ::= J <template-arg>* E in mangleTemplateArg()
6142 // Prior to Clang 12, we didn't omit the X .. E around <expr-primary> in mangleTemplateArgExpr()
6144 // constructed from an expression rather than an already-evaluated in mangleTemplateArgExpr()
6148 // We did special-case DeclRefExpr to attempt to DTRT for that one in mangleTemplateArgExpr()
6149 // expression-kind, but while doing so, unfortunately handled ParmVarDecl in mangleTemplateArgExpr()
6152 E = E->IgnoreParenImpCasts(); in mangleTemplateArgExpr()
6154 const ValueDecl *D = DRE->getDecl(); in mangleTemplateArgExpr()
6167 /// Determine whether a given value is equivalent to zero-initialization for
6171 /// value has an all-zeroes bit pattern.
6183 const CXXRecordDecl *RD = T->getAsCXXRecordDecl(); in isZeroInitialized()
6186 for (const CXXBaseSpecifier &BS : RD->bases()) { in isZeroInitialized()
6192 for (const FieldDecl *FD : RD->fields()) { in isZeroInitialized()
6193 if (!FD->isUnnamedBitField() && in isZeroInitialized()
6194 !isZeroInitialized(FD->getType(), V.getStructField(I))) in isZeroInitialized()
6202 const CXXRecordDecl *RD = T->getAsCXXRecordDecl(); in isZeroInitialized()
6204 // Zero-initialization zeroes the first non-unnamed-bitfield field, if any. in isZeroInitialized()
6205 for (const FieldDecl *FD : RD->fields()) { in isZeroInitialized()
6206 if (!FD->isUnnamedBitField()) in isZeroInitialized()
6208 isZeroInitialized(FD->getType(), V.getUnionValue()); in isZeroInitialized()
6211 // necessarily zero-initialized. in isZeroInitialized()
6216 QualType ElemT(T->getArrayElementTypeNoTypeQual(), 0); in isZeroInitialized()
6224 const VectorType *VT = T->castAs<VectorType>(); in isZeroInitialized()
6226 if (!isZeroInitialized(VT->getElementType(), V.getVectorElt(I))) in isZeroInitialized()
6261 T = AT->getElementType(); in getLValueType()
6264 T = FD->getType(); in getLValueType()
6276 // http://itanium-cxx-abi.github.io/cxx-abi/abi.html#mangling.anonymous in getUnionInitName()
6278 // to be the name of the first named data member found by a pre-order, in getUnionInitName()
6279 // depth-first, declaration-order walk of the data members of the anonymous in getUnionInitName()
6282 if (FD->getIdentifier()) in getUnionInitName()
6283 return FD->getIdentifier(); in getUnionInitName()
6289 if (FD->isBitField()) in getUnionInitName()
6291 const CXXRecordDecl *RD = FD->getType()->getAsCXXRecordDecl(); in getUnionInitName()
6293 // Consider only the fields in declaration order, searched depth-first. We in getUnionInitName()
6297 for (const FieldDecl *RDField : RD->fields()) { in getUnionInitName()
6316 // Ignore all top-level cv-qualifiers, to match GCC. in mangleValueInTemplateArg()
6320 // A top-level expression that's not a primary expression is wrapped in X...E. in mangleValueInTemplateArg()
6328 // Proposed in https://github.com/itanium-cxx-abi/cxx-abi/issues/63. in mangleValueInTemplateArg()
6341 const CXXRecordDecl *RD = T->getAsCXXRecordDecl(); in mangleValueInTemplateArg()
6344 // Drop trailing zero-initialized elements. in mangleValueInTemplateArg()
6345 llvm::SmallVector<const FieldDecl *, 16> Fields(RD->fields()); in mangleValueInTemplateArg()
6348 (Fields.back()->isUnnamedBitField() || in mangleValueInTemplateArg()
6349 isZeroInitialized(Fields.back()->getType(), in mangleValueInTemplateArg()
6350 V.getStructField(Fields.back()->getFieldIndex())))) { in mangleValueInTemplateArg()
6353 llvm::ArrayRef<CXXBaseSpecifier> Bases(RD->bases_begin(), RD->bases_end()); in mangleValueInTemplateArg()
6357 V.getStructBase(Bases.size() - 1))) in mangleValueInTemplateArg()
6361 // <expression> ::= tl <type> <braced-expression>* E in mangleValueInTemplateArg()
6368 if (Fields[I]->isUnnamedBitField()) in mangleValueInTemplateArg()
6370 mangleValueInTemplateArg(Fields[I]->getType(), in mangleValueInTemplateArg()
6371 V.getStructField(Fields[I]->getFieldIndex()), in mangleValueInTemplateArg()
6379 assert(T->getAsCXXRecordDecl() && "unexpected type for union value"); in mangleValueInTemplateArg()
6389 // <braced-expression> ::= di <field source-name> <braced-expression> in mangleValueInTemplateArg()
6396 T->getAsCXXRecordDecl()->getLocation(), Context.getDiags(), FD)); in mangleValueInTemplateArg()
6399 mangleValueInTemplateArg(FD->getType(), V.getUnionValue(), false); in mangleValueInTemplateArg()
6406 QualType ElemT(T->getArrayElementTypeNoTypeQual(), 0); in mangleValueInTemplateArg()
6412 // Drop trailing zero-initialized elements. in mangleValueInTemplateArg()
6416 while (N && isZeroInitialized(ElemT, V.getArrayInitializedElt(N - 1))) in mangleValueInTemplateArg()
6417 --N; in mangleValueInTemplateArg()
6431 const VectorType *VT = T->castAs<VectorType>(); in mangleValueInTemplateArg()
6437 while (N && isZeroInitialized(VT->getElementType(), V.getVectorElt(N - 1))) in mangleValueInTemplateArg()
6438 --N; in mangleValueInTemplateArg()
6440 mangleValueInTemplateArg(VT->getElementType(), V.getVectorElt(I), false); in mangleValueInTemplateArg()
6458 const ComplexType *CT = T->castAs<ComplexType>(); in mangleValueInTemplateArg()
6464 mangleFloatLiteral(CT->getElementType(), V.getComplexFloatReal()); in mangleValueInTemplateArg()
6466 mangleFloatLiteral(CT->getElementType(), V.getComplexFloatImag()); in mangleValueInTemplateArg()
6472 const ComplexType *CT = T->castAs<ComplexType>(); in mangleValueInTemplateArg()
6478 mangleIntegerLiteral(CT->getElementType(), V.getComplexIntReal()); in mangleValueInTemplateArg()
6480 mangleIntegerLiteral(CT->getElementType(), V.getComplexIntImag()); in mangleValueInTemplateArg()
6486 // Proposed in https://github.com/itanium-cxx-abi/cxx-abi/issues/47. in mangleValueInTemplateArg()
6487 assert((T->isPointerType() || T->isReferenceType()) && in mangleValueInTemplateArg()
6497 // Non-standard mangling for integer cast to a pointer; this can only in mangleValueInTemplateArg()
6522 if (T->isReferenceType()) { in mangleValueInTemplateArg()
6525 mangleType(T->getPointeeType()); in mangleValueInTemplateArg()
6534 // Clang 11 and before mangled an array subject to array-to-pointer decay in mangleValueInTemplateArg()
6541 BType->isArrayType() && V.getLValuePath().size() == 1 && in mangleValueInTemplateArg()
6552 if (NeedExactType && T->isVoidPointerType()) { in mangleValueInTemplateArg()
6556 if (T->isPointerType()) in mangleValueInTemplateArg()
6559 mangleType(T->isVoidPointerType() in mangleValueInTemplateArg()
6561 : T->getPointeeType()); in mangleValueInTemplateArg()
6565 !Ctx.hasSameType(T->getPointeeType(), getLValueType(Ctx, V)) && in mangleValueInTemplateArg()
6571 if (T->isPointerType()) { in mangleValueInTemplateArg()
6609 // <union-selector>* [p] E in mangleValueInTemplateArg()
6613 // We model a past-the-end array pointer as array indexing with index N, in mangleValueInTemplateArg()
6618 if (auto *AT = TypeSoFar->getAsArrayTypeUnsafe()) { in mangleValueInTemplateArg()
6620 OnePastTheEnd |= CAT->getSize() == E.getAsArrayIndex(); in mangleValueInTemplateArg()
6621 TypeSoFar = AT->getElementType(); in mangleValueInTemplateArg()
6625 // <union-selector> ::= _ <number> in mangleValueInTemplateArg()
6626 if (FD->getParent()->isUnion()) { in mangleValueInTemplateArg()
6628 if (FD->getFieldIndex()) in mangleValueInTemplateArg()
6629 Out << (FD->getFieldIndex() - 1); in mangleValueInTemplateArg()
6631 TypeSoFar = FD->getType(); in mangleValueInTemplateArg()
6648 // Proposed in https://github.com/itanium-cxx-abi/cxx-abi/issues/47. in mangleValueInTemplateArg()
6662 T->castAs<MemberPointerType>()->getPointeeType(), in mangleValueInTemplateArg()
6663 V.getMemberPointerDecl()->getType()) && in mangleValueInTemplateArg()
6686 // <template-param> ::= T_ # first template parameter in mangleTemplateParameter()
6687 // ::= T <parameter-2 non-negative number> _ in mangleTemplateParameter()
6688 // ::= TL <L-1 non-negative number> __ in mangleTemplateParameter()
6689 // ::= TL <L-1 non-negative number> _ in mangleTemplateParameter()
6690 // <parameter-2 non-negative number> _ in mangleTemplateParameter()
6693 // https://github.com/itanium-cxx-abi/cxx-abi/issues/31#issuecomment-528122117 in mangleTemplateParameter()
6697 Out << 'L' << (Depth - 1) << '_'; in mangleTemplateParameter()
6699 Out << (Index - 1); in mangleTemplateParameter()
6709 SeqID--; in mangleSeqID()
6711 // <seq-id> is encoded in base-36, using digits and upper case letters. in mangleSeqID()
6718 *I++ = (C < 10 ? '0' + C : 'A' + C - 10); in mangleSeqID()
6721 Out.write(I.base(), I - BufferRef.rbegin()); in mangleSeqID()
6732 // <substitution> ::= S <seq-id> _
6739 ND = cast<NamedDecl>(ND->getCanonicalDecl()); in mangleSubstitution()
6744 assert(NNS->getKind() == NestedNameSpecifier::Identifier && in mangleSubstitution()
6760 if (const RecordType *RT = T->getAs<RecordType>()) in mangleSubstitution()
6761 return mangleSubstitution(RT->getDecl()); in mangleSubstitution()
6783 unsigned SeqID = I->second; in mangleSubstitution()
6797 const RecordType *RT = S->getAs<RecordType>(); in isSpecializedAs()
6802 dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl()); in isSpecializedAs()
6803 if (!SD || !SD->getIdentifier()->isStr(Name)) in isSpecializedAs()
6809 const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); in isSpecializedAs()
6816 if (SD->getSpecializedTemplate()->getOwningModuleForLinkage()) in isSpecializedAs()
6828 if (!SD->getIdentifier()->isStr(Name)) in isStdCharSpecialization()
6831 const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); in isStdCharSpecialization()
6839 if (!A->isSpecificBuiltinType(BuiltinType::Char_S) && in isStdCharSpecialization()
6840 !A->isSpecificBuiltinType(BuiltinType::Char_U)) in isStdCharSpecialization()
6850 if (SD->getSpecializedTemplate()->getOwningModuleForLinkage()) in isStdCharSpecialization()
6870 if (TD->getOwningModuleForLinkage()) in mangleStandardSubstitution()
6874 if (TD->getIdentifier()->isStr("allocator")) { in mangleStandardSubstitution()
6880 if (TD->getIdentifier()->isStr("basic_string")) { in mangleStandardSubstitution()
6892 if (SD->getSpecializedTemplate()->getOwningModuleForLinkage()) in mangleStandardSubstitution()
6931 if (const RecordType *RT = T->getAs<RecordType>()) { in addSubstitution()
6932 addSubstitution(RT->getDecl()); in addSubstitution()
6955 assert(Other->SeqID >= SeqID && "Must be superset of substitutions!"); in extendSubstitutions()
6956 if (Other->SeqID > SeqID) { in extendSubstitutions()
6957 Substitutions.swap(Other->Substitutions); in extendSubstitutions()
6958 SeqID = Other->SeqID; in extendSubstitutions()
6973 cast<FunctionProtoType>(FD->getType()->getAs<FunctionType>()); in makeFunctionReturnTypeTags()
6976 TrackReturnTypeTags.mangleType(Proto->getReturnType()); in makeFunctionReturnTypeTags()
6993 TrackVariableType.mangleType(VD->getType()); in makeVariableTypeTags()
7014 /// emit the identifier of the declaration (\c D->getIdentifier()) as its
7073 const CXXRecordDecl *ThisRD = Thunk.ThisType->getPointeeCXXRecordDecl(); in mangleOverrideDiscrimination()
7082 PtrauthClassRD->getAttr<VTablePointerAuthenticationAttr>()) { in mangleOverrideDiscrimination()
7083 ManglerStream << "Lj" << ExplicitAuth->getKey(); in mangleOverrideDiscrimination()
7085 if (ExplicitAuth->getAddressDiscrimination() == in mangleOverrideDiscrimination()
7090 << (ExplicitAuth->getAddressDiscrimination() == in mangleOverrideDiscrimination()
7093 switch (ExplicitAuth->getExtraDiscrimination()) { in mangleOverrideDiscrimination()
7105 ManglerStream << "Lj" << ExplicitAuth->getCustomDiscriminationValue(); in mangleOverrideDiscrimination()
7127 // <special-name> ::= T <call-offset> <base encoding> in mangleThunk()
7129 // <special-name> ::= Tc <call-offset> <call-offset> <base encoding> in mangleThunk()
7131 // # first call-offset is 'this' adjustment in mangleThunk()
7132 // # second call-offset is result adjustment in mangleThunk()
7160 // <special-name> ::= T <call-offset> <base encoding> in mangleCXXDtorThunk()
7178 // <special-name> ::= GV <object name> # Guard variable for one-time in mangleStaticGuardVariable()
7190 // Clang has traditionally used this symbol and allowed LLVM to adjust it to in mangleDynamicInitializer()
7203 Mangler.getStream() << D->getName(); in mangleDynamicAtExitDestructor()
7208 // Clang generates these internal-linkage functions as part of its in mangleDynamicStermFinalizer()
7215 Mangler.getStream() << D->getName(); in mangleDynamicStermFinalizer()
7226 Mangler.getStream() << EnclosingFD->getName(); in mangleSEHFilterExpression()
7237 Mangler.getStream() << EnclosingFD->getName(); in mangleSEHFinallyBlock()
7242 // <special-name> ::= TH <object name> in mangleItaniumThreadLocalInit()
7251 // <special-name> ::= TW <object name> in mangleItaniumThreadLocalWrapper()
7261 // <special-name> ::= GR <object name> in mangleReferenceTemporary()
7266 Mangler.mangleSeqID(ManglingNumber - 1); in mangleReferenceTemporary()
7271 // <special-name> ::= TV <type> # virtual table in mangleCXXVTable()
7279 // <special-name> ::= TT <type> # VTT structure in mangleCXXVTT()
7289 // <special-name> ::= TC <type> <offset number> _ <base type> in mangleCXXCtorVTable()
7299 // <special-name> ::= TI <type> # typeinfo structure in mangleCXXRTTI()
7300 assert(!Ty.hasQualifiers() && "RTTI info cannot have top-level qualifiers"); in mangleCXXRTTI()
7308 // <special-name> ::= TS <type> # typeinfo name (null terminated byte string) in mangleCXXRTTIName()
7331 // <special-name> ::= GI <module-name> # module initializer function in mangleModuleInitializer()
7334 Mangler.mangleModuleNamePrefix(M->getPrimaryModuleInterfaceName()); in mangleModuleInitializer()
7335 if (M->isModulePartition()) { in mangleModuleInitializer()
7337 auto Partition = M->Name.find(':'); in mangleModuleInitializer()
7339 StringRef(&M->Name[Partition + 1], M->Name.size() - Partition - 1), in mangleModuleInitializer()
7349 [](ASTContext &, const NamedDecl *) -> std::optional<unsigned> { in create()