36#include "llvm/ADT/StringExtras.h"
37#include "llvm/Support/ErrorHandling.h"
38#include "llvm/Support/raw_ostream.h"
39#include "llvm/TargetParser/RISCVTargetParser.h"
46static bool isLocalContainerContext(
const DeclContext *DC) {
47 return isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC) || isa<BlockDecl>(DC);
52 return ftd->getTemplatedDecl();
59 return (fn ? getStructor(fn) :
decl);
62static bool isLambda(
const NamedDecl *ND) {
70static const unsigned UnknownArity = ~0
U;
73 typedef std::pair<const DeclContext*, IdentifierInfo*> DiscriminatorKeyTy;
74 llvm::DenseMap<DiscriminatorKeyTy, unsigned> Discriminator;
75 llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
76 const DiscriminatorOverrideTy DiscriminatorOverride =
nullptr;
79 bool NeedsUniqueInternalLinkageNames =
false;
82 explicit ItaniumMangleContextImpl(
84 DiscriminatorOverrideTy DiscriminatorOverride,
bool IsAux =
false)
86 DiscriminatorOverride(DiscriminatorOverride) {}
98 NeedsUniqueInternalLinkageNames =
true;
103 raw_ostream &)
override;
106 raw_ostream &)
override;
108 raw_ostream &)
override;
115 bool NormalizeIntegers)
override;
117 bool NormalizeIntegers)
override;
124 raw_ostream &Out)
override;
127 raw_ostream &Out)
override;
129 raw_ostream &Out)
override;
132 raw_ostream &)
override;
140 bool getNextDiscriminator(
const NamedDecl *ND,
unsigned &disc) {
146 if (
const TagDecl *Tag = dyn_cast<TagDecl>(ND)) {
147 if (Tag->getName().empty() && !Tag->getTypedefNameForAnonDecl())
154 if (discriminator == 1)
156 disc = discriminator - 2;
161 unsigned &discriminator = Uniquifier[ND];
162 if (!discriminator) {
163 const DeclContext *DC = getEffectiveDeclContext(ND);
164 discriminator = ++Discriminator[std::make_pair(DC, ND->
getIdentifier())];
166 if (discriminator == 1)
168 disc = discriminator-2;
175 assert(Lambda->
isLambda() &&
"RD must be a lambda!");
176 std::string Name(
"<lambda");
180 const ParmVarDecl *Parm = dyn_cast_or_null<ParmVarDecl>(LambdaContextDecl);
185 unsigned DefaultArgNo =
187 Name += llvm::utostr(DefaultArgNo);
191 if (LambdaManglingNumber)
192 LambdaId = LambdaManglingNumber;
196 Name += llvm::utostr(LambdaId);
202 return DiscriminatorOverride;
209 return getEffectiveDeclContext(cast<Decl>(DC));
212 bool isInternalLinkageDecl(
const NamedDecl *ND);
218class CXXNameMangler {
219 ItaniumMangleContextImpl &Context;
223 bool NormalizeIntegers =
false;
225 bool NullOut =
false;
230 bool DisableDerivedAbiTags =
false;
236 unsigned StructorType = 0;
241 unsigned TemplateDepthOffset = 0;
246 class FunctionTypeDepthState {
249 enum { InResultTypeMask = 1 };
252 FunctionTypeDepthState() =
default;
255 unsigned getDepth()
const {
260 bool isInResultType()
const {
261 return Bits & InResultTypeMask;
264 FunctionTypeDepthState push() {
265 FunctionTypeDepthState tmp = *
this;
266 Bits = (Bits & ~InResultTypeMask) + 2;
270 void enterResultType() {
271 Bits |= InResultTypeMask;
274 void leaveResultType() {
275 Bits &= ~InResultTypeMask;
278 void pop(FunctionTypeDepthState saved) {
279 assert(getDepth() == saved.getDepth() + 1);
294 class AbiTagState final {
296 explicit AbiTagState(AbiTagState *&Head) : LinkHead(Head) {
302 AbiTagState(
const AbiTagState &) =
delete;
303 AbiTagState &operator=(
const AbiTagState &) =
delete;
305 ~AbiTagState() { pop(); }
307 void write(raw_ostream &Out,
const NamedDecl *ND,
308 const AbiTagList *AdditionalAbiTags) {
310 if (!isa<FunctionDecl>(ND) && !isa<VarDecl>(ND)) {
312 !AdditionalAbiTags &&
313 "only function and variables need a list of additional abi tags");
314 if (
const auto *NS = dyn_cast<NamespaceDecl>(ND)) {
315 if (
const auto *AbiTag = NS->getAttr<AbiTagAttr>()) {
316 UsedAbiTags.insert(UsedAbiTags.end(), AbiTag->tags().begin(),
317 AbiTag->tags().end());
325 if (
const auto *AbiTag = ND->
getAttr<AbiTagAttr>()) {
326 UsedAbiTags.insert(UsedAbiTags.end(), AbiTag->tags().begin(),
327 AbiTag->tags().end());
328 TagList.insert(TagList.end(), AbiTag->tags().begin(),
329 AbiTag->tags().end());
332 if (AdditionalAbiTags) {
333 UsedAbiTags.insert(UsedAbiTags.end(), AdditionalAbiTags->begin(),
334 AdditionalAbiTags->end());
335 TagList.insert(TagList.end(), AdditionalAbiTags->begin(),
336 AdditionalAbiTags->end());
340 TagList.erase(std::unique(TagList.begin(), TagList.end()), TagList.end());
342 writeSortedUniqueAbiTags(Out, TagList);
345 const AbiTagList &getUsedAbiTags()
const {
return UsedAbiTags; }
346 void setUsedAbiTags(
const AbiTagList &AbiTags) {
347 UsedAbiTags = AbiTags;
350 const AbiTagList &getEmittedAbiTags()
const {
351 return EmittedAbiTags;
354 const AbiTagList &getSortedUniqueUsedAbiTags() {
355 llvm::sort(UsedAbiTags);
356 UsedAbiTags.erase(std::unique(UsedAbiTags.begin(), UsedAbiTags.end()),
363 AbiTagList UsedAbiTags;
365 AbiTagList EmittedAbiTags;
367 AbiTagState *&LinkHead;
368 AbiTagState *
Parent =
nullptr;
371 assert(LinkHead ==
this &&
372 "abi tag link head must point to us on destruction");
375 UsedAbiTags.begin(), UsedAbiTags.end());
376 Parent->EmittedAbiTags.insert(
Parent->EmittedAbiTags.end(),
377 EmittedAbiTags.begin(),
378 EmittedAbiTags.end());
383 void writeSortedUniqueAbiTags(raw_ostream &Out,
const AbiTagList &AbiTags) {
384 for (
const auto &Tag : AbiTags) {
385 EmittedAbiTags.push_back(Tag);
393 AbiTagState *AbiTags =
nullptr;
394 AbiTagState AbiTagsRoot;
396 llvm::DenseMap<uintptr_t, unsigned> Substitutions;
397 llvm::DenseMap<StringRef, unsigned> ModuleSubstitutions;
399 ASTContext &getASTContext()
const {
return Context.getASTContext(); }
402 return Context.getASTContext().
getLangOpts().getClangABICompat() <= Ver;
411 llvm::StringRef Name,
bool HasAllocator);
414 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
415 const NamedDecl *D =
nullptr,
bool NullOut_ =
false)
416 : Context(
C), Out(Out_), NullOut(NullOut_), Structor(getStructor(D)),
417 AbiTagsRoot(AbiTags) {
419 assert(!D || (!isa<CXXDestructorDecl>(D) &&
420 !isa<CXXConstructorDecl>(D)));
422 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
424 : Context(
C), Out(Out_), Structor(getStructor(D)), StructorType(
Type),
425 AbiTagsRoot(AbiTags) {}
426 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
428 : Context(
C), Out(Out_), Structor(getStructor(D)), StructorType(
Type),
429 AbiTagsRoot(AbiTags) {}
431 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
432 bool NormalizeIntegers_)
433 : Context(
C), Out(Out_), NormalizeIntegers(NormalizeIntegers_),
434 NullOut(
false), Structor(nullptr), AbiTagsRoot(AbiTags) {}
435 CXXNameMangler(CXXNameMangler &Outer, raw_ostream &Out_)
436 : Context(Outer.Context), Out(Out_), Structor(Outer.Structor),
437 StructorType(Outer.StructorType), SeqID(Outer.SeqID),
438 FunctionTypeDepth(Outer.FunctionTypeDepth), AbiTagsRoot(AbiTags),
439 Substitutions(Outer.Substitutions),
440 ModuleSubstitutions(Outer.ModuleSubstitutions) {}
442 CXXNameMangler(CXXNameMangler &Outer, llvm::raw_null_ostream &Out_)
443 : CXXNameMangler(Outer, (raw_ostream &)Out_) {
447 struct WithTemplateDepthOffset {
unsigned Offset; };
448 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out,
449 WithTemplateDepthOffset Offset)
450 : CXXNameMangler(
C, Out) {
451 TemplateDepthOffset = Offset.Offset;
454 raw_ostream &getStream() {
return Out; }
456 void disableDerivedAbiTags() { DisableDerivedAbiTags =
true; }
457 static bool shouldHaveAbiTags(ItaniumMangleContextImpl &
C,
const VarDecl *VD);
460 void mangleCallOffset(int64_t NonVirtual, int64_t
Virtual);
461 void mangleNumber(
const llvm::APSInt &I);
462 void mangleNumber(int64_t Number);
463 void mangleFloat(
const llvm::APFloat &F);
465 void mangleSeqID(
unsigned SeqID);
468 void mangleNameOrStandardSubstitution(
const NamedDecl *ND);
470 void mangleModuleNamePrefix(StringRef Name,
bool IsPartition =
false);
474 bool mangleSubstitution(
const NamedDecl *ND);
476 bool mangleSubstitution(
QualType T);
482 bool mangleStandardSubstitution(
const NamedDecl *ND);
484 void addSubstitution(
const NamedDecl *ND) {
487 addSubstitution(
reinterpret_cast<uintptr_t>(ND));
492 addSubstitution(
reinterpret_cast<uintptr_t>(NNS));
498 void extendSubstitutions(CXXNameMangler*
Other);
501 bool recursive =
false);
505 unsigned NumTemplateArgs,
506 unsigned KnownArity = UnknownArity);
508 void mangleFunctionEncodingBareType(
const FunctionDecl *FD);
511 const AbiTagList *AdditionalAbiTags);
512 void mangleModuleName(
const NamedDecl *ND);
516 const AbiTagList *AdditionalAbiTags) {
517 mangleUnqualifiedName(GD, cast<NamedDecl>(GD.
getDecl())->getDeclName(), DC,
518 UnknownArity, AdditionalAbiTags);
522 const AbiTagList *AdditionalAbiTags);
524 const AbiTagList *AdditionalAbiTags);
526 const AbiTagList *AdditionalAbiTags);
530 void mangleSourceNameWithAbiTags(
531 const NamedDecl *ND,
const AbiTagList *AdditionalAbiTags =
nullptr);
533 const AbiTagList *AdditionalAbiTags);
538 void mangleTypeConstraint(
const ConceptDecl *Concept,
541 void mangleRequiresClause(
const Expr *RequiresClause);
544 const AbiTagList *AdditionalAbiTags,
545 bool NoFunction=
false);
548 void mangleNestedNameWithClosurePrefix(
GlobalDecl GD,
550 const AbiTagList *AdditionalAbiTags);
552 void manglePrefix(
const DeclContext *DC,
bool NoFunction=
false);
554 void mangleTemplatePrefix(
GlobalDecl GD,
bool NoFunction=
false);
557 void mangleClosurePrefix(
const NamedDecl *ND,
bool NoFunction =
false);
558 bool mangleUnresolvedTypeOrSimpleId(
QualType DestroyedType,
559 StringRef Prefix =
"");
562 void mangleVendorQualifier(StringRef qualifier);
569#define ABSTRACT_TYPE(CLASS, PARENT)
570#define NON_CANONICAL_TYPE(CLASS, PARENT)
571#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T);
572#include "clang/AST/TypeNodes.inc"
574 void mangleType(
const TagType*);
576 static StringRef getCallingConvQualifierName(
CallingConv CC);
581 void mangleNeonVectorType(
const VectorType *T);
583 void mangleAArch64NeonVectorType(
const VectorType *T);
585 void mangleAArch64FixedSveVectorType(
const VectorType *T);
587 void mangleRISCVFixedRVVVectorType(
const VectorType *T);
590 void mangleIntegerLiteral(
QualType T,
const llvm::APSInt &
Value);
591 void mangleFloatLiteral(
QualType T,
const llvm::APFloat &
V);
592 void mangleFixedPointLiteral();
595 void mangleMemberExprBase(
const Expr *base,
bool isArrow);
596 void mangleMemberExpr(
const Expr *base,
bool isArrow,
601 unsigned NumTemplateArgs,
602 unsigned knownArity);
603 void mangleCastExpression(
const Expr *E, StringRef CastEncoding);
604 void mangleInitListElements(
const InitListExpr *InitList);
607 void mangleExpression(
const Expr *E,
unsigned Arity = UnknownArity,
608 bool AsTemplateArg =
false);
612 struct TemplateArgManglingInfo;
615 unsigned NumTemplateArgs);
618 void mangleTemplateArg(TemplateArgManglingInfo &Info,
unsigned Index,
621 void mangleTemplateArgExpr(
const Expr *E);
623 bool NeedExactType =
false);
625 void mangleTemplateParameter(
unsigned Depth,
unsigned Index);
630 const AbiTagList *AdditionalAbiTags);
633 AbiTagList makeFunctionReturnTypeTags(
const FunctionDecl *FD);
635 AbiTagList makeVariableTypeTags(
const VarDecl *VD);
643 getASTContext(), getASTContext().getTranslationUnitDecl(),
645 &getASTContext().Idents.get(
"std"),
655ItaniumMangleContextImpl::getEffectiveDeclContext(
const Decl *D) {
665 dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl()))
666 return ContextParam->getDeclContext();
670 if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
672 dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl()))
673 return ContextParam->getDeclContext();
681 if (D == getASTContext().getVaListTagDecl()) {
682 const llvm::Triple &T = getASTContext().getTargetInfo().getTriple();
683 if (T.isARM() || T.isThumb() || T.isAArch64())
684 return getStdNamespace();
688 if (isa<CapturedDecl>(DC) || isa<OMPDeclareReductionDecl>(DC) ||
689 isa<OMPDeclareMapperDecl>(DC)) {
690 return getEffectiveDeclContext(cast<Decl>(DC));
693 if (
const auto *VD = dyn_cast<VarDecl>(D))
695 return getASTContext().getTranslationUnitDecl();
697 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
699 return getASTContext().getTranslationUnitDecl();
702 if (FD->isMemberLikeConstrainedFriend() &&
703 getASTContext().getLangOpts().getClangABICompat() >
704 LangOptions::ClangABI::Ver17)
711bool ItaniumMangleContextImpl::isInternalLinkageDecl(
const NamedDecl *ND) {
714 getEffectiveDeclContext(ND)->isFileContext() &&
721bool ItaniumMangleContextImpl::isUniqueInternalLinkageDecl(
723 if (!NeedsUniqueInternalLinkageNames || !ND)
726 const auto *FD = dyn_cast<FunctionDecl>(ND);
735 if (isInternalLinkageDecl(ND))
741bool ItaniumMangleContextImpl::shouldMangleCXXName(
const NamedDecl *D) {
742 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
745 if (FD->hasAttr<OverloadableAttr>())
761 if (FD->isMSVCRTEntryPoint())
775 if (!getASTContext().getLangOpts().
CPlusPlus)
778 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
780 if (isa<DecompositionDecl>(VD))
789 const DeclContext *DC = getEffectiveDeclContext(D);
793 DC = getEffectiveParentContext(DC);
795 !CXXNameMangler::shouldHaveAbiTags(*
this, VD) &&
796 !isa<VarTemplateSpecializationDecl>(VD) &&
797 !VD->getOwningModuleForLinkage())
804void CXXNameMangler::writeAbiTags(
const NamedDecl *ND,
805 const AbiTagList *AdditionalAbiTags) {
806 assert(AbiTags &&
"require AbiTagState");
807 AbiTags->write(Out, ND, DisableDerivedAbiTags ?
nullptr : AdditionalAbiTags);
810void CXXNameMangler::mangleSourceNameWithAbiTags(
811 const NamedDecl *ND,
const AbiTagList *AdditionalAbiTags) {
813 writeAbiTags(ND, AdditionalAbiTags);
821 if (isa<FunctionDecl>(GD.
getDecl()))
822 mangleFunctionEncoding(GD);
827 dyn_cast<IndirectFieldDecl>(GD.
getDecl()))
828 mangleName(IFD->getAnonField());
830 llvm_unreachable(
"unexpected kind of global decl");
833void CXXNameMangler::mangleFunctionEncoding(
GlobalDecl GD) {
838 if (!Context.shouldMangleDeclName(FD)) {
843 AbiTagList ReturnTypeAbiTags = makeFunctionReturnTypeTags(FD);
844 if (ReturnTypeAbiTags.empty()) {
853 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
855 FunctionTypeDepth.pop(Saved);
856 mangleFunctionEncodingBareType(FD);
864 llvm::raw_svector_ostream FunctionEncodingStream(FunctionEncodingBuf);
865 CXXNameMangler FunctionEncodingMangler(*
this, FunctionEncodingStream);
867 FunctionEncodingMangler.disableDerivedAbiTags();
869 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
870 FunctionEncodingMangler.mangleNameWithAbiTags(FD,
nullptr);
871 FunctionTypeDepth.pop(Saved);
874 size_t EncodingPositionStart = FunctionEncodingStream.str().size();
875 FunctionEncodingMangler.mangleFunctionEncodingBareType(FD);
879 const AbiTagList &UsedAbiTags =
880 FunctionEncodingMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags();
881 AbiTagList AdditionalAbiTags(ReturnTypeAbiTags.size());
882 AdditionalAbiTags.erase(
883 std::set_difference(ReturnTypeAbiTags.begin(), ReturnTypeAbiTags.end(),
884 UsedAbiTags.begin(), UsedAbiTags.end(),
885 AdditionalAbiTags.begin()),
886 AdditionalAbiTags.end());
889 Saved = FunctionTypeDepth.push();
890 mangleNameWithAbiTags(FD, &AdditionalAbiTags);
891 FunctionTypeDepth.pop(Saved);
892 Out << FunctionEncodingStream.str().substr(EncodingPositionStart);
896 extendSubstitutions(&FunctionEncodingMangler);
899void CXXNameMangler::mangleFunctionEncodingBareType(
const FunctionDecl *FD) {
900 if (FD->
hasAttr<EnableIfAttr>()) {
901 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
902 Out <<
"Ua9enable_ifI";
903 for (AttrVec::const_iterator I = FD->
getAttrs().begin(),
906 EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I);
909 if (isCompatibleWith(LangOptions::ClangABI::Ver11)) {
914 mangleExpression(EIA->getCond());
917 mangleTemplateArgExpr(EIA->getCond());
921 FunctionTypeDepth.pop(Saved);
926 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD))
927 if (
auto Inherited = CD->getInheritedConstructor())
928 FD = Inherited.getConstructor();
946 bool MangleReturnType =
false;
948 if (!(isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD) ||
949 isa<CXXConversionDecl>(FD)))
950 MangleReturnType =
true;
953 FD = PrimaryTemplate->getTemplatedDecl();
957 MangleReturnType, FD);
962 if (!Context.getEffectiveParentContext(NS)->isTranslationUnit())
966 return II && II->
isStr(
"std");
971bool CXXNameMangler::isStdNamespace(
const DeclContext *DC) {
975 return isStd(cast<NamespaceDecl>(DC));
982 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
991 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
992 TemplateArgs = &Spec->getTemplateArgs();
993 return GD.
getWithDecl(Spec->getSpecializedTemplate());
998 dyn_cast<VarTemplateSpecializationDecl>(ND)) {
999 TemplateArgs = &Spec->getTemplateArgs();
1000 return GD.
getWithDecl(Spec->getSpecializedTemplate());
1011void CXXNameMangler::mangleName(
GlobalDecl GD) {
1013 if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1015 AbiTagList VariableTypeAbiTags = makeVariableTypeTags(VD);
1016 if (VariableTypeAbiTags.empty()) {
1018 mangleNameWithAbiTags(VD,
nullptr);
1023 llvm::raw_null_ostream NullOutStream;
1024 CXXNameMangler VariableNameMangler(*
this, NullOutStream);
1025 VariableNameMangler.disableDerivedAbiTags();
1026 VariableNameMangler.mangleNameWithAbiTags(VD,
nullptr);
1029 const AbiTagList &UsedAbiTags =
1030 VariableNameMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags();
1031 AbiTagList AdditionalAbiTags(VariableTypeAbiTags.size());
1032 AdditionalAbiTags.erase(
1033 std::set_difference(VariableTypeAbiTags.begin(),
1034 VariableTypeAbiTags.end(), UsedAbiTags.begin(),
1035 UsedAbiTags.end(), AdditionalAbiTags.begin()),
1036 AdditionalAbiTags.end());
1039 mangleNameWithAbiTags(VD, &AdditionalAbiTags);
1041 mangleNameWithAbiTags(GD,
nullptr);
1045const RecordDecl *CXXNameMangler::GetLocalClassDecl(
const Decl *D) {
1046 const DeclContext *DC = Context.getEffectiveDeclContext(D);
1048 if (isLocalContainerContext(DC))
1049 return dyn_cast<RecordDecl>(D);
1051 DC = Context.getEffectiveDeclContext(D);
1056void CXXNameMangler::mangleNameWithAbiTags(
GlobalDecl GD,
1057 const AbiTagList *AdditionalAbiTags) {
1064 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
1070 if (isLocalContainerContext(DC) && ND->
hasLinkage() && !isLambda(ND))
1072 DC = Context.getEffectiveParentContext(DC);
1073 else if (GetLocalClassDecl(ND)) {
1074 mangleLocalName(GD, AdditionalAbiTags);
1078 assert(!isa<LinkageSpecDecl>(DC) &&
"context cannot be LinkageSpecDecl");
1080 if (isLocalContainerContext(DC)) {
1081 mangleLocalName(GD, AdditionalAbiTags);
1087 if (
const NamedDecl *PrefixND = getClosurePrefix(ND)) {
1088 mangleNestedNameWithClosurePrefix(GD, PrefixND, AdditionalAbiTags);
1096 mangleUnscopedTemplateName(TD, DC, AdditionalAbiTags);
1101 mangleUnscopedName(GD, DC, AdditionalAbiTags);
1105 mangleNestedName(GD, DC, AdditionalAbiTags);
1108void CXXNameMangler::mangleModuleName(
const NamedDecl *ND) {
1111 mangleModuleNamePrefix(M->getPrimaryModuleInterfaceName());
1119void CXXNameMangler::mangleModuleNamePrefix(StringRef Name,
bool IsPartition) {
1121 auto It = ModuleSubstitutions.find(Name);
1122 if (It != ModuleSubstitutions.end()) {
1124 mangleSeqID(It->second);
1130 auto Parts = Name.rsplit(
'.');
1131 if (Parts.second.empty())
1132 Parts.second = Parts.first;
1134 mangleModuleNamePrefix(Parts.first, IsPartition);
1135 IsPartition =
false;
1141 Out << Parts.second.size() << Parts.second;
1142 ModuleSubstitutions.insert({Name, SeqID++});
1145void CXXNameMangler::mangleTemplateName(
const TemplateDecl *TD,
1147 const DeclContext *DC = Context.getEffectiveDeclContext(TD);
1150 mangleUnscopedTemplateName(TD, DC,
nullptr);
1153 mangleNestedName(TD, Args);
1158 const AbiTagList *AdditionalAbiTags) {
1162 assert(!isa<LinkageSpecDecl>(DC) &&
"unskipped LinkageSpecDecl");
1163 if (isStdNamespace(DC))
1166 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1169void CXXNameMangler::mangleUnscopedTemplateName(
1174 if (mangleSubstitution(ND))
1178 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
1179 assert(!AdditionalAbiTags &&
1180 "template template param cannot have abi tags");
1181 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
1182 }
else if (isa<BuiltinTemplateDecl>(ND) || isa<ConceptDecl>(ND)) {
1183 mangleUnscopedName(GD, DC, AdditionalAbiTags);
1189 addSubstitution(ND);
1192void CXXNameMangler::mangleFloat(
const llvm::APFloat &f) {
1206 llvm::APInt valueBits = f.bitcastToAPInt();
1207 unsigned numCharacters = (valueBits.getBitWidth() + 3) / 4;
1208 assert(numCharacters != 0);
1214 for (
unsigned stringIndex = 0; stringIndex != numCharacters; ++stringIndex) {
1216 unsigned digitBitIndex = 4 * (numCharacters - stringIndex - 1);
1219 uint64_t hexDigit = valueBits.getRawData()[digitBitIndex / 64];
1220 hexDigit >>= (digitBitIndex % 64);
1224 static const char charForHex[16] = {
1225 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
1226 '8',
'9',
'a',
'b',
'c',
'd',
'e',
'f'
1228 buffer[stringIndex] = charForHex[hexDigit];
1231 Out.write(buffer.data(), numCharacters);
1234void CXXNameMangler::mangleFloatLiteral(
QualType T,
const llvm::APFloat &
V) {
1241void CXXNameMangler::mangleFixedPointLiteral() {
1248void CXXNameMangler::mangleNullPointer(
QualType T) {
1255void CXXNameMangler::mangleNumber(
const llvm::APSInt &
Value) {
1256 if (
Value.isSigned() &&
Value.isNegative()) {
1264void CXXNameMangler::mangleNumber(int64_t Number) {
1274void CXXNameMangler::mangleCallOffset(int64_t NonVirtual, int64_t
Virtual) {
1282 mangleNumber(NonVirtual);
1288 mangleNumber(NonVirtual);
1296 if (!mangleSubstitution(
QualType(TST, 0))) {
1297 mangleTemplatePrefix(TST->getTemplateName());
1302 mangleTemplateArgs(TST->getTemplateName(), TST->template_arguments());
1305 }
else if (
const auto *DTST =
1307 if (!mangleSubstitution(
QualType(DTST, 0))) {
1308 TemplateName Template = getASTContext().getDependentTemplateName(
1309 DTST->getQualifier(), DTST->getIdentifier());
1310 mangleTemplatePrefix(Template);
1315 mangleTemplateArgs(Template, DTST->template_arguments());
1316 addSubstitution(
QualType(DTST, 0));
1346 switch (qualifier->
getKind()) {
1358 llvm_unreachable(
"Can't mangle __super specifier");
1362 mangleUnresolvedPrefix(qualifier->
getPrefix(),
1370 mangleUnresolvedPrefix(qualifier->
getPrefix(),
1387 mangleUnresolvedPrefix(qualifier->
getPrefix(),
1394 if (mangleUnresolvedTypeOrSimpleId(
QualType(
type, 0), recursive ?
"N" :
""))
1403 mangleUnresolvedPrefix(qualifier->
getPrefix(),
1421void CXXNameMangler::mangleUnresolvedName(
1424 unsigned knownArity) {
1425 if (qualifier) mangleUnresolvedPrefix(qualifier);
1426 switch (
name.getNameKind()) {
1429 mangleSourceName(
name.getAsIdentifierInfo());
1434 mangleUnresolvedTypeOrSimpleId(
name.getCXXNameType());
1441 mangleOperatorName(name, knownArity);
1444 llvm_unreachable(
"Can't mangle a constructor name!");
1446 llvm_unreachable(
"Can't mangle a using directive name!");
1448 llvm_unreachable(
"Can't mangle a deduction guide name!");
1452 llvm_unreachable(
"Can't mangle Objective-C selector names here!");
1458 mangleTemplateArgs(
TemplateName(), TemplateArgs, NumTemplateArgs);
1461void CXXNameMangler::mangleUnqualifiedName(
1463 unsigned KnownArity,
const AbiTagList *AdditionalAbiTags) {
1471 mangleModuleName(ND);
1475 auto *FD = dyn_cast<FunctionDecl>(ND);
1476 auto *FTD = dyn_cast<FunctionTemplateDecl>(ND);
1478 (FTD && FTD->getTemplatedDecl()->isMemberLikeConstrainedFriend())) {
1479 if (!isCompatibleWith(LangOptions::ClangABI::Ver17))
1483 unsigned Arity = KnownArity;
1484 switch (Name.getNameKind()) {
1489 if (
auto *DD = dyn_cast<DecompositionDecl>(ND)) {
1496 for (
auto *BD : DD->bindings())
1497 mangleSourceName(BD->getDeclName().getAsIdentifierInfo());
1499 writeAbiTags(ND, AdditionalAbiTags);
1503 if (
auto *GD = dyn_cast<MSGuidDecl>(ND)) {
1506 SmallString<
sizeof(
"_GUID_12345678_1234_1234_1234_1234567890ab")> GUID;
1507 llvm::raw_svector_ostream GUIDOS(GUID);
1508 Context.mangleMSGuidDecl(GD, GUIDOS);
1509 Out << GUID.size() << GUID;
1513 if (
auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
1516 mangleValueInTemplateArg(TPO->getType().getUnqualifiedType(),
1517 TPO->getValue(),
true);
1535 if (Context.isInternalLinkageDecl(ND))
1538 bool IsRegCall = FD &&
1542 FD && FD->
hasAttr<CUDAGlobalAttr>() &&
1545 mangleDeviceStubName(II);
1547 mangleRegCallName(II);
1549 mangleSourceName(II);
1551 writeAbiTags(ND, AdditionalAbiTags);
1556 assert(ND &&
"mangling empty name without declaration");
1558 if (
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
1561 Out <<
"12_GLOBAL__N_1";
1566 if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1580 &&
"Expected anonymous struct or union!");
1587 assert(FD->
getIdentifier() &&
"Data member name isn't an identifier!");
1600 if (isa<ObjCContainerDecl>(ND))
1604 const TagDecl *TD = cast<TagDecl>(ND);
1607 "Typedef should not be in another decl context!");
1608 assert(D->getDeclName().getAsIdentifierInfo() &&
1609 "Typedef was not named!");
1610 mangleSourceName(D->getDeclName().getAsIdentifierInfo());
1611 assert(!AdditionalAbiTags &&
"Type cannot have additional abi tags");
1614 writeAbiTags(TD,
nullptr);
1623 if (
const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(TD)) {
1624 std::optional<unsigned> DeviceNumber =
1625 Context.getDiscriminatorOverride()(Context.getASTContext(),
Record);
1631 if (
Record->isLambda() &&
1632 ((DeviceNumber && *DeviceNumber > 0) ||
1633 (!DeviceNumber &&
Record->getLambdaManglingNumber() > 0))) {
1634 assert(!AdditionalAbiTags &&
1635 "Lambda type cannot have additional abi tags");
1636 mangleLambda(Record);
1642 unsigned UnnamedMangle =
1643 getASTContext().getManglingNumber(TD, Context.isAux());
1645 if (UnnamedMangle > 1)
1646 Out << UnnamedMangle - 2;
1648 writeAbiTags(TD, AdditionalAbiTags);
1654 unsigned AnonStructId =
1656 : Context.getAnonymousStructId(TD, dyn_cast<FunctionDecl>(DC));
1663 Str += llvm::utostr(AnonStructId);
1673 llvm_unreachable(
"Can't mangle Objective-C selector names here!");
1679 if (
auto Inherited =
1680 cast<CXXConstructorDecl>(ND)->getInheritedConstructor()) {
1681 InheritedFrom = Inherited.getConstructor()->
getParent();
1682 InheritedTemplateName =
1683 TemplateName(Inherited.getConstructor()->getPrimaryTemplate());
1684 InheritedTemplateArgs =
1685 Inherited.getConstructor()->getTemplateSpecializationArgs();
1691 mangleCXXCtorType(
static_cast<CXXCtorType>(StructorType), InheritedFrom);
1699 if (InheritedTemplateArgs)
1700 mangleTemplateArgs(InheritedTemplateName, *InheritedTemplateArgs);
1702 writeAbiTags(ND, AdditionalAbiTags);
1710 mangleCXXDtorType(
static_cast<CXXDtorType>(StructorType));
1716 writeAbiTags(ND, AdditionalAbiTags);
1720 if (ND && Arity == UnknownArity) {
1721 Arity = cast<FunctionDecl>(ND)->getNumParams();
1724 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND))
1725 if (MD->isImplicitObjectMemberFunction())
1731 mangleOperatorName(Name, Arity);
1732 writeAbiTags(ND, AdditionalAbiTags);
1736 llvm_unreachable(
"Can't mangle a deduction guide name!");
1739 llvm_unreachable(
"Can't mangle a using directive name!");
1743void CXXNameMangler::mangleRegCallName(
const IdentifierInfo *II) {
1747 if (getASTContext().getLangOpts().RegCall4)
1748 Out << II->
getLength() +
sizeof(
"__regcall4__") - 1 <<
"__regcall4__"
1751 Out << II->
getLength() +
sizeof(
"__regcall3__") - 1 <<
"__regcall3__"
1755void CXXNameMangler::mangleDeviceStubName(
const IdentifierInfo *II) {
1759 Out << II->
getLength() +
sizeof(
"__device_stub__") - 1 <<
"__device_stub__"
1770void CXXNameMangler::mangleNestedName(
GlobalDecl GD,
1772 const AbiTagList *AdditionalAbiTags,
1781 if (
const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND)) {
1782 Qualifiers MethodQuals = Method->getMethodQualifiers();
1785 if (Method->isExplicitObjectMemberFunction())
1788 mangleQualifiers(MethodQuals);
1789 mangleRefQualifier(Method->getRefQualifier());
1795 mangleTemplatePrefix(TD, NoFunction);
1798 manglePrefix(DC, NoFunction);
1799 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1804void CXXNameMangler::mangleNestedName(
const TemplateDecl *TD,
1810 mangleTemplatePrefix(TD);
1816void CXXNameMangler::mangleNestedNameWithClosurePrefix(
1818 const AbiTagList *AdditionalAbiTags) {
1827 mangleClosurePrefix(PrefixND);
1828 mangleUnqualifiedName(GD,
nullptr, AdditionalAbiTags);
1839 if (
auto *CD = dyn_cast<CXXConstructorDecl>(DC))
1841 else if (
auto *DD = dyn_cast<CXXDestructorDecl>(DC))
1848void CXXNameMangler::mangleLocalName(
GlobalDecl GD,
1849 const AbiTagList *AdditionalAbiTags) {
1856 assert(isa<NamedDecl>(D) || isa<BlockDecl>(D));
1858 const DeclContext *DC = Context.getEffectiveDeclContext(RD ? RD : D);
1863 AbiTagState LocalAbiTags(AbiTags);
1866 mangleObjCMethodName(MD);
1867 else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(DC))
1868 mangleBlockForPrefix(BD);
1874 LocalAbiTags.setUsedAbiTags(LocalAbiTags.getEmittedAbiTags());
1897 mangleNumber(Num - 2);
1906 mangleUnqualifiedName(RD, DC, AdditionalAbiTags);
1907 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
1908 if (
const NamedDecl *PrefixND = getClosurePrefix(BD))
1909 mangleClosurePrefix(PrefixND,
true );
1911 manglePrefix(Context.getEffectiveDeclContext(BD),
true );
1912 assert(!AdditionalAbiTags &&
"Block cannot have additional abi tags");
1913 mangleUnqualifiedBlock(BD);
1915 const NamedDecl *ND = cast<NamedDecl>(D);
1916 mangleNestedName(GD, Context.getEffectiveDeclContext(ND),
1917 AdditionalAbiTags,
true );
1919 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
1923 = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) {
1929 mangleNumber(Num - 2);
1934 assert(!AdditionalAbiTags &&
"Block cannot have additional abi tags");
1935 mangleUnqualifiedBlock(BD);
1937 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1940 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(RD ? RD : D)) {
1942 if (Context.getNextDiscriminator(ND, disc)) {
1946 Out <<
"__" << disc <<
'_';
1951void CXXNameMangler::mangleBlockForPrefix(
const BlockDecl *
Block) {
1952 if (GetLocalClassDecl(
Block)) {
1953 mangleLocalName(
Block,
nullptr);
1957 if (isLocalContainerContext(DC)) {
1958 mangleLocalName(
Block,
nullptr);
1962 mangleClosurePrefix(PrefixND);
1965 mangleUnqualifiedBlock(
Block);
1968void CXXNameMangler::mangleUnqualifiedBlock(
const BlockDecl *
Block) {
1971 if (
Decl *Context =
Block->getBlockManglingContextDecl()) {
1972 if (isCompatibleWith(LangOptions::ClangABI::Ver12) &&
1973 (isa<VarDecl>(Context) || isa<FieldDecl>(Context)) &&
1974 Context->getDeclContext()->isRecord()) {
1975 const auto *ND = cast<NamedDecl>(Context);
1977 mangleSourceNameWithAbiTags(ND);
1984 unsigned Number =
Block->getBlockManglingNumber();
1988 Number = Context.getBlockId(
Block,
false);
2006void CXXNameMangler::mangleTemplateParamDecl(
const NamedDecl *
Decl) {
2008 if (
auto *Ty = dyn_cast<TemplateTypeParmDecl>(
Decl)) {
2009 if (Ty->isParameterPack())
2012 if (Constraint && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
2015 mangleTypeConstraint(Constraint);
2019 }
else if (
auto *Tn = dyn_cast<NonTypeTemplateParmDecl>(
Decl)) {
2020 if (Tn->isExpandedParameterPack()) {
2021 for (
unsigned I = 0, N = Tn->getNumExpansionTypes(); I != N; ++I) {
2023 mangleType(Tn->getExpansionType(I));
2027 if (Tn->isParameterPack()) {
2030 T = PackExpansion->getPattern();
2035 }
else if (
auto *Tt = dyn_cast<TemplateTemplateParmDecl>(
Decl)) {
2036 if (Tt->isExpandedParameterPack()) {
2037 for (
unsigned I = 0, N = Tt->getNumExpansionTemplateParameters(); I != N;
2039 mangleTemplateParameterList(Tt->getExpansionTemplateParameters(I));
2041 if (Tt->isParameterPack())
2043 mangleTemplateParameterList(Tt->getTemplateParameters());
2048void CXXNameMangler::mangleTemplateParameterList(
2051 for (
auto *Param : *Params)
2052 mangleTemplateParamDecl(Param);
2053 mangleRequiresClause(Params->getRequiresClause());
2057void CXXNameMangler::mangleTypeConstraint(
2059 const DeclContext *DC = Context.getEffectiveDeclContext(Concept);
2061 mangleTemplateName(Concept, Arguments);
2063 mangleUnscopedName(Concept, DC,
nullptr);
2065 mangleNestedName(Concept, DC,
nullptr);
2068void CXXNameMangler::mangleTypeConstraint(
const TypeConstraint *Constraint) {
2073 Args.push_back(ArgLoc.getArgument());
2078void CXXNameMangler::mangleRequiresClause(
const Expr *RequiresClause) {
2080 if (RequiresClause && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
2082 mangleExpression(RequiresClause);
2086void CXXNameMangler::mangleLambda(
const CXXRecordDecl *Lambda) {
2090 if (isCompatibleWith(LangOptions::ClangABI::Ver12) &&
2091 (isa<VarDecl>(Context) || isa<FieldDecl>(Context)) &&
2092 !isa<ParmVarDecl>(Context)) {
2095 mangleSourceName(Name);
2105 mangleLambdaSig(Lambda);
2119 std::optional<unsigned> DeviceNumber =
2120 Context.getDiscriminatorOverride()(Context.getASTContext(), Lambda);
2124 assert(Number > 0 &&
"Lambda should be mangled as an unnamed class");
2126 mangleNumber(Number - 2);
2130void CXXNameMangler::mangleLambdaSig(
const CXXRecordDecl *Lambda) {
2133 mangleTemplateParamDecl(D);
2137 mangleRequiresClause(TPL->getRequiresClause());
2141 mangleBareFunctionType(Proto,
false,
2146 switch (qualifier->
getKind()) {
2152 llvm_unreachable(
"Can't mangle __super specifier");
2169 bool Clang14Compat = isCompatibleWith(LangOptions::ClangABI::Ver14);
2170 if (!Clang14Compat && mangleSubstitution(qualifier))
2181 addSubstitution(qualifier);
2185 llvm_unreachable(
"unexpected nested name specifier");
2188void CXXNameMangler::manglePrefix(
const DeclContext *DC,
bool NoFunction) {
2196 assert(!isa<LinkageSpecDecl>(DC) &&
"prefix cannot be LinkageSpecDecl");
2201 if (NoFunction && isLocalContainerContext(DC))
2204 assert(!isLocalContainerContext(DC));
2206 const NamedDecl *ND = cast<NamedDecl>(DC);
2207 if (mangleSubstitution(ND))
2213 mangleTemplatePrefix(TD);
2215 }
else if (
const NamedDecl *PrefixND = getClosurePrefix(ND)) {
2216 mangleClosurePrefix(PrefixND, NoFunction);
2217 mangleUnqualifiedName(ND,
nullptr,
nullptr);
2219 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
2220 manglePrefix(DC, NoFunction);
2221 mangleUnqualifiedName(ND, DC,
nullptr);
2224 addSubstitution(ND);
2227void CXXNameMangler::mangleTemplatePrefix(
TemplateName Template) {
2232 return mangleTemplatePrefix(TD);
2235 assert(Dependent &&
"unexpected template name kind");
2239 bool Clang11Compat = isCompatibleWith(LangOptions::ClangABI::Ver11);
2240 if (!Clang11Compat && mangleSubstitution(Template))
2244 manglePrefix(Qualifier);
2246 if (Clang11Compat && mangleSubstitution(Template))
2250 mangleSourceName(
Id);
2252 mangleOperatorName(Dependent->getOperator(), UnknownArity);
2254 addSubstitution(Template);
2257void CXXNameMangler::mangleTemplatePrefix(
GlobalDecl GD,
2266 if (mangleSubstitution(ND))
2270 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
2271 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
2273 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
2274 manglePrefix(DC, NoFunction);
2275 if (isa<BuiltinTemplateDecl>(ND) || isa<ConceptDecl>(ND))
2276 mangleUnqualifiedName(GD, DC,
nullptr);
2282 addSubstitution(ND);
2285const NamedDecl *CXXNameMangler::getClosurePrefix(
const Decl *ND) {
2286 if (isCompatibleWith(LangOptions::ClangABI::Ver12))
2290 if (
auto *
Block = dyn_cast<BlockDecl>(ND)) {
2291 Context = dyn_cast_or_null<NamedDecl>(
Block->getBlockManglingContextDecl());
2292 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
2294 Context = dyn_cast_or_null<NamedDecl>(RD->getLambdaContextDecl());
2301 if ((isa<VarDecl>(Context) && cast<VarDecl>(Context)->hasGlobalStorage()) ||
2302 isa<FieldDecl>(Context))
2308void CXXNameMangler::mangleClosurePrefix(
const NamedDecl *ND,
bool NoFunction) {
2311 if (mangleSubstitution(ND))
2316 mangleTemplatePrefix(TD, NoFunction);
2319 const auto *DC = Context.getEffectiveDeclContext(ND);
2320 manglePrefix(DC, NoFunction);
2321 mangleUnqualifiedName(ND, DC,
nullptr);
2326 addSubstitution(ND);
2335 if (mangleSubstitution(TN))
2348 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TD))
2349 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
2356 llvm_unreachable(
"can't mangle an overloaded template name as a <type>");
2360 assert(Dependent->isIdentifier());
2364 mangleUnresolvedPrefix(Dependent->getQualifier());
2365 mangleSourceName(Dependent->getIdentifier());
2385 Out <<
"_SUBSTPACK_";
2390 addSubstitution(TN);
2393bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(
QualType Ty,
2399 case Type::Adjusted:
2402 case Type::BlockPointer:
2403 case Type::LValueReference:
2404 case Type::RValueReference:
2405 case Type::MemberPointer:
2406 case Type::ConstantArray:
2407 case Type::IncompleteArray:
2408 case Type::VariableArray:
2409 case Type::DependentSizedArray:
2410 case Type::DependentAddressSpace:
2411 case Type::DependentVector:
2412 case Type::DependentSizedExtVector:
2414 case Type::ExtVector:
2415 case Type::ConstantMatrix:
2416 case Type::DependentSizedMatrix:
2417 case Type::FunctionProto:
2418 case Type::FunctionNoProto:
2420 case Type::Attributed:
2421 case Type::BTFTagAttributed:
2423 case Type::DeducedTemplateSpecialization:
2424 case Type::PackExpansion:
2425 case Type::ObjCObject:
2426 case Type::ObjCInterface:
2427 case Type::ObjCObjectPointer:
2428 case Type::ObjCTypeParam:
2431 case Type::MacroQualified:
2433 case Type::DependentBitInt:
2434 llvm_unreachable(
"type is illegal as a nested name specifier");
2436 case Type::SubstTemplateTypeParmPack:
2441 Out <<
"_SUBSTPACK_";
2448 case Type::TypeOfExpr:
2450 case Type::Decltype:
2451 case Type::TemplateTypeParm:
2452 case Type::UnaryTransform:
2453 case Type::SubstTemplateTypeParm:
2467 mangleSourceNameWithAbiTags(cast<TypedefType>(Ty)->getDecl());
2470 case Type::UnresolvedUsing:
2471 mangleSourceNameWithAbiTags(
2472 cast<UnresolvedUsingType>(Ty)->getDecl());
2477 mangleSourceNameWithAbiTags(cast<TagType>(Ty)->getDecl());
2480 case Type::TemplateSpecialization: {
2482 cast<TemplateSpecializationType>(Ty);
2491 assert(TD &&
"no template for template specialization type");
2492 if (isa<TemplateTemplateParmDecl>(TD))
2493 goto unresolvedType;
2495 mangleSourceNameWithAbiTags(TD);
2502 llvm_unreachable(
"invalid base for a template specialization type");
2516 Out <<
"_SUBSTPACK_";
2521 assert(TD && !isa<TemplateTemplateParmDecl>(TD));
2522 mangleSourceNameWithAbiTags(TD);
2536 case Type::InjectedClassName:
2537 mangleSourceNameWithAbiTags(
2538 cast<InjectedClassNameType>(Ty)->getDecl());
2541 case Type::DependentName:
2542 mangleSourceName(cast<DependentNameType>(Ty)->
getIdentifier());
2545 case Type::DependentTemplateSpecialization: {
2547 cast<DependentTemplateSpecializationType>(Ty);
2548 TemplateName Template = getASTContext().getDependentTemplateName(
2556 return mangleUnresolvedTypeOrSimpleId(cast<UsingType>(Ty)->desugar(),
2558 case Type::Elaborated:
2559 return mangleUnresolvedTypeOrSimpleId(
2560 cast<ElaboratedType>(Ty)->getNamedType(), Prefix);
2566void CXXNameMangler::mangleOperatorName(
DeclarationName Name,
unsigned Arity) {
2567 switch (Name.getNameKind()) {
2576 llvm_unreachable(
"Not an operator name");
2581 mangleType(Name.getCXXNameType());
2586 mangleSourceName(Name.getCXXLiteralIdentifier());
2590 mangleOperatorName(Name.getCXXOverloadedOperator(), Arity);
2599 case OO_New: Out <<
"nw";
break;
2601 case OO_Array_New: Out <<
"na";
break;
2603 case OO_Delete: Out <<
"dl";
break;
2605 case OO_Array_Delete: Out <<
"da";
break;
2609 Out << (Arity == 1?
"ps" :
"pl");
break;
2613 Out << (Arity == 1?
"ng" :
"mi");
break;
2617 Out << (Arity == 1?
"ad" :
"an");
break;
2622 Out << (Arity == 1?
"de" :
"ml");
break;
2624 case OO_Tilde: Out <<
"co";
break;
2626 case OO_Slash: Out <<
"dv";
break;
2628 case OO_Percent: Out <<
"rm";
break;
2630 case OO_Pipe: Out <<
"or";
break;
2632 case OO_Caret: Out <<
"eo";
break;
2634 case OO_Equal: Out <<
"aS";
break;
2636 case OO_PlusEqual: Out <<
"pL";
break;
2638 case OO_MinusEqual: Out <<
"mI";
break;
2640 case OO_StarEqual: Out <<
"mL";
break;
2642 case OO_SlashEqual: Out <<
"dV";
break;
2644 case OO_PercentEqual: Out <<
"rM";
break;
2646 case OO_AmpEqual: Out <<
"aN";
break;
2648 case OO_PipeEqual: Out <<
"oR";
break;
2650 case OO_CaretEqual: Out <<
"eO";
break;
2652 case OO_LessLess: Out <<
"ls";
break;
2654 case OO_GreaterGreater: Out <<
"rs";
break;
2656 case OO_LessLessEqual: Out <<
"lS";
break;
2658 case OO_GreaterGreaterEqual: Out <<
"rS";
break;
2660 case OO_EqualEqual: Out <<
"eq";
break;
2662 case OO_ExclaimEqual: Out <<
"ne";
break;
2664 case OO_Less: Out <<
"lt";
break;
2666 case OO_Greater: Out <<
"gt";
break;
2668 case OO_LessEqual: Out <<
"le";
break;
2670 case OO_GreaterEqual: Out <<
"ge";
break;
2672 case OO_Exclaim: Out <<
"nt";
break;
2674 case OO_AmpAmp: Out <<
"aa";
break;
2676 case OO_PipePipe: Out <<
"oo";
break;
2678 case OO_PlusPlus: Out <<
"pp";
break;
2680 case OO_MinusMinus: Out <<
"mm";
break;
2682 case OO_Comma: Out <<
"cm";
break;
2684 case OO_ArrowStar: Out <<
"pm";
break;
2686 case OO_Arrow: Out <<
"pt";
break;
2688 case OO_Call: Out <<
"cl";
break;
2690 case OO_Subscript: Out <<
"ix";
break;
2695 case OO_Conditional: Out <<
"qu";
break;
2698 case OO_Coawait: Out <<
"aw";
break;
2701 case OO_Spaceship: Out <<
"ss";
break;
2705 llvm_unreachable(
"Not an overloaded operator");
2734 if (TargetAS != 0 ||
2736 ASString =
"AS" + llvm::utostr(TargetAS);
2739 default: llvm_unreachable(
"Not a language specific address space");
2743 case LangAS::opencl_global:
2744 ASString =
"CLglobal";
2746 case LangAS::opencl_global_device:
2747 ASString =
"CLdevice";
2749 case LangAS::opencl_global_host:
2750 ASString =
"CLhost";
2752 case LangAS::opencl_local:
2753 ASString =
"CLlocal";
2755 case LangAS::opencl_constant:
2756 ASString =
"CLconstant";
2758 case LangAS::opencl_private:
2759 ASString =
"CLprivate";
2761 case LangAS::opencl_generic:
2762 ASString =
"CLgeneric";
2766 case LangAS::sycl_global:
2767 ASString =
"SYglobal";
2769 case LangAS::sycl_global_device:
2770 ASString =
"SYdevice";
2772 case LangAS::sycl_global_host:
2773 ASString =
"SYhost";
2775 case LangAS::sycl_local:
2776 ASString =
"SYlocal";
2778 case LangAS::sycl_private:
2779 ASString =
"SYprivate";
2782 case LangAS::cuda_device:
2783 ASString =
"CUdevice";
2785 case LangAS::cuda_constant:
2786 ASString =
"CUconstant";
2788 case LangAS::cuda_shared:
2789 ASString =
"CUshared";
2792 case LangAS::ptr32_sptr:
2793 ASString =
"ptr32_sptr";
2795 case LangAS::ptr32_uptr:
2796 ASString =
"ptr32_uptr";
2803 if (!ASString.empty())
2804 mangleVendorQualifier(ASString);
2817 mangleVendorQualifier(
"__weak");
2821 mangleVendorQualifier(
"__unaligned");
2833 mangleVendorQualifier(
"__strong");
2837 mangleVendorQualifier(
"__autoreleasing");
2860void CXXNameMangler::mangleVendorQualifier(StringRef name) {
2867 switch (RefQualifier) {
2881void CXXNameMangler::mangleObjCMethodName(
const ObjCMethodDecl *MD) {
2882 Context.mangleObjCMethodNameAsSourceName(MD, Out);
2895 Ctx.
getLangOpts().getClangABICompat() > LangOptions::ClangABI::Ver17)
2901 if (Ctx.
getLangOpts().getClangABICompat() > LangOptions::ClangABI::Ver6 &&
2908 if (DeducedTST->getDeducedType().isNull())
2913void CXXNameMangler::mangleType(
QualType T) {
2954 = dyn_cast<TemplateSpecializationType>(T))
2972 const Type *ty = split.
Ty;
2974 bool isSubstitutable =
2976 if (isSubstitutable && mangleSubstitution(T))
2981 if (quals && isa<ArrayType>(T)) {
2991 dyn_cast<DependentAddressSpaceType>(ty)) {
2993 mangleQualifiers(splitDAST.
Quals, DAST);
2996 mangleQualifiers(quals);
3004#define ABSTRACT_TYPE(CLASS, PARENT)
3005#define NON_CANONICAL_TYPE(CLASS, PARENT) \
3007 llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
3009#define TYPE(CLASS, PARENT) \
3011 mangleType(static_cast<const CLASS##Type*>(ty)); \
3013#include "clang/AST/TypeNodes.inc"
3018 if (isSubstitutable)
3022void CXXNameMangler::mangleNameOrStandardSubstitution(
const NamedDecl *ND) {
3023 if (!mangleStandardSubstitution(ND))
3027void CXXNameMangler::mangleType(
const BuiltinType *T) {
3069 std::string type_name;
3073 if (NormalizeIntegers && T->
isInteger()) {
3075 switch (getASTContext().getTypeSize(T)) {
3079 if (mangleSubstitution(BuiltinType::SChar))
3082 addSubstitution(BuiltinType::SChar);
3085 if (mangleSubstitution(BuiltinType::Short))
3088 addSubstitution(BuiltinType::Short);
3091 if (mangleSubstitution(BuiltinType::Int))
3094 addSubstitution(BuiltinType::Int);
3097 if (mangleSubstitution(BuiltinType::Long))
3100 addSubstitution(BuiltinType::Long);
3103 if (mangleSubstitution(BuiltinType::Int128))
3106 addSubstitution(BuiltinType::Int128);
3109 llvm_unreachable(
"Unknown integer size for normalization");
3112 switch (getASTContext().getTypeSize(T)) {
3114 if (mangleSubstitution(BuiltinType::UChar))
3117 addSubstitution(BuiltinType::UChar);
3120 if (mangleSubstitution(BuiltinType::UShort))
3123 addSubstitution(BuiltinType::UShort);
3126 if (mangleSubstitution(BuiltinType::UInt))
3129 addSubstitution(BuiltinType::UInt);
3132 if (mangleSubstitution(BuiltinType::ULong))
3135 addSubstitution(BuiltinType::ULong);
3138 if (mangleSubstitution(BuiltinType::UInt128))
3141 addSubstitution(BuiltinType::UInt128);
3144 llvm_unreachable(
"Unknown integer size for normalization");
3150 case BuiltinType::Void:
3153 case BuiltinType::Bool:
3156 case BuiltinType::Char_U:
3157 case BuiltinType::Char_S:
3160 case BuiltinType::UChar:
3163 case BuiltinType::UShort:
3166 case BuiltinType::UInt:
3169 case BuiltinType::ULong:
3172 case BuiltinType::ULongLong:
3175 case BuiltinType::UInt128:
3178 case BuiltinType::SChar:
3181 case BuiltinType::WChar_S:
3182 case BuiltinType::WChar_U:
3185 case BuiltinType::Char8:
3188 case BuiltinType::Char16:
3191 case BuiltinType::Char32:
3194 case BuiltinType::Short:
3197 case BuiltinType::Int:
3200 case BuiltinType::Long:
3203 case BuiltinType::LongLong:
3206 case BuiltinType::Int128:
3209 case BuiltinType::Float16:
3212 case BuiltinType::ShortAccum:
3215 case BuiltinType::Accum:
3218 case BuiltinType::LongAccum:
3221 case BuiltinType::UShortAccum:
3224 case BuiltinType::UAccum:
3227 case BuiltinType::ULongAccum:
3230 case BuiltinType::ShortFract:
3233 case BuiltinType::Fract:
3236 case BuiltinType::LongFract:
3239 case BuiltinType::UShortFract:
3242 case BuiltinType::UFract:
3245 case BuiltinType::ULongFract:
3248 case BuiltinType::SatShortAccum:
3251 case BuiltinType::SatAccum:
3254 case BuiltinType::SatLongAccum:
3257 case BuiltinType::SatUShortAccum:
3260 case BuiltinType::SatUAccum:
3263 case BuiltinType::SatULongAccum:
3266 case BuiltinType::SatShortFract:
3269 case BuiltinType::SatFract:
3272 case BuiltinType::SatLongFract:
3275 case BuiltinType::SatUShortFract:
3278 case BuiltinType::SatUFract:
3281 case BuiltinType::SatULongFract:
3284 case BuiltinType::Half:
3287 case BuiltinType::Float:
3290 case BuiltinType::Double:
3293 case BuiltinType::LongDouble: {
3295 getASTContext().getLangOpts().OpenMP &&
3296 getASTContext().getLangOpts().OpenMPIsTargetDevice
3297 ? getASTContext().getAuxTargetInfo()
3298 : &getASTContext().getTargetInfo();
3302 case BuiltinType::Float128: {
3304 getASTContext().getLangOpts().OpenMP &&
3305 getASTContext().getLangOpts().OpenMPIsTargetDevice
3306 ? getASTContext().getAuxTargetInfo()
3307 : &getASTContext().getTargetInfo();
3311 case BuiltinType::BFloat16: {
3313 ((getASTContext().getLangOpts().OpenMP &&
3314 getASTContext().getLangOpts().OpenMPIsTargetDevice) ||
3315 getASTContext().getLangOpts().SYCLIsDevice)
3316 ? getASTContext().getAuxTargetInfo()
3317 : &getASTContext().getTargetInfo();
3321 case BuiltinType::Ibm128: {
3322 const TargetInfo *TI = &getASTContext().getTargetInfo();
3326 case BuiltinType::NullPtr:
3330#define BUILTIN_TYPE(Id, SingletonId)
3331#define PLACEHOLDER_TYPE(Id, SingletonId) \
3332 case BuiltinType::Id:
3333#include "clang/AST/BuiltinTypes.def"
3334 case BuiltinType::Dependent:
3336 llvm_unreachable(
"mangling a placeholder type");
3338 case BuiltinType::ObjCId:
3339 Out <<
"11objc_object";
3341 case BuiltinType::ObjCClass:
3342 Out <<
"10objc_class";
3344 case BuiltinType::ObjCSel:
3345 Out <<
"13objc_selector";
3347#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3348 case BuiltinType::Id: \
3349 type_name = "ocl_" #ImgType "_" #Suffix; \
3350 Out << type_name.size() << type_name; \
3352#include "clang/Basic/OpenCLImageTypes.def"
3353 case BuiltinType::OCLSampler:
3354 Out <<
"11ocl_sampler";
3356 case BuiltinType::OCLEvent:
3357 Out <<
"9ocl_event";
3359 case BuiltinType::OCLClkEvent:
3360 Out <<
"12ocl_clkevent";
3362 case BuiltinType::OCLQueue:
3363 Out <<
"9ocl_queue";
3365 case BuiltinType::OCLReserveID:
3366 Out <<
"13ocl_reserveid";
3368#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3369 case BuiltinType::Id: \
3370 type_name = "ocl_" #ExtType; \
3371 Out << type_name.size() << type_name; \
3373#include "clang/Basic/OpenCLExtensionTypes.def"
3377#define SVE_VECTOR_TYPE(InternalName, MangledName, Id, SingletonId, NumEls, \
3378 ElBits, IsSigned, IsFP, IsBF) \
3379 case BuiltinType::Id: \
3380 if (T->getKind() == BuiltinType::SveBFloat16 && \
3381 isCompatibleWith(LangOptions::ClangABI::Ver17)) { \
3383 type_name = "__SVBFloat16_t"; \
3384 Out << "u" << type_name.size() << type_name; \
3386 type_name = MangledName; \
3387 Out << (type_name == InternalName ? "u" : "") << type_name.size() \
3391#define SVE_PREDICATE_TYPE(InternalName, MangledName, Id, SingletonId, NumEls) \
3392 case BuiltinType::Id: \
3393 type_name = MangledName; \
3394 Out << (type_name == InternalName ? "u" : "") << type_name.size() \
3397#define SVE_OPAQUE_TYPE(InternalName, MangledName, Id, SingletonId) \
3398 case BuiltinType::Id: \
3399 type_name = MangledName; \
3400 Out << (type_name == InternalName ? "u" : "") << type_name.size() \
3403#include "clang/Basic/AArch64SVEACLETypes.def"
3404#define PPC_VECTOR_TYPE(Name, Id, Size) \
3405 case BuiltinType::Id: \
3406 type_name = #Name; \
3407 Out << 'u' << type_name.size() << type_name; \
3409#include "clang/Basic/PPCTypes.def"
3411#define RVV_TYPE(Name, Id, SingletonId) \
3412 case BuiltinType::Id: \
3414 Out << 'u' << type_name.size() << type_name; \
3416#include "clang/Basic/RISCVVTypes.def"
3417#define WASM_REF_TYPE(InternalName, MangledName, Id, SingletonId, AS) \
3418 case BuiltinType::Id: \
3419 type_name = MangledName; \
3420 Out << 'u' << type_name.size() << type_name; \
3422#include "clang/Basic/WebAssemblyReferenceTypes.def"
3426StringRef CXXNameMangler::getCallingConvQualifierName(
CallingConv CC) {
3467 return "swiftasynccall";
3469 llvm_unreachable(
"bad calling convention");
3472void CXXNameMangler::mangleExtFunctionInfo(
const FunctionType *T) {
3481 StringRef CCQualifier = getCallingConvQualifierName(T->
getExtInfo().
getCC());
3482 if (!CCQualifier.empty())
3483 mangleVendorQualifier(CCQualifier);
3497 case ParameterABI::Ordinary:
3501 case ParameterABI::SwiftContext:
3502 case ParameterABI::SwiftAsyncContext:
3503 case ParameterABI::SwiftErrorResult:
3504 case ParameterABI::SwiftIndirectResult:
3510 mangleVendorQualifier(
"ns_consumed");
3513 mangleVendorQualifier(
"noescape");
3520 mangleExtFunctionInfo(T);
3537 mangleType(ExceptTy);
3548 mangleBareFunctionType(T,
true);
3562 FunctionTypeDepthState saved = FunctionTypeDepth.push();
3564 FunctionTypeDepth.enterResultType();
3566 FunctionTypeDepth.leaveResultType();
3568 FunctionTypeDepth.pop(saved);
3573 bool MangleReturnType,
3577 FunctionTypeDepthState saved = FunctionTypeDepth.push();
3580 if (MangleReturnType) {
3581 FunctionTypeDepth.enterResultType();
3585 mangleVendorQualifier(
"ns_returns_retained");
3590 auto SplitReturnTy = ReturnTy.
split();
3592 ReturnTy = getASTContext().getQualifiedType(SplitReturnTy);
3594 mangleType(ReturnTy);
3596 FunctionTypeDepth.leaveResultType();
3604 for (
unsigned I = 0, E = Proto->
getNumParams(); I != E; ++I) {
3618 assert(
Attr->getType() <= 9 &&
Attr->getType() >= 0);
3619 if (
Attr->isDynamic())
3620 Out <<
"U25pass_dynamic_object_size" <<
Attr->getType();
3622 Out <<
"U17pass_object_size" <<
Attr->getType();
3633 FunctionTypeDepth.enterResultType();
3637 FunctionTypeDepth.pop(saved);
3648void CXXNameMangler::mangleType(
const EnumType *T) {
3649 mangleType(
static_cast<const TagType*
>(T));
3651void CXXNameMangler::mangleType(
const RecordType *T) {
3652 mangleType(
static_cast<const TagType*
>(T));
3654void CXXNameMangler::mangleType(
const TagType *T) {
3662 Out <<
'A' << T->
getSize() <<
'_';
3715 mangleType(PointeeType);
3729 Out <<
"_SUBSTPACK_";
3733void CXXNameMangler::mangleType(
const PointerType *T) {
3755void CXXNameMangler::mangleType(
const ComplexType *T) {
3763void CXXNameMangler::mangleNeonVectorType(
const VectorType *T) {
3765 assert(EltType->
isBuiltinType() &&
"Neon vector element not a BuiltinType");
3766 const char *EltName =
nullptr;
3768 switch (cast<BuiltinType>(EltType)->
getKind()) {
3769 case BuiltinType::SChar:
3770 case BuiltinType::UChar:
3771 EltName =
"poly8_t";
3773 case BuiltinType::Short:
3774 case BuiltinType::UShort:
3775 EltName =
"poly16_t";
3777 case BuiltinType::LongLong:
3778 case BuiltinType::ULongLong:
3779 EltName =
"poly64_t";
3781 default: llvm_unreachable(
"unexpected Neon polynomial vector element type");
3784 switch (cast<BuiltinType>(EltType)->
getKind()) {
3785 case BuiltinType::SChar: EltName =
"int8_t";
break;
3786 case BuiltinType::UChar: EltName =
"uint8_t";
break;
3787 case BuiltinType::Short: EltName =
"int16_t";
break;
3788 case BuiltinType::UShort: EltName =
"uint16_t";
break;
3789 case BuiltinType::Int: EltName =
"int32_t";
break;
3790 case BuiltinType::UInt: EltName =
"uint32_t";
break;
3791 case BuiltinType::LongLong: EltName =
"int64_t";
break;
3792 case BuiltinType::ULongLong: EltName =
"uint64_t";
break;
3793 case BuiltinType::Double: EltName =
"float64_t";
break;
3794 case BuiltinType::Float: EltName =
"float32_t";
break;
3795 case BuiltinType::Half: EltName =
"float16_t";
break;
3796 case BuiltinType::BFloat16: EltName =
"bfloat16_t";
break;
3798 llvm_unreachable(
"unexpected Neon vector element type");
3801 const char *BaseName =
nullptr;
3803 getASTContext().getTypeSize(EltType));
3805 BaseName =
"__simd64_";
3807 assert(BitSize == 128 &&
"Neon vector type not 64 or 128 bits");
3808 BaseName =
"__simd128_";
3810 Out << strlen(BaseName) + strlen(EltName);
3811 Out << BaseName << EltName;
3818 "cannot mangle this dependent neon vector type yet");
3824 case BuiltinType::SChar:
3826 case BuiltinType::Short:
3828 case BuiltinType::Int:
3830 case BuiltinType::Long:
3831 case BuiltinType::LongLong:
3833 case BuiltinType::UChar:
3835 case BuiltinType::UShort:
3837 case BuiltinType::UInt:
3839 case BuiltinType::ULong:
3840 case BuiltinType::ULongLong:
3842 case BuiltinType::Half:
3844 case BuiltinType::Float:
3846 case BuiltinType::Double:
3848 case BuiltinType::BFloat16:
3851 llvm_unreachable(
"Unexpected vector element base type");
3858void CXXNameMangler::mangleAArch64NeonVectorType(
const VectorType *T) {
3860 assert(EltType->
isBuiltinType() &&
"Neon vector element not a BuiltinType");
3865 assert((BitSize == 64 || BitSize == 128) &&
3866 "Neon vector type not 64 or 128 bits");
3870 switch (cast<BuiltinType>(EltType)->
getKind()) {
3871 case BuiltinType::UChar:
3874 case BuiltinType::UShort:
3877 case BuiltinType::ULong:
3878 case BuiltinType::ULongLong:
3882 llvm_unreachable(
"unexpected Neon polynomial vector element type");
3888 (
"__" + EltName +
"x" + Twine(T->
getNumElements()) +
"_t").str();
3895 "cannot mangle this dependent neon vector type yet");
3923void CXXNameMangler::mangleAArch64FixedSveVectorType(
const VectorType *T) {
3924 assert((T->
getVectorKind() == VectorKind::SveFixedLengthData ||
3925 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) &&
3926 "expected fixed-length SVE vector!");
3930 "expected builtin type for fixed-length SVE vector!");
3933 switch (cast<BuiltinType>(EltType)->
getKind()) {
3934 case BuiltinType::SChar:
3937 case BuiltinType::UChar: {
3944 case BuiltinType::Short:
3947 case BuiltinType::UShort:
3950 case BuiltinType::Int:
3953 case BuiltinType::UInt:
3956 case BuiltinType::Long:
3959 case BuiltinType::ULong:
3962 case BuiltinType::Half:
3965 case BuiltinType::Float:
3968 case BuiltinType::Double:
3971 case BuiltinType::BFloat16:
3975 llvm_unreachable(
"unexpected element type for fixed-length SVE vector!");
3978 unsigned VecSizeInBits = getASTContext().getTypeInfo(T).Width;
3980 if (T->
getVectorKind() == VectorKind::SveFixedLengthPredicate)
3984 << VecSizeInBits <<
"EE";
3987void CXXNameMangler::mangleAArch64FixedSveVectorType(
3992 "cannot mangle this dependent fixed-length SVE vector type yet");
3996void CXXNameMangler::mangleRISCVFixedRVVVectorType(
const VectorType *T) {
3997 assert(T->
getVectorKind() == VectorKind::RVVFixedLengthData &&
3998 "expected fixed-length RVV vector!");
4002 "expected builtin type for fixed-length RVV vector!");
4005 llvm::raw_svector_ostream TypeNameOS(TypeNameStr);
4006 TypeNameOS <<
"__rvv_";
4007 switch (cast<BuiltinType>(EltType)->
getKind()) {
4008 case BuiltinType::SChar:
4009 TypeNameOS <<
"int8";
4011 case BuiltinType::UChar:
4012 TypeNameOS <<
"uint8";
4014 case BuiltinType::Short:
4015 TypeNameOS <<
"int16";
4017 case BuiltinType::UShort:
4018 TypeNameOS <<
"uint16";
4020 case BuiltinType::Int:
4021 TypeNameOS <<
"int32";
4023 case BuiltinType::UInt:
4024 TypeNameOS <<
"uint32";
4026 case BuiltinType::Long:
4027 TypeNameOS <<
"int64";
4029 case BuiltinType::ULong:
4030 TypeNameOS <<
"uint64";
4032 case BuiltinType::Float16:
4033 TypeNameOS <<
"float16";
4035 case BuiltinType::Float:
4036 TypeNameOS <<
"float32";
4038 case BuiltinType::Double:
4039 TypeNameOS <<
"float64";
4042 llvm_unreachable(
"unexpected element type for fixed-length RVV vector!");
4045 unsigned VecSizeInBits = getASTContext().getTypeInfo(T).Width;
4048 auto VScale = getASTContext().getTargetInfo().getVScaleRange(
4049 getASTContext().getLangOpts());
4050 unsigned VLen = VScale->first * llvm::RISCV::RVVBitsPerBlock;
4052 if (VecSizeInBits >= VLen)
4053 TypeNameOS << (VecSizeInBits / VLen);
4055 TypeNameOS <<
'f' << (VLen / VecSizeInBits);
4059 Out <<
"9__RVV_VLSI" <<
'u' << TypeNameStr.size() << TypeNameStr <<
"Lj"
4060 << VecSizeInBits <<
"EE";
4063void CXXNameMangler::mangleRISCVFixedRVVVectorType(
4068 "cannot mangle this dependent fixed-length RVV vector type yet");
4080void CXXNameMangler::mangleType(
const VectorType *T) {
4083 llvm::Triple
Target = getASTContext().getTargetInfo().getTriple();
4084 llvm::Triple::ArchType Arch =
4085 getASTContext().getTargetInfo().getTriple().getArch();
4086 if ((Arch == llvm::Triple::aarch64 ||
4087 Arch == llvm::Triple::aarch64_be) && !
Target.isOSDarwin())
4088 mangleAArch64NeonVectorType(T);
4090 mangleNeonVectorType(T);
4092 }
else if (T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4093 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) {
4094 mangleAArch64FixedSveVectorType(T);
4096 }
else if (T->
getVectorKind() == VectorKind::RVVFixedLengthData) {
4097 mangleRISCVFixedRVVVectorType(T);
4112 llvm::Triple
Target = getASTContext().getTargetInfo().getTriple();
4113 llvm::Triple::ArchType Arch =
4114 getASTContext().getTargetInfo().getTriple().getArch();
4115 if ((Arch == llvm::Triple::aarch64 || Arch == llvm::Triple::aarch64_be) &&
4117 mangleAArch64NeonVectorType(T);
4119 mangleNeonVectorType(T);
4121 }
else if (T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4122 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) {
4123 mangleAArch64FixedSveVectorType(T);
4125 }
else if (T->
getVectorKind() == VectorKind::RVVFixedLengthData) {
4126 mangleRISCVFixedRVVVectorType(T);
4142 mangleType(
static_cast<const VectorType*
>(T));
4155 StringRef VendorQualifier =
"matrix_type";
4156 Out <<
"u" << VendorQualifier.size() << VendorQualifier;
4159 auto &ASTCtx = getASTContext();
4160 unsigned BitWidth = ASTCtx.getTypeSize(ASTCtx.getSizeType());
4161 llvm::APSInt Rows(BitWidth);
4163 mangleIntegerLiteral(ASTCtx.getSizeType(), Rows);
4164 llvm::APSInt Columns(BitWidth);
4166 mangleIntegerLiteral(ASTCtx.getSizeType(), Columns);
4174 StringRef VendorQualifier =
"matrix_type";
4175 Out <<
"u" << VendorQualifier.size() << VendorQualifier;
4186 mangleQualifiers(split.
Quals, T);
4203 Out <<
"U8__kindof";
4208 llvm::raw_svector_ostream QualOS(QualStr);
4209 QualOS <<
"objcproto";
4210 for (
const auto *I : T->
quals()) {
4211 StringRef
name = I->getName();
4214 Out <<
'U' << QualStr.size() << QualStr;
4223 mangleType(typeArg);
4229 Out <<
"U13block_pointer";
4244 if (mangleSubstitution(
QualType(T, 0)))
4269 case ElaboratedTypeKeyword::None:
4270 case ElaboratedTypeKeyword::Typename:
4272 case ElaboratedTypeKeyword::Struct:
4273 case ElaboratedTypeKeyword::Class:
4274 case ElaboratedTypeKeyword::Interface:
4277 case ElaboratedTypeKeyword::Union:
4280 case ElaboratedTypeKeyword::Enum:
4297 getASTContext().getDependentTemplateName(T->
getQualifier(),
4299 mangleTemplatePrefix(Prefix);
4308void CXXNameMangler::mangleType(
const TypeOfType *T) {
4320void CXXNameMangler::mangleType(
const DecltypeType *T) {
4331 if (isa<DeclRefExpr>(E) ||
4332 isa<MemberExpr>(E) ||
4333 isa<UnresolvedLookupExpr>(E) ||
4334 isa<DependentScopeDeclRefExpr>(E) ||
4335 isa<CXXDependentScopeMemberExpr>(E) ||
4336 isa<UnresolvedMemberExpr>(E))
4340 mangleExpression(E);
4350 StringRef BuiltinName;
4352#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
4353 case UnaryTransformType::Enum: \
4354 BuiltinName = "__" #Trait; \
4356#include "clang/Basic/TransformTypeTraits.def"
4358 Out << BuiltinName.size() << BuiltinName;
4366void CXXNameMangler::mangleType(
const AutoType *T) {
4368 "Deduced AutoType shouldn't be handled here!");
4369 assert(T->
getKeyword() != AutoTypeKeyword::GNUAutoType &&
4370 "shouldn't need to mangle __auto_type!");
4375 if (T->
isConstrained() && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
4387 return mangleType(Deduced);
4390 assert(TD &&
"shouldn't form deduced TST unless we know we have a template");
4392 if (mangleSubstitution(TD))
4396 addSubstitution(TD);
4399void CXXNameMangler::mangleType(
const AtomicType *T) {
4406void CXXNameMangler::mangleType(
const PipeType *T) {
4413void CXXNameMangler::mangleType(
const BitIntType *T) {
4429void CXXNameMangler::mangleIntegerLiteral(
QualType T,
4430 const llvm::APSInt &
Value) {
4437 Out << (
Value.getBoolValue() ?
'1' :
'0');
4439 mangleNumber(
Value);
4445void CXXNameMangler::mangleMemberExprBase(
const Expr *
Base,
bool IsArrow) {
4448 if (!RT->getDecl()->isAnonymousStructOrUnion())
4450 const auto *ME = dyn_cast<MemberExpr>(
Base);
4453 Base = ME->getBase();
4454 IsArrow = ME->isArrow();
4457 if (
Base->isImplicitCXXThis()) {
4463 Out << (IsArrow ?
"pt" :
"dt");
4464 mangleExpression(
Base);
4469void CXXNameMangler::mangleMemberExpr(
const Expr *base,
4475 unsigned NumTemplateArgs,
4480 mangleMemberExprBase(base, isArrow);
4481 mangleUnresolvedName(qualifier, member, TemplateArgs, NumTemplateArgs, arity);
4494 if (callee == fn)
return false;
4498 if (!lookup)
return false;
4515void CXXNameMangler::mangleCastExpression(
const Expr *E, StringRef CastEncoding) {
4517 Out << CastEncoding;
4522void CXXNameMangler::mangleInitListElements(
const InitListExpr *InitList) {
4524 InitList = Syntactic;
4525 for (
unsigned i = 0, e = InitList->
getNumInits(); i != e; ++i)
4526 mangleExpression(InitList->
getInit(i));
4529void CXXNameMangler::mangleRequirement(
SourceLocation RequiresExprLoc,
4536 auto HandleSubstitutionFailure =
4541 "containing a substitution failure");
4542 Diags.
Report(Loc, DiagID);
4547 case Requirement::RK_Type: {
4548 const auto *TR = cast<concepts::TypeRequirement>(Req);
4549 if (TR->isSubstitutionFailure())
4550 return HandleSubstitutionFailure(
4551 TR->getSubstitutionDiagnostic()->DiagLoc);
4554 mangleType(TR->getType()->getType());
4558 case Requirement::RK_Simple:
4559 case Requirement::RK_Compound: {
4560 const auto *ER = cast<concepts::ExprRequirement>(Req);
4561 if (ER->isExprSubstitutionFailure())
4562 return HandleSubstitutionFailure(
4563 ER->getExprSubstitutionDiagnostic()->DiagLoc);
4566 mangleExpression(ER->getExpr());
4568 if (ER->hasNoexceptRequirement())
4571 if (!ER->getReturnTypeRequirement().isEmpty()) {
4572 if (ER->getReturnTypeRequirement().isSubstitutionFailure())
4573 return HandleSubstitutionFailure(ER->getReturnTypeRequirement()
4574 .getSubstitutionDiagnostic()
4578 mangleTypeConstraint(ER->getReturnTypeRequirement().getTypeConstraint());
4583 case Requirement::RK_Nested:
4584 const auto *NR = cast<concepts::NestedRequirement>(Req);
4585 if (NR->hasInvalidConstraint()) {
4588 return HandleSubstitutionFailure(RequiresExprLoc);
4592 mangleExpression(NR->getConstraintExpr());
4597void CXXNameMangler::mangleExpression(
const Expr *E,
unsigned Arity,
4598 bool AsTemplateArg) {
4627 QualType ImplicitlyConvertedToType;
4631 bool IsPrimaryExpr =
true;
4632 auto NotPrimaryExpr = [&] {
4633 if (AsTemplateArg && IsPrimaryExpr)
4635 IsPrimaryExpr =
false;
4638 auto MangleDeclRefExpr = [&](
const NamedDecl *D) {
4639 switch (D->getKind()) {
4649 mangleFunctionParam(cast<ParmVarDecl>(D));
4652 case Decl::EnumConstant: {
4659 case Decl::NonTypeTemplateParm:
4672 case Expr::NoStmtClass:
4673#define ABSTRACT_STMT(Type)
4674#define EXPR(Type, Base)
4675#define STMT(Type, Base) \
4676 case Expr::Type##Class:
4677#include "clang/AST/StmtNodes.inc"
4682 case Expr::AddrLabelExprClass:
4683 case Expr::DesignatedInitUpdateExprClass:
4684 case Expr::ImplicitValueInitExprClass:
4685 case Expr::ArrayInitLoopExprClass:
4686 case Expr::ArrayInitIndexExprClass:
4687 case Expr::NoInitExprClass:
4688 case Expr::ParenListExprClass:
4689 case Expr::MSPropertyRefExprClass:
4690 case Expr::MSPropertySubscriptExprClass:
4691 case Expr::TypoExprClass:
4692 case Expr::RecoveryExprClass:
4693 case Expr::OMPArraySectionExprClass:
4694 case Expr::OMPArrayShapingExprClass:
4695 case Expr::OMPIteratorExprClass:
4696 case Expr::CXXInheritedCtorInitExprClass:
4697 case Expr::CXXParenListInitExprClass:
4698 llvm_unreachable(
"unexpected statement kind");
4700 case Expr::ConstantExprClass:
4701 E = cast<ConstantExpr>(E)->getSubExpr();
4705 case Expr::BlockExprClass:
4706 case Expr::ChooseExprClass:
4707 case Expr::CompoundLiteralExprClass:
4708 case Expr::ExtVectorElementExprClass:
4709 case Expr::GenericSelectionExprClass:
4710 case Expr::ObjCEncodeExprClass:
4711 case Expr::ObjCIsaExprClass:
4712 case Expr::ObjCIvarRefExprClass:
4713 case Expr::ObjCMessageExprClass:
4714 case Expr::ObjCPropertyRefExprClass:
4715 case Expr::ObjCProtocolExprClass:
4716 case Expr::ObjCSelectorExprClass:
4717 case Expr::ObjCStringLiteralClass:
4718 case Expr::ObjCBoxedExprClass:
4719 case Expr::ObjCArrayLiteralClass:
4720 case Expr::ObjCDictionaryLiteralClass:
4721 case Expr::ObjCSubscriptRefExprClass:
4722 case Expr::ObjCIndirectCopyRestoreExprClass:
4723 case Expr::ObjCAvailabilityCheckExprClass:
4724 case Expr::OffsetOfExprClass:
4725 case Expr::PredefinedExprClass:
4726 case Expr::ShuffleVectorExprClass:
4727 case Expr::ConvertVectorExprClass:
4728 case Expr::StmtExprClass:
4729 case Expr::ArrayTypeTraitExprClass:
4730 case Expr::ExpressionTraitExprClass:
4731 case Expr::VAArgExprClass:
4732 case Expr::CUDAKernelCallExprClass:
4733 case Expr::AsTypeExprClass:
4734 case Expr::PseudoObjectExprClass:
4735 case Expr::AtomicExprClass:
4736 case Expr::SourceLocExprClass:
4737 case Expr::BuiltinBitCastExprClass:
4744 "cannot yet mangle expression type %0");
4752 case Expr::CXXUuidofExprClass: {
4757 if (!isCompatibleWith(LangOptions::ClangABI::Ver11)) {
4758 Out <<
"u8__uuidof";
4767 Out <<
"u8__uuidoft";
4771 Out <<
"u8__uuidofz";
4772 mangleExpression(UuidExp);
4779 case Expr::BinaryConditionalOperatorClass: {
4784 "?: operator with omitted middle operand cannot be mangled");
4791 case Expr::OpaqueValueExprClass:
4792 llvm_unreachable(
"cannot mangle opaque value; mangling wrong thing?");
4794 case Expr::InitListExprClass: {
4797 mangleInitListElements(cast<InitListExpr>(E));
4802 case Expr::DesignatedInitExprClass: {
4804 auto *DIE = cast<DesignatedInitExpr>(E);
4805 for (
const auto &
Designator : DIE->designators()) {
4811 mangleExpression(DIE->getArrayIndex(
Designator));
4814 "unknown designator kind");
4816 mangleExpression(DIE->getArrayRangeStart(
Designator));
4817 mangleExpression(DIE->getArrayRangeEnd(
Designator));
4820 mangleExpression(DIE->getInit());
4824 case Expr::CXXDefaultArgExprClass:
4825 E = cast<CXXDefaultArgExpr>(E)->getExpr();
4828 case Expr::CXXDefaultInitExprClass:
4829 E = cast<CXXDefaultInitExpr>(E)->getExpr();
4832 case Expr::CXXStdInitializerListExprClass:
4833 E = cast<CXXStdInitializerListExpr>(E)->getSubExpr();
4836 case Expr::SubstNonTypeTemplateParmExprClass:
4837 E = cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement();
4840 case Expr::UserDefinedLiteralClass:
4843 case Expr::CXXMemberCallExprClass:
4844 case Expr::CallExprClass: {
4846 const CallExpr *CE = cast<CallExpr>(E);
4865 if (isa<PackExpansionExpr>(Arg))
4866 CallArity = UnknownArity;
4868 mangleExpression(CE->
getCallee(), CallArity);
4870 mangleExpression(Arg);
4875 case Expr::CXXNewExprClass: {
4879 Out << (New->
isArray() ?
"na" :
"nw");
4882 mangleExpression(*I);
4896 mangleExpression(*I);
4898 for (
unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i)
4899 mangleExpression(PLE->getExpr(i));
4901 CXXNewInitializationStyle::List &&
4902 isa<InitListExpr>(
Init)) {
4904 mangleInitListElements(cast<InitListExpr>(
Init));
4906 mangleExpression(
Init);
4912 case Expr::CXXPseudoDestructorExprClass: {
4914 const auto *PDE = cast<CXXPseudoDestructorExpr>(E);
4915 if (
const Expr *
Base = PDE->getBase())
4916 mangleMemberExprBase(
Base, PDE->isArrow());
4920 mangleUnresolvedPrefix(Qualifier,
4922 mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType());
4926 if (!mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType()))
4929 }
else if (Qualifier) {
4930 mangleUnresolvedPrefix(Qualifier);
4934 QualType DestroyedType = PDE->getDestroyedType();
4935 mangleUnresolvedTypeOrSimpleId(DestroyedType);
4939 case Expr::MemberExprClass: {
4950 case Expr::UnresolvedMemberExprClass: {
4961 case Expr::CXXDependentScopeMemberExprClass: {
4964 = cast<CXXDependentScopeMemberExpr>(E);
4974 case Expr::UnresolvedLookupExprClass: {
4983 case Expr::CXXUnresolvedConstructExprClass: {
4989 assert(N == 1 &&
"unexpected form for list initialization");
4990 auto *IL = cast<InitListExpr>(CE->
getArg(0));
4993 mangleInitListElements(IL);
5000 if (N != 1) Out <<
'_';
5001 for (
unsigned I = 0; I != N; ++I) mangleExpression(CE->
getArg(I));
5002 if (N != 1) Out <<
'E';
5006 case Expr::CXXConstructExprClass: {
5008 const auto *CE = cast<CXXConstructExpr>(E);
5013 "implicit CXXConstructExpr must have one argument");
5014 E = cast<CXXConstructExpr>(E)->getArg(0);
5020 mangleExpression(E);
5025 case Expr::CXXTemporaryObjectExprClass: {
5027 const auto *CE = cast<CXXTemporaryObjectExpr>(E);
5036 if (!List && N != 1)
5038 if (CE->isStdInitListInitialization()) {
5044 auto *ILE = cast<InitListExpr>(SILE->getSubExpr()->IgnoreImplicit());
5045 mangleInitListElements(ILE);
5048 mangleExpression(E);
5055 case Expr::CXXScalarValueInitExprClass:
5062 case Expr::CXXNoexceptExprClass:
5065 mangleExpression(cast<CXXNoexceptExpr>(E)->getOperand());
5068 case Expr::UnaryExprOrTypeTraitExprClass: {
5087 : ImplicitlyConvertedToType;
5089 mangleIntegerLiteral(T,
V);
5095 auto MangleAlignofSizeofArg = [&] {
5108 MangleAlignofSizeofArg();
5110 case UETT_PreferredAlignOf:
5114 if (!isCompatibleWith(LangOptions::ClangABI::Ver11)) {
5115 Out <<
"u11__alignof__";
5126 MangleAlignofSizeofArg();
5128 case UETT_DataSizeOf: {
5132 "cannot yet mangle __datasizeof expression");
5136 case UETT_VecStep: {
5139 "cannot yet mangle vec_step expression");
5143 case UETT_OpenMPRequiredSimdAlign: {
5147 "cannot yet mangle __builtin_omp_required_simd_align expression");
5151 case UETT_VectorElements: {
5155 "cannot yet mangle __builtin_vectorelements expression");
5163 case Expr::TypeTraitExprClass: {
5169 Out << Spelling.size() << Spelling;
5171 mangleType(TSI->getType());
5177 case Expr::CXXThrowExprClass: {
5191 case Expr::CXXTypeidExprClass: {
5206 case Expr::CXXDeleteExprClass: {
5217 case Expr::UnaryOperatorClass: {
5226 case Expr::ArraySubscriptExprClass: {
5233 mangleExpression(AE->
getLHS());
5234 mangleExpression(AE->
getRHS());
5238 case Expr::MatrixSubscriptExprClass: {
5242 mangleExpression(ME->
getBase());
5248 case Expr::CompoundAssignOperatorClass:
5249 case Expr::BinaryOperatorClass: {
5257 mangleExpression(BO->
getLHS());
5258 mangleExpression(BO->
getRHS());
5262 case Expr::CXXRewrittenBinaryOperatorClass: {
5266 cast<CXXRewrittenBinaryOperator>(E)->getDecomposedForm();
5269 mangleExpression(Decomposed.
LHS);
5270 mangleExpression(Decomposed.
RHS);
5274 case Expr::ConditionalOperatorClass: {
5277 mangleOperatorName(OO_Conditional, 3);
5278 mangleExpression(CO->
getCond());
5279 mangleExpression(CO->
getLHS(), Arity);
5280 mangleExpression(CO->
getRHS(), Arity);
5284 case Expr::ImplicitCastExprClass: {
5285 ImplicitlyConvertedToType = E->
getType();
5286 E = cast<ImplicitCastExpr>(E)->getSubExpr();
5290 case Expr::ObjCBridgedCastExprClass: {
5294 StringRef
Kind = cast<ObjCBridgedCastExpr>(E)->getBridgeKindName();
5295 Out <<
"v1U" <<
Kind.size() <<
Kind;
5296 mangleCastExpression(E,
"cv");
5300 case Expr::CStyleCastExprClass:
5302 mangleCastExpression(E,
"cv");
5305 case Expr::CXXFunctionalCastExprClass: {
5307 auto *
Sub = cast<ExplicitCastExpr>(E)->getSubExpr()->IgnoreImplicit();
5309 if (
auto *CCE = dyn_cast<CXXConstructExpr>(Sub))
5310 if (CCE->getParenOrBraceRange().isInvalid())
5311 Sub = CCE->getArg(0)->IgnoreImplicit();
5312 if (
auto *StdInitList = dyn_cast<CXXStdInitializerListExpr>(Sub))
5313 Sub = StdInitList->getSubExpr()->IgnoreImplicit();
5314 if (
auto *IL = dyn_cast<InitListExpr>(Sub)) {
5317 mangleInitListElements(IL);
5320 mangleCastExpression(E,
"cv");
5325 case Expr::CXXStaticCastExprClass:
5327 mangleCastExpression(E,
"sc");
5329 case Expr::CXXDynamicCastExprClass:
5331 mangleCastExpression(E,
"dc");
5333 case Expr::CXXReinterpretCastExprClass:
5335 mangleCastExpression(E,
"rc");
5337 case Expr::CXXConstCastExprClass:
5339 mangleCastExpression(E,
"cc");
5341 case Expr::CXXAddrspaceCastExprClass:
5343 mangleCastExpression(E,
"ac");
5346 case Expr::CXXOperatorCallExprClass: {
5355 for (
unsigned i = 0; i != NumArgs; ++i)
5356 mangleExpression(CE->
getArg(i));
5360 case Expr::ParenExprClass:
5361 E = cast<ParenExpr>(E)->getSubExpr();
5364 case Expr::ConceptSpecializationExprClass: {
5365 auto *CSE = cast<ConceptSpecializationExpr>(E);
5366 if (isCompatibleWith(LangOptions::ClangABI::Ver17)) {
5371 mangleTemplateName(CSE->getNamedConcept(), CSE->getTemplateArguments());
5377 mangleUnresolvedName(
5378 CSE->getNestedNameSpecifierLoc().getNestedNameSpecifier(),
5379 CSE->getConceptNameInfo().getName(),
5380 CSE->getTemplateArgsAsWritten()->getTemplateArgs(),
5381 CSE->getTemplateArgsAsWritten()->getNumTemplateArgs());
5385 case Expr::RequiresExprClass: {
5387 auto *RE = cast<RequiresExpr>(E);
5391 if (RE->getLParenLoc().isValid()) {
5393 FunctionTypeDepthState saved = FunctionTypeDepth.push();
5394 if (RE->getLocalParameters().empty()) {
5397 for (
ParmVarDecl *Param : RE->getLocalParameters()) {
5405 FunctionTypeDepth.enterResultType();
5407 mangleRequirement(RE->getExprLoc(), Req);
5408 FunctionTypeDepth.pop(saved);
5413 mangleRequirement(RE->getExprLoc(), Req);
5419 case Expr::DeclRefExprClass:
5421 MangleDeclRefExpr(cast<DeclRefExpr>(E)->getDecl());
5424 case Expr::SubstNonTypeTemplateParmPackExprClass:
5430 Out <<
"_SUBSTPACK_";
5433 case Expr::FunctionParmPackExprClass: {
5437 Out <<
"v110_SUBSTPACK";
5442 case Expr::DependentScopeDeclRefExprClass: {
5451 case Expr::CXXBindTemporaryExprClass:
5452 E = cast<CXXBindTemporaryExpr>(E)->getSubExpr();
5455 case Expr::ExprWithCleanupsClass:
5456 E = cast<ExprWithCleanups>(E)->getSubExpr();
5459 case Expr::FloatingLiteralClass: {
5466 case Expr::FixedPointLiteralClass:
5468 mangleFixedPointLiteral();
5471 case Expr::CharacterLiteralClass:
5475 Out << cast<CharacterLiteral>(E)->getValue();
5480 case Expr::ObjCBoolLiteralExprClass:
5483 Out << (cast<ObjCBoolLiteralExpr>(E)->getValue() ?
'1' :
'0');
5487 case Expr::CXXBoolLiteralExprClass:
5490 Out << (cast<CXXBoolLiteralExpr>(E)->getValue() ?
'1' :
'0');
5494 case Expr::IntegerLiteralClass: {
5496 llvm::APSInt
Value(cast<IntegerLiteral>(E)->getValue());
5498 Value.setIsSigned(
true);
5503 case Expr::ImaginaryLiteralClass: {
5511 dyn_cast<FloatingLiteral>(IE->
getSubExpr())) {
5513 mangleFloat(llvm::APFloat(Imag->getValue().getSemantics()));
5515 mangleFloat(Imag->getValue());
5518 llvm::APSInt
Value(cast<IntegerLiteral>(IE->
getSubExpr())->getValue());
5520 Value.setIsSigned(
true);
5521 mangleNumber(
Value);
5527 case Expr::StringLiteralClass: {
5531 assert(isa<ConstantArrayType>(E->
getType()));
5537 case Expr::GNUNullExprClass:
5540 mangleIntegerLiteral(E->
getType(), llvm::APSInt(32));
5543 case Expr::CXXNullPtrLiteralExprClass: {
5549 case Expr::LambdaExprClass: {
5554 mangleType(Context.getASTContext().
getRecordType(cast<LambdaExpr>(E)->getLambdaClass()));
5559 case Expr::PackExpansionExprClass:
5562 mangleExpression(cast<PackExpansionExpr>(E)->getPattern());
5565 case Expr::SizeOfPackExprClass: {
5567 auto *SPE = cast<SizeOfPackExpr>(E);
5568 if (SPE->isPartiallySubstituted()) {
5570 for (
const auto &A : SPE->getPartialArguments())
5571 mangleTemplateArg(A,
false);
5579 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
5581 = dyn_cast<NonTypeTemplateParmDecl>(Pack))
5582 mangleTemplateParameter(NTTP->getDepth(), NTTP->getIndex());
5584 = dyn_cast<TemplateTemplateParmDecl>(Pack))
5585 mangleTemplateParameter(TempTP->getDepth(), TempTP->getIndex());
5587 mangleFunctionParam(cast<ParmVarDecl>(Pack));
5591 case Expr::MaterializeTemporaryExprClass:
5592 E = cast<MaterializeTemporaryExpr>(E)->getSubExpr();
5595 case Expr::CXXFoldExprClass: {
5597 auto *FE = cast<CXXFoldExpr>(E);
5598 if (FE->isLeftFold())
5599 Out << (FE->getInit() ?
"fL" :
"fl");
5601 Out << (FE->getInit() ?
"fR" :
"fr");
5603 if (FE->getOperator() == BO_PtrMemD)
5611 mangleExpression(FE->getLHS());
5613 mangleExpression(FE->getRHS());
5617 case Expr::CXXThisExprClass:
5622 case Expr::CoawaitExprClass:
5625 Out <<
"v18co_await";
5626 mangleExpression(cast<CoawaitExpr>(E)->getOperand());
5629 case Expr::DependentCoawaitExprClass:
5632 Out <<
"v18co_await";
5633 mangleExpression(cast<DependentCoawaitExpr>(E)->getOperand());
5636 case Expr::CoyieldExprClass:
5639 Out <<
"v18co_yield";
5640 mangleExpression(cast<CoawaitExpr>(E)->getOperand());
5642 case Expr::SYCLUniqueStableNameExprClass: {
5643 const auto *USN = cast<SYCLUniqueStableNameExpr>(E);
5646 Out <<
"u33__builtin_sycl_unique_stable_name";
5647 mangleType(USN->getTypeSourceInfo()->getType());
5654 if (AsTemplateArg && !IsPrimaryExpr)
5686void CXXNameMangler::mangleFunctionParam(
const ParmVarDecl *parm) {
5693 assert(parmDepth < FunctionTypeDepth.getDepth());
5694 unsigned nestingDepth = FunctionTypeDepth.getDepth() - parmDepth;
5695 if (FunctionTypeDepth.isInResultType())
5698 if (nestingDepth == 0) {
5701 Out <<
"fL" << (nestingDepth - 1) <<
'p';
5709 &&
"parameter's type is still an array type?");
5712 dyn_cast<DependentAddressSpaceType>(parm->
getType())) {
5719 if (parmIndex != 0) {
5720 Out << (parmIndex - 1);
5725void CXXNameMangler::mangleCXXCtorType(
CXXCtorType T,
5748 llvm_unreachable(
"closure constructors don't exist for the Itanium ABI!");
5751 mangleName(InheritedFrom);
5754void CXXNameMangler::mangleCXXDtorType(
CXXDtorType T) {
5805 if (
auto *FTD = dyn_cast_or_null<FunctionTemplateDecl>(
ResolvedTemplate)) {
5806 auto *RD = dyn_cast<CXXRecordDecl>(FTD->getDeclContext());
5807 if (!RD || !RD->isGenericLambda())
5823 if (
auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
5824 return TTP->hasTypeConstraint();
5841 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param))
5842 return NTTP->getType()->isInstantiationDependentType() ||
5843 NTTP->getType()->getContainedDeducedType();
5847 auto *TTP = cast<TemplateTemplateParmDecl>(Param);
5858 auto MangleTemplateParamListToString =
5860 unsigned DepthOffset) {
5861 llvm::raw_svector_ostream Stream(Buffer);
5862 CXXNameMangler(
Mangler.Context, Stream,
5863 WithTemplateDepthOffset{DepthOffset})
5864 .mangleTemplateParameterList(Params);
5867 MangleTemplateParamListToString(ParamTemplateHead,
5868 TTP->getTemplateParameters(), 0);