35#include "llvm/ADT/StringExtras.h"
36#include "llvm/Support/ErrorHandling.h"
37#include "llvm/Support/raw_ostream.h"
38#include "llvm/TargetParser/RISCVTargetParser.h"
42namespace UnsupportedItaniumManglingKind =
43 clang::diag::UnsupportedItaniumManglingKind;
47static bool isLocalContainerContext(
const DeclContext *DC) {
51static const FunctionDecl *getStructor(
const FunctionDecl *fn) {
53 return ftd->getTemplatedDecl();
58static const NamedDecl *getStructor(
const NamedDecl *
decl) {
59 const FunctionDecl *fn = dyn_cast_or_null<FunctionDecl>(
decl);
60 return (fn ? getStructor(fn) :
decl);
63static bool isLambda(
const NamedDecl *ND) {
64 const CXXRecordDecl *
Record = dyn_cast<CXXRecordDecl>(ND);
71static const unsigned UnknownArity = ~0U;
73class ItaniumMangleContextImpl :
public ItaniumMangleContext {
74 using DiscriminatorKeyTy = std::pair<const DeclContext *, IdentifierInfo *>;
75 llvm::DenseMap<DiscriminatorKeyTy, unsigned> Discriminator;
76 llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier;
77 const DiscriminatorOverrideTy DiscriminatorOverride =
nullptr;
78 NamespaceDecl *StdNamespace =
nullptr;
80 bool NeedsUniqueInternalLinkageNames =
false;
83 explicit ItaniumMangleContextImpl(
84 ASTContext &Context, DiagnosticsEngine &Diags,
85 DiscriminatorOverrideTy DiscriminatorOverride,
bool IsAux =
false)
86 : ItaniumMangleContext(Context, Diags, IsAux),
87 DiscriminatorOverride(DiscriminatorOverride) {}
92 bool shouldMangleCXXName(
const NamedDecl *D)
override;
93 bool shouldMangleStringLiteral(
const StringLiteral *)
override {
98 void needsUniqueInternalLinkageNames()
override {
99 NeedsUniqueInternalLinkageNames =
true;
102 void mangleCXXName(GlobalDecl GD, raw_ostream &)
override;
103 void mangleThunk(
const CXXMethodDecl *MD,
const ThunkInfo &Thunk,
bool,
104 raw_ostream &)
override;
106 const ThunkInfo &Thunk,
bool, raw_ostream &)
override;
107 void mangleReferenceTemporary(
const VarDecl *D,
unsigned ManglingNumber,
108 raw_ostream &)
override;
109 void mangleCXXVTable(
const CXXRecordDecl *RD, raw_ostream &)
override;
110 void mangleCXXVTT(
const CXXRecordDecl *RD, raw_ostream &)
override;
111 void mangleCXXCtorVTable(
const CXXRecordDecl *RD, int64_t Offset,
112 const CXXRecordDecl *
Type, raw_ostream &)
override;
113 void mangleCXXRTTI(QualType T, raw_ostream &)
override;
114 void mangleCXXRTTIName(QualType T, raw_ostream &,
115 bool NormalizeIntegers)
override;
116 void mangleCanonicalTypeName(QualType T, raw_ostream &,
117 bool NormalizeIntegers)
override;
119 void mangleCXXCtorComdat(
const CXXConstructorDecl *D, raw_ostream &)
override;
120 void mangleCXXDtorComdat(
const CXXDestructorDecl *D, raw_ostream &)
override;
121 void mangleStaticGuardVariable(
const VarDecl *D, raw_ostream &)
override;
122 void mangleDynamicInitializer(
const VarDecl *D, raw_ostream &Out)
override;
123 void mangleDynamicAtExitDestructor(
const VarDecl *D,
124 raw_ostream &Out)
override;
125 void mangleDynamicStermFinalizer(
const VarDecl *D, raw_ostream &Out)
override;
126 void mangleSEHFilterExpression(GlobalDecl EnclosingDecl,
127 raw_ostream &Out)
override;
128 void mangleSEHFinallyBlock(GlobalDecl EnclosingDecl,
129 raw_ostream &Out)
override;
130 void mangleItaniumThreadLocalInit(
const VarDecl *D, raw_ostream &)
override;
131 void mangleItaniumThreadLocalWrapper(
const VarDecl *D,
132 raw_ostream &)
override;
134 void mangleStringLiteral(
const StringLiteral *, raw_ostream &)
override;
136 void mangleLambdaSig(
const CXXRecordDecl *Lambda, raw_ostream &)
override;
138 void mangleModuleInitializer(
const Module *
Module, raw_ostream &)
override;
140 bool getNextDiscriminator(
const NamedDecl *ND,
unsigned &disc) {
146 if (
const auto *Tag = dyn_cast<TagDecl>(ND);
147 Tag &&
Tag->getName().empty() && !
Tag->getTypedefNameForAnonDecl())
152 unsigned discriminator = getASTContext().getManglingNumber(ND, isAux());
153 if (discriminator == 1)
155 disc = discriminator - 2;
160 unsigned &discriminator = Uniquifier[ND];
161 if (!discriminator) {
162 const DeclContext *DC = getEffectiveDeclContext(ND);
163 discriminator = ++Discriminator[std::make_pair(DC, ND->
getIdentifier())];
165 if (discriminator == 1)
167 disc = discriminator-2;
171 std::string getLambdaString(
const CXXRecordDecl *Lambda)
override {
174 assert(Lambda->
isLambda() &&
"RD must be a lambda!");
175 std::string Name(
"<lambda");
179 const ParmVarDecl *Parm = dyn_cast_or_null<ParmVarDecl>(LambdaContextDecl);
180 const FunctionDecl *
Func =
184 unsigned DefaultArgNo =
186 Name += llvm::utostr(DefaultArgNo);
190 if (LambdaManglingNumber)
191 LambdaId = LambdaManglingNumber;
193 LambdaId = getAnonymousStructIdForDebugInfo(Lambda);
195 Name += llvm::utostr(LambdaId);
200 DiscriminatorOverrideTy getDiscriminatorOverride()
const override {
201 return DiscriminatorOverride;
204 NamespaceDecl *getStdNamespace();
206 const DeclContext *getEffectiveDeclContext(
const Decl *D);
207 const DeclContext *getEffectiveParentContext(
const DeclContext *DC) {
208 return getEffectiveDeclContext(
cast<Decl>(DC));
211 bool isInternalLinkageDecl(
const NamedDecl *ND);
217class CXXNameMangler {
218 ItaniumMangleContextImpl &Context;
222 bool NormalizeIntegers =
false;
224 bool NullOut =
false;
229 bool DisableDerivedAbiTags =
false;
234 const NamedDecl *Structor;
235 unsigned StructorType = 0;
240 unsigned TemplateDepthOffset = 0;
245 class FunctionTypeDepthState {
247 unsigned InFunctionDeclSuffix : 1;
250 FunctionTypeDepthState() : Depth(0), InFunctionDeclSuffix(0) {}
252 unsigned getNestingDepth(
unsigned ParmDepth)
const {
255 assert(ParmDepth < Depth &&
256 "ParmVarDecl is not visible in current parameter environment");
257 return Depth - ParmDepth - InFunctionDeclSuffix;
260 FunctionTypeDepthState push() {
261 FunctionTypeDepthState Saved = *
this;
263 InFunctionDeclSuffix = 0;
267 void pop(FunctionTypeDepthState Saved) {
268 assert(Depth == Saved.Depth + 1 &&
"unbalanced function type depth pop");
272 void enterFunctionDeclSuffix() { InFunctionDeclSuffix = 1; }
273 void leaveFunctionDeclSuffix() { InFunctionDeclSuffix = 0; }
280 using AbiTagList = SmallVector<StringRef, 4>;
285 class AbiTagState final {
287 explicit AbiTagState(AbiTagState *&Head) : LinkHead(Head) {
293 AbiTagState(
const AbiTagState &) =
delete;
294 AbiTagState &operator=(
const AbiTagState &) =
delete;
296 ~AbiTagState() { pop(); }
298 void write(raw_ostream &Out,
const NamedDecl *ND,
299 ArrayRef<StringRef> AdditionalAbiTags) {
303 AdditionalAbiTags.empty() &&
304 "only function and variables need a list of additional abi tags");
305 if (
const auto *NS = dyn_cast<NamespaceDecl>(ND)) {
306 if (
const auto *AbiTag = NS->getAttr<AbiTagAttr>())
307 llvm::append_range(UsedAbiTags, AbiTag->tags());
314 if (
const auto *AbiTag = ND->
getAttr<AbiTagAttr>()) {
315 llvm::append_range(UsedAbiTags, AbiTag->tags());
316 llvm::append_range(TagList, AbiTag->tags());
319 llvm::append_range(UsedAbiTags, AdditionalAbiTags);
320 llvm::append_range(TagList, AdditionalAbiTags);
323 TagList.erase(llvm::unique(TagList), TagList.end());
325 writeSortedUniqueAbiTags(Out, TagList);
328 const AbiTagList &getUsedAbiTags()
const {
return UsedAbiTags; }
329 void setUsedAbiTags(
const AbiTagList &AbiTags) {
330 UsedAbiTags = AbiTags;
333 const AbiTagList &getEmittedAbiTags()
const {
334 return EmittedAbiTags;
337 const AbiTagList &getSortedUniqueUsedAbiTags() {
338 llvm::sort(UsedAbiTags);
339 UsedAbiTags.erase(llvm::unique(UsedAbiTags), UsedAbiTags.end());
345 AbiTagList UsedAbiTags;
347 AbiTagList EmittedAbiTags;
349 AbiTagState *&LinkHead;
350 AbiTagState *Parent =
nullptr;
353 assert(LinkHead ==
this &&
354 "abi tag link head must point to us on destruction");
356 Parent->UsedAbiTags.insert(Parent->UsedAbiTags.end(),
357 UsedAbiTags.begin(), UsedAbiTags.end());
358 Parent->EmittedAbiTags.insert(Parent->EmittedAbiTags.end(),
359 EmittedAbiTags.begin(),
360 EmittedAbiTags.end());
365 void writeSortedUniqueAbiTags(raw_ostream &Out,
const AbiTagList &AbiTags) {
366 for (
const auto &Tag : AbiTags) {
367 EmittedAbiTags.push_back(Tag);
375 AbiTagState *AbiTags =
nullptr;
376 AbiTagState AbiTagsRoot;
378 llvm::DenseMap<uintptr_t, unsigned> Substitutions;
379 llvm::DenseMap<StringRef, unsigned> ModuleSubstitutions;
381 ASTContext &getASTContext()
const {
return Context.getASTContext(); }
383 bool isCompatibleWith(LangOptions::ClangABI Ver) {
387 bool isStd(
const NamespaceDecl *NS);
388 bool isStdNamespace(
const DeclContext *DC);
390 const RecordDecl *GetLocalClassDecl(
const Decl *D);
391 bool isSpecializedAs(QualType S, llvm::StringRef Name, QualType A);
392 bool isStdCharSpecialization(
const ClassTemplateSpecializationDecl *SD,
393 llvm::StringRef Name,
bool HasAllocator);
396 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
397 const NamedDecl *D =
nullptr,
bool NullOut_ =
false)
398 : Context(
C),
Out(Out_), NullOut(NullOut_), Structor(getStructor(D)),
399 AbiTagsRoot(AbiTags) {
404 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
406 : Context(
C),
Out(Out_), Structor(getStructor(D)), StructorType(
Type),
407 AbiTagsRoot(AbiTags) {}
408 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
410 : Context(
C),
Out(Out_), Structor(getStructor(D)), StructorType(
Type),
411 AbiTagsRoot(AbiTags) {}
413 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
414 bool NormalizeIntegers_)
415 : Context(
C),
Out(Out_), NormalizeIntegers(NormalizeIntegers_),
416 NullOut(
false), Structor(
nullptr), AbiTagsRoot(AbiTags) {}
417 CXXNameMangler(CXXNameMangler &Outer, raw_ostream &Out_)
418 : Context(Outer.Context),
Out(Out_),
419 NormalizeIntegers(Outer.NormalizeIntegers), Structor(Outer.Structor),
420 StructorType(Outer.StructorType), SeqID(Outer.SeqID),
421 FunctionTypeDepth(Outer.FunctionTypeDepth), AbiTagsRoot(AbiTags),
422 Substitutions(Outer.Substitutions),
423 ModuleSubstitutions(Outer.ModuleSubstitutions) {}
425 CXXNameMangler(CXXNameMangler &Outer, llvm::raw_null_ostream &Out_)
426 : CXXNameMangler(Outer, (raw_ostream &)Out_) {
430 struct WithTemplateDepthOffset {
unsigned Offset; };
431 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out,
432 WithTemplateDepthOffset Offset)
433 : CXXNameMangler(
C,
Out) {
434 TemplateDepthOffset = Offset.Offset;
437 raw_ostream &getStream() {
return Out; }
439 void disableDerivedAbiTags() { DisableDerivedAbiTags =
true; }
440 static bool shouldHaveAbiTags(ItaniumMangleContextImpl &
C,
const VarDecl *VD);
442 void mangle(GlobalDecl GD);
443 void mangleCallOffset(int64_t NonVirtual, int64_t
Virtual);
444 void mangleNumber(
const llvm::APSInt &I);
445 void mangleNumber(int64_t Number);
446 void mangleFloat(
const llvm::APFloat &F);
447 void mangleFunctionEncoding(GlobalDecl GD);
448 void mangleSeqID(
unsigned SeqID);
449 void mangleName(GlobalDecl GD);
450 void mangleType(QualType T);
451 void mangleCXXRecordDecl(
const CXXRecordDecl *
Record,
452 bool SuppressSubstitution =
false);
453 void mangleLambdaSig(
const CXXRecordDecl *Lambda);
454 void mangleModuleNamePrefix(StringRef Name,
bool IsPartition =
false);
455 void mangleVendorQualifier(StringRef Name);
456 void mangleVendorType(StringRef Name);
459 bool mangleSubstitution(
const NamedDecl *ND);
460 bool mangleSubstitution(QualType T);
466 bool mangleStandardSubstitution(
const NamedDecl *ND);
468 void addSubstitution(
const NamedDecl *ND) {
471 addSubstitution(
reinterpret_cast<uintptr_t>(ND));
473 void addSubstitution(QualType T);
477 void extendSubstitutions(CXXNameMangler*
Other);
479 void mangleUnresolvedPrefix(NestedNameSpecifier Qualifier,
480 bool recursive =
false);
481 void mangleUnresolvedName(NestedNameSpecifier Qualifier, DeclarationName name,
482 const TemplateArgumentLoc *TemplateArgs,
483 unsigned NumTemplateArgs,
484 unsigned KnownArity = UnknownArity);
486 void mangleFunctionEncodingBareType(
const FunctionDecl *FD);
488 void mangleNameWithAbiTags(GlobalDecl GD,
489 ArrayRef<StringRef> AdditionalAbiTags = {});
490 void mangleModuleName(
const NamedDecl *ND);
491 void mangleTemplateName(
const TemplateDecl *TD,
492 ArrayRef<TemplateArgument> Args);
493 void mangleUnqualifiedName(GlobalDecl GD,
const DeclContext *DC,
494 ArrayRef<StringRef> AdditionalAbiTags = {}) {
496 UnknownArity, AdditionalAbiTags);
498 void mangleUnqualifiedName(GlobalDecl GD, DeclarationName Name,
499 const DeclContext *DC,
unsigned KnownArity,
500 ArrayRef<StringRef> AdditionalAbiTags);
501 void mangleUnscopedName(GlobalDecl GD,
const DeclContext *DC,
502 ArrayRef<StringRef> AdditionalAbiTags = {});
503 void mangleUnscopedTemplateName(GlobalDecl GD,
const DeclContext *DC,
504 ArrayRef<StringRef> AdditionalAbiTags = {});
505 void mangleSourceName(
const IdentifierInfo *II);
506 void mangleConstructorName(
const CXXConstructorDecl *CCD,
507 ArrayRef<StringRef> AdditionalAbiTags = {});
508 void mangleDestructorName(
const CXXDestructorDecl *CDD,
509 ArrayRef<StringRef> AdditionalAbiTags = {});
510 void mangleRegCallName(
const IdentifierInfo *II);
511 void mangleDeviceStubName(
const IdentifierInfo *II);
512 void mangleOCLDeviceStubName(
const IdentifierInfo *II);
513 void mangleSourceNameWithAbiTags(
const NamedDecl *ND,
514 ArrayRef<StringRef> AdditionalAbiTags = {});
515 void mangleLocalName(GlobalDecl GD,
516 ArrayRef<StringRef> AdditionalAbiTags = {});
517 void mangleBlockForPrefix(
const BlockDecl *
Block);
518 void mangleUnqualifiedBlock(
const BlockDecl *
Block);
519 void mangleTemplateParamDecl(
const NamedDecl *Decl);
520 void mangleTemplateParameterList(
const TemplateParameterList *Params);
521 void mangleTypeConstraint(
const TemplateDecl *
Concept,
522 ArrayRef<TemplateArgument> Arguments);
523 void mangleTypeConstraint(
const TypeConstraint *Constraint);
524 void mangleRequiresClause(
const Expr *RequiresClause);
525 void mangleLambda(
const CXXRecordDecl *Lambda);
526 void mangleNestedName(GlobalDecl GD,
const DeclContext *DC,
527 ArrayRef<StringRef> AdditionalAbiTags = {},
528 bool NoFunction =
false);
529 void mangleNestedName(
const TemplateDecl *TD,
530 ArrayRef<TemplateArgument> Args);
531 void mangleNestedNameWithClosurePrefix(GlobalDecl GD,
532 const NamedDecl *PrefixND,
533 ArrayRef<StringRef> AdditionalAbiTags,
534 bool NoFunction =
false);
535 void manglePrefix(NestedNameSpecifier Qualifier);
536 void manglePrefix(
const DeclContext *DC,
bool NoFunction=
false);
537 void manglePrefix(QualType
type);
538 void mangleTemplatePrefix(GlobalDecl GD,
bool NoFunction=
false);
540 const NamedDecl *getClosurePrefix(
const Decl *ND);
541 void mangleClosurePrefix(
const NamedDecl *ND,
bool NoFunction =
false);
542 bool mangleUnresolvedTypeOrSimpleId(QualType DestroyedType,
543 StringRef Prefix =
"");
544 void mangleOperatorName(DeclarationName Name,
unsigned Arity);
546 void mangleQualifiers(Qualifiers Quals,
const DependentAddressSpaceType *DAST =
nullptr);
552#define ABSTRACT_TYPE(CLASS, PARENT)
553#define NON_CANONICAL_TYPE(CLASS, PARENT)
554#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T);
555#include "clang/AST/TypeNodes.inc"
557 void mangleType(
const TagType*);
559 static StringRef getCallingConvQualifierName(
CallingConv CC);
562 void mangleSMEAttrs(
unsigned SMEAttrs);
565 void mangleNeonVectorType(
const VectorType *T);
567 void mangleAArch64NeonVectorType(
const VectorType *T);
569 void mangleAArch64FixedSveVectorType(
const VectorType *T);
571 void mangleRISCVFixedRVVVectorType(
const VectorType *T);
574 void mangleIntegerLiteral(
QualType T,
const llvm::APSInt &
Value);
575 void mangleFloatLiteral(
QualType T,
const llvm::APFloat &
V);
576 void mangleFixedPointLiteral();
579 void mangleMemberExprBase(
const Expr *base,
bool isArrow);
580 void mangleMemberExpr(
const Expr *base,
bool isArrow,
584 unsigned NumTemplateArgs,
unsigned knownArity);
585 void mangleCastExpression(
const Expr *E, StringRef CastEncoding);
586 void mangleInitListElements(
const InitListExpr *InitList);
589 void mangleReferenceToPack(
const NamedDecl *ND);
590 void mangleExpression(
const Expr *E,
unsigned Arity = UnknownArity,
591 bool AsTemplateArg =
false);
595 struct TemplateArgManglingInfo;
598 unsigned NumTemplateArgs);
601 void mangleTemplateArg(TemplateArgManglingInfo &Info,
unsigned Index,
604 void mangleTemplateArgExpr(
const Expr *E);
606 bool NeedExactType =
false);
608 void mangleTemplateParameter(
unsigned Depth,
unsigned Index);
616 AbiTagList makeFunctionReturnTypeTags(
const FunctionDecl *FD);
618 AbiTagList makeVariableTypeTags(
const VarDecl *VD);
626 getASTContext(), getASTContext().getTranslationUnitDecl(),
627 false, SourceLocation(), SourceLocation(),
628 &getASTContext().Idents.get(
"std"),
651ItaniumMangleContextImpl::getEffectiveDeclContext(
const Decl *D) {
658 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
660 if (ParmVarDecl *ContextParam =
661 dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl()))
662 return ContextParam->getDeclContext();
666 if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
667 if (ParmVarDecl *ContextParam =
668 dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl()))
669 return ContextParam->getDeclContext();
677 if (D == getASTContext().getVaListTagDecl()) {
678 const llvm::Triple &T = getASTContext().getTargetInfo().getTriple();
679 if (T.isARM() || T.isThumb() || T.isAArch64())
680 return getStdNamespace();
686 return getEffectiveDeclContext(
cast<Decl>(DC));
689 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
691 const DeclContext *ParentDC = getEffectiveParentContext(Lambda);
695 if (isLocalContainerContext(ParentDC))
699 return getASTContext().getTranslationUnitDecl();
702 if (
const auto *FD = !getASTContext().getLangOpts().isCompatibleWith(
703 LangOptions::ClangABI::Ver19)
705 : dyn_cast<FunctionDecl>(D)) {
707 return getASTContext().getTranslationUnitDecl();
710 if (FD->isMemberLikeConstrainedFriend() &&
711 !getASTContext().getLangOpts().isCompatibleWith(
712 LangOptions::ClangABI::Ver17))
719bool ItaniumMangleContextImpl::isInternalLinkageDecl(
const NamedDecl *ND) {
722 getEffectiveDeclContext(ND)->isFileContext() &&
729bool ItaniumMangleContextImpl::isUniqueInternalLinkageDecl(
730 const NamedDecl *ND) {
731 if (!NeedsUniqueInternalLinkageNames || !ND)
734 const auto *FD = dyn_cast<FunctionDecl>(ND);
740 if (!FD->getType()->getAs<FunctionProtoType>())
743 if (isInternalLinkageDecl(ND))
749bool ItaniumMangleContextImpl::shouldMangleCXXName(
const NamedDecl *D) {
750 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
753 if (FD->hasAttr<OverloadableAttr>())
769 if (FD->isMSVCRTEntryPoint())
783 if (!getASTContext().getLangOpts().
CPlusPlus)
786 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
797 const DeclContext *DC = getEffectiveDeclContext(D);
799 !CXXNameMangler::shouldHaveAbiTags(*
this, VD) &&
801 !VD->getOwningModuleForLinkage())
808void CXXNameMangler::writeAbiTags(
const NamedDecl *ND,
809 ArrayRef<StringRef> AdditionalAbiTags) {
810 assert(AbiTags &&
"require AbiTagState");
811 AbiTags->write(Out, ND,
812 DisableDerivedAbiTags ? ArrayRef<StringRef>{}
813 : AdditionalAbiTags);
816void CXXNameMangler::mangleSourceNameWithAbiTags(
817 const NamedDecl *ND, ArrayRef<StringRef> AdditionalAbiTags) {
819 writeAbiTags(ND, AdditionalAbiTags);
822void CXXNameMangler::mangle(GlobalDecl GD) {
828 mangleFunctionEncoding(GD);
829 else if (
isa<VarDecl, FieldDecl, MSGuidDecl, TemplateParamObjectDecl,
832 else if (
const IndirectFieldDecl *IFD =
833 dyn_cast<IndirectFieldDecl>(GD.
getDecl()))
834 mangleName(IFD->getAnonField());
836 llvm_unreachable(
"unexpected kind of global decl");
839void CXXNameMangler::mangleFunctionEncoding(GlobalDecl GD) {
844 if (!Context.shouldMangleDeclName(FD)) {
849 AbiTagList ReturnTypeAbiTags = makeFunctionReturnTypeTags(FD);
850 if (ReturnTypeAbiTags.empty()) {
859 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
861 FunctionTypeDepth.pop(Saved);
862 mangleFunctionEncodingBareType(FD);
869 SmallString<256> FunctionEncodingBuf;
870 llvm::raw_svector_ostream FunctionEncodingStream(FunctionEncodingBuf);
871 CXXNameMangler FunctionEncodingMangler(*
this, FunctionEncodingStream);
873 FunctionEncodingMangler.disableDerivedAbiTags();
875 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
876 FunctionEncodingMangler.mangleNameWithAbiTags(FD);
877 FunctionTypeDepth.pop(Saved);
880 size_t EncodingPositionStart = FunctionEncodingStream.str().size();
881 FunctionEncodingMangler.mangleFunctionEncodingBareType(FD);
885 const AbiTagList &UsedAbiTags =
886 FunctionEncodingMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags();
887 AbiTagList AdditionalAbiTags(ReturnTypeAbiTags.size());
888 AdditionalAbiTags.erase(
889 std::set_difference(ReturnTypeAbiTags.begin(), ReturnTypeAbiTags.end(),
890 UsedAbiTags.begin(), UsedAbiTags.end(),
891 AdditionalAbiTags.begin()),
892 AdditionalAbiTags.end());
895 Saved = FunctionTypeDepth.push();
896 mangleNameWithAbiTags(FD, AdditionalAbiTags);
897 FunctionTypeDepth.pop(Saved);
898 Out << FunctionEncodingStream.str().substr(EncodingPositionStart);
902 extendSubstitutions(&FunctionEncodingMangler);
905void CXXNameMangler::mangleFunctionEncodingBareType(
const FunctionDecl *FD) {
906 if (FD->
hasAttr<EnableIfAttr>()) {
907 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
908 Out <<
"Ua9enable_ifI";
909 for (AttrVec::const_iterator I = FD->
getAttrs().begin(),
912 EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I);
915 if (isCompatibleWith(LangOptions::ClangABI::Ver11)) {
920 mangleExpression(EIA->getCond());
923 mangleTemplateArgExpr(EIA->getCond());
927 FunctionTypeDepth.pop(Saved);
932 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD))
933 if (
auto Inherited = CD->getInheritedConstructor())
934 FD = Inherited.getConstructor();
952 bool MangleReturnType =
false;
956 MangleReturnType =
true;
959 FD = PrimaryTemplate->getTemplatedDecl();
962 mangleBareFunctionType(FD->
getType()->
castAs<FunctionProtoType>(),
963 MangleReturnType, FD);
967bool CXXNameMangler::isStd(
const NamespaceDecl *NS) {
968 if (!Context.getEffectiveParentContext(NS)->isTranslationUnit())
972 return II && II->
isStr(
"std");
977bool CXXNameMangler::isStdNamespace(
const DeclContext *DC) {
984static const GlobalDecl
988 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
997 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
998 TemplateArgs = &Spec->getTemplateArgs();
999 return GD.
getWithDecl(Spec->getSpecializedTemplate());
1004 dyn_cast<VarTemplateSpecializationDecl>(ND)) {
1005 TemplateArgs = &Spec->getTemplateArgs();
1006 return GD.
getWithDecl(Spec->getSpecializedTemplate());
1017void CXXNameMangler::mangleName(GlobalDecl GD) {
1019 if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1021 AbiTagList VariableTypeAbiTags = makeVariableTypeTags(VD);
1022 if (VariableTypeAbiTags.empty()) {
1024 mangleNameWithAbiTags(VD);
1029 llvm::raw_null_ostream NullOutStream;
1030 CXXNameMangler VariableNameMangler(*
this, NullOutStream);
1031 VariableNameMangler.disableDerivedAbiTags();
1032 VariableNameMangler.mangleNameWithAbiTags(VD);
1035 const AbiTagList &UsedAbiTags =
1036 VariableNameMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags();
1037 AbiTagList AdditionalAbiTags(VariableTypeAbiTags.size());
1038 AdditionalAbiTags.erase(
1039 std::set_difference(VariableTypeAbiTags.begin(),
1040 VariableTypeAbiTags.end(), UsedAbiTags.begin(),
1041 UsedAbiTags.end(), AdditionalAbiTags.begin()),
1042 AdditionalAbiTags.end());
1045 mangleNameWithAbiTags(VD, AdditionalAbiTags);
1047 mangleNameWithAbiTags(GD);
1051const RecordDecl *CXXNameMangler::GetLocalClassDecl(
const Decl *D) {
1052 const DeclContext *DC = Context.getEffectiveDeclContext(D);
1054 if (isLocalContainerContext(DC))
1055 return dyn_cast<RecordDecl>(D);
1057 DC = Context.getEffectiveDeclContext(D);
1062void CXXNameMangler::mangleNameWithAbiTags(
1063 GlobalDecl GD, ArrayRef<StringRef> AdditionalAbiTags) {
1070 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
1072 if (GetLocalClassDecl(ND) &&
1073 (!isLambda(ND) || isCompatibleWith(LangOptions::ClangABI::Ver18) ||
1074 !isCompatibleWith(LangOptions::ClangABI::Ver22))) {
1075 mangleLocalName(GD, AdditionalAbiTags);
1083 if (
const NamedDecl *PrefixND = getClosurePrefix(ND)) {
1084 mangleNestedNameWithClosurePrefix(GD, PrefixND, AdditionalAbiTags);
1088 if (isLocalContainerContext(DC)) {
1089 mangleLocalName(GD, AdditionalAbiTags);
1098 const TemplateArgumentList *TemplateArgs =
nullptr;
1099 if (GlobalDecl TD =
isTemplate(GD, TemplateArgs)) {
1100 mangleUnscopedTemplateName(TD, DC, AdditionalAbiTags);
1105 mangleUnscopedName(GD, DC, AdditionalAbiTags);
1109 mangleNestedName(GD, DC, AdditionalAbiTags);
1112void CXXNameMangler::mangleModuleName(
const NamedDecl *ND) {
1115 mangleModuleNamePrefix(M->getPrimaryModuleInterfaceName());
1123void CXXNameMangler::mangleModuleNamePrefix(StringRef Name,
bool IsPartition) {
1125 if (
auto It = ModuleSubstitutions.find(Name);
1126 It != ModuleSubstitutions.end()) {
1128 mangleSeqID(It->second);
1134 auto [Prefix, SubName] = Name.rsplit(
'.');
1135 if (SubName.empty())
1138 mangleModuleNamePrefix(Prefix, IsPartition);
1139 IsPartition =
false;
1145 Out << SubName.size() << SubName;
1146 ModuleSubstitutions.insert({Name, SeqID++});
1149void CXXNameMangler::mangleTemplateName(
const TemplateDecl *TD,
1150 ArrayRef<TemplateArgument> Args) {
1151 const DeclContext *DC = Context.getEffectiveDeclContext(TD);
1154 mangleUnscopedTemplateName(TD, DC);
1157 mangleNestedName(TD, Args);
1161void CXXNameMangler::mangleUnscopedName(GlobalDecl GD,
const DeclContext *DC,
1162 ArrayRef<StringRef> AdditionalAbiTags) {
1167 if (isStdNamespace(DC)) {
1168 if (getASTContext().getTargetInfo().
getTriple().isOSSolaris()) {
1170 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(ND)) {
1175 if (
const IdentifierInfo *II = RD->getIdentifier()) {
1177 if (llvm::is_contained({
"div_t",
"ldiv_t",
"lconv",
"tm"},
type)) {
1187 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1190void CXXNameMangler::mangleUnscopedTemplateName(
1191 GlobalDecl GD,
const DeclContext *DC,
1192 ArrayRef<StringRef> AdditionalAbiTags) {
1196 if (mangleSubstitution(ND))
1200 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
1201 assert(AdditionalAbiTags.empty() &&
1202 "template template param cannot have abi tags");
1203 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
1205 mangleUnscopedName(GD, DC, AdditionalAbiTags);
1211 addSubstitution(ND);
1214void CXXNameMangler::mangleFloat(
const llvm::APFloat &f) {
1228 llvm::APInt valueBits = f.bitcastToAPInt();
1229 unsigned numCharacters = (valueBits.getBitWidth() + 3) / 4;
1230 assert(numCharacters != 0);
1233 SmallVector<char, 20> buffer(numCharacters);
1236 for (
unsigned stringIndex = 0; stringIndex != numCharacters; ++stringIndex) {
1238 unsigned digitBitIndex = 4 * (numCharacters - stringIndex - 1);
1241 uint64_t hexDigit = valueBits.getRawData()[digitBitIndex / 64];
1242 hexDigit >>= (digitBitIndex % 64);
1246 static const char charForHex[16] = {
1247 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
1248 '8',
'9',
'a',
'b',
'c',
'd',
'e',
'f'
1250 buffer[stringIndex] = charForHex[hexDigit];
1253 Out.write(buffer.data(), numCharacters);
1256void CXXNameMangler::mangleFloatLiteral(QualType T,
const llvm::APFloat &
V) {
1263void CXXNameMangler::mangleFixedPointLiteral() {
1264 DiagnosticsEngine &Diags = Context.getDiags();
1265 Diags.
Report(diag::err_unsupported_itanium_mangling)
1266 << UnsupportedItaniumManglingKind::FixedPointLiteral;
1269void CXXNameMangler::mangleNullPointer(QualType T) {
1276void CXXNameMangler::mangleNumber(
const llvm::APSInt &
Value) {
1277 if (
Value.isSigned() &&
Value.isNegative()) {
1279 Value.abs().print(Out,
false);
1281 Value.print(Out,
false);
1285void CXXNameMangler::mangleNumber(int64_t Number) {
1295void CXXNameMangler::mangleCallOffset(int64_t NonVirtual, int64_t
Virtual) {
1303 mangleNumber(NonVirtual);
1309 mangleNumber(NonVirtual);
1315void CXXNameMangler::manglePrefix(QualType
type) {
1316 if (
const auto *TST =
type->getAs<TemplateSpecializationType>()) {
1317 if (!mangleSubstitution(QualType(TST, 0))) {
1318 mangleTemplatePrefix(TST->getTemplateName());
1323 mangleTemplateArgs(TST->getTemplateName(), TST->template_arguments());
1324 addSubstitution(QualType(TST, 0));
1326 }
else if (
const auto *DNT =
type->getAs<DependentNameType>()) {
1328 bool Clang14Compat = isCompatibleWith(LangOptions::ClangABI::Ver14);
1329 if (!Clang14Compat && mangleSubstitution(QualType(DNT, 0)))
1334 assert(DNT->getQualifier());
1335 manglePrefix(DNT->getQualifier());
1337 mangleSourceName(DNT->getIdentifier());
1340 addSubstitution(QualType(DNT, 0));
1352void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier Qualifier,
1370 case NestedNameSpecifier::Kind::Null:
1371 llvm_unreachable(
"unexpected null nested name specifier");
1373 case NestedNameSpecifier::Kind::Global:
1383 case NestedNameSpecifier::Kind::MicrosoftSuper:
1384 llvm_unreachable(
"Can't mangle __super specifier");
1386 case NestedNameSpecifier::Kind::Namespace: {
1389 mangleUnresolvedPrefix(Prefix,
1393 mangleSourceNameWithAbiTags(Namespace);
1397 case NestedNameSpecifier::Kind::Type: {
1405 if (NestedNameSpecifier Prefix =
type->getPrefix()) {
1406 mangleUnresolvedPrefix(Prefix,
1413 if (mangleUnresolvedTypeOrSimpleId(QualType(
type, 0), recursive ?
"N" :
""))
1428void CXXNameMangler::mangleUnresolvedName(
1429 NestedNameSpecifier Qualifier, DeclarationName name,
1430 const TemplateArgumentLoc *TemplateArgs,
unsigned NumTemplateArgs,
1431 unsigned knownArity) {
1433 mangleUnresolvedPrefix(Qualifier);
1434 switch (
name.getNameKind()) {
1437 mangleSourceName(
name.getAsIdentifierInfo());
1442 mangleUnresolvedTypeOrSimpleId(
name.getCXXNameType());
1449 mangleOperatorName(name, knownArity);
1452 llvm_unreachable(
"Can't mangle a constructor name!");
1454 llvm_unreachable(
"Can't mangle a using directive name!");
1456 llvm_unreachable(
"Can't mangle a deduction guide name!");
1460 llvm_unreachable(
"Can't mangle Objective-C selector names here!");
1466 mangleTemplateArgs(
TemplateName(), TemplateArgs, NumTemplateArgs);
1469void CXXNameMangler::mangleUnqualifiedName(
1470 GlobalDecl GD, DeclarationName Name,
const DeclContext *DC,
1471 unsigned KnownArity, ArrayRef<StringRef> AdditionalAbiTags) {
1472 const NamedDecl *ND = cast_or_null<NamedDecl>(GD.
getDecl());
1479 mangleModuleName(ND);
1483 auto *FD = dyn_cast<FunctionDecl>(ND);
1484 auto *FTD = dyn_cast<FunctionTemplateDecl>(ND);
1486 (FTD && FTD->getTemplatedDecl()->isMemberLikeConstrainedFriend())) {
1487 if (!isCompatibleWith(LangOptions::ClangABI::Ver17))
1491 unsigned Arity = KnownArity;
1497 if (
auto *DD = dyn_cast<DecompositionDecl>(ND)) {
1504 for (
auto *BD : DD->bindings())
1505 mangleSourceName(BD->getDeclName().getAsIdentifierInfo());
1507 writeAbiTags(ND, AdditionalAbiTags);
1511 if (
auto *GD = dyn_cast<MSGuidDecl>(ND)) {
1514 SmallString<
sizeof(
"_GUID_12345678_1234_1234_1234_1234567890ab")> GUID;
1515 llvm::raw_svector_ostream GUIDOS(GUID);
1516 Context.mangleMSGuidDecl(GD, GUIDOS);
1517 Out << GUID.size() << GUID;
1521 if (
auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
1524 mangleValueInTemplateArg(TPO->getType().getUnqualifiedType(),
1525 TPO->getValue(),
true);
1543 if (Context.isInternalLinkageDecl(ND))
1546 bool IsRegCall = FD &&
1550 FD && FD->
hasAttr<CUDAGlobalAttr>() &&
1552 bool IsOCLDeviceStub =
1554 DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
1557 mangleDeviceStubName(II);
1558 else if (IsOCLDeviceStub)
1559 mangleOCLDeviceStubName(II);
1561 mangleRegCallName(II);
1563 mangleSourceName(II);
1565 writeAbiTags(ND, AdditionalAbiTags);
1570 assert(ND &&
"mangling empty name without declaration");
1572 if (
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
1575 Out <<
"12_GLOBAL__N_1";
1580 if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1582 const auto *RD = VD->getType()->castAsRecordDecl();
1593 assert(RD->isAnonymousStructOrUnion()
1594 &&
"Expected anonymous struct or union!");
1595 const FieldDecl *FD = RD->findFirstNamedDataMember();
1601 assert(FD->
getIdentifier() &&
"Data member name isn't an identifier!");
1621 "Typedef should not be in another decl context!");
1622 assert(D->getDeclName().getAsIdentifierInfo() &&
1623 "Typedef was not named!");
1624 mangleSourceName(D->getDeclName().getAsIdentifierInfo());
1625 assert(AdditionalAbiTags.empty() &&
1626 "Type cannot have additional abi tags");
1638 if (
const CXXRecordDecl *
Record = dyn_cast<CXXRecordDecl>(TD)) {
1640 Context.getDiscriminatorOverride()(Context.getASTContext(),
Record);
1646 if (
Record->isLambda() &&
1647 ((DeviceNumber && *DeviceNumber > 0) ||
1648 (!DeviceNumber &&
Record->getLambdaManglingNumber() > 0))) {
1649 assert(AdditionalAbiTags.empty() &&
1650 "Lambda type cannot have additional abi tags");
1657 unsigned UnnamedMangle =
1658 getASTContext().getManglingNumber(TD, Context.isAux());
1660 if (UnnamedMangle > 1)
1661 Out << UnnamedMangle - 2;
1663 writeAbiTags(TD, AdditionalAbiTags);
1669 unsigned AnonStructId =
1671 : Context.getAnonymousStructId(TD, dyn_cast<FunctionDecl>(DC));
1678 Str += llvm::utostr(AnonStructId);
1688 llvm_unreachable(
"Can't mangle Objective-C selector names here!");
1699 if (ND && Arity == UnknownArity) {
1703 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND))
1704 if (MD->isImplicitObjectMemberFunction())
1710 mangleOperatorName(Name, Arity);
1711 writeAbiTags(ND, AdditionalAbiTags);
1715 llvm_unreachable(
"Can't mangle a deduction guide name!");
1718 llvm_unreachable(
"Can't mangle a using directive name!");
1722void CXXNameMangler::mangleConstructorName(
1723 const CXXConstructorDecl *CCD, ArrayRef<StringRef> AdditionalAbiTags) {
1724 const CXXRecordDecl *InheritedFrom =
nullptr;
1726 const TemplateArgumentList *InheritedTemplateArgs =
nullptr;
1728 InheritedFrom = Inherited.getConstructor()->
getParent();
1729 InheritedTemplateName =
1730 TemplateName(Inherited.getConstructor()->getPrimaryTemplate());
1731 InheritedTemplateArgs =
1732 Inherited.getConstructor()->getTemplateSpecializationArgs();
1735 if (CCD == Structor)
1738 mangleCXXCtorType(
static_cast<CXXCtorType>(StructorType), InheritedFrom);
1746 if (InheritedTemplateArgs)
1747 mangleTemplateArgs(InheritedTemplateName, *InheritedTemplateArgs);
1749 writeAbiTags(CCD, AdditionalAbiTags);
1752void CXXNameMangler::mangleDestructorName(
1753 const CXXDestructorDecl *CDD, ArrayRef<StringRef> AdditionalAbiTags) {
1754 if (CDD == Structor)
1757 mangleCXXDtorType(
static_cast<CXXDtorType>(StructorType));
1763 writeAbiTags(CDD, AdditionalAbiTags);
1766void CXXNameMangler::mangleRegCallName(
const IdentifierInfo *II) {
1770 if (getASTContext().getLangOpts().RegCall4)
1771 Out << II->
getLength() +
sizeof(
"__regcall4__") - 1 <<
"__regcall4__"
1774 Out << II->
getLength() +
sizeof(
"__regcall3__") - 1 <<
"__regcall3__"
1778void CXXNameMangler::mangleDeviceStubName(
const IdentifierInfo *II) {
1782 Out << II->
getLength() +
sizeof(
"__device_stub__") - 1 <<
"__device_stub__"
1786void CXXNameMangler::mangleOCLDeviceStubName(
const IdentifierInfo *II) {
1790 StringRef OCLDeviceStubNamePrefix =
"__clang_ocl_kern_imp_";
1791 Out << II->
getLength() + OCLDeviceStubNamePrefix.size()
1792 << OCLDeviceStubNamePrefix << II->
getName();
1795void CXXNameMangler::mangleSourceName(
const IdentifierInfo *II) {
1802void CXXNameMangler::mangleNestedName(GlobalDecl GD,
const DeclContext *DC,
1803 ArrayRef<StringRef> AdditionalAbiTags,
1812 if (
const CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(ND)) {
1813 Qualifiers MethodQuals =
Method->getMethodQualifiers();
1816 if (
Method->isExplicitObjectMemberFunction())
1819 mangleQualifiers(MethodQuals);
1820 mangleRefQualifier(
Method->getRefQualifier());
1824 const TemplateArgumentList *TemplateArgs =
nullptr;
1825 if (GlobalDecl TD =
isTemplate(GD, TemplateArgs)) {
1826 mangleTemplatePrefix(TD, NoFunction);
1829 manglePrefix(DC, NoFunction);
1830 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1835void CXXNameMangler::mangleNestedName(
const TemplateDecl *TD,
1836 ArrayRef<TemplateArgument> Args) {
1841 mangleTemplatePrefix(TD);
1847void CXXNameMangler::mangleNestedNameWithClosurePrefix(
1848 GlobalDecl GD,
const NamedDecl *PrefixND,
1849 ArrayRef<StringRef> AdditionalAbiTags,
bool NoFunction) {
1858 mangleClosurePrefix(PrefixND, NoFunction);
1859 mangleUnqualifiedName(GD,
nullptr, AdditionalAbiTags);
1870 if (
auto *CD = dyn_cast<CXXConstructorDecl>(DC))
1872 else if (
auto *DD = dyn_cast<CXXDestructorDecl>(DC))
1879void CXXNameMangler::mangleLocalName(GlobalDecl GD,
1880 ArrayRef<StringRef> AdditionalAbiTags) {
1888 const RecordDecl *RD = GetLocalClassDecl(D);
1889 const DeclContext *DC = Context.getEffectiveDeclContext(RD ? RD : D);
1894 AbiTagState LocalAbiTags(AbiTags);
1896 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(DC)) {
1898 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
1899 mangleBlockForPrefix(BD);
1906 LocalAbiTags.setUsedAbiTags(LocalAbiTags.getEmittedAbiTags());
1920 const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD);
1922 if (
const ParmVarDecl *Parm
1924 if (
const FunctionDecl *
Func
1929 mangleNumber(
Num - 2);
1938 mangleUnqualifiedName(RD, DC, AdditionalAbiTags);
1939 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
1940 if (
const NamedDecl *PrefixND = getClosurePrefix(BD))
1941 mangleClosurePrefix(PrefixND,
true );
1943 manglePrefix(Context.getEffectiveDeclContext(BD),
true );
1944 assert(AdditionalAbiTags.empty() &&
1945 "Block cannot have additional abi tags");
1946 mangleUnqualifiedBlock(BD);
1949 const NamedDecl *PrefixND = getClosurePrefix(ND);
1950 if (PrefixND && !isCompatibleWith(LangOptions::ClangABI::Ver18))
1951 mangleNestedNameWithClosurePrefix(GD, PrefixND, AdditionalAbiTags,
1954 mangleNestedName(GD, Context.getEffectiveDeclContext(ND),
1955 AdditionalAbiTags,
true);
1957 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
1960 if (
const ParmVarDecl *Parm
1961 = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) {
1962 if (
const FunctionDecl *
Func
1967 mangleNumber(
Num - 2);
1972 assert(AdditionalAbiTags.empty() &&
1973 "Block cannot have additional abi tags");
1974 mangleUnqualifiedBlock(BD);
1976 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1979 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(RD ? RD : D)) {
1981 if (Context.getNextDiscriminator(ND, disc)) {
1985 Out <<
"__" << disc <<
'_';
1990void CXXNameMangler::mangleBlockForPrefix(
const BlockDecl *
Block) {
1991 if (GetLocalClassDecl(
Block)) {
1992 mangleLocalName(
Block);
1995 const DeclContext *DC = Context.getEffectiveDeclContext(
Block);
1996 if (isLocalContainerContext(DC)) {
1997 mangleLocalName(
Block);
2000 if (
const NamedDecl *PrefixND = getClosurePrefix(
Block))
2001 mangleClosurePrefix(PrefixND);
2004 mangleUnqualifiedBlock(
Block);
2007void CXXNameMangler::mangleUnqualifiedBlock(
const BlockDecl *
Block) {
2010 if (Decl *Context =
Block->getBlockManglingContextDecl();
2011 Context && isCompatibleWith(LangOptions::ClangABI::Ver12) &&
2013 Context->getDeclContext()->isRecord()) {
2016 mangleSourceNameWithAbiTags(ND);
2022 unsigned Number =
Block->getBlockManglingNumber();
2044void CXXNameMangler::mangleTemplateParamDecl(
const NamedDecl *Decl) {
2046 if (
auto *Ty = dyn_cast<TemplateTypeParmDecl>(Decl)) {
2047 if (Ty->isParameterPack())
2049 const TypeConstraint *Constraint = Ty->getTypeConstraint();
2050 if (Constraint && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
2053 mangleTypeConstraint(Constraint);
2057 }
else if (
auto *Tn = dyn_cast<NonTypeTemplateParmDecl>(Decl)) {
2058 if (Tn->isExpandedParameterPack()) {
2059 for (
unsigned I = 0, N = Tn->getNumExpansionTypes(); I != N; ++I) {
2061 mangleType(Tn->getExpansionType(I));
2064 QualType T = Tn->getType();
2065 if (Tn->isParameterPack()) {
2067 if (
auto *PackExpansion = T->
getAs<PackExpansionType>())
2068 T = PackExpansion->getPattern();
2073 }
else if (
auto *Tt = dyn_cast<TemplateTemplateParmDecl>(Decl)) {
2074 if (Tt->isExpandedParameterPack()) {
2075 for (
unsigned I = 0, N = Tt->getNumExpansionTemplateParameters(); I != N;
2077 mangleTemplateParameterList(Tt->getExpansionTemplateParameters(I));
2079 if (Tt->isParameterPack())
2081 mangleTemplateParameterList(Tt->getTemplateParameters());
2086void CXXNameMangler::mangleTemplateParameterList(
2087 const TemplateParameterList *Params) {
2089 for (
auto *Param : *Params)
2090 mangleTemplateParamDecl(Param);
2091 mangleRequiresClause(Params->getRequiresClause());
2095void CXXNameMangler::mangleTypeConstraint(
2096 const TemplateDecl *
Concept, ArrayRef<TemplateArgument> Arguments) {
2097 const DeclContext *DC = Context.getEffectiveDeclContext(
Concept);
2099 mangleTemplateName(
Concept, Arguments);
2101 mangleUnscopedName(
Concept, DC);
2103 mangleNestedName(
Concept, DC);
2106void CXXNameMangler::mangleTypeConstraint(
const TypeConstraint *Constraint) {
2107 llvm::SmallVector<TemplateArgument, 8> Args;
2109 for (
const TemplateArgumentLoc &ArgLoc :
2111 Args.push_back(ArgLoc.getArgument());
2116void CXXNameMangler::mangleRequiresClause(
const Expr *RequiresClause) {
2118 if (RequiresClause && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
2120 mangleExpression(RequiresClause);
2124void CXXNameMangler::mangleLambda(
const CXXRecordDecl *Lambda) {
2128 Context && isCompatibleWith(LangOptions::ClangABI::Ver12) &&
2131 if (
const IdentifierInfo *Name =
2133 mangleSourceName(Name);
2134 const TemplateArgumentList *TemplateArgs =
nullptr;
2142 mangleLambdaSig(Lambda);
2157 Context.getDiscriminatorOverride()(Context.getASTContext(), Lambda);
2161 assert(Number > 0 &&
"Lambda should be mangled as an unnamed class");
2163 mangleNumber(Number - 2);
2167void CXXNameMangler::mangleLambdaSig(
const CXXRecordDecl *Lambda) {
2170 mangleTemplateParamDecl(D);
2174 mangleRequiresClause(TPL->getRequiresClause());
2178 mangleBareFunctionType(Proto,
false,
2182void CXXNameMangler::manglePrefix(NestedNameSpecifier Qualifier) {
2184 case NestedNameSpecifier::Kind::Null:
2185 case NestedNameSpecifier::Kind::Global:
2189 case NestedNameSpecifier::Kind::MicrosoftSuper:
2190 llvm_unreachable(
"Can't mangle __super specifier");
2192 case NestedNameSpecifier::Kind::Namespace:
2193 mangleName(
Qualifier.getAsNamespaceAndPrefix().Namespace->getNamespace());
2196 case NestedNameSpecifier::Kind::Type:
2197 manglePrefix(QualType(
Qualifier.getAsType(), 0));
2201 llvm_unreachable(
"unexpected nested name specifier");
2204void CXXNameMangler::manglePrefix(
const DeclContext *DC,
bool NoFunction) {
2217 if (NoFunction && isLocalContainerContext(DC))
2221 if (mangleSubstitution(ND))
2227 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
2228 const TemplateDecl *TD = FD->getPrimaryTemplate()) {
2229 mangleTemplatePrefix(TD);
2231 *FD->getTemplateSpecializationArgs());
2233 manglePrefix(Context.getEffectiveDeclContext(ND), NoFunction);
2236 addSubstitution(ND);
2241 manglePrefix(Context.getEffectiveDeclContext(ND), NoFunction);
2243 addSubstitution(ND);
2248 const TemplateArgumentList *TemplateArgs =
nullptr;
2249 if (GlobalDecl TD =
isTemplate(ND, TemplateArgs)) {
2250 mangleTemplatePrefix(TD);
2252 }
else if (
const NamedDecl *PrefixND = getClosurePrefix(ND)) {
2253 mangleClosurePrefix(PrefixND, NoFunction);
2254 mangleUnqualifiedName(ND,
nullptr);
2256 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
2257 manglePrefix(DC, NoFunction);
2258 mangleUnqualifiedName(ND, DC);
2261 addSubstitution(ND);
2268 if (TemplateDecl *TD =
Template.getAsTemplateDecl())
2269 return mangleTemplatePrefix(TD);
2272 assert(
Dependent &&
"unexpected template name kind");
2276 bool Clang11Compat = isCompatibleWith(LangOptions::ClangABI::Ver11);
2277 if (!Clang11Compat && mangleSubstitution(
Template))
2280 manglePrefix(
Dependent->getQualifier());
2282 if (Clang11Compat && mangleSubstitution(
Template))
2285 if (IdentifierOrOverloadedOperator Name =
Dependent->getName();
2286 const IdentifierInfo *Id = Name.getIdentifier())
2287 mangleSourceName(Id);
2289 mangleOperatorName(Name.getOperator(), UnknownArity);
2294void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
2303 if (mangleSubstitution(ND))
2307 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
2308 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
2310 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
2311 manglePrefix(DC, NoFunction);
2313 mangleUnqualifiedName(GD, DC);
2318 addSubstitution(ND);
2321const NamedDecl *CXXNameMangler::getClosurePrefix(
const Decl *ND) {
2322 if (isCompatibleWith(LangOptions::ClangABI::Ver12))
2325 const NamedDecl *Context =
nullptr;
2326 if (
auto *
Block = dyn_cast<BlockDecl>(ND)) {
2327 Context = dyn_cast_or_null<NamedDecl>(
Block->getBlockManglingContextDecl());
2328 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
2331 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
2333 Context = dyn_cast_or_null<NamedDecl>(RD->getLambdaContextDecl());
2347void CXXNameMangler::mangleClosurePrefix(
const NamedDecl *ND,
bool NoFunction) {
2350 if (mangleSubstitution(ND))
2353 const TemplateArgumentList *TemplateArgs =
nullptr;
2354 if (GlobalDecl TD =
isTemplate(ND, TemplateArgs)) {
2355 mangleTemplatePrefix(TD, NoFunction);
2358 const auto *DC = Context.getEffectiveDeclContext(ND);
2359 manglePrefix(DC, NoFunction);
2360 mangleUnqualifiedName(ND, DC);
2365 addSubstitution(ND);
2374 if (mangleSubstitution(TN))
2377 TemplateDecl *TD =
nullptr;
2387 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TD))
2388 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
2395 llvm_unreachable(
"can't mangle an overloaded template name as a <type>");
2404 mangleUnresolvedPrefix(
Dependent->getQualifier());
2405 mangleSourceName(II);
2414 SubstTemplateTemplateParmStorage *subst
2425 Out <<
"_SUBSTPACK_";
2429 llvm_unreachable(
"Unexpected DeducedTemplate");
2432 addSubstitution(TN);
2435bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty,
2441 case Type::Adjusted:
2443 case Type::ArrayParameter:
2445 case Type::BlockPointer:
2446 case Type::LValueReference:
2447 case Type::RValueReference:
2448 case Type::MemberPointer:
2449 case Type::ConstantArray:
2450 case Type::IncompleteArray:
2451 case Type::VariableArray:
2452 case Type::DependentSizedArray:
2453 case Type::DependentAddressSpace:
2454 case Type::DependentVector:
2455 case Type::DependentSizedExtVector:
2457 case Type::ExtVector:
2458 case Type::ConstantMatrix:
2459 case Type::DependentSizedMatrix:
2460 case Type::FunctionProto:
2461 case Type::FunctionNoProto:
2463 case Type::Attributed:
2464 case Type::BTFTagAttributed:
2465 case Type::OverflowBehavior:
2466 case Type::HLSLAttributedResource:
2467 case Type::HLSLInlineSpirv:
2469 case Type::DeducedTemplateSpecialization:
2470 case Type::PackExpansion:
2471 case Type::ObjCObject:
2472 case Type::ObjCInterface:
2473 case Type::ObjCObjectPointer:
2474 case Type::ObjCTypeParam:
2477 case Type::MacroQualified:
2479 case Type::DependentBitInt:
2480 case Type::CountAttributed:
2481 llvm_unreachable(
"type is illegal as a nested name specifier");
2483 case Type::SubstBuiltinTemplatePack:
2488 Out <<
"_SUBSTBUILTINPACK_";
2490 case Type::SubstTemplateTypeParmPack:
2495 Out <<
"_SUBSTPACK_";
2502 case Type::TypeOfExpr:
2504 case Type::Decltype:
2505 case Type::PackIndexing:
2506 case Type::TemplateTypeParm:
2507 case Type::UnaryTransform:
2520 case Type::SubstTemplateTypeParm: {
2524 if (
auto *TD = dyn_cast<TemplateDecl>(ST->getAssociatedDecl());
2526 return mangleUnresolvedTypeOrSimpleId(ST->getReplacementType(), Prefix);
2527 goto unresolvedType;
2534 case Type::PredefinedSugar:
2538 case Type::UnresolvedUsing:
2539 mangleSourceNameWithAbiTags(
2545 mangleSourceNameWithAbiTags(
2549 case Type::TemplateSpecialization: {
2550 const TemplateSpecializationType *TST =
2560 assert(TD &&
"no template for template specialization type");
2562 goto unresolvedType;
2564 mangleSourceNameWithAbiTags(TD);
2576 llvm_unreachable(
"invalid base for a template specialization type");
2579 SubstTemplateTemplateParmStorage *subst =
2590 Out <<
"_SUBSTPACK_";
2596 mangleSourceNameWithAbiTags(TD);
2606 mangleTemplateArgs(
TemplateName(), TST->template_arguments());
2610 case Type::InjectedClassName:
2611 mangleSourceNameWithAbiTags(
2615 case Type::DependentName:
2627void CXXNameMangler::mangleOperatorName(DeclarationName Name,
unsigned Arity) {
2637 llvm_unreachable(
"Not an operator name");
2660 case OO_New:
Out <<
"nw";
break;
2662 case OO_Array_New:
Out <<
"na";
break;
2664 case OO_Delete:
Out <<
"dl";
break;
2666 case OO_Array_Delete:
Out <<
"da";
break;
2670 Out << (Arity == 1?
"ps" :
"pl");
break;
2674 Out << (Arity == 1?
"ng" :
"mi");
break;
2678 Out << (Arity == 1?
"ad" :
"an");
break;
2683 Out << (Arity == 1?
"de" :
"ml");
break;
2685 case OO_Tilde:
Out <<
"co";
break;
2687 case OO_Slash:
Out <<
"dv";
break;
2689 case OO_Percent:
Out <<
"rm";
break;
2691 case OO_Pipe:
Out <<
"or";
break;
2693 case OO_Caret:
Out <<
"eo";
break;
2695 case OO_Equal:
Out <<
"aS";
break;
2697 case OO_PlusEqual:
Out <<
"pL";
break;
2699 case OO_MinusEqual:
Out <<
"mI";
break;
2701 case OO_StarEqual:
Out <<
"mL";
break;
2703 case OO_SlashEqual:
Out <<
"dV";
break;
2705 case OO_PercentEqual:
Out <<
"rM";
break;
2707 case OO_AmpEqual:
Out <<
"aN";
break;
2709 case OO_PipeEqual:
Out <<
"oR";
break;
2711 case OO_CaretEqual:
Out <<
"eO";
break;
2713 case OO_LessLess:
Out <<
"ls";
break;
2715 case OO_GreaterGreater:
Out <<
"rs";
break;
2717 case OO_LessLessEqual:
Out <<
"lS";
break;
2719 case OO_GreaterGreaterEqual:
Out <<
"rS";
break;
2721 case OO_EqualEqual:
Out <<
"eq";
break;
2723 case OO_ExclaimEqual:
Out <<
"ne";
break;
2725 case OO_Less:
Out <<
"lt";
break;
2727 case OO_Greater:
Out <<
"gt";
break;
2729 case OO_LessEqual:
Out <<
"le";
break;
2731 case OO_GreaterEqual:
Out <<
"ge";
break;
2733 case OO_Exclaim:
Out <<
"nt";
break;
2735 case OO_AmpAmp:
Out <<
"aa";
break;
2737 case OO_PipePipe:
Out <<
"oo";
break;
2739 case OO_PlusPlus:
Out <<
"pp";
break;
2741 case OO_MinusMinus:
Out <<
"mm";
break;
2743 case OO_Comma:
Out <<
"cm";
break;
2745 case OO_ArrowStar:
Out <<
"pm";
break;
2747 case OO_Arrow:
Out <<
"pt";
break;
2749 case OO_Call:
Out <<
"cl";
break;
2751 case OO_Subscript:
Out <<
"ix";
break;
2756 case OO_Conditional:
Out <<
"qu";
break;
2759 case OO_Coawait:
Out <<
"aw";
break;
2762 case OO_Spaceship:
Out <<
"ss";
break;
2766 llvm_unreachable(
"Not an overloaded operator");
2770void CXXNameMangler::mangleQualifiers(Qualifiers Quals,
const DependentAddressSpaceType *DAST) {
2789 SmallString<64> ASString;
2795 if (TargetAS != 0 ||
2797 ASString =
"AS" + llvm::utostr(TargetAS);
2800 default: llvm_unreachable(
"Not a language specific address space");
2804 case LangAS::opencl_global:
2805 ASString =
"CLglobal";
2807 case LangAS::opencl_global_device:
2808 ASString =
"CLdevice";
2810 case LangAS::opencl_global_host:
2811 ASString =
"CLhost";
2813 case LangAS::opencl_local:
2814 ASString =
"CLlocal";
2816 case LangAS::opencl_constant:
2817 ASString =
"CLconstant";
2819 case LangAS::opencl_private:
2820 ASString =
"CLprivate";
2822 case LangAS::opencl_generic:
2823 ASString =
"CLgeneric";
2827 case LangAS::sycl_global:
2828 ASString =
"SYglobal";
2830 case LangAS::sycl_global_device:
2831 ASString =
"SYdevice";
2833 case LangAS::sycl_global_host:
2834 ASString =
"SYhost";
2836 case LangAS::sycl_local:
2837 ASString =
"SYlocal";
2839 case LangAS::sycl_private:
2840 ASString =
"SYprivate";
2843 case LangAS::cuda_device:
2844 ASString =
"CUdevice";
2846 case LangAS::cuda_constant:
2847 ASString =
"CUconstant";
2849 case LangAS::cuda_shared:
2850 ASString =
"CUshared";
2853 case LangAS::ptr32_sptr:
2854 ASString =
"ptr32_sptr";
2856 case LangAS::ptr32_uptr:
2860 if (!getASTContext().getTargetInfo().
getTriple().isOSzOS())
2861 ASString =
"ptr32_uptr";
2868 if (!ASString.empty())
2869 mangleVendorQualifier(ASString);
2882 mangleVendorQualifier(
"__weak");
2886 mangleVendorQualifier(
"__unaligned");
2890 mangleVendorQualifier(
"__ptrauth");
2900 << unsigned(PtrAuth.isAddressDiscriminated())
2903 << PtrAuth.getExtraDiscriminator()
2918 mangleVendorQualifier(
"__strong");
2922 mangleVendorQualifier(
"__autoreleasing");
2945void CXXNameMangler::mangleVendorQualifier(StringRef name) {
2949void CXXNameMangler::mangleVendorType(StringRef name) {
2956 switch (RefQualifier) {
2970void CXXNameMangler::mangleObjCMethodName(
const ObjCMethodDecl *MD) {
2971 Context.mangleObjCMethodNameAsSourceName(MD, Out);
2996 if (
auto *DeducedTST = Ty->
getAs<DeducedTemplateSpecializationType>())
2997 if (DeducedTST->getDeducedType().isNull())
3002void CXXNameMangler::mangleType(QualType T) {
3042 if (
const TemplateSpecializationType *TST
3043 = dyn_cast<TemplateSpecializationType>(T))
3044 if (!TST->isTypeAlias())
3059 auto [ty, quals] = T.
split();
3061 bool isSubstitutable =
3063 if (isSubstitutable && mangleSubstitution(T))
3070 quals = Qualifiers();
3076 if (quals || ty->isDependentAddressSpaceType()) {
3077 if (
const DependentAddressSpaceType *DAST =
3078 dyn_cast<DependentAddressSpaceType>(ty)) {
3080 mangleQualifiers(Quals, DAST);
3081 mangleType(QualType(Ty, 0));
3083 mangleQualifiers(quals);
3087 mangleType(QualType(ty, 0));
3090 switch (ty->getTypeClass()) {
3091#define ABSTRACT_TYPE(CLASS, PARENT)
3092#define NON_CANONICAL_TYPE(CLASS, PARENT) \
3094 llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
3096#define TYPE(CLASS, PARENT) \
3098 mangleType(static_cast<const CLASS##Type*>(ty)); \
3100#include "clang/AST/TypeNodes.inc"
3105 if (isSubstitutable)
3109void CXXNameMangler::mangleCXXRecordDecl(
const CXXRecordDecl *
Record,
3110 bool SuppressSubstitution) {
3111 if (mangleSubstitution(
Record))
3114 if (SuppressSubstitution)
3119void CXXNameMangler::mangleType(
const BuiltinType *T) {
3161 std::string type_name;
3165 if (NormalizeIntegers && T->
isInteger()) {
3167 switch (getASTContext().getTypeSize(T)) {
3171 if (mangleSubstitution(BuiltinType::SChar))
3174 addSubstitution(BuiltinType::SChar);
3177 if (mangleSubstitution(BuiltinType::Short))
3180 addSubstitution(BuiltinType::Short);
3183 if (mangleSubstitution(BuiltinType::Int))
3186 addSubstitution(BuiltinType::Int);
3189 if (mangleSubstitution(BuiltinType::Long))
3192 addSubstitution(BuiltinType::Long);
3195 if (mangleSubstitution(BuiltinType::Int128))
3198 addSubstitution(BuiltinType::Int128);
3201 llvm_unreachable(
"Unknown integer size for normalization");
3204 switch (getASTContext().getTypeSize(T)) {
3206 if (mangleSubstitution(BuiltinType::UChar))
3209 addSubstitution(BuiltinType::UChar);
3212 if (mangleSubstitution(BuiltinType::UShort))
3215 addSubstitution(BuiltinType::UShort);
3218 if (mangleSubstitution(BuiltinType::UInt))
3221 addSubstitution(BuiltinType::UInt);
3224 if (mangleSubstitution(BuiltinType::ULong))
3227 addSubstitution(BuiltinType::ULong);
3230 if (mangleSubstitution(BuiltinType::UInt128))
3233 addSubstitution(BuiltinType::UInt128);
3236 llvm_unreachable(
"Unknown integer size for normalization");
3242 case BuiltinType::Void:
3245 case BuiltinType::Bool:
3248 case BuiltinType::Char_U:
3249 case BuiltinType::Char_S:
3252 case BuiltinType::UChar:
3255 case BuiltinType::UShort:
3258 case BuiltinType::UInt:
3261 case BuiltinType::ULong:
3264 case BuiltinType::ULongLong:
3267 case BuiltinType::UInt128:
3270 case BuiltinType::SChar:
3273 case BuiltinType::WChar_S:
3274 case BuiltinType::WChar_U:
3277 case BuiltinType::Char8:
3280 case BuiltinType::Char16:
3283 case BuiltinType::Char32:
3286 case BuiltinType::Short:
3289 case BuiltinType::Int:
3292 case BuiltinType::Long:
3295 case BuiltinType::LongLong:
3298 case BuiltinType::Int128:
3301 case BuiltinType::Float16:
3304 case BuiltinType::ShortAccum:
3307 case BuiltinType::Accum:
3310 case BuiltinType::LongAccum:
3313 case BuiltinType::UShortAccum:
3316 case BuiltinType::UAccum:
3319 case BuiltinType::ULongAccum:
3322 case BuiltinType::ShortFract:
3325 case BuiltinType::Fract:
3328 case BuiltinType::LongFract:
3331 case BuiltinType::UShortFract:
3334 case BuiltinType::UFract:
3337 case BuiltinType::ULongFract:
3340 case BuiltinType::SatShortAccum:
3343 case BuiltinType::SatAccum:
3346 case BuiltinType::SatLongAccum:
3349 case BuiltinType::SatUShortAccum:
3352 case BuiltinType::SatUAccum:
3355 case BuiltinType::SatULongAccum:
3358 case BuiltinType::SatShortFract:
3361 case BuiltinType::SatFract:
3364 case BuiltinType::SatLongFract:
3367 case BuiltinType::SatUShortFract:
3370 case BuiltinType::SatUFract:
3373 case BuiltinType::SatULongFract:
3376 case BuiltinType::Half:
3379 case BuiltinType::Float:
3382 case BuiltinType::Double:
3385 case BuiltinType::LongDouble: {
3386 const TargetInfo *TI =
3387 getASTContext().getLangOpts().OpenMP &&
3388 getASTContext().getLangOpts().OpenMPIsTargetDevice
3389 ? getASTContext().getAuxTargetInfo()
3390 : &getASTContext().getTargetInfo();
3394 case BuiltinType::Float128: {
3395 const TargetInfo *TI =
3396 getASTContext().getLangOpts().OpenMP &&
3397 getASTContext().getLangOpts().OpenMPIsTargetDevice
3398 ? getASTContext().getAuxTargetInfo()
3399 : &getASTContext().getTargetInfo();
3403 case BuiltinType::BFloat16: {
3404 const TargetInfo *TI =
3405 ((getASTContext().getLangOpts().OpenMP &&
3406 getASTContext().getLangOpts().OpenMPIsTargetDevice) ||
3407 getASTContext().getLangOpts().SYCLIsDevice)
3408 ? getASTContext().getAuxTargetInfo()
3409 : &getASTContext().getTargetInfo();
3413 case BuiltinType::Ibm128: {
3414 const TargetInfo *TI = &getASTContext().getTargetInfo();
3418 case BuiltinType::NullPtr:
3422#define BUILTIN_TYPE(Id, SingletonId)
3423#define PLACEHOLDER_TYPE(Id, SingletonId) \
3424 case BuiltinType::Id:
3425#include "clang/AST/BuiltinTypes.def"
3426 case BuiltinType::Dependent:
3428 llvm_unreachable(
"mangling a placeholder type");
3430 case BuiltinType::ObjCId:
3431 Out <<
"11objc_object";
3433 case BuiltinType::ObjCClass:
3434 Out <<
"10objc_class";
3436 case BuiltinType::ObjCSel:
3437 Out <<
"13objc_selector";
3439#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3440 case BuiltinType::Id: \
3441 type_name = "ocl_" #ImgType "_" #Suffix; \
3442 Out << type_name.size() << type_name; \
3444#include "clang/Basic/OpenCLImageTypes.def"
3445 case BuiltinType::OCLSampler:
3446 Out <<
"11ocl_sampler";
3448 case BuiltinType::OCLEvent:
3449 Out <<
"9ocl_event";
3451 case BuiltinType::OCLClkEvent:
3452 Out <<
"12ocl_clkevent";
3454 case BuiltinType::OCLQueue:
3455 Out <<
"9ocl_queue";
3457 case BuiltinType::OCLReserveID:
3458 Out <<
"13ocl_reserveid";
3460#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3461 case BuiltinType::Id: \
3462 type_name = "ocl_" #ExtType; \
3463 Out << type_name.size() << type_name; \
3465#include "clang/Basic/OpenCLExtensionTypes.def"
3469#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
3470 case BuiltinType::Id: \
3471 if (T->getKind() == BuiltinType::SveBFloat16 && \
3472 isCompatibleWith(LangOptions::ClangABI::Ver17)) { \
3474 mangleVendorType("__SVBFloat16_t"); \
3476 type_name = #MangledName; \
3477 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3480#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
3481 case BuiltinType::Id: \
3482 type_name = #MangledName; \
3483 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3485#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
3486 case BuiltinType::Id: \
3487 type_name = #MangledName; \
3488 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3490#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
3491 case BuiltinType::Id: \
3492 type_name = #MangledName; \
3493 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3495#include "clang/Basic/AArch64ACLETypes.def"
3496#define PPC_VECTOR_TYPE(Name, Id, Size) \
3497 case BuiltinType::Id: \
3498 mangleVendorType(#Name); \
3500#include "clang/Basic/PPCTypes.def"
3502#define RVV_TYPE(Name, Id, SingletonId) \
3503 case BuiltinType::Id: \
3504 mangleVendorType(Name); \
3506#include "clang/Basic/RISCVVTypes.def"
3507#define WASM_REF_TYPE(InternalName, MangledName, Id, SingletonId, AS) \
3508 case BuiltinType::Id: \
3509 mangleVendorType(MangledName); \
3511#include "clang/Basic/WebAssemblyReferenceTypes.def"
3512#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
3513 case BuiltinType::Id: \
3514 mangleVendorType(Name); \
3516#include "clang/Basic/AMDGPUTypes.def"
3517#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3518 case BuiltinType::Id: \
3519 mangleVendorType(#Name); \
3521#include "clang/Basic/HLSLIntangibleTypes.def"
3525StringRef CXXNameMangler::getCallingConvQualifierName(
CallingConv CC) {
3545#define CC_VLS_CASE(ABI_VLEN) case CC_RISCVVLSCall_##ABI_VLEN:
3581 return "swiftasynccall";
3583 llvm_unreachable(
"bad calling convention");
3586void CXXNameMangler::mangleExtFunctionInfo(
const FunctionType *T) {
3588 if (T->
getExtInfo() == FunctionType::ExtInfo())
3595 StringRef CCQualifier = getCallingConvQualifierName(T->
getExtInfo().
getCC());
3596 if (!CCQualifier.empty())
3597 mangleVendorQualifier(CCQualifier);
3630 llvm_unreachable(
"Unrecognised SME attribute");
3645void CXXNameMangler::mangleSMEAttrs(
unsigned SMEAttrs) {
3665 Out <<
"Lj" <<
static_cast<unsigned>(Bitmask) <<
"EE";
3669CXXNameMangler::mangleExtParameterInfo(FunctionProtoType::ExtParameterInfo PI) {
3676 case ParameterABI::Ordinary:
3680 case ParameterABI::HLSLOut:
3681 case ParameterABI::HLSLInOut:
3686 case ParameterABI::SwiftContext:
3687 case ParameterABI::SwiftAsyncContext:
3688 case ParameterABI::SwiftErrorResult:
3689 case ParameterABI::SwiftIndirectResult:
3695 mangleVendorQualifier(
"ns_consumed");
3698 mangleVendorQualifier(
"noescape");
3704void CXXNameMangler::mangleType(
const FunctionProtoType *T) {
3708 Out <<
"11__SME_ATTRSI";
3710 mangleExtFunctionInfo(T);
3727 mangleType(ExceptTy);
3738 mangleBareFunctionType(T,
true);
3745 mangleSMEAttrs(SMEAttrs);
3748void CXXNameMangler::mangleType(
const FunctionNoProtoType *T) {
3754 FunctionTypeDepthState saved = FunctionTypeDepth.push();
3756 FunctionTypeDepth.enterFunctionDeclSuffix();
3758 FunctionTypeDepth.leaveFunctionDeclSuffix();
3760 FunctionTypeDepth.pop(saved);
3764void CXXNameMangler::mangleBareFunctionType(
const FunctionProtoType *Proto,
3765 bool MangleReturnType,
3766 const FunctionDecl *FD) {
3769 FunctionTypeDepthState saved = FunctionTypeDepth.push();
3772 if (MangleReturnType) {
3773 FunctionTypeDepth.enterFunctionDeclSuffix();
3777 mangleVendorQualifier(
"ns_returns_retained");
3782 auto SplitReturnTy = ReturnTy.
split();
3784 ReturnTy = getASTContext().getQualifiedType(SplitReturnTy);
3786 mangleType(ReturnTy);
3788 FunctionTypeDepth.leaveFunctionDeclSuffix();
3796 for (
unsigned I = 0, E = Proto->
getNumParams(); I != E; ++I) {
3810 assert(Attr->getType() <= 9 && Attr->getType() >= 0);
3811 if (Attr->isDynamic())
3812 Out <<
"U25pass_dynamic_object_size" << Attr->getType();
3814 Out <<
"U17pass_object_size" << Attr->getType();
3825 FunctionTypeDepth.enterFunctionDeclSuffix();
3829 FunctionTypeDepth.pop(saved);
3834void CXXNameMangler::mangleType(
const UnresolvedUsingType *T) {
3840void CXXNameMangler::mangleType(
const EnumType *T) {
3841 mangleType(
static_cast<const TagType*
>(T));
3843void CXXNameMangler::mangleType(
const RecordType *T) {
3844 mangleType(
static_cast<const TagType*
>(T));
3846void CXXNameMangler::mangleType(
const TagType *T) {
3847 mangleName(T->getDecl()->getDefinitionOrSelf());
3853void CXXNameMangler::mangleType(
const ConstantArrayType *T) {
3857void CXXNameMangler::mangleType(
const VariableArrayType *T) {
3865void CXXNameMangler::mangleType(
const DependentSizedArrayType *T) {
3875void CXXNameMangler::mangleType(
const IncompleteArrayType *T) {
3882void CXXNameMangler::mangleType(
const MemberPointerType *T) {
3885 mangleCXXRecordDecl(RD);
3889 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) {
3910 mangleType(PointeeType);
3914void CXXNameMangler::mangleType(
const TemplateTypeParmType *T) {
3915 mangleTemplateParameter(T->getDepth(), T->getIndex());
3919void CXXNameMangler::mangleType(
const SubstTemplateTypeParmPackType *T) {
3924 Out <<
"_SUBSTPACK_";
3927void CXXNameMangler::mangleType(
const SubstBuiltinTemplatePackType *T) {
3932 Out <<
"_SUBSTBUILTINPACK_";
3936void CXXNameMangler::mangleType(
const PointerType *T) {
3940void CXXNameMangler::mangleType(
const ObjCObjectPointerType *T) {
3946void CXXNameMangler::mangleType(
const LValueReferenceType *T) {
3952void CXXNameMangler::mangleType(
const RValueReferenceType *T) {
3958void CXXNameMangler::mangleType(
const ComplexType *T) {
3966void CXXNameMangler::mangleNeonVectorType(
const VectorType *T) {
3968 assert(EltType->
isBuiltinType() &&
"Neon vector element not a BuiltinType");
3969 const char *EltName =
nullptr;
3972 case BuiltinType::SChar:
3973 case BuiltinType::UChar:
3974 EltName =
"poly8_t";
3976 case BuiltinType::Short:
3977 case BuiltinType::UShort:
3978 EltName =
"poly16_t";
3980 case BuiltinType::LongLong:
3981 case BuiltinType::ULongLong:
3982 EltName =
"poly64_t";
3984 default: llvm_unreachable(
"unexpected Neon polynomial vector element type");
3988 case BuiltinType::SChar: EltName =
"int8_t";
break;
3989 case BuiltinType::UChar: EltName =
"uint8_t";
break;
3990 case BuiltinType::Short: EltName =
"int16_t";
break;
3991 case BuiltinType::UShort: EltName =
"uint16_t";
break;
3992 case BuiltinType::Int: EltName =
"int32_t";
break;
3993 case BuiltinType::UInt: EltName =
"uint32_t";
break;
3994 case BuiltinType::LongLong: EltName =
"int64_t";
break;
3995 case BuiltinType::ULongLong: EltName =
"uint64_t";
break;
3996 case BuiltinType::Double: EltName =
"float64_t";
break;
3997 case BuiltinType::Float: EltName =
"float32_t";
break;
3998 case BuiltinType::Half: EltName =
"float16_t";
break;
3999 case BuiltinType::BFloat16: EltName =
"bfloat16_t";
break;
4000 case BuiltinType::MFloat8:
4001 EltName =
"mfloat8_t";
4004 llvm_unreachable(
"unexpected Neon vector element type");
4007 const char *BaseName =
nullptr;
4009 getASTContext().getTypeSize(EltType));
4011 BaseName =
"__simd64_";
4013 assert(BitSize == 128 &&
"Neon vector type not 64 or 128 bits");
4014 BaseName =
"__simd128_";
4016 Out << strlen(BaseName) + strlen(EltName);
4017 Out << BaseName << EltName;
4020void CXXNameMangler::mangleNeonVectorType(
const DependentVectorType *T) {
4021 DiagnosticsEngine &Diags = Context.getDiags();
4023 << UnsupportedItaniumManglingKind::DependentNeonVector;
4028 case BuiltinType::SChar:
4030 case BuiltinType::Short:
4032 case BuiltinType::Int:
4034 case BuiltinType::Long:
4035 case BuiltinType::LongLong:
4037 case BuiltinType::UChar:
4039 case BuiltinType::UShort:
4041 case BuiltinType::UInt:
4043 case BuiltinType::ULong:
4044 case BuiltinType::ULongLong:
4046 case BuiltinType::Half:
4048 case BuiltinType::Float:
4050 case BuiltinType::Double:
4052 case BuiltinType::BFloat16:
4054 case BuiltinType::MFloat8:
4057 llvm_unreachable(
"Unexpected vector element base type");
4064void CXXNameMangler::mangleAArch64NeonVectorType(
const VectorType *T) {
4066 assert(EltType->
isBuiltinType() &&
"Neon vector element not a BuiltinType");
4071 assert((BitSize == 64 || BitSize == 128) &&
4072 "Neon vector type not 64 or 128 bits");
4077 case BuiltinType::UChar:
4080 case BuiltinType::UShort:
4083 case BuiltinType::ULong:
4084 case BuiltinType::ULongLong:
4088 llvm_unreachable(
"unexpected Neon polynomial vector element type");
4094 (
"__" + EltName +
"x" + Twine(T->
getNumElements()) +
"_t").str();
4097void CXXNameMangler::mangleAArch64NeonVectorType(
const DependentVectorType *T) {
4098 DiagnosticsEngine &Diags = Context.getDiags();
4100 << UnsupportedItaniumManglingKind::DependentNeonVector;
4127void CXXNameMangler::mangleAArch64FixedSveVectorType(
const VectorType *T) {
4128 assert((T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4129 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) &&
4130 "expected fixed-length SVE vector!");
4134 "expected builtin type for fixed-length SVE vector!");
4138 case BuiltinType::SChar:
4141 case BuiltinType::UChar: {
4148 case BuiltinType::Short:
4151 case BuiltinType::UShort:
4154 case BuiltinType::Int:
4157 case BuiltinType::UInt:
4160 case BuiltinType::Long:
4163 case BuiltinType::ULong:
4166 case BuiltinType::Half:
4169 case BuiltinType::Float:
4172 case BuiltinType::Double:
4175 case BuiltinType::BFloat16:
4179 llvm_unreachable(
"unexpected element type for fixed-length SVE vector!");
4182 unsigned VecSizeInBits = getASTContext().getTypeInfo(T).Width;
4184 if (T->
getVectorKind() == VectorKind::SveFixedLengthPredicate)
4187 Out <<
"9__SVE_VLSI";
4188 mangleVendorType(TypeName);
4189 Out <<
"Lj" << VecSizeInBits <<
"EE";
4192void CXXNameMangler::mangleAArch64FixedSveVectorType(
4193 const DependentVectorType *T) {
4194 DiagnosticsEngine &Diags = Context.getDiags();
4196 << UnsupportedItaniumManglingKind::DependentFixedLengthSVEVector;
4199void CXXNameMangler::mangleRISCVFixedRVVVectorType(
const VectorType *T) {
4200 assert((T->
getVectorKind() == VectorKind::RVVFixedLengthData ||
4205 "expected fixed-length RVV vector!");
4209 "expected builtin type for fixed-length RVV vector!");
4211 SmallString<20> TypeNameStr;
4212 llvm::raw_svector_ostream TypeNameOS(TypeNameStr);
4213 TypeNameOS <<
"__rvv_";
4215 case BuiltinType::SChar:
4216 TypeNameOS <<
"int8";
4218 case BuiltinType::UChar:
4220 TypeNameOS <<
"uint8";
4222 TypeNameOS <<
"bool";
4224 case BuiltinType::Short:
4225 TypeNameOS <<
"int16";
4227 case BuiltinType::UShort:
4228 TypeNameOS <<
"uint16";
4230 case BuiltinType::Int:
4231 TypeNameOS <<
"int32";
4233 case BuiltinType::UInt:
4234 TypeNameOS <<
"uint32";
4236 case BuiltinType::Long:
4237 case BuiltinType::LongLong:
4238 TypeNameOS <<
"int64";
4240 case BuiltinType::ULong:
4241 case BuiltinType::ULongLong:
4242 TypeNameOS <<
"uint64";
4244 case BuiltinType::Float16:
4245 TypeNameOS <<
"float16";
4247 case BuiltinType::Float:
4248 TypeNameOS <<
"float32";
4250 case BuiltinType::Double:
4251 TypeNameOS <<
"float64";
4253 case BuiltinType::BFloat16:
4254 TypeNameOS <<
"bfloat16";
4257 llvm_unreachable(
"unexpected element type for fixed-length RVV vector!");
4260 unsigned VecSizeInBits;
4262 case VectorKind::RVVFixedLengthMask_1:
4265 case VectorKind::RVVFixedLengthMask_2:
4268 case VectorKind::RVVFixedLengthMask_4:
4272 VecSizeInBits = getASTContext().getTypeInfo(T).Width;
4277 auto VScale = getASTContext().getTargetInfo().getVScaleRange(
4278 getASTContext().getLangOpts(),
4279 TargetInfo::ArmStreamingKind::NotStreaming);
4280 unsigned VLen = VScale->first * llvm::RISCV::RVVBitsPerBlock;
4284 if (VecSizeInBits >= VLen)
4285 TypeNameOS << (VecSizeInBits / VLen);
4287 TypeNameOS <<
'f' << (VLen / VecSizeInBits);
4289 TypeNameOS << (VLen / VecSizeInBits);
4293 Out <<
"9__RVV_VLSI";
4294 mangleVendorType(TypeNameStr);
4295 Out <<
"Lj" << VecSizeInBits <<
"EE";
4298void CXXNameMangler::mangleRISCVFixedRVVVectorType(
4299 const DependentVectorType *T) {
4300 DiagnosticsEngine &Diags = Context.getDiags();
4302 << UnsupportedItaniumManglingKind::DependentFixedLengthRVVVectorType;
4313void CXXNameMangler::mangleType(
const VectorType *T) {
4316 llvm::Triple
Target = getASTContext().getTargetInfo().getTriple();
4317 llvm::Triple::ArchType
Arch =
4318 getASTContext().getTargetInfo().getTriple().getArch();
4319 if ((
Arch == llvm::Triple::aarch64 ||
4320 Arch == llvm::Triple::aarch64_be) && !
Target.isOSDarwin())
4321 mangleAArch64NeonVectorType(T);
4323 mangleNeonVectorType(T);
4325 }
else if (T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4326 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) {
4327 mangleAArch64FixedSveVectorType(T);
4329 }
else if (T->
getVectorKind() == VectorKind::RVVFixedLengthData ||
4334 mangleRISCVFixedRVVVectorType(T);
4346void CXXNameMangler::mangleType(
const DependentVectorType *T) {
4349 llvm::Triple
Target = getASTContext().getTargetInfo().getTriple();
4350 llvm::Triple::ArchType
Arch =
4351 getASTContext().getTargetInfo().getTriple().getArch();
4352 if ((
Arch == llvm::Triple::aarch64 ||
Arch == llvm::Triple::aarch64_be) &&
4354 mangleAArch64NeonVectorType(T);
4356 mangleNeonVectorType(T);
4358 }
else if (T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4359 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) {
4360 mangleAArch64FixedSveVectorType(T);
4362 }
else if (T->
getVectorKind() == VectorKind::RVVFixedLengthData) {
4363 mangleRISCVFixedRVVVectorType(T);
4378void CXXNameMangler::mangleType(
const ExtVectorType *T) {
4379 mangleType(
static_cast<const VectorType*
>(T));
4381void CXXNameMangler::mangleType(
const DependentSizedExtVectorType *T) {
4388void CXXNameMangler::mangleType(
const ConstantMatrixType *T) {
4392 mangleVendorType(
"matrix_type");
4395 auto &ASTCtx = getASTContext();
4396 unsigned BitWidth = ASTCtx.getTypeSize(ASTCtx.getSizeType());
4397 llvm::APSInt Rows(BitWidth);
4399 mangleIntegerLiteral(ASTCtx.getSizeType(), Rows);
4400 llvm::APSInt Columns(BitWidth);
4402 mangleIntegerLiteral(ASTCtx.getSizeType(), Columns);
4407void CXXNameMangler::mangleType(
const DependentSizedMatrixType *T) {
4410 mangleVendorType(
"matrix_type");
4419void CXXNameMangler::mangleType(
const DependentAddressSpaceType *T) {
4421 mangleQualifiers(split.
Quals, T);
4422 mangleType(QualType(split.
Ty, 0));
4425void CXXNameMangler::mangleType(
const PackExpansionType *T) {
4428 mangleType(T->getPattern());
4431void CXXNameMangler::mangleType(
const PackIndexingType *T) {
4434 mangleType(T->getPattern());
4435 mangleExpression(T->getIndexExpr());
4438void CXXNameMangler::mangleType(
const ObjCInterfaceType *T) {
4442void CXXNameMangler::mangleType(
const ObjCObjectType *T) {
4444 if (T->isKindOfType())
4445 Out <<
"U8__kindof";
4447 if (!T->qual_empty()) {
4449 SmallString<64> QualStr;
4450 llvm::raw_svector_ostream QualOS(QualStr);
4451 QualOS <<
"objcproto";
4452 for (
const auto *I : T->quals()) {
4453 StringRef
name = I->getName();
4456 mangleVendorQualifier(QualStr);
4459 mangleType(T->getBaseType());
4461 if (T->isSpecialized()) {
4464 for (
auto typeArg : T->getTypeArgs())
4465 mangleType(typeArg);
4470void CXXNameMangler::mangleType(
const BlockPointerType *T) {
4471 Out <<
"U13block_pointer";
4475void CXXNameMangler::mangleType(
const InjectedClassNameType *T) {
4480 T->getDecl()->getCanonicalTemplateSpecializationType(getASTContext()));
4483void CXXNameMangler::mangleType(
const TemplateSpecializationType *T) {
4484 if (TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl()) {
4485 mangleTemplateName(TD, T->template_arguments());
4488 mangleTemplatePrefix(T->getTemplateName());
4493 mangleTemplateArgs(T->getTemplateName(), T->template_arguments());
4498void CXXNameMangler::mangleType(
const DependentNameType *T) {
4509 switch (T->getKeyword()) {
4510 case ElaboratedTypeKeyword::None:
4511 case ElaboratedTypeKeyword::Typename:
4513 case ElaboratedTypeKeyword::Struct:
4514 case ElaboratedTypeKeyword::Class:
4515 case ElaboratedTypeKeyword::Interface:
4518 case ElaboratedTypeKeyword::Union:
4521 case ElaboratedTypeKeyword::Enum:
4527 manglePrefix(T->getQualifier());
4528 mangleSourceName(T->getIdentifier());
4532void CXXNameMangler::mangleType(
const TypeOfType *T) {
4538void CXXNameMangler::mangleType(
const TypeOfExprType *T) {
4544void CXXNameMangler::mangleType(
const DecltypeType *T) {
4545 Expr *E = T->getUnderlyingExpr();
4564 mangleExpression(E);
4568void CXXNameMangler::mangleType(
const UnaryTransformType *T) {
4571 if (T->isDependentType()) {
4572 StringRef BuiltinName;
4573 switch (T->getUTTKind()) {
4574#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
4575 case UnaryTransformType::Enum: \
4576 BuiltinName = "__" #Trait; \
4578#include "clang/Basic/TransformTypeTraits.def"
4580 mangleVendorType(BuiltinName);
4584 mangleType(T->getBaseType());
4588void CXXNameMangler::mangleType(
const AutoType *T) {
4589 assert(T->getDeducedType().isNull() &&
4590 "Deduced AutoType shouldn't be handled here!");
4591 assert(T->getKeyword() != AutoTypeKeyword::GNUAutoType &&
4592 "shouldn't need to mangle __auto_type!");
4597 if (T->isConstrained() && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
4598 Out << (T->isDecltypeAuto() ?
"DK" :
"Dk");
4599 mangleTypeConstraint(T->getTypeConstraintConcept(),
4600 T->getTypeConstraintArguments());
4602 Out << (T->isDecltypeAuto() ?
"Dc" :
"Da");
4606void CXXNameMangler::mangleType(
const DeducedTemplateSpecializationType *T) {
4607 QualType
Deduced = T->getDeducedType();
4613 "shouldn't form deduced TST unless we know we have a template");
4617void CXXNameMangler::mangleType(
const AtomicType *T) {
4624void CXXNameMangler::mangleType(
const PipeType *T) {
4631void CXXNameMangler::mangleType(
const OverflowBehaviorType *T) {
4634 if (T->isWrapKind()) {
4635 Out <<
"U8ObtWrap_";
4637 Out <<
"U8ObtTrap_";
4639 mangleType(T->getUnderlyingType());
4642void CXXNameMangler::mangleType(
const BitIntType *T) {
4649void CXXNameMangler::mangleType(
const DependentBitIntType *T) {
4658void CXXNameMangler::mangleType(
const ArrayParameterType *T) {
4662void CXXNameMangler::mangleType(
const HLSLAttributedResourceType *T) {
4663 llvm::SmallString<64> Str(
"_Res");
4664 const HLSLAttributedResourceType::Attributes &Attrs = T->getAttrs();
4666 switch (Attrs.ResourceClass) {
4667 case llvm::dxil::ResourceClass::UAV:
4670 case llvm::dxil::ResourceClass::SRV:
4673 case llvm::dxil::ResourceClass::CBuffer:
4676 case llvm::dxil::ResourceClass::Sampler:
4682 if (Attrs.RawBuffer)
4684 if (Attrs.IsCounter)
4688 if (T->hasContainedType())
4690 mangleVendorQualifier(Str);
4692 if (T->hasContainedType()) {
4693 mangleType(T->getContainedType());
4695 mangleType(T->getWrappedType());
4698void CXXNameMangler::mangleType(
const HLSLInlineSpirvType *T) {
4699 SmallString<20> TypeNameStr;
4700 llvm::raw_svector_ostream TypeNameOS(TypeNameStr);
4702 TypeNameOS <<
"spirv_type";
4704 TypeNameOS <<
"_" << T->getOpcode();
4705 TypeNameOS <<
"_" << T->getSize();
4706 TypeNameOS <<
"_" << T->getAlignment();
4708 mangleVendorType(TypeNameStr);
4710 for (
auto &Operand : T->getOperands()) {
4711 using SpirvOperandKind = SpirvOperand::SpirvOperandKind;
4714 case SpirvOperandKind::ConstantId:
4715 mangleVendorQualifier(
"_Const");
4716 mangleIntegerLiteral(
Operand.getResultType(),
4717 llvm::APSInt(
Operand.getValue()));
4719 case SpirvOperandKind::Literal:
4720 mangleVendorQualifier(
"_Lit");
4721 mangleIntegerLiteral(Context.getASTContext().
IntTy,
4722 llvm::APSInt(
Operand.getValue()));
4724 case SpirvOperandKind::TypeId:
4725 mangleVendorQualifier(
"_Type");
4726 mangleType(
Operand.getResultType());
4729 llvm_unreachable(
"Invalid SpirvOperand kind");
4732 TypeNameOS <<
Operand.getKind();
4736void CXXNameMangler::mangleIntegerLiteral(QualType T,
4737 const llvm::APSInt &
Value) {
4744 Out << (
Value.getBoolValue() ?
'1' :
'0');
4746 mangleNumber(
Value);
4751void CXXNameMangler::mangleMemberExprBase(
const Expr *Base,
bool IsArrow) {
4753 while (
const auto *RT =
Base->getType()->getAsCanonical<RecordType>()) {
4754 if (!RT->getDecl()->isAnonymousStructOrUnion())
4756 const auto *ME = dyn_cast<MemberExpr>(Base);
4759 Base = ME->getBase();
4760 IsArrow = ME->isArrow();
4763 if (
Base->isImplicitCXXThis()) {
4769 Out << (IsArrow ?
"pt" :
"dt");
4770 mangleExpression(Base);
4775void CXXNameMangler::mangleMemberExpr(
const Expr *base,
bool isArrow,
4776 NestedNameSpecifier Qualifier,
4777 NamedDecl *firstQualifierLookup,
4778 DeclarationName member,
4779 const TemplateArgumentLoc *TemplateArgs,
4780 unsigned NumTemplateArgs,
4785 mangleMemberExprBase(base, isArrow);
4786 mangleUnresolvedName(Qualifier, member, TemplateArgs, NumTemplateArgs, arity);
4799 if (callee == fn)
return false;
4803 if (!lookup)
return false;
4820void CXXNameMangler::mangleCastExpression(
const Expr *E, StringRef CastEncoding) {
4822 Out << CastEncoding;
4827void CXXNameMangler::mangleInitListElements(
const InitListExpr *InitList) {
4829 InitList = Syntactic;
4830 for (
unsigned i = 0, e = InitList->
getNumInits(); i != e; ++i)
4831 mangleExpression(InitList->
getInit(i));
4834void CXXNameMangler::mangleRequirement(SourceLocation RequiresExprLoc,
4835 const concepts::Requirement *Req) {
4836 using concepts::Requirement;
4841 auto HandleSubstitutionFailure =
4842 [&](SourceLocation Loc) {
4843 DiagnosticsEngine &Diags = Context.getDiags();
4844 Diags.
Report(Loc, diag::err_unsupported_itanium_mangling)
4845 << UnsupportedItaniumManglingKind::
4846 RequiresExprWithSubstitutionFailure;
4851 case Requirement::RK_Type: {
4853 if (TR->isSubstitutionFailure())
4854 return HandleSubstitutionFailure(
4855 TR->getSubstitutionDiagnostic()->DiagLoc);
4858 mangleType(TR->getType()->getType());
4862 case Requirement::RK_Simple:
4863 case Requirement::RK_Compound: {
4865 if (ER->isExprSubstitutionFailure())
4866 return HandleSubstitutionFailure(
4867 ER->getExprSubstitutionDiagnostic()->DiagLoc);
4870 mangleExpression(ER->getExpr());
4872 if (ER->hasNoexceptRequirement())
4875 if (!ER->getReturnTypeRequirement().isEmpty()) {
4876 if (ER->getReturnTypeRequirement().isSubstitutionFailure())
4877 return HandleSubstitutionFailure(ER->getReturnTypeRequirement()
4878 .getSubstitutionDiagnostic()
4882 mangleTypeConstraint(ER->getReturnTypeRequirement().getTypeConstraint());
4887 case Requirement::RK_Nested:
4889 if (NR->hasInvalidConstraint()) {
4892 return HandleSubstitutionFailure(RequiresExprLoc);
4896 mangleExpression(NR->getConstraintExpr());
4901void CXXNameMangler::mangleExpression(
const Expr *E,
unsigned Arity,
4902 bool AsTemplateArg) {
4935 QualType ImplicitlyConvertedToType;
4939 bool IsPrimaryExpr =
true;
4940 auto NotPrimaryExpr = [&] {
4941 if (AsTemplateArg && IsPrimaryExpr)
4943 IsPrimaryExpr =
false;
4946 auto MangleDeclRefExpr = [&](
const NamedDecl *D) {
4947 switch (D->getKind()) {
4960 case Decl::EnumConstant: {
4967 case Decl::NonTypeTemplateParm:
4980 case Expr::NoStmtClass:
4981#define ABSTRACT_STMT(Type)
4982#define EXPR(Type, Base)
4983#define STMT(Type, Base) \
4984 case Expr::Type##Class:
4985#include "clang/AST/StmtNodes.inc"
4990 case Expr::AddrLabelExprClass:
4991 case Expr::DesignatedInitUpdateExprClass:
4992 case Expr::ImplicitValueInitExprClass:
4993 case Expr::ArrayInitLoopExprClass:
4994 case Expr::ArrayInitIndexExprClass:
4995 case Expr::NoInitExprClass:
4996 case Expr::ParenListExprClass:
4997 case Expr::MSPropertyRefExprClass:
4998 case Expr::MSPropertySubscriptExprClass:
4999 case Expr::RecoveryExprClass:
5000 case Expr::ArraySectionExprClass:
5001 case Expr::OMPArrayShapingExprClass:
5002 case Expr::OMPIteratorExprClass:
5003 case Expr::CXXInheritedCtorInitExprClass:
5004 case Expr::CXXParenListInitExprClass:
5005 llvm_unreachable(
"unexpected statement kind");
5007 case Expr::ConstantExprClass:
5011 case Expr::CXXReflectExprClass: {
5013 assert(
false &&
"unimplemented");
5018 case Expr::BlockExprClass:
5019 case Expr::ChooseExprClass:
5020 case Expr::CompoundLiteralExprClass:
5021 case Expr::ExtVectorElementExprClass:
5022 case Expr::MatrixElementExprClass:
5023 case Expr::GenericSelectionExprClass:
5024 case Expr::ObjCEncodeExprClass:
5025 case Expr::ObjCIsaExprClass:
5026 case Expr::ObjCIvarRefExprClass:
5027 case Expr::ObjCMessageExprClass:
5028 case Expr::ObjCPropertyRefExprClass:
5029 case Expr::ObjCProtocolExprClass:
5030 case Expr::ObjCSelectorExprClass:
5031 case Expr::ObjCStringLiteralClass:
5032 case Expr::ObjCBoxedExprClass:
5033 case Expr::ObjCArrayLiteralClass:
5034 case Expr::ObjCDictionaryLiteralClass:
5035 case Expr::ObjCSubscriptRefExprClass:
5036 case Expr::ObjCIndirectCopyRestoreExprClass:
5037 case Expr::ObjCAvailabilityCheckExprClass:
5038 case Expr::OffsetOfExprClass:
5039 case Expr::PredefinedExprClass:
5040 case Expr::ShuffleVectorExprClass:
5041 case Expr::ConvertVectorExprClass:
5042 case Expr::StmtExprClass:
5043 case Expr::ArrayTypeTraitExprClass:
5044 case Expr::ExpressionTraitExprClass:
5045 case Expr::VAArgExprClass:
5046 case Expr::CUDAKernelCallExprClass:
5047 case Expr::AsTypeExprClass:
5048 case Expr::PseudoObjectExprClass:
5049 case Expr::AtomicExprClass:
5050 case Expr::SourceLocExprClass:
5051 case Expr::EmbedExprClass:
5052 case Expr::BuiltinBitCastExprClass: {
5056 DiagnosticsEngine &Diags = Context.getDiags();
5064 case Expr::CXXUuidofExprClass: {
5069 if (!isCompatibleWith(LangOptions::ClangABI::Ver11)) {
5070 Out <<
"u8__uuidof";
5079 Out <<
"u8__uuidoft";
5083 Out <<
"u8__uuidofz";
5084 mangleExpression(UuidExp);
5091 case Expr::BinaryConditionalOperatorClass: {
5093 DiagnosticsEngine &Diags = Context.getDiags();
5095 << UnsupportedItaniumManglingKind::TernaryWithOmittedMiddleOperand
5101 case Expr::OpaqueValueExprClass:
5102 llvm_unreachable(
"cannot mangle opaque value; mangling wrong thing?");
5104 case Expr::InitListExprClass: {
5112 case Expr::DesignatedInitExprClass: {
5115 for (
const auto &Designator : DIE->designators()) {
5116 if (Designator.isFieldDesignator()) {
5118 mangleSourceName(Designator.getFieldName());
5119 }
else if (Designator.isArrayDesignator()) {
5121 mangleExpression(DIE->getArrayIndex(Designator));
5123 assert(Designator.isArrayRangeDesignator() &&
5124 "unknown designator kind");
5126 mangleExpression(DIE->getArrayRangeStart(Designator));
5127 mangleExpression(DIE->getArrayRangeEnd(Designator));
5130 mangleExpression(DIE->getInit());
5134 case Expr::CXXDefaultArgExprClass:
5138 case Expr::CXXDefaultInitExprClass:
5142 case Expr::CXXStdInitializerListExprClass:
5146 case Expr::SubstNonTypeTemplateParmExprClass: {
5150 if (
auto *CE = dyn_cast<ConstantExpr>(SNTTPE->getReplacement())) {
5152 assert(CE->hasAPValueResult() &&
"expected the NTTP to have an APValue");
5153 mangleValueInTemplateArg(SNTTPE->getParameterType(),
5154 CE->getAPValueResult(),
false,
5164 case Expr::UserDefinedLiteralClass:
5167 case Expr::CXXMemberCallExprClass:
5168 case Expr::CallExprClass: {
5190 CallArity = UnknownArity;
5192 mangleExpression(CE->
getCallee(), CallArity);
5194 mangleExpression(Arg);
5199 case Expr::CXXNewExprClass: {
5202 if (
New->isGlobalNew())
Out <<
"gs";
5203 Out << (
New->isArray() ?
"na" :
"nw");
5205 E =
New->placement_arg_end(); I != E; ++I)
5206 mangleExpression(*I);
5208 mangleType(
New->getAllocatedType());
5209 if (
New->hasInitializer()) {
5210 if (
New->getInitializationStyle() == CXXNewInitializationStyle::Braces)
5214 const Expr *
Init =
New->getInitializer();
5215 if (
const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(
Init)) {
5220 mangleExpression(*I);
5221 }
else if (
const ParenListExpr *PLE = dyn_cast<ParenListExpr>(
Init)) {
5222 for (
unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i)
5223 mangleExpression(PLE->getExpr(i));
5224 }
else if (
New->getInitializationStyle() ==
5225 CXXNewInitializationStyle::Braces &&
5230 mangleExpression(
Init);
5236 case Expr::CXXPseudoDestructorExprClass: {
5239 if (
const Expr *Base = PDE->getBase())
5240 mangleMemberExprBase(Base, PDE->isArrow());
5241 NestedNameSpecifier
Qualifier = PDE->getQualifier();
5242 if (TypeSourceInfo *ScopeInfo = PDE->getScopeTypeInfo()) {
5244 mangleUnresolvedPrefix(Qualifier,
5246 mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType());
5250 if (!mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType()))
5253 }
else if (Qualifier) {
5254 mangleUnresolvedPrefix(Qualifier);
5258 QualType DestroyedType = PDE->getDestroyedType();
5259 mangleUnresolvedTypeOrSimpleId(DestroyedType);
5263 case Expr::MemberExprClass: {
5274 case Expr::UnresolvedMemberExprClass: {
5285 case Expr::CXXDependentScopeMemberExprClass: {
5287 const CXXDependentScopeMemberExpr *ME
5298 case Expr::UnresolvedLookupExprClass: {
5307 case Expr::CXXUnresolvedConstructExprClass: {
5313 assert(N == 1 &&
"unexpected form for list initialization");
5317 mangleInitListElements(IL);
5324 if (N != 1)
Out <<
'_';
5325 for (
unsigned I = 0; I != N; ++I) mangleExpression(CE->
getArg(I));
5326 if (N != 1)
Out <<
'E';
5330 case Expr::CXXConstructExprClass: {
5337 "implicit CXXConstructExpr must have one argument");
5344 mangleExpression(E);
5349 case Expr::CXXTemporaryObjectExprClass: {
5360 if (!List && N != 1)
5362 if (CE->isStdInitListInitialization()) {
5369 mangleInitListElements(ILE);
5372 mangleExpression(E);
5379 case Expr::CXXScalarValueInitExprClass:
5386 case Expr::CXXNoexceptExprClass:
5392 case Expr::UnaryExprOrTypeTraitExprClass: {
5409 QualType T = (ImplicitlyConvertedToType.
isNull() ||
5411 : ImplicitlyConvertedToType;
5413 mangleIntegerLiteral(T,
V);
5419 auto MangleAlignofSizeofArg = [&] {
5429 auto MangleExtensionBuiltin = [&](
const UnaryExprOrTypeTraitExpr *E,
5430 StringRef Name = {}) {
5433 mangleVendorType(Name);
5444 MangleAlignofSizeofArg();
5446 case UETT_PreferredAlignOf:
5450 if (!isCompatibleWith(LangOptions::ClangABI::Ver11)) {
5451 MangleExtensionBuiltin(SAE,
"__alignof__");
5457 MangleAlignofSizeofArg();
5461 case UETT_VectorElements:
5462 case UETT_OpenMPRequiredSimdAlign:
5464 case UETT_PtrAuthTypeDiscriminator:
5465 case UETT_DataSizeOf: {
5466 DiagnosticsEngine &Diags = Context.getDiags();
5475 case Expr::TypeTraitExprClass: {
5480 mangleVendorType(Spelling);
5481 for (TypeSourceInfo *TSI : TTE->
getArgs()) {
5482 mangleType(TSI->getType());
5488 case Expr::CXXThrowExprClass: {
5502 case Expr::CXXTypeidExprClass: {
5517 case Expr::CXXDeleteExprClass: {
5528 case Expr::UnaryOperatorClass: {
5537 case Expr::ArraySubscriptExprClass: {
5544 mangleExpression(AE->
getLHS());
5545 mangleExpression(AE->
getRHS());
5549 case Expr::MatrixSingleSubscriptExprClass: {
5553 mangleExpression(ME->
getBase());
5558 case Expr::MatrixSubscriptExprClass: {
5562 mangleExpression(ME->
getBase());
5568 case Expr::CompoundAssignOperatorClass:
5569 case Expr::BinaryOperatorClass: {
5577 mangleExpression(BO->
getLHS());
5578 mangleExpression(BO->
getRHS());
5582 case Expr::CXXRewrittenBinaryOperatorClass: {
5585 CXXRewrittenBinaryOperator::DecomposedForm Decomposed =
5589 mangleExpression(Decomposed.
LHS);
5590 mangleExpression(Decomposed.
RHS);
5594 case Expr::ConditionalOperatorClass: {
5597 mangleOperatorName(OO_Conditional, 3);
5598 mangleExpression(CO->
getCond());
5599 mangleExpression(CO->
getLHS(), Arity);
5600 mangleExpression(CO->
getRHS(), Arity);
5604 case Expr::ImplicitCastExprClass: {
5605 ImplicitlyConvertedToType = E->
getType();
5610 case Expr::ObjCBridgedCastExprClass: {
5616 mangleCastExpression(E,
"cv");
5620 case Expr::CStyleCastExprClass:
5622 mangleCastExpression(E,
"cv");
5625 case Expr::CXXFunctionalCastExprClass: {
5629 if (
auto *CCE = dyn_cast<CXXConstructExpr>(Sub))
5630 if (CCE->getParenOrBraceRange().isInvalid())
5631 Sub = CCE->getArg(0)->IgnoreImplicit();
5632 if (
auto *StdInitList = dyn_cast<CXXStdInitializerListExpr>(Sub))
5633 Sub = StdInitList->getSubExpr()->IgnoreImplicit();
5634 if (
auto *IL = dyn_cast<InitListExpr>(Sub)) {
5637 mangleInitListElements(IL);
5640 mangleCastExpression(E,
"cv");
5645 case Expr::CXXStaticCastExprClass:
5647 mangleCastExpression(E,
"sc");
5649 case Expr::CXXDynamicCastExprClass:
5651 mangleCastExpression(E,
"dc");
5653 case Expr::CXXReinterpretCastExprClass:
5655 mangleCastExpression(E,
"rc");
5657 case Expr::CXXConstCastExprClass:
5659 mangleCastExpression(E,
"cc");
5661 case Expr::CXXAddrspaceCastExprClass:
5663 mangleCastExpression(E,
"ac");
5666 case Expr::CXXOperatorCallExprClass: {
5675 for (
unsigned i = 0; i != NumArgs; ++i)
5676 mangleExpression(CE->
getArg(i));
5680 case Expr::ParenExprClass:
5684 case Expr::ConceptSpecializationExprClass: {
5686 if (isCompatibleWith(LangOptions::ClangABI::Ver17)) {
5691 mangleTemplateName(CSE->getNamedConcept(), CSE->getTemplateArguments());
5697 mangleUnresolvedName(
5698 CSE->getNestedNameSpecifierLoc().getNestedNameSpecifier(),
5699 CSE->getConceptNameInfo().getName(),
5700 CSE->getTemplateArgsAsWritten()->getTemplateArgs(),
5701 CSE->getTemplateArgsAsWritten()->getNumTemplateArgs());
5705 case Expr::RequiresExprClass: {
5711 if (RE->getLParenLoc().isValid()) {
5713 FunctionTypeDepthState saved = FunctionTypeDepth.push();
5714 if (RE->getLocalParameters().empty()) {
5717 for (ParmVarDecl *Param : RE->getLocalParameters()) {
5725 FunctionTypeDepth.enterFunctionDeclSuffix();
5726 for (
const concepts::Requirement *Req : RE->getRequirements())
5727 mangleRequirement(RE->getExprLoc(), Req);
5728 FunctionTypeDepth.pop(saved);
5732 for (
const concepts::Requirement *Req : RE->getRequirements())
5733 mangleRequirement(RE->getExprLoc(), Req);
5739 case Expr::DeclRefExprClass:
5744 case Expr::SubstNonTypeTemplateParmPackExprClass:
5750 Out <<
"_SUBSTPACK_";
5753 case Expr::FunctionParmPackExprClass: {
5757 Out <<
"v110_SUBSTPACK";
5762 case Expr::DependentScopeDeclRefExprClass: {
5771 case Expr::CXXBindTemporaryExprClass:
5775 case Expr::ExprWithCleanupsClass:
5779 case Expr::FloatingLiteralClass: {
5786 case Expr::FixedPointLiteralClass:
5788 mangleFixedPointLiteral();
5791 case Expr::CharacterLiteralClass:
5795 Out << cast<CharacterLiteral>(E)->getValue();
5800 case Expr::ObjCBoolLiteralExprClass:
5803 Out << (cast<ObjCBoolLiteralExpr>(E)->getValue() ?
'1' :
'0');
5807 case Expr::CXXBoolLiteralExprClass:
5810 Out << (cast<CXXBoolLiteralExpr>(E)->getValue() ?
'1' :
'0');
5814 case Expr::IntegerLiteralClass: {
5818 Value.setIsSigned(
true);
5823 case Expr::ImaginaryLiteralClass: {
5830 if (
const FloatingLiteral *Imag =
5831 dyn_cast<FloatingLiteral>(IE->
getSubExpr())) {
5833 mangleFloat(llvm::APFloat(Imag->getValue().getSemantics()));
5835 mangleFloat(Imag->getValue());
5840 Value.setIsSigned(
true);
5841 mangleNumber(
Value);
5847 case Expr::StringLiteralClass: {
5857 case Expr::GNUNullExprClass:
5860 mangleIntegerLiteral(E->
getType(), llvm::APSInt(32));
5863 case Expr::CXXNullPtrLiteralExprClass: {
5869 case Expr::LambdaExprClass: {
5880 case Expr::PackExpansionExprClass:
5886 case Expr::SizeOfPackExprClass: {
5889 if (SPE->isPartiallySubstituted()) {
5891 for (
const auto &A : SPE->getPartialArguments())
5892 mangleTemplateArg(A,
false);
5898 mangleReferenceToPack(SPE->getPack());
5902 case Expr::MaterializeTemporaryExprClass:
5906 case Expr::CXXFoldExprClass: {
5909 if (FE->isLeftFold())
5910 Out << (FE->getInit() ?
"fL" :
"fl");
5912 Out << (FE->getInit() ?
"fR" :
"fr");
5914 if (FE->getOperator() == BO_PtrMemD)
5922 mangleExpression(FE->getLHS());
5924 mangleExpression(FE->getRHS());
5928 case Expr::PackIndexingExprClass: {
5932 mangleReferenceToPack(PE->getPackDecl());
5933 mangleExpression(PE->getIndexExpr());
5937 case Expr::CXXThisExprClass:
5942 case Expr::CoawaitExprClass:
5945 Out <<
"v18co_await";
5949 case Expr::DependentCoawaitExprClass:
5952 Out <<
"v18co_await";
5956 case Expr::CoyieldExprClass:
5959 Out <<
"v18co_yield";
5962 case Expr::SYCLUniqueStableNameExprClass: {
5966 Out <<
"u33__builtin_sycl_unique_stable_name";
5967 mangleType(USN->getTypeSourceInfo()->getType());
5972 case Expr::HLSLOutArgExprClass:
5974 "cannot mangle hlsl temporary value; mangling wrong thing?");
5975 case Expr::OpenACCAsteriskSizeExprClass: {
5977 DiagnosticsEngine &Diags = Context.getDiags();
5978 Diags.
Report(diag::err_unsupported_itanium_mangling)
5979 << UnsupportedItaniumManglingKind::OpenACCAsteriskSizeExpr;
5984 if (AsTemplateArg && !IsPrimaryExpr)
6016void CXXNameMangler::mangleFunctionParam(
const ParmVarDecl *parm) {
6021 if (
unsigned nestingDepth = FunctionTypeDepth.getNestingDepth(parmDepth);
6022 nestingDepth == 0) {
6025 Out <<
"fL" << (nestingDepth - 1) <<
'p';
6033 &&
"parameter's type is still an array type?");
6035 if (
const DependentAddressSpaceType *DAST =
6036 dyn_cast<DependentAddressSpaceType>(parm->
getType())) {
6043 if (parmIndex != 0) {
6044 Out << (parmIndex - 1);
6049void CXXNameMangler::mangleCXXCtorType(
CXXCtorType T,
6050 const CXXRecordDecl *InheritedFrom) {
6077 llvm_unreachable(
"closure constructors don't exist for the Itanium ABI!");
6080 mangleName(InheritedFrom);
6083void CXXNameMangler::mangleCXXDtorType(
CXXDtorType T) {
6108 llvm_unreachable(
"Itanium ABI does not use vector deleting dtors");
6112void CXXNameMangler::mangleReferenceToPack(
const NamedDecl *Pack) {
6113 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
6114 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
6115 else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Pack))
6116 mangleTemplateParameter(NTTP->getDepth(), NTTP->getIndex());
6117 else if (
const auto *TempTP = dyn_cast<TemplateTemplateParmDecl>(Pack))
6118 mangleTemplateParameter(TempTP->getDepth(), TempTP->getIndex());
6152 if (
auto *FTD = dyn_cast_or_null<FunctionTemplateDecl>(
ResolvedTemplate)) {
6153 auto *RD = dyn_cast<CXXRecordDecl>(FTD->getDeclContext());
6154 if (!RD || !RD->isGenericLambda())
6170 if (
auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
6171 return TTP->hasTypeConstraint();
6188 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param))
6189 return NTTP->getType()->isInstantiationDependentType() ||
6190 NTTP->getType()->getContainedDeducedType();
6197 "A DeducedTemplateName shouldn't escape partial ordering");
6208 auto MangleTemplateParamListToString =
6210 unsigned DepthOffset) {
6211 llvm::raw_svector_ostream Stream(Buffer);
6212 CXXNameMangler(
Mangler.Context, Stream,
6213 WithTemplateDepthOffset{DepthOffset})
6214 .mangleTemplateParameterList(Params);
6217 MangleTemplateParamListToString(ParamTemplateHead,
6218 TTP->getTemplateParameters(), 0);
6222 MangleTemplateParamListToString(ArgTemplateHead,
6224 TTP->getTemplateParameters()->
getDepth());
6225 return ParamTemplateHead != ArgTemplateHead;
6235 return {
true,
nullptr};
6240 assert(ParamIdx < ResolvedTemplate->getTemplateParameters()->size() &&
6241 "no parameter for argument");
6262 return {
true,
nullptr};
6277 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param);
6278 bool NeedExactType = NTTP && NTTP->getType()->getContainedDeducedType();
6279 return {NeedExactType,
nullptr};
6291void CXXNameMangler::mangleTemplateArgs(
TemplateName TN,
6293 unsigned NumTemplateArgs) {
6296 TemplateArgManglingInfo Info(*
this, TN);
6297 for (
unsigned i = 0; i != NumTemplateArgs; ++i) {
6298 mangleTemplateArg(Info, i, TemplateArgs[i].
getArgument());
6300 mangleRequiresClause(Info.getTrailingRequiresClauseToMangle());
6304void CXXNameMangler::mangleTemplateArgs(
TemplateName TN,
6305 const TemplateArgumentList &AL) {
6308 TemplateArgManglingInfo Info(*
this, TN);
6309 for (
unsigned i = 0, e = AL.
size(); i != e; ++i) {
6310 mangleTemplateArg(Info, i, AL[i]);
6312 mangleRequiresClause(Info.getTrailingRequiresClauseToMangle());
6316void CXXNameMangler::mangleTemplateArgs(
TemplateName TN,
6317 ArrayRef<TemplateArgument> Args) {
6320 TemplateArgManglingInfo Info(*
this, TN);
6321 for (
unsigned i = 0; i != Args.size(); ++i) {
6322 mangleTemplateArg(Info, i, Args[i]);
6324 mangleRequiresClause(Info.getTrailingRequiresClauseToMangle());
6328void CXXNameMangler::mangleTemplateArg(TemplateArgManglingInfo &Info,
6329 unsigned Index, TemplateArgument A) {
6330 TemplateArgManglingInfo::Info ArgInfo = Info.getArgInfo(Index, A);
6333 if (ArgInfo.TemplateParameterToMangle &&
6334 !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
6341 mangleTemplateParamDecl(ArgInfo.TemplateParameterToMangle);
6344 mangleTemplateArg(A, ArgInfo.NeedExactType);
6347void CXXNameMangler::mangleTemplateArg(TemplateArgument A,
bool NeedExactType) {
6357 llvm_unreachable(
"Cannot mangle NULL template argument");
6385 mangleValueInTemplateArg(TPO->getType().getUnqualifiedType(),
6386 TPO->getValue(),
true,
6391 ASTContext &Ctx = Context.getASTContext();
6399 !isCompatibleWith(LangOptions::ClangABI::Ver11))
6407 ArrayRef<APValue::LValuePathEntry>(),
6420 true, NeedExactType);
6426 mangleTemplateArg(P, NeedExactType);
6432void CXXNameMangler::mangleTemplateArgExpr(
const Expr *E) {
6433 if (!isCompatibleWith(LangOptions::ClangABI::Ver11)) {
6434 mangleExpression(E, UnknownArity,
true);
6449 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
6450 const ValueDecl *D = DRE->getDecl();
6459 mangleExpression(E);
6472 switch (
V.getKind()) {
6480 assert(RD &&
"unexpected type for record value");
6489 if (!FD->isUnnamedBitField() &&
6499 assert(RD &&
"unexpected type for union value");
6502 if (!FD->isUnnamedBitField())
6512 QualType ElemT(T->getArrayElementTypeNoTypeQual(), 0);
6513 for (
unsigned I = 0, N =
V.getArrayInitializedElts(); I != N; ++I)
6521 for (
unsigned I = 0, N =
V.getVectorLength(); I != N; ++I)
6528 llvm_unreachable(
"Matrix APValues not yet supported");
6534 return V.getFloat().isPosZero();
6537 return !
V.getFixedPoint().getValue();
6540 return V.getComplexFloatReal().isPosZero() &&
6541 V.getComplexFloatImag().isPosZero();
6544 return !
V.getComplexIntReal() && !
V.getComplexIntImag();
6547 return V.isNullPointer();
6550 return !
V.getMemberPointerDecl();
6553 llvm_unreachable(
"Unhandled APValue::ValueKind enum");
6560 T = AT->getElementType();
6562 dyn_cast<FieldDecl>(E.getAsBaseOrMember().getPointer()))
6605 Diags.
Report(UnionLoc, diag::err_unsupported_itanium_mangling)
6606 << UnsupportedItaniumManglingKind::UnnamedUnionNTTP;
6611void CXXNameMangler::mangleValueInTemplateArg(QualType T,
const APValue &
V,
6613 bool NeedExactType) {
6616 T = getASTContext().getUnqualifiedArrayType(T, Quals);
6619 bool IsPrimaryExpr =
true;
6620 auto NotPrimaryExpr = [&] {
6621 if (TopLevel && IsPrimaryExpr)
6623 IsPrimaryExpr =
false;
6627 switch (
V.getKind()) {
6636 llvm_unreachable(
"unexpected value kind in template argument");
6640 assert(RD &&
"unexpected type for record value");
6643 llvm::SmallVector<const FieldDecl *, 16> Fields(RD->
fields());
6646 (Fields.back()->isUnnamedBitField() ||
6648 V.getStructField(Fields.back()->getFieldIndex())))) {
6652 if (Fields.empty()) {
6653 while (!Bases.empty() &&
6655 V.getStructBase(Bases.size() - 1)))
6656 Bases = Bases.drop_back();
6663 for (
unsigned I = 0, N = Bases.size(); I != N; ++I)
6664 mangleValueInTemplateArg(Bases[I].
getType(),
V.getStructBase(I),
false);
6665 for (
unsigned I = 0, N = Fields.size(); I != N; ++I) {
6666 if (Fields[I]->isUnnamedBitField())
6668 mangleValueInTemplateArg(Fields[I]->
getType(),
6669 V.getStructField(Fields[I]->getFieldIndex()),
6678 const FieldDecl *FD =
V.getUnionField();
6696 mangleSourceName(II);
6697 mangleValueInTemplateArg(FD->
getType(),
V.getUnionValue(),
false);
6711 unsigned N =
V.getArraySize();
6713 N =
V.getArrayInitializedElts();
6718 for (
unsigned I = 0; I != N; ++I) {
6719 const APValue &Elem = I <
V.getArrayInitializedElts()
6720 ?
V.getArrayInitializedElt(I)
6721 :
V.getArrayFiller();
6722 mangleValueInTemplateArg(ElemT, Elem,
false);
6729 const VectorType *VT = T->
castAs<VectorType>();
6734 unsigned N =
V.getVectorLength();
6737 for (
unsigned I = 0; I != N; ++I)
6738 mangleValueInTemplateArg(VT->
getElementType(),
V.getVectorElt(I),
false);
6744 llvm_unreachable(
"Matrix template argument mangling not yet supported");
6747 mangleIntegerLiteral(T,
V.getInt());
6751 mangleFloatLiteral(T,
V.getFloat());
6755 mangleFixedPointLiteral();
6759 const ComplexType *CT = T->
castAs<ComplexType>();
6763 if (!
V.getComplexFloatReal().isPosZero() ||
6764 !
V.getComplexFloatImag().isPosZero())
6766 if (!
V.getComplexFloatImag().isPosZero())
6773 const ComplexType *CT = T->
castAs<ComplexType>();
6777 if (
V.getComplexIntReal().getBoolValue() ||
6778 V.getComplexIntImag().getBoolValue())
6780 if (
V.getComplexIntImag().getBoolValue())
6789 "unexpected type for LValue template arg");
6791 if (
V.isNullPointer()) {
6792 mangleNullPointer(T);
6796 APValue::LValueBase B =
V.getLValueBase();
6800 CharUnits Offset =
V.getLValueOffset();
6818 ASTContext &Ctx = Context.getASTContext();
6821 if (!
V.hasLValuePath()) {
6837 bool IsArrayToPointerDecayMangledAsDecl =
false;
6838 if (TopLevel && isCompatibleWith(LangOptions::ClangABI::Ver11)) {
6840 IsArrayToPointerDecayMangledAsDecl =
6841 BType->
isArrayType() &&
V.getLValuePath().size() == 1 &&
6842 V.getLValuePath()[0].getAsArrayIndex() == 0 &&
6846 if ((!
V.getLValuePath().empty() ||
V.isLValueOnePastTheEnd()) &&
6847 !IsArrayToPointerDecayMangledAsDecl) {
6864 if (NeedExactType &&
6866 !isCompatibleWith(LangOptions::ClangABI::Ver11)) {
6879 QualType TypeSoFar = B.
getType();
6880 if (
auto *VD = B.
dyn_cast<
const ValueDecl*>()) {
6884 }
else if (
auto *E = B.
dyn_cast<
const Expr*>()) {
6886 mangleExpression(E);
6887 }
else if (
auto TI = B.
dyn_cast<TypeInfoLValue>()) {
6890 mangleType(QualType(TI.getType(), 0));
6893 llvm_unreachable(
"unexpected lvalue base kind in template argument");
6903 mangleNumber(
V.getLValueOffset().getQuantity());
6910 if (!
V.getLValueOffset().isZero())
6911 mangleNumber(
V.getLValueOffset().getQuantity());
6915 bool OnePastTheEnd =
V.isLValueOnePastTheEnd();
6917 for (APValue::LValuePathEntry E :
V.getLValuePath()) {
6919 if (
auto *CAT = dyn_cast<ConstantArrayType>(AT))
6920 OnePastTheEnd |= CAT->getSize() == E.getAsArrayIndex();
6921 TypeSoFar = AT->getElementType();
6923 const Decl *D = E.getAsBaseOrMember().getPointer();
6924 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
6949 if (!
V.getMemberPointerDecl()) {
6950 mangleNullPointer(T);
6954 ASTContext &Ctx = Context.getASTContext();
6957 if (!
V.getMemberPointerPath().empty()) {
6960 }
else if (NeedExactType &&
6962 T->
castAs<MemberPointerType>()->getPointeeType(),
6963 V.getMemberPointerDecl()->getType()) &&
6964 !isCompatibleWith(LangOptions::ClangABI::Ver11)) {
6969 mangle(
V.getMemberPointerDecl());
6971 if (!
V.getMemberPointerPath().empty()) {
6981 if (TopLevel && !IsPrimaryExpr)
6985void CXXNameMangler::mangleTemplateParameter(
unsigned Depth,
unsigned Index) {
6995 Depth += TemplateDepthOffset;
6997 Out <<
'L' << (Depth - 1) <<
'_';
7003void CXXNameMangler::mangleSeqID(
unsigned SeqID) {
7006 }
else if (SeqID == 1) {
7013 MutableArrayRef<char> BufferRef(Buffer);
7014 MutableArrayRef<char>::reverse_iterator I = BufferRef.rbegin();
7016 for (; SeqID != 0; SeqID /= 36) {
7017 unsigned C = SeqID % 36;
7018 *I++ = (
C < 10 ?
'0' +
C :
'A' +
C - 10);
7021 Out.write(I.base(), I - BufferRef.rbegin());
7026void CXXNameMangler::mangleExistingSubstitution(
TemplateName tname) {
7027 bool result = mangleSubstitution(tname);
7028 assert(result &&
"no existing substitution for template name");
7034bool CXXNameMangler::mangleSubstitution(
const NamedDecl *ND) {
7036 if (mangleStandardSubstitution(ND))
7040 return mangleSubstitution(
reinterpret_cast<uintptr_t>(ND));
7050bool CXXNameMangler::mangleSubstitution(QualType T) {
7053 return mangleSubstitution(RD);
7058 return mangleSubstitution(TypePtr);
7062 if (TemplateDecl *TD =
Template.getAsTemplateDecl())
7063 return mangleSubstitution(TD);
7066 return mangleSubstitution(
7070bool CXXNameMangler::mangleSubstitution(
uintptr_t Ptr) {
7071 llvm::DenseMap<uintptr_t, unsigned>::iterator I = Substitutions.find(Ptr);
7072 if (I == Substitutions.end())
7075 unsigned SeqID = I->second;
7084bool CXXNameMangler::isSpecializedAs(QualType S, llvm::StringRef Name,
7093 const auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
7094 if (!SD || !SD->getIdentifier()->isStr(Name))
7097 if (!isStdNamespace(Context.getEffectiveDeclContext(SD)))
7100 const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs();
7101 if (TemplateArgs.
size() != 1)
7104 if (TemplateArgs[0].getAsType() != A)
7107 if (SD->getSpecializedTemplate()->getOwningModuleForLinkage())
7116bool CXXNameMangler::isStdCharSpecialization(
7117 const ClassTemplateSpecializationDecl *SD, llvm::StringRef Name,
7118 bool HasAllocator) {
7123 if (TemplateArgs.
size() != (HasAllocator ? 3 : 2))
7126 QualType A = TemplateArgs[0].getAsType();
7134 if (!isSpecializedAs(TemplateArgs[1].getAsType(),
"char_traits", A))
7138 !isSpecializedAs(TemplateArgs[2].getAsType(),
"allocator", A))
7147bool CXXNameMangler::mangleStandardSubstitution(
const NamedDecl *ND) {
7149 if (
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
7157 if (
const ClassTemplateDecl *TD = dyn_cast<ClassTemplateDecl>(ND)) {
7158 if (!isStdNamespace(Context.getEffectiveDeclContext(TD)))
7178 if (
const ClassTemplateSpecializationDecl *SD =
7179 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
7180 if (!isStdNamespace(Context.getEffectiveDeclContext(SD)))
7189 if (isStdCharSpecialization(SD,
"basic_string",
true)) {
7196 if (isStdCharSpecialization(SD,
"basic_istream",
false)) {
7203 if (isStdCharSpecialization(SD,
"basic_ostream",
false)) {
7210 if (isStdCharSpecialization(SD,
"basic_iostream",
false)) {
7220void CXXNameMangler::addSubstitution(QualType T) {
7223 addSubstitution(RD);
7229 addSubstitution(TypePtr);
7233 if (TemplateDecl *TD =
Template.getAsTemplateDecl())
7234 return addSubstitution(TD);
7240void CXXNameMangler::addSubstitution(
uintptr_t Ptr) {
7241 assert(!Substitutions.count(Ptr) &&
"Substitution already exists!");
7242 Substitutions[Ptr] = SeqID++;
7245void CXXNameMangler::extendSubstitutions(CXXNameMangler*
Other) {
7246 assert(
Other->SeqID >= SeqID &&
"Must be superset of substitutions!");
7247 if (
Other->SeqID > SeqID) {
7248 Substitutions.swap(
Other->Substitutions);
7249 SeqID =
Other->SeqID;
7253CXXNameMangler::AbiTagList
7254CXXNameMangler::makeFunctionReturnTypeTags(
const FunctionDecl *FD) {
7256 if (DisableDerivedAbiTags)
7257 return AbiTagList();
7259 llvm::raw_null_ostream NullOutStream;
7260 CXXNameMangler TrackReturnTypeTags(*
this, NullOutStream);
7261 TrackReturnTypeTags.disableDerivedAbiTags();
7263 const FunctionProtoType *Proto =
7265 FunctionTypeDepthState saved = TrackReturnTypeTags.FunctionTypeDepth.push();
7266 TrackReturnTypeTags.FunctionTypeDepth.enterFunctionDeclSuffix();
7268 TrackReturnTypeTags.FunctionTypeDepth.leaveFunctionDeclSuffix();
7269 TrackReturnTypeTags.FunctionTypeDepth.pop(saved);
7271 return TrackReturnTypeTags.AbiTagsRoot.getSortedUniqueUsedAbiTags();
7274CXXNameMangler::AbiTagList
7275CXXNameMangler::makeVariableTypeTags(
const VarDecl *VD) {
7277 if (DisableDerivedAbiTags)
7278 return AbiTagList();
7280 llvm::raw_null_ostream NullOutStream;
7281 CXXNameMangler TrackVariableType(*
this, NullOutStream);
7282 TrackVariableType.disableDerivedAbiTags();
7284 TrackVariableType.mangleType(VD->
getType());
7286 return TrackVariableType.AbiTagsRoot.getSortedUniqueUsedAbiTags();
7289bool CXXNameMangler::shouldHaveAbiTags(ItaniumMangleContextImpl &
C,
7290 const VarDecl *VD) {
7291 llvm::raw_null_ostream NullOutStream;
7292 CXXNameMangler TrackAbiTags(
C, NullOutStream,
nullptr,
true);
7293 TrackAbiTags.mangle(VD);
7294 return TrackAbiTags.AbiTagsRoot.getUsedAbiTags().size();
7299void ItaniumMangleContextImpl::mangleCXXName(GlobalDecl GD,
7303 "Invalid mangleName() call, argument is not a variable or function!");
7305 PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
7306 getASTContext().getSourceManager(),
7307 "Mangling declaration");
7309 if (
auto *CD = dyn_cast<CXXConstructorDecl>(D)) {
7311 CXXNameMangler Mangler(*
this, Out, CD,
Type);
7312 return Mangler.mangle(GlobalDecl(CD,
Type));
7315 if (
auto *DD = dyn_cast<CXXDestructorDecl>(D)) {
7317 CXXNameMangler Mangler(*
this, Out, DD,
Type);
7318 return Mangler.mangle(GlobalDecl(DD,
Type));
7321 CXXNameMangler Mangler(*
this, Out, D);
7325void ItaniumMangleContextImpl::mangleCXXCtorComdat(
const CXXConstructorDecl *D,
7327 CXXNameMangler Mangler(*
this, Out, D,
Ctor_Comdat);
7331void ItaniumMangleContextImpl::mangleCXXDtorComdat(
const CXXDestructorDecl *D,
7333 CXXNameMangler Mangler(*
this, Out, D,
Dtor_Comdat);
7355 auto &LangOpts = Context.getLangOpts();
7358 Context.baseForVTableAuthentication(ThisRD);
7359 unsigned TypedDiscriminator =
7360 Context.getPointerAuthVTablePointerDiscriminator(ThisRD);
7361 Mangler.mangleVendorQualifier(
"__vtptrauth");
7362 auto &ManglerStream = Mangler.getStream();
7363 ManglerStream <<
"I";
7364 if (
const auto *ExplicitAuth =
7365 PtrauthClassRD->
getAttr<VTablePointerAuthenticationAttr>()) {
7366 ManglerStream <<
"Lj" << ExplicitAuth->getKey();
7368 if (ExplicitAuth->getAddressDiscrimination() ==
7369 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination)
7370 ManglerStream <<
"Lb" << LangOpts.PointerAuthVTPtrAddressDiscrimination;
7372 ManglerStream <<
"Lb"
7373 << (ExplicitAuth->getAddressDiscrimination() ==
7374 VTablePointerAuthenticationAttr::AddressDiscrimination);
7376 switch (ExplicitAuth->getExtraDiscrimination()) {
7377 case VTablePointerAuthenticationAttr::DefaultExtraDiscrimination: {
7378 if (LangOpts.PointerAuthVTPtrTypeDiscrimination)
7379 ManglerStream <<
"Lj" << TypedDiscriminator;
7381 ManglerStream <<
"Lj" << 0;
7384 case VTablePointerAuthenticationAttr::TypeDiscrimination:
7385 ManglerStream <<
"Lj" << TypedDiscriminator;
7387 case VTablePointerAuthenticationAttr::CustomDiscrimination:
7388 ManglerStream <<
"Lj" << ExplicitAuth->getCustomDiscriminationValue();
7390 case VTablePointerAuthenticationAttr::NoExtraDiscrimination:
7391 ManglerStream <<
"Lj" << 0;
7395 ManglerStream <<
"Lj"
7396 << (
unsigned)VTablePointerAuthenticationAttr::DefaultKey;
7397 ManglerStream <<
"Lb" << LangOpts.PointerAuthVTPtrAddressDiscrimination;
7398 if (LangOpts.PointerAuthVTPtrTypeDiscrimination)
7399 ManglerStream <<
"Lj" << TypedDiscriminator;
7401 ManglerStream <<
"Lj" << 0;
7403 ManglerStream <<
"E";
7406void ItaniumMangleContextImpl::mangleThunk(
const CXXMethodDecl *MD,
7407 const ThunkInfo &Thunk,
7408 bool ElideOverrideInfo,
7418 "Use mangleCXXDtor for destructor decls!");
7419 CXXNameMangler Mangler(*
this, Out);
7420 Mangler.getStream() <<
"_ZT";
7422 Mangler.getStream() <<
'c';
7433 Mangler.mangleFunctionEncoding(MD);
7434 if (!ElideOverrideInfo)
7438void ItaniumMangleContextImpl::mangleCXXDtorThunk(
const CXXDestructorDecl *DD,
7440 const ThunkInfo &Thunk,
7441 bool ElideOverrideInfo,
7445 CXXNameMangler Mangler(*
this, Out, DD,
Type);
7446 Mangler.getStream() <<
"_ZT";
7448 auto &ThisAdjustment = Thunk.
This;
7450 Mangler.mangleCallOffset(ThisAdjustment.NonVirtual,
7451 ThisAdjustment.Virtual.Itanium.VCallOffsetOffset);
7453 Mangler.mangleFunctionEncoding(GlobalDecl(DD,
Type));
7454 if (!ElideOverrideInfo)
7459void ItaniumMangleContextImpl::mangleStaticGuardVariable(
const VarDecl *D,
7463 CXXNameMangler Mangler(*
this, Out);
7466 Mangler.getStream() <<
"_ZGV";
7467 Mangler.mangleName(D);
7470void ItaniumMangleContextImpl::mangleDynamicInitializer(
const VarDecl *MD,
7475 Out <<
"__cxx_global_var_init";
7478void ItaniumMangleContextImpl::mangleDynamicAtExitDestructor(
const VarDecl *D,
7481 CXXNameMangler Mangler(*
this, Out);
7482 Mangler.getStream() <<
"__dtor_";
7483 if (shouldMangleDeclName(D))
7486 Mangler.getStream() << D->
getName();
7489void ItaniumMangleContextImpl::mangleDynamicStermFinalizer(
const VarDecl *D,
7493 CXXNameMangler Mangler(*
this, Out);
7494 Mangler.getStream() <<
"__finalize_";
7495 if (shouldMangleDeclName(D))
7498 Mangler.getStream() << D->
getName();
7501void ItaniumMangleContextImpl::mangleSEHFilterExpression(
7502 GlobalDecl EnclosingDecl, raw_ostream &Out) {
7503 CXXNameMangler Mangler(*
this, Out);
7504 Mangler.getStream() <<
"__filt_";
7506 if (shouldMangleDeclName(EnclosingFD))
7507 Mangler.mangle(EnclosingDecl);
7509 Mangler.getStream() << EnclosingFD->getName();
7512void ItaniumMangleContextImpl::mangleSEHFinallyBlock(
7513 GlobalDecl EnclosingDecl, raw_ostream &Out) {
7514 CXXNameMangler Mangler(*
this, Out);
7515 Mangler.getStream() <<
"__fin_";
7517 if (shouldMangleDeclName(EnclosingFD))
7518 Mangler.mangle(EnclosingDecl);
7520 Mangler.getStream() << EnclosingFD->getName();
7523void ItaniumMangleContextImpl::mangleItaniumThreadLocalInit(
const VarDecl *D,
7526 CXXNameMangler Mangler(*
this, Out);
7527 Mangler.getStream() <<
"_ZTH";
7528 Mangler.mangleName(D);
7532ItaniumMangleContextImpl::mangleItaniumThreadLocalWrapper(
const VarDecl *D,
7535 CXXNameMangler Mangler(*
this, Out);
7536 Mangler.getStream() <<
"_ZTW";
7537 Mangler.mangleName(D);
7540void ItaniumMangleContextImpl::mangleReferenceTemporary(
const VarDecl *D,
7541 unsigned ManglingNumber,
7545 CXXNameMangler Mangler(*
this, Out);
7546 Mangler.getStream() <<
"_ZGR";
7547 Mangler.mangleName(D);
7548 assert(ManglingNumber > 0 &&
"Reference temporary mangling number is zero!");
7549 Mangler.mangleSeqID(ManglingNumber - 1);
7552void ItaniumMangleContextImpl::mangleCXXVTable(
const CXXRecordDecl *RD,
7555 CXXNameMangler Mangler(*
this, Out);
7556 Mangler.getStream() <<
"_ZTV";
7557 Mangler.mangleCXXRecordDecl(RD);
7560void ItaniumMangleContextImpl::mangleCXXVTT(
const CXXRecordDecl *RD,
7563 CXXNameMangler Mangler(*
this, Out);
7564 Mangler.getStream() <<
"_ZTT";
7565 Mangler.mangleCXXRecordDecl(RD);
7568void ItaniumMangleContextImpl::mangleCXXCtorVTable(
const CXXRecordDecl *RD,
7570 const CXXRecordDecl *
Type,
7573 CXXNameMangler Mangler(*
this, Out);
7574 Mangler.getStream() <<
"_ZTC";
7577 bool SuppressSubstitution = getASTContext().getLangOpts().isCompatibleWith(
7578 LangOptions::ClangABI::Ver19);
7579 Mangler.mangleCXXRecordDecl(RD, SuppressSubstitution);
7580 Mangler.getStream() << Offset;
7581 Mangler.getStream() <<
'_';
7582 Mangler.mangleCXXRecordDecl(
Type);
7585void ItaniumMangleContextImpl::mangleCXXRTTI(QualType Ty, raw_ostream &Out) {
7587 assert(!Ty.
hasQualifiers() &&
"RTTI info cannot have top-level qualifiers");
7588 CXXNameMangler Mangler(*
this, Out);
7589 Mangler.getStream() <<
"_ZTI";
7590 Mangler.mangleType(Ty);
7593void ItaniumMangleContextImpl::mangleCXXRTTIName(
7594 QualType Ty, raw_ostream &Out,
bool NormalizeIntegers =
false) {
7596 CXXNameMangler Mangler(*
this, Out, NormalizeIntegers);
7597 Mangler.getStream() <<
"_ZTS";
7598 Mangler.mangleType(Ty);
7601void ItaniumMangleContextImpl::mangleCanonicalTypeName(
7602 QualType Ty, raw_ostream &Out,
bool NormalizeIntegers =
false) {
7603 mangleCXXRTTIName(Ty, Out, NormalizeIntegers);
7606void ItaniumMangleContextImpl::mangleStringLiteral(
const StringLiteral *, raw_ostream &) {
7607 llvm_unreachable(
"Can't mangle string literals");
7610void ItaniumMangleContextImpl::mangleLambdaSig(
const CXXRecordDecl *Lambda,
7612 CXXNameMangler Mangler(*
this, Out);
7613 Mangler.mangleLambdaSig(Lambda);
7616void ItaniumMangleContextImpl::mangleModuleInitializer(
const Module *M,
7619 CXXNameMangler Mangler(*
this, Out);
7620 Mangler.getStream() <<
"_ZGI";
7624 auto Partition = M->
Name.find(
':');
7625 Mangler.mangleModuleNamePrefix(
7626 StringRef(&M->
Name[Partition + 1], M->
Name.size() - Partition - 1),
7634 return new ItaniumMangleContextImpl(
7637 return std::nullopt;
7646 return new ItaniumMangleContextImpl(Context, Diags, DiscriminatorOverride,
Enums/classes describing ABI related information about constructors, destructors and thunks.
Defines the clang::ASTContext interface.
static bool isUniqueInternalLinkageDecl(GlobalDecl GD, CodeGenModule &CGM)
@ LLVM_MARK_AS_BITMASK_ENUM
static Decl::Kind getKind(const Decl *D)
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
Defines Expressions and AST nodes for C++2a concepts.
static bool isTypeSubstitutable(Qualifiers Quals, const Type *Ty, ASTContext &Ctx)
static IdentifierInfo * getUnionInitName(SourceLocation UnionLoc, DiagnosticsEngine &Diags, const FieldDecl *FD)
static bool hasMangledSubstitutionQualifiers(QualType T)
Determine whether the given type has any qualifiers that are relevant for substitutions.
#define CC_VLS_CASE(ABI_VLEN)
static GlobalDecl getParentOfLocalEntity(const DeclContext *DC)
@ ArmAgnosticSMEZAStateBit
@ ArmStreamingCompatibleBit
static AAPCSBitmaskSME encodeAAPCSZAState(unsigned SMEAttrs)
static StringRef mangleAArch64VectorBase(const BuiltinType *EltType)
static const CXXRecordDecl * getLambdaForInitCapture(const VarDecl *VD)
Retrieve the lambda associated with an init-capture variable.
static void mangleOverrideDiscrimination(CXXNameMangler &Mangler, ASTContext &Context, const ThunkInfo &Thunk)
Mangles the pointer authentication override attribute for classes that have explicit overrides for th...
static bool isZeroInitialized(QualType T, const APValue &V)
Determine whether a given value is equivalent to zero-initialization for the purpose of discarding a ...
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static bool isParenthesizedADLCallee(const CallExpr *call)
Look at the callee of the given call expression and determine if it's a parenthesized id-expression w...
static TemplateName asTemplateName(GlobalDecl GD)
static QualType getLValueType(ASTContext &Ctx, const APValue &LV)
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::Module class, which describes a module in the source code.
static StringRef getTriple(const Command &Job)
static StringRef getIdentifier(const Token &Tok)
Enums/classes describing THUNK related information about constructors, destructors and thunks.
Defines the clang::TypeLoc interface and its subclasses.
static const TemplateArgument & getArgument(const TemplateArgument &A)
A non-discriminated union of a base, field, or array index.
static LValuePathEntry ArrayIndex(uint64_t Index)
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
const LValueBase getLValueBase() const
ArrayRef< LValuePathEntry > getLValuePath() const
@ Indeterminate
This object has an indeterminate value (C++ [basic.indet]).
@ None
There is no such object (it's outside its lifetime).
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
TemplateArgument getCanonicalTemplateArgument(const TemplateArgument &Arg) const
Retrieve the "canonical" template argument.
CharUnits getMemberPointerPathAdjustment(const APValue &MP) const
Find the 'this' offset for the member path in a pointer-to-member APValue.
TemplateName getCanonicalTemplateName(TemplateName Name, bool IgnoreDeduced=false) const
Retrieves the "canonical" template name that refers to a given template.
const LangOptions & getLangOpts() const
QualType getDecayedType(QualType T) const
Return the uniqued reference to the decayed version of the given type.
QualType getPointerDiffType() const
Return the unique type for "ptrdiff_t" (C99 7.17) defined in <stddef.h>.
QualType getSignatureParameterType(QualType T) const
Retrieve the parameter type as adjusted for use in the signature of a function, decaying array and fu...
bool addressSpaceMapManglingFor(LangAS AS) const
const ArrayType * getAsArrayType(QualType T) const
Type Query functions.
static bool hasSameType(QualType T1, QualType T2)
Determine whether the given types T1 and T2 are equivalent.
bool hasSimilarType(QualType T1, QualType T2) const
Determine if two types are similar, according to the C++ rules.
CanQualType getCanonicalTagType(const TagDecl *TD) const
unsigned getTargetAddressSpace(LangAS AS) const
Expr * getLHS()
An array access can be written A[4] or 4[A] (both are equivalent).
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
QualType getValueType() const
Gets the type contained by this atomic type, i.e.
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given binary opcode.
unsigned getNumBits() const
QualType getPointeeType() const
This class is used for builtin types like 'int'.
bool isSignedInteger() const
Represents a base class of a C++ class.
ConstExprIterator const_arg_iterator
InheritedConstructor getInheritedConstructor() const
Get the constructor that this inheriting constructor is based on.
bool isGlobalDelete() const
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies the member name.
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments provided as part of this template-id.
DeclarationName getMember() const
Retrieve the name of the member that this expression refers to.
NamedDecl * getFirstQualifierFoundInScope() const
Retrieve the first part of the nested-name-specifier that was found in the scope of the member access...
Expr * getBase() const
Retrieve the base object of this member expressions, e.g., the x in x.m.
bool isImplicitAccess() const
True if this is an implicit access, i.e.
ConstExprIterator const_arg_iterator
OverloadedOperatorKind getOperator() const
Returns the kind of overloaded operator that this expression refers to.
Represents a C++ struct/union/class.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
TemplateParameterList * getGenericLambdaTemplateParameterList() const
Retrieve the generic lambda's template parameter list.
base_class_iterator bases_end()
bool isLambda() const
Determine whether this class describes a lambda function object.
unsigned getLambdaManglingNumber() const
If this is the closure type of a lambda expression, retrieve the number to be used for name mangling ...
base_class_iterator bases_begin()
TypeSourceInfo * getLambdaTypeInfo() const
ArrayRef< NamedDecl * > getLambdaExplicitTemplateParameters() const
Retrieve the lambda template parameters that were specified explicitly.
CXXMethodDecl * getLambdaStaticInvoker() const
Retrieve the lambda static invoker, the address of which is returned by the conversion operator,...
const Expr * getSubExpr() const
bool isTypeOperand() const
QualType getTypeOperand(const ASTContext &Context) const
Retrieves the type operand of this typeid() expression after various required adjustments (removing r...
Expr * getExprOperand() const
bool isListInitialization() const
Determine whether this expression models list-initialization.
Expr * getArg(unsigned I)
unsigned getNumArgs() const
Retrieve the number of arguments.
Expr * getExprOperand() const
QualType getTypeOperand(ASTContext &Context) const
Retrieves the type operand of this __uuidof() expression after various required adjustments (removing...
bool isTypeOperand() const
CallExpr - Represents a function call (C99 6.5.2.2, C++ [expr.call]).
Expr * getArg(unsigned Arg)
getArg - Return the specified argument.
unsigned getNumArgs() const
getNumArgs - Return the number of actual arguments to this call.
bool isZero() const
isZero - Test whether the quantity equals zero.
QuantityType getQuantity() const
getQuantity - Get the raw integer representation of this quantity.
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
Represents a class template specialization, which refers to a class template with a given set of temp...
ClassTemplateDecl * getSpecializedTemplate() const
Retrieve the template that this specialization specializes.
const TemplateArgumentList & getTemplateArgs() const
Retrieve the template arguments of the class template specialization.
QualType getElementType() const
Expr * getCond() const
getCond - Return the expression representing the condition for the ?
llvm::APInt getSize() const
Return the constant array size as an APInt.
unsigned getNumColumns() const
Returns the number of columns in the matrix.
unsigned getNumRows() const
Returns the number of rows in the matrix.
DeclContext - This is used only as base class of specific decl types that can act as declaration cont...
DeclContext * getParent()
getParent - Returns the containing DeclContext.
bool isRequiresExprBody() const
bool isFileContext() const
bool isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
FunctionDecl * getAsFunction() LLVM_READONLY
Returns the function itself, or the templated function if this is a function template.
SourceLocation getLocation() const
void setImplicit(bool I=true)
DeclContext * getDeclContext()
bool isInAnonymousNamespace() const
Module * getOwningModuleForLinkage() const
Get the module that owns this declaration for linkage purposes.
DeclContext * getLexicalDeclContext()
getLexicalDeclContext - The declaration context where this Decl was lexically declared (LexicalDC).
virtual Decl * getCanonicalDecl()
Retrieves the "canonical" declaration of the given declaration.
The name of a declaration.
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
const IdentifierInfo * getCXXLiteralIdentifier() const
If this name is the name of a literal operator, retrieve the identifier associated with it.
OverloadedOperatorKind getCXXOverloadedOperator() const
If this name is the name of an overloadable operator in C++ (e.g., operator+), retrieve the kind of o...
@ CXXConversionFunctionName
QualType getCXXNameType() const
If this name is one of the C++ names (of a constructor, destructor, or conversion function),...
NameKind getNameKind() const
Determine what kind of name this is.
const AssociatedConstraint & getTrailingRequiresClause() const
Get the constraint-expression introduced by the trailing requires-clause in the function/member decla...
Expr * getAddrSpaceExpr() const
QualType getPointeeType() const
Expr * getNumBitsExpr() const
NestedNameSpecifier getQualifier() const
Retrieve the nested-name-specifier that qualifies this declaration.
unsigned getNumTemplateArgs() const
DeclarationName getDeclName() const
Retrieve the name that this expression refers to.
TemplateArgumentLoc const * getTemplateArgs() const
Expr * getSizeExpr() const
Expr * getSizeExpr() const
QualType getElementType() const
Expr * getColumnExpr() const
Expr * getRowExpr() const
IdentifierOrOverloadedOperator getName() const
Represents a vector type where either the type or size is dependent.
Expr * getSizeExpr() const
VectorKind getVectorKind() const
SourceLocation getAttributeLoc() const
QualType getElementType() const
Concrete class used by the front-end to report problems and issues.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
llvm::APSInt getInitVal() const
This represents one expression.
llvm::APSInt EvaluateKnownConstInt(const ASTContext &Ctx) const
EvaluateKnownConstInt - Call EvaluateAsRValue and return the folded integer.
Expr * IgnoreParenImpCasts() LLVM_READONLY
Skip past any parentheses and implicit casts which might surround this expression until reaching a fi...
Expr * IgnoreImplicit() LLVM_READONLY
Skip past any implicit AST nodes which might surround this expression until reaching a fixed point.
Expr * IgnoreParens() LLVM_READONLY
Skip past any parentheses which might surround this expression until reaching a fixed point.
bool isInstantiationDependent() const
Whether this expression is instantiation-dependent, meaning that it depends in some way on.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents a member of a struct/union/class.
bool isBitField() const
Determines whether this field is a bitfield.
unsigned getFieldIndex() const
Returns the index of this field within its record, as appropriate for passing to ASTRecordLayout::get...
const RecordDecl * getParent() const
Returns the parent of this field declaration, which is the struct in which this field is defined.
llvm::APFloat getValue() const
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
bool isMemberLikeConstrainedFriend() const
Determine whether a function is a friend function that cannot be redeclared outside of its class,...
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
unsigned getNumParams() const
Return the number of parameters this function must have based on its FunctionType.
ValueDecl * getParameterPack() const
Get the parameter pack which this expression refers to.
Represents a prototype with parameter type info, e.g.
ExtParameterInfo getExtParameterInfo(unsigned I) const
ExceptionSpecificationType getExceptionSpecType() const
Get the kind of exception specification on this function.
unsigned getNumParams() const
Qualifiers getMethodQuals() const
QualType getParamType(unsigned i) const
unsigned getAArch64SMEAttributes() const
Return a bitmask describing the SME attributes on the function type, see AArch64SMETypeAttributes for...
bool isVariadic() const
Whether this function prototype is variadic.
Expr * getNoexceptExpr() const
Return the expression inside noexcept(expression), or a null pointer if there is none (because the ex...
bool isNothrow(bool ResultIfDependent=false) const
Determine whether this function type has a non-throwing exception specification.
ArrayRef< QualType > exceptions() const
bool hasInstantiationDependentExceptionSpec() const
Return whether this function has an instantiation-dependent exception spec.
bool hasExtParameterInfos() const
Is there any interesting extra information for any of the parameters of this function type?
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
CallingConv getCC() const
bool getProducesResult() const
Interesting information about a specific parameter that can't simply be reflected in parameter's type...
bool isConsumed() const
Is this parameter considered "consumed" by Objective-C ARC?
ParameterABI getABI() const
Return the ABI treatment of this parameter.
FunctionType - C99 6.7.5.3 - Function Declarators.
ExtInfo getExtInfo() const
@ SME_PStateSMEnabledMask
@ SME_PStateSMCompatibleMask
@ SME_AgnosticZAStateMask
static ArmStateValue getArmZT0State(unsigned AttrBits)
static ArmStateValue getArmZAState(unsigned AttrBits)
QualType getReturnType() const
GlobalDecl - represents a global declaration.
CXXCtorType getCtorType() const
KernelReferenceKind getKernelReferenceKind() const
GlobalDecl getWithDecl(const Decl *D)
CXXDtorType getDtorType() const
const Decl * getDecl() const
One of these records is kept for each identifier that is lexed.
unsigned getLength() const
Efficiently return the length of this identifier info.
bool isStr(const char(&Str)[StrLen]) const
Return true if this is the identifier for the specified string.
StringRef getName() const
Return the actual identifier string.
const Expr * getSubExpr() const
Describes an C or C++ initializer list.
unsigned getNumInits() const
InitListExpr * getSyntacticForm() const
const Expr * getInit(unsigned Init) const
ItaniumMangleContext(ASTContext &C, DiagnosticsEngine &D, bool IsAux=false)
static ItaniumMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
UnsignedOrNone(*)(ASTContext &, const NamedDecl *) DiscriminatorOverrideTy
bool isCompatibleWith(ClangABI Version) const
QualType getElementType() const
Returns type of the elements being stored in the matrix.
NestedNameSpecifier getQualifier() const
If the member name was qualified, retrieves the nested-name-specifier that precedes the member name.
ValueDecl * getMemberDecl() const
Retrieve the member declaration to which this expression refers.
const TemplateArgumentLoc * getTemplateArgs() const
Retrieve the template arguments provided as part of this template-id.
unsigned getNumTemplateArgs() const
Retrieve the number of template arguments provided as part of this template-id.
NestedNameSpecifier getQualifier() const
CXXRecordDecl * getMostRecentCXXRecordDecl() const
Note: this can trigger extra deserialization when external AST sources are used.
QualType getPointeeType() const
std::string Name
The name of this module.
StringRef getPrimaryModuleInterfaceName() const
Get the primary module interface name from a partition.
bool isModulePartition() const
Is this a module partition.
This represents a decl that may have a name.
IdentifierInfo * getIdentifier() const
Get the identifier that names this declaration, if there is one.
StringRef getName() const
Get the name of identifier for this declaration as a StringRef.
DeclarationName getDeclName() const
Get the actual, stored name of the declaration, which may be a special name.
Linkage getFormalLinkage() const
Get the linkage from a semantic point of view.
bool isCXXInstanceMember() const
Determine whether the given declaration is an instance member of a C++ class.
bool isExternallyVisible() const
Represent a C++ namespace.
bool isAnonymousNamespace() const
Returns true if this is an anonymous namespace declaration.
static NamespaceDecl * Create(ASTContext &C, DeclContext *DC, bool Inline, SourceLocation StartLoc, SourceLocation IdLoc, IdentifierInfo *Id, NamespaceDecl *PrevDecl, bool Nested)
Represents a C++ nested name specifier, such as "\::std::vector<int>::".
const Type * getAsType() const
unsigned getIndex() const
Get the index of the template parameter within its parameter list.
unsigned getDepth() const
Get the nesting depth of the template parameter.
ObjCInterfaceDecl * getDecl() const
Get the declaration of this interface.
QualType getPointeeType() const
Gets the type pointed to by this ObjC pointer.
NestedNameSpecifier getQualifier() const
Fetches the nested-name qualifier, if one was given.
decls_iterator decls_begin() const
unsigned getNumDecls() const
Gets the number of declarations in the unresolved set.
TemplateArgumentLoc const * getTemplateArgs() const
unsigned getNumTemplateArgs() const
DeclarationName getName() const
Gets the name looked up.
A single parameter index whose accessors require each use to make explicit the parameter index encodi...
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
unsigned getFunctionScopeDepth() const
QualType getPointeeType() const
A (possibly-)qualified type.
bool hasQualifiers() const
Determine whether this type has any qualifiers.
bool isNull() const
Return true if this QualType doesn't point to a type yet.
Qualifiers getQualifiers() const
Retrieve the set of qualifiers applied to this type.
Qualifiers::ObjCLifetime getObjCLifetime() const
Returns lifetime attribute of this type.
QualType getCanonicalType() const
SplitQualType split() const
Divides a QualType into its unqualified type and a set of local qualifiers.
void * getAsOpaquePtr() const
QualType getSingleStepDesugaredType(const ASTContext &Context) const
Return the specified type with one level of "sugar" removed from the type.
The collection of all-type qualifiers we support.
unsigned getCVRQualifiers() const
@ OCL_Strong
Assigning into this object requires the old value to be released and the new value to be retained.
@ OCL_ExplicitNone
This object can be modified without requiring retains or releases.
@ OCL_None
There is no lifetime qualification on this type.
@ OCL_Weak
Reading or writing from this object requires a barrier call.
@ OCL_Autoreleasing
Assigning into this object requires a lifetime extension.
void removeObjCLifetime()
bool hasUnaligned() const
bool hasAddressSpace() const
PointerAuthQualifier getPointerAuth() const
ObjCLifetime getObjCLifetime() const
LangAS getAddressSpace() const
bool isLambda() const
Determine whether this record is a class describing a lambda function object.
field_range fields() const
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
QualType getPointeeType() const
Encodes a location in the source.
StmtClass getStmtClass() const
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
const char * getStmtClassName() const
TemplateName getReplacement() const
TypedefNameDecl * getTypedefNameForAnonDecl() const
virtual const char * getFloat128Mangling() const
Return the mangled code of __float128.
virtual const char * getIbm128Mangling() const
Return the mangled code of __ibm128.
virtual const char * getLongDoubleMangling() const
Return the mangled code of long double.
virtual const char * getBFloat16Mangling() const
Return the mangled code of bfloat.
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
Location wrapper for a TemplateArgument.
Represents a template argument.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
bool isDependent() const
Whether this template argument is dependent on a template parameter such that its result can change f...
bool isInstantiationDependent() const
Whether this template argument is dependent on a template parameter.
pack_iterator pack_begin() const
Iterator referencing the first argument of a template argument pack.
QualType getAsType() const
Retrieve the type for a type template argument.
llvm::APSInt getAsIntegral() const
Retrieve the template argument as an integral value.
QualType getNullPtrType() const
Retrieve the type for null non-type template argument.
TemplateName getAsTemplate() const
Retrieve the template name for a template name argument.
unsigned pack_size() const
The number of template arguments in the given template argument pack.
QualType getIntegralType() const
Retrieve the type of the integral value.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
ArrayRef< TemplateArgument > pack_elements() const
Iterator range referencing all of the elements of a template argument pack.
@ Declaration
The template argument is a declaration that was provided for a pointer, reference,...
@ Template
The template argument is a template name that was provided for a template template parameter.
@ StructuralValue
The template argument is a non-type template argument that can't be represented by the special-case D...
@ Pack
The template argument is actually a parameter pack.
@ TemplateExpansion
The template argument is a pack expansion of a template name that was provided for a template templat...
@ NullPtr
The template argument is a null pointer or null pointer to member that was provided for a non-type te...
@ Type
The template argument is a type.
@ Null
Represents an empty template argument, e.g., one that has not been deduced.
@ Integral
The template argument is an integral value stored in an llvm::APSInt that was provided for an integra...
@ Expression
The template argument is an expression, and we've not resolved it to one of the other forms yet,...
ArgKind getKind() const
Return the kind of stored template argument.
bool isPackExpansion() const
Determine whether this template argument is a pack expansion.
TemplateName getAsTemplateOrTemplatePattern() const
Retrieve the template argument as a template name; if the argument is a pack expansion,...
const APValue & getAsStructuralValue() const
Get the value of a StructuralValue.
The base class of all kinds of template declarations (e.g., class, function, etc.).
NamedDecl * getTemplatedDecl() const
Get the underlying, templated declaration.
TemplateParameterList * getTemplateParameters() const
Get the list of template parameters.
Represents a C++ template name within the type system.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
DependentTemplateName * getAsDependentTemplateName() const
Retrieve the underlying dependent template name structure, if any.
std::pair< TemplateName, DefaultArguments > getTemplateDeclAndDefaultArgs() const
Retrieves the underlying template name that this template name refers to, along with the deduced defa...
@ UsingTemplate
A template name that refers to a template declaration found through a specific using shadow declarati...
@ OverloadedTemplate
A set of overloaded template declarations.
@ Template
A single template declaration.
@ DependentTemplate
A dependent template name that has not been resolved to a template (or set of templates).
@ SubstTemplateTemplateParm
A template template parameter that has been substituted for some other template name.
@ SubstTemplateTemplateParmPack
A template template parameter pack that has been substituted for a template template argument pack,...
@ DeducedTemplate
A template name that refers to another TemplateName with deduced default arguments.
@ QualifiedTemplate
A qualified template name, where the qualification is kept to describe the source code as written.
@ AssumedTemplate
An unqualified-id that has been assumed to name a function template that will be found by ADL.
SubstTemplateTemplateParmStorage * getAsSubstTemplateTemplateParm() const
Retrieve the substituted template template parameter, if known.
Stores a list of template parameters for a TemplateDecl and its derived classes.
unsigned getDepth() const
Get the depth of this template parameter list in the set of template parameter lists.
const ASTTemplateArgumentListInfo * getTemplateArgsAsWritten() const
TemplateDecl * getNamedConcept() const
QualType getType() const
Return the type wrapped by this type source info.
ArrayRef< TypeSourceInfo * > getArgs() const
Retrieve the argument types.
TypeTrait getTrait() const
Determine which type trait this expression uses.
The base class of the type hierarchy.
bool isBooleanType() const
bool isSignedIntegerType() const
Return true if this is an integer type that is signed, according to C99 6.2.5p4 [char,...
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
bool isVoidPointerType() const
bool isPointerType() const
bool isIntegerType() const
isIntegerType() does not include complex integers (a GCC extension).
bool isSVESizelessBuiltinType() const
Returns true for SVE scalable vector types.
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
const CXXRecordDecl * getPointeeCXXRecordDecl() const
If this is a pointer or reference to a RecordType, return the CXXRecordDecl that the type refers to.
const Type * getArrayElementTypeNoTypeQual() const
If this is an array type, return the element type of the array, potentially with type qualifiers miss...
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
bool isInstantiationDependentType() const
Determine whether this type is an instantiation-dependent type, meaning that the type involves a temp...
bool isSpecificBuiltinType(unsigned K) const
Test for a particular builtin type.
bool isBuiltinType() const
Helper methods to distinguish type categories.
bool isOpenCLSpecificType() const
bool isDependentType() const
Whether this type is a dependent type, meaning that its definition somehow depends on a template para...
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isPointerOrReferenceType() const
const T * getAsCanonical() const
If this type is canonically the specified type, return its canonical type cast to that specified type...
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
QualType getArgumentType() const
bool isArgumentType() const
UnaryExprOrTypeTrait getKind() const
Expr * getSubExpr() const
static OverloadedOperatorKind getOverloadedOperator(Opcode Opc)
Retrieve the overloaded operator kind that corresponds to the given unary opcode.
A reference to a name which we were able to look up during parsing but could not resolve to a specifi...
bool requiresADL() const
True if this declaration should be extended by argument-dependent lookup.
DeclarationName getMemberName() const
Retrieve the name of the member that this expression refers to.
bool isArrow() const
Determine whether this member expression used the '->' operator; otherwise, it used the '.
Expr * getBase()
Retrieve the base object of this member expressions, e.g., the x in x.m.
bool isImplicitAccess() const
True if this is an implicit access, i.e., one in which the member being accessed was not written in t...
UnresolvedUsingTypenameDecl * getDecl() const
Represents a variable declaration or definition.
bool isInitCapture() const
Whether this variable is the implicit variable for a lambda init-capture.
Represents a variable template specialization, which refers to a variable template with a given set o...
Expr * getSizeExpr() const
Represents a GCC generic vector type.
unsigned getNumElements() const
VectorKind getVectorKind() const
QualType getElementType() const
A static requirement that can be used in a requires-expression to check properties of types and expre...
RequirementKind getKind() const
Defines the clang::TargetInfo interface.
const internal::VariadicAllOfMatcher< Type > type
Matches Types in the clang AST.
const internal::VariadicAllOfMatcher< Decl > decl
Matches declarations.
bool Sub(InterpState &S, CodePtr OpPC)
@ Number
Just a number, nothing else.
std::variant< struct RequiresDecl, struct HeaderDecl, struct UmbrellaDirDecl, struct ModuleDecl, struct ExcludeDecl, struct ExportDecl, struct ExportAsDecl, struct ExternModuleDecl, struct UseDecl, struct LinkDecl, struct ConfigMacrosDecl, struct ConflictDecl > Decl
All declarations that can appear in a module declaration.
The JSON file list parser is used to communicate input to InstallAPI.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
CXXCtorType
C++ constructor types.
@ Ctor_Base
Base object ctor.
@ Ctor_DefaultClosure
Default closure variant of a ctor.
@ Ctor_CopyingClosure
Copying closure variant of a ctor.
@ Ctor_Complete
Complete object ctor.
@ Ctor_Comdat
The COMDAT used for ctors.
@ Ctor_Unified
GCC-style unified dtor.
bool isa(CodeGen::Address addr)
llvm::StringRef getParameterABISpelling(ParameterABI kind)
RefQualifierKind
The kind of C++11 ref-qualifier associated with a function type.
@ RQ_None
No ref-qualifier was provided.
@ RQ_LValue
An lvalue ref-qualifier was provided (&).
@ RQ_RValue
An rvalue ref-qualifier was provided (&&).
@ TemplateName
The identifier is a template name. FIXME: Add an annotation for that.
void mangleObjCMethodName(raw_ostream &OS, bool includePrefixByte, bool isInstanceMethod, StringRef ClassName, std::optional< StringRef > CategoryName, StringRef MethodName, bool useDirectABI)
Extract mangling function name from MangleContext such that swift can call it to prepare for ObjCDire...
nullptr
This class represents a compute construct, representing a 'Kind' of ‘parallel’, 'serial',...
LanguageLinkage
Describes the different kinds of language linkage (C++ [dcl.link]) that an entity may have.
@ Dependent
Parse the block as a dependent block, which may be used in some template instantiations but not other...
@ Module
Module linkage, which indicates that the entity can be referred to from other translation units withi...
OptionalUnsigned< unsigned > UnsignedOrNone
bool isComputedNoexcept(ExceptionSpecificationType ESpecType)
@ Template
We are parsing a template declaration.
CXXDtorType
C++ destructor types.
@ Dtor_VectorDeleting
Vector deleting dtor.
@ Dtor_Comdat
The COMDAT used for dtors.
@ Dtor_Unified
GCC-style unified dtor.
@ Dtor_Base
Base object dtor.
@ Dtor_Complete
Complete object dtor.
@ Dtor_Deleting
Deleting dtor.
@ Type
The name was classified as a type.
@ Concept
The name was classified as a concept name.
LangAS
Defines the address space values used by the address space qualifier of QualType.
@ Deduced
The normal deduced case.
const char * getTraitSpelling(ExpressionTrait T) LLVM_READONLY
Return the spelling of the type trait TT. Never null.
bool declaresSameEntity(const Decl *D1, const Decl *D2)
Determine whether two declarations declare the same entity.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
@ Other
Other implicit parameter.
@ EST_Dynamic
throw(T1, T2)
__UINTPTR_TYPE__ uintptr_t
An unsigned integer type with the property that any valid pointer to void can be converted to this ty...
Information about how to mangle a template argument.
bool NeedExactType
Do we need to mangle the template argument with an exactly correct type?
const NamedDecl * TemplateParameterToMangle
If we need to prefix the mangling with a mangling of the template parameter, the corresponding parame...
bool isOverloadable()
Determine whether the resolved template might be overloaded on its template parameter list.
TemplateArgManglingInfo(const CXXNameMangler &Mangler, TemplateName TN)
bool needToMangleTemplateParam(const NamedDecl *Param, const TemplateArgument &Arg)
Determine whether we need to prefix this <template-arg> mangling with a <template-param-decl>.
const NamedDecl * UnresolvedExpandedPack
const CXXNameMangler & Mangler
TemplateDecl * ResolvedTemplate
Info getArgInfo(unsigned ParamIdx, const TemplateArgument &Arg)
Determine information about how this template argument should be mangled.
const Expr * getTrailingRequiresClauseToMangle()
Determine if we should mangle a requires-clause after the template argument list.
bool SeenPackExpansionIntoNonPack
ArrayRef< TemplateArgumentLoc > arguments() const
const Expr * ConstraintExpr
const IdentifierInfo * getIdentifier() const
Returns the identifier to which this template name refers.
union clang::ReturnAdjustment::VirtualAdjustment Virtual
int64_t NonVirtual
The non-virtual adjustment from the derived object to its nearest virtual base.
const Type * Ty
The locally-unqualified type.
Qualifiers Quals
The local qualifiers.
union clang::ThisAdjustment::VirtualAdjustment Virtual
int64_t NonVirtual
The non-virtual adjustment from the derived object to its nearest virtual base.
The this pointer adjustment as well as an optional return adjustment for a thunk.
ThisAdjustment This
The this pointer adjustment.
ReturnAdjustment Return
The return adjustment.
struct clang::ReturnAdjustment::VirtualAdjustment::@103031170252120233124322035264172076254313213024 Itanium
int64_t VBaseOffsetOffset
The offset (in bytes), relative to the address point of the virtual base class offset.
struct clang::ThisAdjustment::VirtualAdjustment::@106065375072164260365214033034320247050276346205 Itanium
int64_t VCallOffsetOffset
The offset (in bytes), relative to the address point, of the virtual call offset.