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 {
248 enum { InResultTypeMask = 1 };
251 FunctionTypeDepthState() =
default;
254 unsigned getDepth()
const {
259 bool isInResultType()
const {
260 return Bits & InResultTypeMask;
263 FunctionTypeDepthState push() {
264 FunctionTypeDepthState tmp = *
this;
265 Bits = (Bits & ~InResultTypeMask) + 2;
269 void enterResultType() {
270 Bits |= InResultTypeMask;
273 void leaveResultType() {
274 Bits &= ~InResultTypeMask;
277 void pop(FunctionTypeDepthState saved) {
278 assert(getDepth() == saved.getDepth() + 1);
288 using AbiTagList = SmallVector<StringRef, 4>;
293 class AbiTagState final {
295 explicit AbiTagState(AbiTagState *&Head) : LinkHead(Head) {
301 AbiTagState(
const AbiTagState &) =
delete;
302 AbiTagState &operator=(
const AbiTagState &) =
delete;
304 ~AbiTagState() { pop(); }
306 void write(raw_ostream &Out,
const NamedDecl *ND,
307 ArrayRef<StringRef> AdditionalAbiTags) {
311 AdditionalAbiTags.empty() &&
312 "only function and variables need a list of additional abi tags");
313 if (
const auto *NS = dyn_cast<NamespaceDecl>(ND)) {
314 if (
const auto *AbiTag = NS->getAttr<AbiTagAttr>())
315 llvm::append_range(UsedAbiTags, AbiTag->tags());
322 if (
const auto *AbiTag = ND->
getAttr<AbiTagAttr>()) {
323 llvm::append_range(UsedAbiTags, AbiTag->tags());
324 llvm::append_range(TagList, AbiTag->tags());
327 llvm::append_range(UsedAbiTags, AdditionalAbiTags);
328 llvm::append_range(TagList, AdditionalAbiTags);
331 TagList.erase(llvm::unique(TagList), TagList.end());
333 writeSortedUniqueAbiTags(Out, TagList);
336 const AbiTagList &getUsedAbiTags()
const {
return UsedAbiTags; }
337 void setUsedAbiTags(
const AbiTagList &AbiTags) {
338 UsedAbiTags = AbiTags;
341 const AbiTagList &getEmittedAbiTags()
const {
342 return EmittedAbiTags;
345 const AbiTagList &getSortedUniqueUsedAbiTags() {
346 llvm::sort(UsedAbiTags);
347 UsedAbiTags.erase(llvm::unique(UsedAbiTags), UsedAbiTags.end());
353 AbiTagList UsedAbiTags;
355 AbiTagList EmittedAbiTags;
357 AbiTagState *&LinkHead;
358 AbiTagState *Parent =
nullptr;
361 assert(LinkHead ==
this &&
362 "abi tag link head must point to us on destruction");
364 Parent->UsedAbiTags.insert(Parent->UsedAbiTags.end(),
365 UsedAbiTags.begin(), UsedAbiTags.end());
366 Parent->EmittedAbiTags.insert(Parent->EmittedAbiTags.end(),
367 EmittedAbiTags.begin(),
368 EmittedAbiTags.end());
373 void writeSortedUniqueAbiTags(raw_ostream &Out,
const AbiTagList &AbiTags) {
374 for (
const auto &Tag : AbiTags) {
375 EmittedAbiTags.push_back(Tag);
383 AbiTagState *AbiTags =
nullptr;
384 AbiTagState AbiTagsRoot;
386 llvm::DenseMap<uintptr_t, unsigned> Substitutions;
387 llvm::DenseMap<StringRef, unsigned> ModuleSubstitutions;
389 ASTContext &getASTContext()
const {
return Context.getASTContext(); }
391 bool isCompatibleWith(LangOptions::ClangABI Ver) {
392 return Context.getASTContext().
getLangOpts().getClangABICompat() <= Ver;
395 bool isStd(
const NamespaceDecl *NS);
396 bool isStdNamespace(
const DeclContext *DC);
398 const RecordDecl *GetLocalClassDecl(
const Decl *D);
399 bool isSpecializedAs(QualType S, llvm::StringRef Name, QualType A);
400 bool isStdCharSpecialization(
const ClassTemplateSpecializationDecl *SD,
401 llvm::StringRef Name,
bool HasAllocator);
404 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
405 const NamedDecl *D =
nullptr,
bool NullOut_ =
false)
406 : Context(
C),
Out(Out_), NullOut(NullOut_), Structor(getStructor(D)),
407 AbiTagsRoot(AbiTags) {
412 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
414 : Context(
C),
Out(Out_), Structor(getStructor(D)), StructorType(
Type),
415 AbiTagsRoot(AbiTags) {}
416 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
418 : Context(
C),
Out(Out_), Structor(getStructor(D)), StructorType(
Type),
419 AbiTagsRoot(AbiTags) {}
421 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out_,
422 bool NormalizeIntegers_)
423 : Context(
C),
Out(Out_), NormalizeIntegers(NormalizeIntegers_),
424 NullOut(
false), Structor(
nullptr), AbiTagsRoot(AbiTags) {}
425 CXXNameMangler(CXXNameMangler &Outer, raw_ostream &Out_)
426 : Context(Outer.Context),
Out(Out_),
427 NormalizeIntegers(Outer.NormalizeIntegers), Structor(Outer.Structor),
428 StructorType(Outer.StructorType), SeqID(Outer.SeqID),
429 FunctionTypeDepth(Outer.FunctionTypeDepth), AbiTagsRoot(AbiTags),
430 Substitutions(Outer.Substitutions),
431 ModuleSubstitutions(Outer.ModuleSubstitutions) {}
433 CXXNameMangler(CXXNameMangler &Outer, llvm::raw_null_ostream &Out_)
434 : CXXNameMangler(Outer, (raw_ostream &)Out_) {
438 struct WithTemplateDepthOffset {
unsigned Offset; };
439 CXXNameMangler(ItaniumMangleContextImpl &
C, raw_ostream &Out,
440 WithTemplateDepthOffset Offset)
441 : CXXNameMangler(
C,
Out) {
442 TemplateDepthOffset = Offset.Offset;
445 raw_ostream &getStream() {
return Out; }
447 void disableDerivedAbiTags() { DisableDerivedAbiTags =
true; }
448 static bool shouldHaveAbiTags(ItaniumMangleContextImpl &
C,
const VarDecl *VD);
450 void mangle(GlobalDecl GD);
451 void mangleCallOffset(int64_t NonVirtual, int64_t
Virtual);
452 void mangleNumber(
const llvm::APSInt &I);
453 void mangleNumber(int64_t Number);
454 void mangleFloat(
const llvm::APFloat &F);
455 void mangleFunctionEncoding(GlobalDecl GD);
456 void mangleSeqID(
unsigned SeqID);
457 void mangleName(GlobalDecl GD);
458 void mangleType(QualType T);
459 void mangleCXXRecordDecl(
const CXXRecordDecl *
Record,
460 bool SuppressSubstitution =
false);
461 void mangleLambdaSig(
const CXXRecordDecl *Lambda);
462 void mangleModuleNamePrefix(StringRef Name,
bool IsPartition =
false);
463 void mangleVendorQualifier(StringRef Name);
464 void mangleVendorType(StringRef Name);
467 bool mangleSubstitution(
const NamedDecl *ND);
468 bool mangleSubstitution(QualType T);
474 bool mangleStandardSubstitution(
const NamedDecl *ND);
476 void addSubstitution(
const NamedDecl *ND) {
479 addSubstitution(
reinterpret_cast<uintptr_t>(ND));
481 void addSubstitution(QualType T);
485 void extendSubstitutions(CXXNameMangler*
Other);
487 void mangleUnresolvedPrefix(NestedNameSpecifier Qualifier,
488 bool recursive =
false);
489 void mangleUnresolvedName(NestedNameSpecifier Qualifier, DeclarationName name,
490 const TemplateArgumentLoc *TemplateArgs,
491 unsigned NumTemplateArgs,
492 unsigned KnownArity = UnknownArity);
494 void mangleFunctionEncodingBareType(
const FunctionDecl *FD);
496 void mangleNameWithAbiTags(GlobalDecl GD,
497 ArrayRef<StringRef> AdditionalAbiTags = {});
498 void mangleModuleName(
const NamedDecl *ND);
499 void mangleTemplateName(
const TemplateDecl *TD,
500 ArrayRef<TemplateArgument> Args);
501 void mangleUnqualifiedName(GlobalDecl GD,
const DeclContext *DC,
502 ArrayRef<StringRef> AdditionalAbiTags = {}) {
504 UnknownArity, AdditionalAbiTags);
506 void mangleUnqualifiedName(GlobalDecl GD, DeclarationName Name,
507 const DeclContext *DC,
unsigned KnownArity,
508 ArrayRef<StringRef> AdditionalAbiTags);
509 void mangleUnscopedName(GlobalDecl GD,
const DeclContext *DC,
510 ArrayRef<StringRef> AdditionalAbiTags = {});
511 void mangleUnscopedTemplateName(GlobalDecl GD,
const DeclContext *DC,
512 ArrayRef<StringRef> AdditionalAbiTags = {});
513 void mangleSourceName(
const IdentifierInfo *II);
514 void mangleConstructorName(
const CXXConstructorDecl *CCD,
515 ArrayRef<StringRef> AdditionalAbiTags = {});
516 void mangleDestructorName(
const CXXDestructorDecl *CDD,
517 ArrayRef<StringRef> AdditionalAbiTags = {});
518 void mangleRegCallName(
const IdentifierInfo *II);
519 void mangleDeviceStubName(
const IdentifierInfo *II);
520 void mangleOCLDeviceStubName(
const IdentifierInfo *II);
521 void mangleSourceNameWithAbiTags(
const NamedDecl *ND,
522 ArrayRef<StringRef> AdditionalAbiTags = {});
523 void mangleLocalName(GlobalDecl GD,
524 ArrayRef<StringRef> AdditionalAbiTags = {});
525 void mangleBlockForPrefix(
const BlockDecl *
Block);
526 void mangleUnqualifiedBlock(
const BlockDecl *
Block);
527 void mangleTemplateParamDecl(
const NamedDecl *Decl);
528 void mangleTemplateParameterList(
const TemplateParameterList *Params);
529 void mangleTypeConstraint(
const TemplateDecl *
Concept,
530 ArrayRef<TemplateArgument> Arguments);
531 void mangleTypeConstraint(
const TypeConstraint *Constraint);
532 void mangleRequiresClause(
const Expr *RequiresClause);
533 void mangleLambda(
const CXXRecordDecl *Lambda);
534 void mangleNestedName(GlobalDecl GD,
const DeclContext *DC,
535 ArrayRef<StringRef> AdditionalAbiTags = {},
536 bool NoFunction =
false);
537 void mangleNestedName(
const TemplateDecl *TD,
538 ArrayRef<TemplateArgument> Args);
539 void mangleNestedNameWithClosurePrefix(GlobalDecl GD,
540 const NamedDecl *PrefixND,
541 ArrayRef<StringRef> AdditionalAbiTags);
542 void manglePrefix(NestedNameSpecifier Qualifier);
543 void manglePrefix(
const DeclContext *DC,
bool NoFunction=
false);
544 void manglePrefix(QualType
type);
545 void mangleTemplatePrefix(GlobalDecl GD,
bool NoFunction=
false);
547 const NamedDecl *getClosurePrefix(
const Decl *ND);
548 void mangleClosurePrefix(
const NamedDecl *ND,
bool NoFunction =
false);
549 bool mangleUnresolvedTypeOrSimpleId(QualType DestroyedType,
550 StringRef Prefix =
"");
551 void mangleOperatorName(DeclarationName Name,
unsigned Arity);
553 void mangleQualifiers(Qualifiers Quals,
const DependentAddressSpaceType *DAST =
nullptr);
559#define ABSTRACT_TYPE(CLASS, PARENT)
560#define NON_CANONICAL_TYPE(CLASS, PARENT)
561#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T);
562#include "clang/AST/TypeNodes.inc"
564 void mangleType(
const TagType*);
566 static StringRef getCallingConvQualifierName(
CallingConv CC);
569 void mangleSMEAttrs(
unsigned SMEAttrs);
572 void mangleNeonVectorType(
const VectorType *T);
574 void mangleAArch64NeonVectorType(
const VectorType *T);
576 void mangleAArch64FixedSveVectorType(
const VectorType *T);
578 void mangleRISCVFixedRVVVectorType(
const VectorType *T);
581 void mangleIntegerLiteral(
QualType T,
const llvm::APSInt &
Value);
582 void mangleFloatLiteral(
QualType T,
const llvm::APFloat &
V);
583 void mangleFixedPointLiteral();
586 void mangleMemberExprBase(
const Expr *base,
bool isArrow);
587 void mangleMemberExpr(
const Expr *base,
bool isArrow,
591 unsigned NumTemplateArgs,
unsigned knownArity);
592 void mangleCastExpression(
const Expr *E, StringRef CastEncoding);
593 void mangleInitListElements(
const InitListExpr *InitList);
596 void mangleReferenceToPack(
const NamedDecl *ND);
597 void mangleExpression(
const Expr *E,
unsigned Arity = UnknownArity,
598 bool AsTemplateArg =
false);
602 struct TemplateArgManglingInfo;
605 unsigned NumTemplateArgs);
608 void mangleTemplateArg(TemplateArgManglingInfo &Info,
unsigned Index,
611 void mangleTemplateArgExpr(
const Expr *E);
613 bool NeedExactType =
false);
615 void mangleTemplateParameter(
unsigned Depth,
unsigned Index);
623 AbiTagList makeFunctionReturnTypeTags(
const FunctionDecl *FD);
625 AbiTagList makeVariableTypeTags(
const VarDecl *VD);
633 getASTContext(), getASTContext().getTranslationUnitDecl(),
634 false, SourceLocation(), SourceLocation(),
635 &getASTContext().Idents.get(
"std"),
658ItaniumMangleContextImpl::getEffectiveDeclContext(
const Decl *D) {
665 if (
const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) {
667 if (ParmVarDecl *ContextParam =
668 dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl()))
669 return ContextParam->getDeclContext();
673 if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
674 if (ParmVarDecl *ContextParam =
675 dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl()))
676 return ContextParam->getDeclContext();
684 if (D == getASTContext().getVaListTagDecl()) {
685 const llvm::Triple &T = getASTContext().getTargetInfo().getTriple();
686 if (T.isARM() || T.isThumb() || T.isAArch64())
687 return getStdNamespace();
693 return getEffectiveDeclContext(
cast<Decl>(DC));
696 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
698 const DeclContext *ParentDC = getEffectiveParentContext(Lambda);
702 if (isLocalContainerContext(ParentDC))
706 return getASTContext().getTranslationUnitDecl();
709 if (
const auto *FD = getASTContext().getLangOpts().getClangABICompat() >
710 LangOptions::ClangABI::Ver19
712 : dyn_cast<FunctionDecl>(D)) {
714 return getASTContext().getTranslationUnitDecl();
717 if (FD->isMemberLikeConstrainedFriend() &&
718 getASTContext().getLangOpts().getClangABICompat() >
719 LangOptions::ClangABI::Ver17)
726bool ItaniumMangleContextImpl::isInternalLinkageDecl(
const NamedDecl *ND) {
729 getEffectiveDeclContext(ND)->isFileContext() &&
736bool ItaniumMangleContextImpl::isUniqueInternalLinkageDecl(
737 const NamedDecl *ND) {
738 if (!NeedsUniqueInternalLinkageNames || !ND)
741 const auto *FD = dyn_cast<FunctionDecl>(ND);
747 if (!FD->getType()->getAs<FunctionProtoType>())
750 if (isInternalLinkageDecl(ND))
756bool ItaniumMangleContextImpl::shouldMangleCXXName(
const NamedDecl *D) {
757 if (
const auto *FD = dyn_cast<FunctionDecl>(D)) {
760 if (FD->hasAttr<OverloadableAttr>())
776 if (FD->isMSVCRTEntryPoint())
790 if (!getASTContext().getLangOpts().
CPlusPlus)
793 if (
const auto *VD = dyn_cast<VarDecl>(D)) {
804 const DeclContext *DC = getEffectiveDeclContext(D);
806 !CXXNameMangler::shouldHaveAbiTags(*
this, VD) &&
808 !VD->getOwningModuleForLinkage())
815void CXXNameMangler::writeAbiTags(
const NamedDecl *ND,
816 ArrayRef<StringRef> AdditionalAbiTags) {
817 assert(AbiTags &&
"require AbiTagState");
818 AbiTags->write(Out, ND,
819 DisableDerivedAbiTags ? ArrayRef<StringRef>{}
820 : AdditionalAbiTags);
823void CXXNameMangler::mangleSourceNameWithAbiTags(
824 const NamedDecl *ND, ArrayRef<StringRef> AdditionalAbiTags) {
826 writeAbiTags(ND, AdditionalAbiTags);
829void CXXNameMangler::mangle(GlobalDecl GD) {
835 mangleFunctionEncoding(GD);
836 else if (
isa<VarDecl, FieldDecl, MSGuidDecl, TemplateParamObjectDecl,
839 else if (
const IndirectFieldDecl *IFD =
840 dyn_cast<IndirectFieldDecl>(GD.
getDecl()))
841 mangleName(IFD->getAnonField());
843 llvm_unreachable(
"unexpected kind of global decl");
846void CXXNameMangler::mangleFunctionEncoding(GlobalDecl GD) {
851 if (!Context.shouldMangleDeclName(FD)) {
856 AbiTagList ReturnTypeAbiTags = makeFunctionReturnTypeTags(FD);
857 if (ReturnTypeAbiTags.empty()) {
866 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
868 FunctionTypeDepth.pop(Saved);
869 mangleFunctionEncodingBareType(FD);
876 SmallString<256> FunctionEncodingBuf;
877 llvm::raw_svector_ostream FunctionEncodingStream(FunctionEncodingBuf);
878 CXXNameMangler FunctionEncodingMangler(*
this, FunctionEncodingStream);
880 FunctionEncodingMangler.disableDerivedAbiTags();
882 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
883 FunctionEncodingMangler.mangleNameWithAbiTags(FD);
884 FunctionTypeDepth.pop(Saved);
887 size_t EncodingPositionStart = FunctionEncodingStream.str().size();
888 FunctionEncodingMangler.mangleFunctionEncodingBareType(FD);
892 const AbiTagList &UsedAbiTags =
893 FunctionEncodingMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags();
894 AbiTagList AdditionalAbiTags(ReturnTypeAbiTags.size());
895 AdditionalAbiTags.erase(
896 std::set_difference(ReturnTypeAbiTags.begin(), ReturnTypeAbiTags.end(),
897 UsedAbiTags.begin(), UsedAbiTags.end(),
898 AdditionalAbiTags.begin()),
899 AdditionalAbiTags.end());
902 Saved = FunctionTypeDepth.push();
903 mangleNameWithAbiTags(FD, AdditionalAbiTags);
904 FunctionTypeDepth.pop(Saved);
905 Out << FunctionEncodingStream.str().substr(EncodingPositionStart);
909 extendSubstitutions(&FunctionEncodingMangler);
912void CXXNameMangler::mangleFunctionEncodingBareType(
const FunctionDecl *FD) {
913 if (FD->
hasAttr<EnableIfAttr>()) {
914 FunctionTypeDepthState Saved = FunctionTypeDepth.push();
915 Out <<
"Ua9enable_ifI";
916 for (AttrVec::const_iterator I = FD->
getAttrs().begin(),
919 EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I);
922 if (isCompatibleWith(LangOptions::ClangABI::Ver11)) {
927 mangleExpression(EIA->getCond());
930 mangleTemplateArgExpr(EIA->getCond());
934 FunctionTypeDepth.pop(Saved);
939 if (
auto *CD = dyn_cast<CXXConstructorDecl>(FD))
940 if (
auto Inherited = CD->getInheritedConstructor())
941 FD = Inherited.getConstructor();
959 bool MangleReturnType =
false;
963 MangleReturnType =
true;
966 FD = PrimaryTemplate->getTemplatedDecl();
969 mangleBareFunctionType(FD->
getType()->
castAs<FunctionProtoType>(),
970 MangleReturnType, FD);
974bool CXXNameMangler::isStd(
const NamespaceDecl *NS) {
975 if (!Context.getEffectiveParentContext(NS)->isTranslationUnit())
979 return II && II->
isStr(
"std");
984bool CXXNameMangler::isStdNamespace(
const DeclContext *DC) {
991static const GlobalDecl
995 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1004 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
1005 TemplateArgs = &Spec->getTemplateArgs();
1006 return GD.
getWithDecl(Spec->getSpecializedTemplate());
1011 dyn_cast<VarTemplateSpecializationDecl>(ND)) {
1012 TemplateArgs = &Spec->getTemplateArgs();
1013 return GD.
getWithDecl(Spec->getSpecializedTemplate());
1024void CXXNameMangler::mangleName(GlobalDecl GD) {
1026 if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1028 AbiTagList VariableTypeAbiTags = makeVariableTypeTags(VD);
1029 if (VariableTypeAbiTags.empty()) {
1031 mangleNameWithAbiTags(VD);
1036 llvm::raw_null_ostream NullOutStream;
1037 CXXNameMangler VariableNameMangler(*
this, NullOutStream);
1038 VariableNameMangler.disableDerivedAbiTags();
1039 VariableNameMangler.mangleNameWithAbiTags(VD);
1042 const AbiTagList &UsedAbiTags =
1043 VariableNameMangler.AbiTagsRoot.getSortedUniqueUsedAbiTags();
1044 AbiTagList AdditionalAbiTags(VariableTypeAbiTags.size());
1045 AdditionalAbiTags.erase(
1046 std::set_difference(VariableTypeAbiTags.begin(),
1047 VariableTypeAbiTags.end(), UsedAbiTags.begin(),
1048 UsedAbiTags.end(), AdditionalAbiTags.begin()),
1049 AdditionalAbiTags.end());
1052 mangleNameWithAbiTags(VD, AdditionalAbiTags);
1054 mangleNameWithAbiTags(GD);
1058const RecordDecl *CXXNameMangler::GetLocalClassDecl(
const Decl *D) {
1059 const DeclContext *DC = Context.getEffectiveDeclContext(D);
1061 if (isLocalContainerContext(DC))
1062 return dyn_cast<RecordDecl>(D);
1064 DC = Context.getEffectiveDeclContext(D);
1069void CXXNameMangler::mangleNameWithAbiTags(
1070 GlobalDecl GD, ArrayRef<StringRef> AdditionalAbiTags) {
1077 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
1078 bool IsLambda = isLambda(ND);
1080 if (GetLocalClassDecl(ND) &&
1081 (!IsLambda || isCompatibleWith(LangOptions::ClangABI::Ver18))) {
1082 mangleLocalName(GD, AdditionalAbiTags);
1090 if (
const NamedDecl *PrefixND = getClosurePrefix(ND)) {
1091 mangleNestedNameWithClosurePrefix(GD, PrefixND, AdditionalAbiTags);
1095 if (isLocalContainerContext(DC)) {
1096 mangleLocalName(GD, AdditionalAbiTags);
1105 const TemplateArgumentList *TemplateArgs =
nullptr;
1106 if (GlobalDecl TD =
isTemplate(GD, TemplateArgs)) {
1107 mangleUnscopedTemplateName(TD, DC, AdditionalAbiTags);
1112 mangleUnscopedName(GD, DC, AdditionalAbiTags);
1116 mangleNestedName(GD, DC, AdditionalAbiTags);
1119void CXXNameMangler::mangleModuleName(
const NamedDecl *ND) {
1122 mangleModuleNamePrefix(M->getPrimaryModuleInterfaceName());
1130void CXXNameMangler::mangleModuleNamePrefix(StringRef Name,
bool IsPartition) {
1132 if (
auto It = ModuleSubstitutions.find(Name);
1133 It != ModuleSubstitutions.end()) {
1135 mangleSeqID(It->second);
1141 auto [Prefix, SubName] = Name.rsplit(
'.');
1142 if (SubName.empty())
1145 mangleModuleNamePrefix(Prefix, IsPartition);
1146 IsPartition =
false;
1152 Out << SubName.size() << SubName;
1153 ModuleSubstitutions.insert({Name, SeqID++});
1156void CXXNameMangler::mangleTemplateName(
const TemplateDecl *TD,
1157 ArrayRef<TemplateArgument> Args) {
1158 const DeclContext *DC = Context.getEffectiveDeclContext(TD);
1161 mangleUnscopedTemplateName(TD, DC);
1164 mangleNestedName(TD, Args);
1168void CXXNameMangler::mangleUnscopedName(GlobalDecl GD,
const DeclContext *DC,
1169 ArrayRef<StringRef> AdditionalAbiTags) {
1174 if (isStdNamespace(DC)) {
1175 if (getASTContext().getTargetInfo().
getTriple().isOSSolaris()) {
1177 if (
const RecordDecl *RD = dyn_cast<RecordDecl>(ND)) {
1182 if (
const IdentifierInfo *II = RD->getIdentifier()) {
1184 if (llvm::is_contained({
"div_t",
"ldiv_t",
"lconv",
"tm"},
type)) {
1194 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1197void CXXNameMangler::mangleUnscopedTemplateName(
1198 GlobalDecl GD,
const DeclContext *DC,
1199 ArrayRef<StringRef> AdditionalAbiTags) {
1203 if (mangleSubstitution(ND))
1207 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
1208 assert(AdditionalAbiTags.empty() &&
1209 "template template param cannot have abi tags");
1210 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
1212 mangleUnscopedName(GD, DC, AdditionalAbiTags);
1218 addSubstitution(ND);
1221void CXXNameMangler::mangleFloat(
const llvm::APFloat &f) {
1235 llvm::APInt valueBits = f.bitcastToAPInt();
1236 unsigned numCharacters = (valueBits.getBitWidth() + 3) / 4;
1237 assert(numCharacters != 0);
1240 SmallVector<char, 20> buffer(numCharacters);
1243 for (
unsigned stringIndex = 0; stringIndex != numCharacters; ++stringIndex) {
1245 unsigned digitBitIndex = 4 * (numCharacters - stringIndex - 1);
1248 uint64_t hexDigit = valueBits.getRawData()[digitBitIndex / 64];
1249 hexDigit >>= (digitBitIndex % 64);
1253 static const char charForHex[16] = {
1254 '0',
'1',
'2',
'3',
'4',
'5',
'6',
'7',
1255 '8',
'9',
'a',
'b',
'c',
'd',
'e',
'f'
1257 buffer[stringIndex] = charForHex[hexDigit];
1260 Out.write(buffer.data(), numCharacters);
1263void CXXNameMangler::mangleFloatLiteral(QualType T,
const llvm::APFloat &
V) {
1270void CXXNameMangler::mangleFixedPointLiteral() {
1271 DiagnosticsEngine &Diags = Context.getDiags();
1272 Diags.
Report(diag::err_unsupported_itanium_mangling)
1273 << UnsupportedItaniumManglingKind::FixedPointLiteral;
1276void CXXNameMangler::mangleNullPointer(QualType T) {
1283void CXXNameMangler::mangleNumber(
const llvm::APSInt &
Value) {
1284 if (
Value.isSigned() &&
Value.isNegative()) {
1286 Value.abs().print(Out,
false);
1288 Value.print(Out,
false);
1292void CXXNameMangler::mangleNumber(int64_t Number) {
1302void CXXNameMangler::mangleCallOffset(int64_t NonVirtual, int64_t
Virtual) {
1310 mangleNumber(NonVirtual);
1316 mangleNumber(NonVirtual);
1322void CXXNameMangler::manglePrefix(QualType
type) {
1323 if (
const auto *TST =
type->getAs<TemplateSpecializationType>()) {
1324 if (!mangleSubstitution(QualType(TST, 0))) {
1325 mangleTemplatePrefix(TST->getTemplateName());
1330 mangleTemplateArgs(TST->getTemplateName(), TST->template_arguments());
1331 addSubstitution(QualType(TST, 0));
1333 }
else if (
const auto *DNT =
type->getAs<DependentNameType>()) {
1335 bool Clang14Compat = isCompatibleWith(LangOptions::ClangABI::Ver14);
1336 if (!Clang14Compat && mangleSubstitution(QualType(DNT, 0)))
1341 assert(DNT->getQualifier());
1342 manglePrefix(DNT->getQualifier());
1344 mangleSourceName(DNT->getIdentifier());
1347 addSubstitution(QualType(DNT, 0));
1359void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier Qualifier,
1377 case NestedNameSpecifier::Kind::Null:
1378 llvm_unreachable(
"unexpected null nested name specifier");
1380 case NestedNameSpecifier::Kind::Global:
1390 case NestedNameSpecifier::Kind::MicrosoftSuper:
1391 llvm_unreachable(
"Can't mangle __super specifier");
1393 case NestedNameSpecifier::Kind::Namespace: {
1396 mangleUnresolvedPrefix(Prefix,
1400 mangleSourceNameWithAbiTags(Namespace);
1404 case NestedNameSpecifier::Kind::Type: {
1412 if (NestedNameSpecifier Prefix =
type->getPrefix()) {
1413 mangleUnresolvedPrefix(Prefix,
1420 if (mangleUnresolvedTypeOrSimpleId(QualType(
type, 0), recursive ?
"N" :
""))
1435void CXXNameMangler::mangleUnresolvedName(
1436 NestedNameSpecifier Qualifier, DeclarationName name,
1437 const TemplateArgumentLoc *TemplateArgs,
unsigned NumTemplateArgs,
1438 unsigned knownArity) {
1440 mangleUnresolvedPrefix(Qualifier);
1441 switch (
name.getNameKind()) {
1444 mangleSourceName(
name.getAsIdentifierInfo());
1449 mangleUnresolvedTypeOrSimpleId(
name.getCXXNameType());
1456 mangleOperatorName(name, knownArity);
1459 llvm_unreachable(
"Can't mangle a constructor name!");
1461 llvm_unreachable(
"Can't mangle a using directive name!");
1463 llvm_unreachable(
"Can't mangle a deduction guide name!");
1467 llvm_unreachable(
"Can't mangle Objective-C selector names here!");
1473 mangleTemplateArgs(
TemplateName(), TemplateArgs, NumTemplateArgs);
1476void CXXNameMangler::mangleUnqualifiedName(
1477 GlobalDecl GD, DeclarationName Name,
const DeclContext *DC,
1478 unsigned KnownArity, ArrayRef<StringRef> AdditionalAbiTags) {
1479 const NamedDecl *ND = cast_or_null<NamedDecl>(GD.
getDecl());
1486 mangleModuleName(ND);
1490 auto *FD = dyn_cast<FunctionDecl>(ND);
1491 auto *FTD = dyn_cast<FunctionTemplateDecl>(ND);
1493 (FTD && FTD->getTemplatedDecl()->isMemberLikeConstrainedFriend())) {
1494 if (!isCompatibleWith(LangOptions::ClangABI::Ver17))
1498 unsigned Arity = KnownArity;
1504 if (
auto *DD = dyn_cast<DecompositionDecl>(ND)) {
1511 for (
auto *BD : DD->bindings())
1512 mangleSourceName(BD->getDeclName().getAsIdentifierInfo());
1514 writeAbiTags(ND, AdditionalAbiTags);
1518 if (
auto *GD = dyn_cast<MSGuidDecl>(ND)) {
1521 SmallString<
sizeof(
"_GUID_12345678_1234_1234_1234_1234567890ab")> GUID;
1522 llvm::raw_svector_ostream GUIDOS(GUID);
1523 Context.mangleMSGuidDecl(GD, GUIDOS);
1524 Out << GUID.size() << GUID;
1528 if (
auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
1531 mangleValueInTemplateArg(TPO->getType().getUnqualifiedType(),
1532 TPO->getValue(),
true);
1550 if (Context.isInternalLinkageDecl(ND))
1553 bool IsRegCall = FD &&
1557 FD && FD->
hasAttr<CUDAGlobalAttr>() &&
1559 bool IsOCLDeviceStub =
1561 DeviceKernelAttr::isOpenCLSpelling(FD->
getAttr<DeviceKernelAttr>()) &&
1564 mangleDeviceStubName(II);
1565 else if (IsOCLDeviceStub)
1566 mangleOCLDeviceStubName(II);
1568 mangleRegCallName(II);
1570 mangleSourceName(II);
1572 writeAbiTags(ND, AdditionalAbiTags);
1577 assert(ND &&
"mangling empty name without declaration");
1579 if (
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
1582 Out <<
"12_GLOBAL__N_1";
1587 if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1589 const auto *RD = VD->getType()->castAsRecordDecl();
1600 assert(RD->isAnonymousStructOrUnion()
1601 &&
"Expected anonymous struct or union!");
1602 const FieldDecl *FD = RD->findFirstNamedDataMember();
1608 assert(FD->
getIdentifier() &&
"Data member name isn't an identifier!");
1628 "Typedef should not be in another decl context!");
1629 assert(D->getDeclName().getAsIdentifierInfo() &&
1630 "Typedef was not named!");
1631 mangleSourceName(D->getDeclName().getAsIdentifierInfo());
1632 assert(AdditionalAbiTags.empty() &&
1633 "Type cannot have additional abi tags");
1645 if (
const CXXRecordDecl *
Record = dyn_cast<CXXRecordDecl>(TD)) {
1647 Context.getDiscriminatorOverride()(Context.getASTContext(),
Record);
1653 if (
Record->isLambda() &&
1654 ((DeviceNumber && *DeviceNumber > 0) ||
1655 (!DeviceNumber &&
Record->getLambdaManglingNumber() > 0))) {
1656 assert(AdditionalAbiTags.empty() &&
1657 "Lambda type cannot have additional abi tags");
1664 unsigned UnnamedMangle =
1665 getASTContext().getManglingNumber(TD, Context.isAux());
1667 if (UnnamedMangle > 1)
1668 Out << UnnamedMangle - 2;
1670 writeAbiTags(TD, AdditionalAbiTags);
1676 unsigned AnonStructId =
1678 : Context.getAnonymousStructId(TD, dyn_cast<FunctionDecl>(DC));
1685 Str += llvm::utostr(AnonStructId);
1695 llvm_unreachable(
"Can't mangle Objective-C selector names here!");
1706 if (ND && Arity == UnknownArity) {
1710 if (
const auto *MD = dyn_cast<CXXMethodDecl>(ND))
1711 if (MD->isImplicitObjectMemberFunction())
1717 mangleOperatorName(Name, Arity);
1718 writeAbiTags(ND, AdditionalAbiTags);
1722 llvm_unreachable(
"Can't mangle a deduction guide name!");
1725 llvm_unreachable(
"Can't mangle a using directive name!");
1729void CXXNameMangler::mangleConstructorName(
1730 const CXXConstructorDecl *CCD, ArrayRef<StringRef> AdditionalAbiTags) {
1731 const CXXRecordDecl *InheritedFrom =
nullptr;
1733 const TemplateArgumentList *InheritedTemplateArgs =
nullptr;
1735 InheritedFrom = Inherited.getConstructor()->
getParent();
1736 InheritedTemplateName =
1737 TemplateName(Inherited.getConstructor()->getPrimaryTemplate());
1738 InheritedTemplateArgs =
1739 Inherited.getConstructor()->getTemplateSpecializationArgs();
1742 if (CCD == Structor)
1745 mangleCXXCtorType(
static_cast<CXXCtorType>(StructorType), InheritedFrom);
1753 if (InheritedTemplateArgs)
1754 mangleTemplateArgs(InheritedTemplateName, *InheritedTemplateArgs);
1756 writeAbiTags(CCD, AdditionalAbiTags);
1759void CXXNameMangler::mangleDestructorName(
1760 const CXXDestructorDecl *CDD, ArrayRef<StringRef> AdditionalAbiTags) {
1761 if (CDD == Structor)
1764 mangleCXXDtorType(
static_cast<CXXDtorType>(StructorType));
1770 writeAbiTags(CDD, AdditionalAbiTags);
1773void CXXNameMangler::mangleRegCallName(
const IdentifierInfo *II) {
1777 if (getASTContext().getLangOpts().RegCall4)
1778 Out << II->
getLength() +
sizeof(
"__regcall4__") - 1 <<
"__regcall4__"
1781 Out << II->
getLength() +
sizeof(
"__regcall3__") - 1 <<
"__regcall3__"
1785void CXXNameMangler::mangleDeviceStubName(
const IdentifierInfo *II) {
1789 Out << II->
getLength() +
sizeof(
"__device_stub__") - 1 <<
"__device_stub__"
1793void CXXNameMangler::mangleOCLDeviceStubName(
const IdentifierInfo *II) {
1797 StringRef OCLDeviceStubNamePrefix =
"__clang_ocl_kern_imp_";
1798 Out << II->
getLength() + OCLDeviceStubNamePrefix.size()
1799 << OCLDeviceStubNamePrefix << II->
getName();
1802void CXXNameMangler::mangleSourceName(
const IdentifierInfo *II) {
1809void CXXNameMangler::mangleNestedName(GlobalDecl GD,
const DeclContext *DC,
1810 ArrayRef<StringRef> AdditionalAbiTags,
1819 if (
const CXXMethodDecl *
Method = dyn_cast<CXXMethodDecl>(ND)) {
1820 Qualifiers MethodQuals =
Method->getMethodQualifiers();
1823 if (
Method->isExplicitObjectMemberFunction())
1826 mangleQualifiers(MethodQuals);
1827 mangleRefQualifier(
Method->getRefQualifier());
1831 const TemplateArgumentList *TemplateArgs =
nullptr;
1832 if (GlobalDecl TD =
isTemplate(GD, TemplateArgs)) {
1833 mangleTemplatePrefix(TD, NoFunction);
1836 manglePrefix(DC, NoFunction);
1837 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1842void CXXNameMangler::mangleNestedName(
const TemplateDecl *TD,
1843 ArrayRef<TemplateArgument> Args) {
1848 mangleTemplatePrefix(TD);
1854void CXXNameMangler::mangleNestedNameWithClosurePrefix(
1855 GlobalDecl GD,
const NamedDecl *PrefixND,
1856 ArrayRef<StringRef> AdditionalAbiTags) {
1865 mangleClosurePrefix(PrefixND);
1866 mangleUnqualifiedName(GD,
nullptr, AdditionalAbiTags);
1877 if (
auto *CD = dyn_cast<CXXConstructorDecl>(DC))
1879 else if (
auto *DD = dyn_cast<CXXDestructorDecl>(DC))
1886void CXXNameMangler::mangleLocalName(GlobalDecl GD,
1887 ArrayRef<StringRef> AdditionalAbiTags) {
1895 const RecordDecl *RD = GetLocalClassDecl(D);
1896 const DeclContext *DC = Context.getEffectiveDeclContext(RD ? RD : D);
1901 AbiTagState LocalAbiTags(AbiTags);
1903 if (
const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(DC)) {
1905 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
1906 mangleBlockForPrefix(BD);
1913 LocalAbiTags.setUsedAbiTags(LocalAbiTags.getEmittedAbiTags());
1927 const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD);
1929 if (
const ParmVarDecl *Parm
1931 if (
const FunctionDecl *
Func
1936 mangleNumber(
Num - 2);
1945 mangleUnqualifiedName(RD, DC, AdditionalAbiTags);
1946 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
1947 if (
const NamedDecl *PrefixND = getClosurePrefix(BD))
1948 mangleClosurePrefix(PrefixND,
true );
1950 manglePrefix(Context.getEffectiveDeclContext(BD),
true );
1951 assert(AdditionalAbiTags.empty() &&
1952 "Block cannot have additional abi tags");
1953 mangleUnqualifiedBlock(BD);
1956 mangleNestedName(GD, Context.getEffectiveDeclContext(ND),
1957 AdditionalAbiTags,
true );
1959 }
else if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
1962 if (
const ParmVarDecl *Parm
1963 = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) {
1964 if (
const FunctionDecl *
Func
1969 mangleNumber(
Num - 2);
1974 assert(AdditionalAbiTags.empty() &&
1975 "Block cannot have additional abi tags");
1976 mangleUnqualifiedBlock(BD);
1978 mangleUnqualifiedName(GD, DC, AdditionalAbiTags);
1981 if (
const NamedDecl *ND = dyn_cast<NamedDecl>(RD ? RD : D)) {
1983 if (Context.getNextDiscriminator(ND, disc)) {
1987 Out <<
"__" << disc <<
'_';
1992void CXXNameMangler::mangleBlockForPrefix(
const BlockDecl *
Block) {
1993 if (GetLocalClassDecl(
Block)) {
1994 mangleLocalName(
Block);
1997 const DeclContext *DC = Context.getEffectiveDeclContext(
Block);
1998 if (isLocalContainerContext(DC)) {
1999 mangleLocalName(
Block);
2002 if (
const NamedDecl *PrefixND = getClosurePrefix(
Block))
2003 mangleClosurePrefix(PrefixND);
2006 mangleUnqualifiedBlock(
Block);
2009void CXXNameMangler::mangleUnqualifiedBlock(
const BlockDecl *
Block) {
2012 if (Decl *Context =
Block->getBlockManglingContextDecl();
2013 Context && isCompatibleWith(LangOptions::ClangABI::Ver12) &&
2015 Context->getDeclContext()->isRecord()) {
2018 mangleSourceNameWithAbiTags(ND);
2024 unsigned Number =
Block->getBlockManglingNumber();
2046void CXXNameMangler::mangleTemplateParamDecl(
const NamedDecl *Decl) {
2048 if (
auto *Ty = dyn_cast<TemplateTypeParmDecl>(Decl)) {
2049 if (Ty->isParameterPack())
2051 const TypeConstraint *Constraint = Ty->getTypeConstraint();
2052 if (Constraint && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
2055 mangleTypeConstraint(Constraint);
2059 }
else if (
auto *Tn = dyn_cast<NonTypeTemplateParmDecl>(Decl)) {
2060 if (Tn->isExpandedParameterPack()) {
2061 for (
unsigned I = 0, N = Tn->getNumExpansionTypes(); I != N; ++I) {
2063 mangleType(Tn->getExpansionType(I));
2066 QualType T = Tn->getType();
2067 if (Tn->isParameterPack()) {
2069 if (
auto *PackExpansion = T->
getAs<PackExpansionType>())
2070 T = PackExpansion->getPattern();
2075 }
else if (
auto *Tt = dyn_cast<TemplateTemplateParmDecl>(Decl)) {
2076 if (Tt->isExpandedParameterPack()) {
2077 for (
unsigned I = 0, N = Tt->getNumExpansionTemplateParameters(); I != N;
2079 mangleTemplateParameterList(Tt->getExpansionTemplateParameters(I));
2081 if (Tt->isParameterPack())
2083 mangleTemplateParameterList(Tt->getTemplateParameters());
2088void CXXNameMangler::mangleTemplateParameterList(
2089 const TemplateParameterList *Params) {
2091 for (
auto *Param : *Params)
2092 mangleTemplateParamDecl(Param);
2093 mangleRequiresClause(Params->getRequiresClause());
2097void CXXNameMangler::mangleTypeConstraint(
2098 const TemplateDecl *
Concept, ArrayRef<TemplateArgument> Arguments) {
2099 const DeclContext *DC = Context.getEffectiveDeclContext(
Concept);
2101 mangleTemplateName(
Concept, Arguments);
2103 mangleUnscopedName(
Concept, DC);
2105 mangleNestedName(
Concept, DC);
2108void CXXNameMangler::mangleTypeConstraint(
const TypeConstraint *Constraint) {
2109 llvm::SmallVector<TemplateArgument, 8> Args;
2111 for (
const TemplateArgumentLoc &ArgLoc :
2113 Args.push_back(ArgLoc.getArgument());
2118void CXXNameMangler::mangleRequiresClause(
const Expr *RequiresClause) {
2120 if (RequiresClause && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
2122 mangleExpression(RequiresClause);
2126void CXXNameMangler::mangleLambda(
const CXXRecordDecl *Lambda) {
2130 Context && isCompatibleWith(LangOptions::ClangABI::Ver12) &&
2133 if (
const IdentifierInfo *Name =
2135 mangleSourceName(Name);
2136 const TemplateArgumentList *TemplateArgs =
nullptr;
2144 mangleLambdaSig(Lambda);
2159 Context.getDiscriminatorOverride()(Context.getASTContext(), Lambda);
2163 assert(Number > 0 &&
"Lambda should be mangled as an unnamed class");
2165 mangleNumber(Number - 2);
2169void CXXNameMangler::mangleLambdaSig(
const CXXRecordDecl *Lambda) {
2172 mangleTemplateParamDecl(D);
2176 mangleRequiresClause(TPL->getRequiresClause());
2180 mangleBareFunctionType(Proto,
false,
2184void CXXNameMangler::manglePrefix(NestedNameSpecifier Qualifier) {
2186 case NestedNameSpecifier::Kind::Null:
2187 case NestedNameSpecifier::Kind::Global:
2191 case NestedNameSpecifier::Kind::MicrosoftSuper:
2192 llvm_unreachable(
"Can't mangle __super specifier");
2194 case NestedNameSpecifier::Kind::Namespace:
2195 mangleName(
Qualifier.getAsNamespaceAndPrefix().Namespace->getNamespace());
2198 case NestedNameSpecifier::Kind::Type:
2199 manglePrefix(QualType(
Qualifier.getAsType(), 0));
2203 llvm_unreachable(
"unexpected nested name specifier");
2206void CXXNameMangler::manglePrefix(
const DeclContext *DC,
bool NoFunction) {
2219 if (NoFunction && isLocalContainerContext(DC))
2223 if (mangleSubstitution(ND))
2229 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND);
2230 const TemplateDecl *TD = FD->getPrimaryTemplate()) {
2231 mangleTemplatePrefix(TD);
2233 *FD->getTemplateSpecializationArgs());
2235 manglePrefix(Context.getEffectiveDeclContext(ND), NoFunction);
2238 addSubstitution(ND);
2243 manglePrefix(Context.getEffectiveDeclContext(ND), NoFunction);
2245 addSubstitution(ND);
2250 const TemplateArgumentList *TemplateArgs =
nullptr;
2251 if (GlobalDecl TD =
isTemplate(ND, TemplateArgs)) {
2252 mangleTemplatePrefix(TD);
2254 }
else if (
const NamedDecl *PrefixND = getClosurePrefix(ND)) {
2255 mangleClosurePrefix(PrefixND, NoFunction);
2256 mangleUnqualifiedName(ND,
nullptr);
2258 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
2259 manglePrefix(DC, NoFunction);
2260 mangleUnqualifiedName(ND, DC);
2263 addSubstitution(ND);
2270 if (TemplateDecl *TD =
Template.getAsTemplateDecl())
2271 return mangleTemplatePrefix(TD);
2274 assert(
Dependent &&
"unexpected template name kind");
2278 bool Clang11Compat = isCompatibleWith(LangOptions::ClangABI::Ver11);
2279 if (!Clang11Compat && mangleSubstitution(
Template))
2282 manglePrefix(
Dependent->getQualifier());
2284 if (Clang11Compat && mangleSubstitution(
Template))
2287 if (IdentifierOrOverloadedOperator Name =
Dependent->getName();
2288 const IdentifierInfo *Id = Name.getIdentifier())
2289 mangleSourceName(Id);
2291 mangleOperatorName(Name.getOperator(), UnknownArity);
2296void CXXNameMangler::mangleTemplatePrefix(GlobalDecl GD,
2305 if (mangleSubstitution(ND))
2309 if (
const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) {
2310 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
2312 const DeclContext *DC = Context.getEffectiveDeclContext(ND);
2313 manglePrefix(DC, NoFunction);
2315 mangleUnqualifiedName(GD, DC);
2320 addSubstitution(ND);
2323const NamedDecl *CXXNameMangler::getClosurePrefix(
const Decl *ND) {
2324 if (isCompatibleWith(LangOptions::ClangABI::Ver12))
2327 const NamedDecl *Context =
nullptr;
2328 if (
auto *
Block = dyn_cast<BlockDecl>(ND)) {
2329 Context = dyn_cast_or_null<NamedDecl>(
Block->getBlockManglingContextDecl());
2330 }
else if (
auto *VD = dyn_cast<VarDecl>(ND)) {
2333 }
else if (
auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
2335 Context = dyn_cast_or_null<NamedDecl>(RD->getLambdaContextDecl());
2349void CXXNameMangler::mangleClosurePrefix(
const NamedDecl *ND,
bool NoFunction) {
2352 if (mangleSubstitution(ND))
2355 const TemplateArgumentList *TemplateArgs =
nullptr;
2356 if (GlobalDecl TD =
isTemplate(ND, TemplateArgs)) {
2357 mangleTemplatePrefix(TD, NoFunction);
2360 const auto *DC = Context.getEffectiveDeclContext(ND);
2361 manglePrefix(DC, NoFunction);
2362 mangleUnqualifiedName(ND, DC);
2367 addSubstitution(ND);
2376 if (mangleSubstitution(TN))
2379 TemplateDecl *TD =
nullptr;
2389 if (
auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TD))
2390 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
2397 llvm_unreachable(
"can't mangle an overloaded template name as a <type>");
2406 mangleUnresolvedPrefix(
Dependent->getQualifier());
2407 mangleSourceName(II);
2416 SubstTemplateTemplateParmStorage *subst
2427 Out <<
"_SUBSTPACK_";
2431 llvm_unreachable(
"Unexpected DeducedTemplate");
2434 addSubstitution(TN);
2437bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty,
2443 case Type::Adjusted:
2445 case Type::ArrayParameter:
2447 case Type::BlockPointer:
2448 case Type::LValueReference:
2449 case Type::RValueReference:
2450 case Type::MemberPointer:
2451 case Type::ConstantArray:
2452 case Type::IncompleteArray:
2453 case Type::VariableArray:
2454 case Type::DependentSizedArray:
2455 case Type::DependentAddressSpace:
2456 case Type::DependentVector:
2457 case Type::DependentSizedExtVector:
2459 case Type::ExtVector:
2460 case Type::ConstantMatrix:
2461 case Type::DependentSizedMatrix:
2462 case Type::FunctionProto:
2463 case Type::FunctionNoProto:
2465 case Type::Attributed:
2466 case Type::BTFTagAttributed:
2467 case Type::OverflowBehavior:
2468 case Type::HLSLAttributedResource:
2469 case Type::HLSLInlineSpirv:
2471 case Type::DeducedTemplateSpecialization:
2472 case Type::PackExpansion:
2473 case Type::ObjCObject:
2474 case Type::ObjCInterface:
2475 case Type::ObjCObjectPointer:
2476 case Type::ObjCTypeParam:
2479 case Type::MacroQualified:
2481 case Type::DependentBitInt:
2482 case Type::CountAttributed:
2483 llvm_unreachable(
"type is illegal as a nested name specifier");
2485 case Type::SubstBuiltinTemplatePack:
2490 Out <<
"_SUBSTBUILTINPACK_";
2492 case Type::SubstTemplateTypeParmPack:
2497 Out <<
"_SUBSTPACK_";
2504 case Type::TypeOfExpr:
2506 case Type::Decltype:
2507 case Type::PackIndexing:
2508 case Type::TemplateTypeParm:
2509 case Type::UnaryTransform:
2522 case Type::SubstTemplateTypeParm: {
2526 if (
auto *TD = dyn_cast<TemplateDecl>(ST->getAssociatedDecl());
2528 return mangleUnresolvedTypeOrSimpleId(ST->getReplacementType(), Prefix);
2529 goto unresolvedType;
2536 case Type::PredefinedSugar:
2540 case Type::UnresolvedUsing:
2541 mangleSourceNameWithAbiTags(
2547 mangleSourceNameWithAbiTags(
2551 case Type::TemplateSpecialization: {
2552 const TemplateSpecializationType *TST =
2562 assert(TD &&
"no template for template specialization type");
2564 goto unresolvedType;
2566 mangleSourceNameWithAbiTags(TD);
2578 llvm_unreachable(
"invalid base for a template specialization type");
2581 SubstTemplateTemplateParmStorage *subst =
2592 Out <<
"_SUBSTPACK_";
2598 mangleSourceNameWithAbiTags(TD);
2608 mangleTemplateArgs(
TemplateName(), TST->template_arguments());
2612 case Type::InjectedClassName:
2613 mangleSourceNameWithAbiTags(
2617 case Type::DependentName:
2629void CXXNameMangler::mangleOperatorName(DeclarationName Name,
unsigned Arity) {
2639 llvm_unreachable(
"Not an operator name");
2662 case OO_New:
Out <<
"nw";
break;
2664 case OO_Array_New:
Out <<
"na";
break;
2666 case OO_Delete:
Out <<
"dl";
break;
2668 case OO_Array_Delete:
Out <<
"da";
break;
2672 Out << (Arity == 1?
"ps" :
"pl");
break;
2676 Out << (Arity == 1?
"ng" :
"mi");
break;
2680 Out << (Arity == 1?
"ad" :
"an");
break;
2685 Out << (Arity == 1?
"de" :
"ml");
break;
2687 case OO_Tilde:
Out <<
"co";
break;
2689 case OO_Slash:
Out <<
"dv";
break;
2691 case OO_Percent:
Out <<
"rm";
break;
2693 case OO_Pipe:
Out <<
"or";
break;
2695 case OO_Caret:
Out <<
"eo";
break;
2697 case OO_Equal:
Out <<
"aS";
break;
2699 case OO_PlusEqual:
Out <<
"pL";
break;
2701 case OO_MinusEqual:
Out <<
"mI";
break;
2703 case OO_StarEqual:
Out <<
"mL";
break;
2705 case OO_SlashEqual:
Out <<
"dV";
break;
2707 case OO_PercentEqual:
Out <<
"rM";
break;
2709 case OO_AmpEqual:
Out <<
"aN";
break;
2711 case OO_PipeEqual:
Out <<
"oR";
break;
2713 case OO_CaretEqual:
Out <<
"eO";
break;
2715 case OO_LessLess:
Out <<
"ls";
break;
2717 case OO_GreaterGreater:
Out <<
"rs";
break;
2719 case OO_LessLessEqual:
Out <<
"lS";
break;
2721 case OO_GreaterGreaterEqual:
Out <<
"rS";
break;
2723 case OO_EqualEqual:
Out <<
"eq";
break;
2725 case OO_ExclaimEqual:
Out <<
"ne";
break;
2727 case OO_Less:
Out <<
"lt";
break;
2729 case OO_Greater:
Out <<
"gt";
break;
2731 case OO_LessEqual:
Out <<
"le";
break;
2733 case OO_GreaterEqual:
Out <<
"ge";
break;
2735 case OO_Exclaim:
Out <<
"nt";
break;
2737 case OO_AmpAmp:
Out <<
"aa";
break;
2739 case OO_PipePipe:
Out <<
"oo";
break;
2741 case OO_PlusPlus:
Out <<
"pp";
break;
2743 case OO_MinusMinus:
Out <<
"mm";
break;
2745 case OO_Comma:
Out <<
"cm";
break;
2747 case OO_ArrowStar:
Out <<
"pm";
break;
2749 case OO_Arrow:
Out <<
"pt";
break;
2751 case OO_Call:
Out <<
"cl";
break;
2753 case OO_Subscript:
Out <<
"ix";
break;
2758 case OO_Conditional:
Out <<
"qu";
break;
2761 case OO_Coawait:
Out <<
"aw";
break;
2764 case OO_Spaceship:
Out <<
"ss";
break;
2768 llvm_unreachable(
"Not an overloaded operator");
2772void CXXNameMangler::mangleQualifiers(Qualifiers Quals,
const DependentAddressSpaceType *DAST) {
2791 SmallString<64> ASString;
2797 if (TargetAS != 0 ||
2799 ASString =
"AS" + llvm::utostr(TargetAS);
2802 default: llvm_unreachable(
"Not a language specific address space");
2806 case LangAS::opencl_global:
2807 ASString =
"CLglobal";
2809 case LangAS::opencl_global_device:
2810 ASString =
"CLdevice";
2812 case LangAS::opencl_global_host:
2813 ASString =
"CLhost";
2815 case LangAS::opencl_local:
2816 ASString =
"CLlocal";
2818 case LangAS::opencl_constant:
2819 ASString =
"CLconstant";
2821 case LangAS::opencl_private:
2822 ASString =
"CLprivate";
2824 case LangAS::opencl_generic:
2825 ASString =
"CLgeneric";
2829 case LangAS::sycl_global:
2830 ASString =
"SYglobal";
2832 case LangAS::sycl_global_device:
2833 ASString =
"SYdevice";
2835 case LangAS::sycl_global_host:
2836 ASString =
"SYhost";
2838 case LangAS::sycl_local:
2839 ASString =
"SYlocal";
2841 case LangAS::sycl_private:
2842 ASString =
"SYprivate";
2845 case LangAS::cuda_device:
2846 ASString =
"CUdevice";
2848 case LangAS::cuda_constant:
2849 ASString =
"CUconstant";
2851 case LangAS::cuda_shared:
2852 ASString =
"CUshared";
2855 case LangAS::ptr32_sptr:
2856 ASString =
"ptr32_sptr";
2858 case LangAS::ptr32_uptr:
2862 if (!getASTContext().getTargetInfo().
getTriple().isOSzOS())
2863 ASString =
"ptr32_uptr";
2870 if (!ASString.empty())
2871 mangleVendorQualifier(ASString);
2884 mangleVendorQualifier(
"__weak");
2888 mangleVendorQualifier(
"__unaligned");
2892 mangleVendorQualifier(
"__ptrauth");
2902 << unsigned(PtrAuth.isAddressDiscriminated())
2905 << PtrAuth.getExtraDiscriminator()
2920 mangleVendorQualifier(
"__strong");
2924 mangleVendorQualifier(
"__autoreleasing");
2947void CXXNameMangler::mangleVendorQualifier(StringRef name) {
2951void CXXNameMangler::mangleVendorType(StringRef name) {
2958 switch (RefQualifier) {
2972void CXXNameMangler::mangleObjCMethodName(
const ObjCMethodDecl *MD) {
2973 Context.mangleObjCMethodNameAsSourceName(MD, Out);
2986 Ctx.
getLangOpts().getClangABICompat() > LangOptions::ClangABI::Ver17)
2992 if (Ctx.
getLangOpts().getClangABICompat() > LangOptions::ClangABI::Ver6 &&
2998 if (
auto *DeducedTST = Ty->
getAs<DeducedTemplateSpecializationType>())
2999 if (DeducedTST->getDeducedType().isNull())
3004void CXXNameMangler::mangleType(QualType T) {
3044 if (
const TemplateSpecializationType *TST
3045 = dyn_cast<TemplateSpecializationType>(T))
3046 if (!TST->isTypeAlias())
3061 auto [ty, quals] = T.
split();
3063 bool isSubstitutable =
3065 if (isSubstitutable && mangleSubstitution(T))
3072 quals = Qualifiers();
3078 if (quals || ty->isDependentAddressSpaceType()) {
3079 if (
const DependentAddressSpaceType *DAST =
3080 dyn_cast<DependentAddressSpaceType>(ty)) {
3082 mangleQualifiers(Quals, DAST);
3083 mangleType(QualType(Ty, 0));
3085 mangleQualifiers(quals);
3089 mangleType(QualType(ty, 0));
3092 switch (ty->getTypeClass()) {
3093#define ABSTRACT_TYPE(CLASS, PARENT)
3094#define NON_CANONICAL_TYPE(CLASS, PARENT) \
3096 llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
3098#define TYPE(CLASS, PARENT) \
3100 mangleType(static_cast<const CLASS##Type*>(ty)); \
3102#include "clang/AST/TypeNodes.inc"
3107 if (isSubstitutable)
3111void CXXNameMangler::mangleCXXRecordDecl(
const CXXRecordDecl *
Record,
3112 bool SuppressSubstitution) {
3113 if (mangleSubstitution(
Record))
3116 if (SuppressSubstitution)
3121void CXXNameMangler::mangleType(
const BuiltinType *T) {
3163 std::string type_name;
3167 if (NormalizeIntegers && T->
isInteger()) {
3169 switch (getASTContext().getTypeSize(T)) {
3173 if (mangleSubstitution(BuiltinType::SChar))
3176 addSubstitution(BuiltinType::SChar);
3179 if (mangleSubstitution(BuiltinType::Short))
3182 addSubstitution(BuiltinType::Short);
3185 if (mangleSubstitution(BuiltinType::Int))
3188 addSubstitution(BuiltinType::Int);
3191 if (mangleSubstitution(BuiltinType::Long))
3194 addSubstitution(BuiltinType::Long);
3197 if (mangleSubstitution(BuiltinType::Int128))
3200 addSubstitution(BuiltinType::Int128);
3203 llvm_unreachable(
"Unknown integer size for normalization");
3206 switch (getASTContext().getTypeSize(T)) {
3208 if (mangleSubstitution(BuiltinType::UChar))
3211 addSubstitution(BuiltinType::UChar);
3214 if (mangleSubstitution(BuiltinType::UShort))
3217 addSubstitution(BuiltinType::UShort);
3220 if (mangleSubstitution(BuiltinType::UInt))
3223 addSubstitution(BuiltinType::UInt);
3226 if (mangleSubstitution(BuiltinType::ULong))
3229 addSubstitution(BuiltinType::ULong);
3232 if (mangleSubstitution(BuiltinType::UInt128))
3235 addSubstitution(BuiltinType::UInt128);
3238 llvm_unreachable(
"Unknown integer size for normalization");
3244 case BuiltinType::Void:
3247 case BuiltinType::Bool:
3250 case BuiltinType::Char_U:
3251 case BuiltinType::Char_S:
3254 case BuiltinType::UChar:
3257 case BuiltinType::UShort:
3260 case BuiltinType::UInt:
3263 case BuiltinType::ULong:
3266 case BuiltinType::ULongLong:
3269 case BuiltinType::UInt128:
3272 case BuiltinType::SChar:
3275 case BuiltinType::WChar_S:
3276 case BuiltinType::WChar_U:
3279 case BuiltinType::Char8:
3282 case BuiltinType::Char16:
3285 case BuiltinType::Char32:
3288 case BuiltinType::Short:
3291 case BuiltinType::Int:
3294 case BuiltinType::Long:
3297 case BuiltinType::LongLong:
3300 case BuiltinType::Int128:
3303 case BuiltinType::Float16:
3306 case BuiltinType::ShortAccum:
3309 case BuiltinType::Accum:
3312 case BuiltinType::LongAccum:
3315 case BuiltinType::UShortAccum:
3318 case BuiltinType::UAccum:
3321 case BuiltinType::ULongAccum:
3324 case BuiltinType::ShortFract:
3327 case BuiltinType::Fract:
3330 case BuiltinType::LongFract:
3333 case BuiltinType::UShortFract:
3336 case BuiltinType::UFract:
3339 case BuiltinType::ULongFract:
3342 case BuiltinType::SatShortAccum:
3345 case BuiltinType::SatAccum:
3348 case BuiltinType::SatLongAccum:
3351 case BuiltinType::SatUShortAccum:
3354 case BuiltinType::SatUAccum:
3357 case BuiltinType::SatULongAccum:
3360 case BuiltinType::SatShortFract:
3363 case BuiltinType::SatFract:
3366 case BuiltinType::SatLongFract:
3369 case BuiltinType::SatUShortFract:
3372 case BuiltinType::SatUFract:
3375 case BuiltinType::SatULongFract:
3378 case BuiltinType::Half:
3381 case BuiltinType::Float:
3384 case BuiltinType::Double:
3387 case BuiltinType::LongDouble: {
3388 const TargetInfo *TI =
3389 getASTContext().getLangOpts().OpenMP &&
3390 getASTContext().getLangOpts().OpenMPIsTargetDevice
3391 ? getASTContext().getAuxTargetInfo()
3392 : &getASTContext().getTargetInfo();
3396 case BuiltinType::Float128: {
3397 const TargetInfo *TI =
3398 getASTContext().getLangOpts().OpenMP &&
3399 getASTContext().getLangOpts().OpenMPIsTargetDevice
3400 ? getASTContext().getAuxTargetInfo()
3401 : &getASTContext().getTargetInfo();
3405 case BuiltinType::BFloat16: {
3406 const TargetInfo *TI =
3407 ((getASTContext().getLangOpts().OpenMP &&
3408 getASTContext().getLangOpts().OpenMPIsTargetDevice) ||
3409 getASTContext().getLangOpts().SYCLIsDevice)
3410 ? getASTContext().getAuxTargetInfo()
3411 : &getASTContext().getTargetInfo();
3415 case BuiltinType::Ibm128: {
3416 const TargetInfo *TI = &getASTContext().getTargetInfo();
3420 case BuiltinType::NullPtr:
3424#define BUILTIN_TYPE(Id, SingletonId)
3425#define PLACEHOLDER_TYPE(Id, SingletonId) \
3426 case BuiltinType::Id:
3427#include "clang/AST/BuiltinTypes.def"
3428 case BuiltinType::Dependent:
3430 llvm_unreachable(
"mangling a placeholder type");
3432 case BuiltinType::ObjCId:
3433 Out <<
"11objc_object";
3435 case BuiltinType::ObjCClass:
3436 Out <<
"10objc_class";
3438 case BuiltinType::ObjCSel:
3439 Out <<
"13objc_selector";
3441#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
3442 case BuiltinType::Id: \
3443 type_name = "ocl_" #ImgType "_" #Suffix; \
3444 Out << type_name.size() << type_name; \
3446#include "clang/Basic/OpenCLImageTypes.def"
3447 case BuiltinType::OCLSampler:
3448 Out <<
"11ocl_sampler";
3450 case BuiltinType::OCLEvent:
3451 Out <<
"9ocl_event";
3453 case BuiltinType::OCLClkEvent:
3454 Out <<
"12ocl_clkevent";
3456 case BuiltinType::OCLQueue:
3457 Out <<
"9ocl_queue";
3459 case BuiltinType::OCLReserveID:
3460 Out <<
"13ocl_reserveid";
3462#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
3463 case BuiltinType::Id: \
3464 type_name = "ocl_" #ExtType; \
3465 Out << type_name.size() << type_name; \
3467#include "clang/Basic/OpenCLExtensionTypes.def"
3471#define SVE_VECTOR_TYPE(Name, MangledName, Id, SingletonId) \
3472 case BuiltinType::Id: \
3473 if (T->getKind() == BuiltinType::SveBFloat16 && \
3474 isCompatibleWith(LangOptions::ClangABI::Ver17)) { \
3476 mangleVendorType("__SVBFloat16_t"); \
3478 type_name = #MangledName; \
3479 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3482#define SVE_PREDICATE_TYPE(Name, MangledName, Id, SingletonId) \
3483 case BuiltinType::Id: \
3484 type_name = #MangledName; \
3485 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3487#define SVE_OPAQUE_TYPE(Name, MangledName, Id, SingletonId) \
3488 case BuiltinType::Id: \
3489 type_name = #MangledName; \
3490 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3492#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) \
3493 case BuiltinType::Id: \
3494 type_name = #MangledName; \
3495 Out << (type_name == #Name ? "u" : "") << type_name.size() << type_name; \
3497#include "clang/Basic/AArch64ACLETypes.def"
3498#define PPC_VECTOR_TYPE(Name, Id, Size) \
3499 case BuiltinType::Id: \
3500 mangleVendorType(#Name); \
3502#include "clang/Basic/PPCTypes.def"
3504#define RVV_TYPE(Name, Id, SingletonId) \
3505 case BuiltinType::Id: \
3506 mangleVendorType(Name); \
3508#include "clang/Basic/RISCVVTypes.def"
3509#define WASM_REF_TYPE(InternalName, MangledName, Id, SingletonId, AS) \
3510 case BuiltinType::Id: \
3511 mangleVendorType(MangledName); \
3513#include "clang/Basic/WebAssemblyReferenceTypes.def"
3514#define AMDGPU_TYPE(Name, Id, SingletonId, Width, Align) \
3515 case BuiltinType::Id: \
3516 mangleVendorType(Name); \
3518#include "clang/Basic/AMDGPUTypes.def"
3519#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
3520 case BuiltinType::Id: \
3521 mangleVendorType(#Name); \
3523#include "clang/Basic/HLSLIntangibleTypes.def"
3527StringRef CXXNameMangler::getCallingConvQualifierName(
CallingConv CC) {
3547#define CC_VLS_CASE(ABI_VLEN) case CC_RISCVVLSCall_##ABI_VLEN:
3583 return "swiftasynccall";
3585 llvm_unreachable(
"bad calling convention");
3588void CXXNameMangler::mangleExtFunctionInfo(
const FunctionType *T) {
3590 if (T->
getExtInfo() == FunctionType::ExtInfo())
3597 StringRef CCQualifier = getCallingConvQualifierName(T->
getExtInfo().
getCC());
3598 if (!CCQualifier.empty())
3599 mangleVendorQualifier(CCQualifier);
3632 llvm_unreachable(
"Unrecognised SME attribute");
3647void CXXNameMangler::mangleSMEAttrs(
unsigned SMEAttrs) {
3667 Out <<
"Lj" <<
static_cast<unsigned>(Bitmask) <<
"EE";
3671CXXNameMangler::mangleExtParameterInfo(FunctionProtoType::ExtParameterInfo PI) {
3678 case ParameterABI::Ordinary:
3682 case ParameterABI::HLSLOut:
3683 case ParameterABI::HLSLInOut:
3688 case ParameterABI::SwiftContext:
3689 case ParameterABI::SwiftAsyncContext:
3690 case ParameterABI::SwiftErrorResult:
3691 case ParameterABI::SwiftIndirectResult:
3697 mangleVendorQualifier(
"ns_consumed");
3700 mangleVendorQualifier(
"noescape");
3706void CXXNameMangler::mangleType(
const FunctionProtoType *T) {
3710 Out <<
"11__SME_ATTRSI";
3712 mangleExtFunctionInfo(T);
3729 mangleType(ExceptTy);
3740 mangleBareFunctionType(T,
true);
3747 mangleSMEAttrs(SMEAttrs);
3750void CXXNameMangler::mangleType(
const FunctionNoProtoType *T) {
3756 FunctionTypeDepthState saved = FunctionTypeDepth.push();
3758 FunctionTypeDepth.enterResultType();
3760 FunctionTypeDepth.leaveResultType();
3762 FunctionTypeDepth.pop(saved);
3766void CXXNameMangler::mangleBareFunctionType(
const FunctionProtoType *Proto,
3767 bool MangleReturnType,
3768 const FunctionDecl *FD) {
3771 FunctionTypeDepthState saved = FunctionTypeDepth.push();
3774 if (MangleReturnType) {
3775 FunctionTypeDepth.enterResultType();
3779 mangleVendorQualifier(
"ns_returns_retained");
3784 auto SplitReturnTy = ReturnTy.
split();
3786 ReturnTy = getASTContext().getQualifiedType(SplitReturnTy);
3788 mangleType(ReturnTy);
3790 FunctionTypeDepth.leaveResultType();
3798 for (
unsigned I = 0, E = Proto->
getNumParams(); I != E; ++I) {
3812 assert(Attr->getType() <= 9 && Attr->getType() >= 0);
3813 if (Attr->isDynamic())
3814 Out <<
"U25pass_dynamic_object_size" << Attr->getType();
3816 Out <<
"U17pass_object_size" << Attr->getType();
3827 FunctionTypeDepth.enterResultType();
3831 FunctionTypeDepth.pop(saved);
3836void CXXNameMangler::mangleType(
const UnresolvedUsingType *T) {
3842void CXXNameMangler::mangleType(
const EnumType *T) {
3843 mangleType(
static_cast<const TagType*
>(T));
3845void CXXNameMangler::mangleType(
const RecordType *T) {
3846 mangleType(
static_cast<const TagType*
>(T));
3848void CXXNameMangler::mangleType(
const TagType *T) {
3849 mangleName(T->getDecl()->getDefinitionOrSelf());
3855void CXXNameMangler::mangleType(
const ConstantArrayType *T) {
3859void CXXNameMangler::mangleType(
const VariableArrayType *T) {
3867void CXXNameMangler::mangleType(
const DependentSizedArrayType *T) {
3877void CXXNameMangler::mangleType(
const IncompleteArrayType *T) {
3884void CXXNameMangler::mangleType(
const MemberPointerType *T) {
3887 mangleCXXRecordDecl(RD);
3891 if (
const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) {
3912 mangleType(PointeeType);
3916void CXXNameMangler::mangleType(
const TemplateTypeParmType *T) {
3917 mangleTemplateParameter(T->getDepth(), T->getIndex());
3921void CXXNameMangler::mangleType(
const SubstTemplateTypeParmPackType *T) {
3926 Out <<
"_SUBSTPACK_";
3929void CXXNameMangler::mangleType(
const SubstBuiltinTemplatePackType *T) {
3934 Out <<
"_SUBSTBUILTINPACK_";
3938void CXXNameMangler::mangleType(
const PointerType *T) {
3942void CXXNameMangler::mangleType(
const ObjCObjectPointerType *T) {
3948void CXXNameMangler::mangleType(
const LValueReferenceType *T) {
3954void CXXNameMangler::mangleType(
const RValueReferenceType *T) {
3960void CXXNameMangler::mangleType(
const ComplexType *T) {
3968void CXXNameMangler::mangleNeonVectorType(
const VectorType *T) {
3970 assert(EltType->
isBuiltinType() &&
"Neon vector element not a BuiltinType");
3971 const char *EltName =
nullptr;
3974 case BuiltinType::SChar:
3975 case BuiltinType::UChar:
3976 EltName =
"poly8_t";
3978 case BuiltinType::Short:
3979 case BuiltinType::UShort:
3980 EltName =
"poly16_t";
3982 case BuiltinType::LongLong:
3983 case BuiltinType::ULongLong:
3984 EltName =
"poly64_t";
3986 default: llvm_unreachable(
"unexpected Neon polynomial vector element type");
3990 case BuiltinType::SChar: EltName =
"int8_t";
break;
3991 case BuiltinType::UChar: EltName =
"uint8_t";
break;
3992 case BuiltinType::Short: EltName =
"int16_t";
break;
3993 case BuiltinType::UShort: EltName =
"uint16_t";
break;
3994 case BuiltinType::Int: EltName =
"int32_t";
break;
3995 case BuiltinType::UInt: EltName =
"uint32_t";
break;
3996 case BuiltinType::LongLong: EltName =
"int64_t";
break;
3997 case BuiltinType::ULongLong: EltName =
"uint64_t";
break;
3998 case BuiltinType::Double: EltName =
"float64_t";
break;
3999 case BuiltinType::Float: EltName =
"float32_t";
break;
4000 case BuiltinType::Half: EltName =
"float16_t";
break;
4001 case BuiltinType::BFloat16: EltName =
"bfloat16_t";
break;
4002 case BuiltinType::MFloat8:
4003 EltName =
"mfloat8_t";
4006 llvm_unreachable(
"unexpected Neon vector element type");
4009 const char *BaseName =
nullptr;
4011 getASTContext().getTypeSize(EltType));
4013 BaseName =
"__simd64_";
4015 assert(BitSize == 128 &&
"Neon vector type not 64 or 128 bits");
4016 BaseName =
"__simd128_";
4018 Out << strlen(BaseName) + strlen(EltName);
4019 Out << BaseName << EltName;
4022void CXXNameMangler::mangleNeonVectorType(
const DependentVectorType *T) {
4023 DiagnosticsEngine &Diags = Context.getDiags();
4025 << UnsupportedItaniumManglingKind::DependentNeonVector;
4030 case BuiltinType::SChar:
4032 case BuiltinType::Short:
4034 case BuiltinType::Int:
4036 case BuiltinType::Long:
4037 case BuiltinType::LongLong:
4039 case BuiltinType::UChar:
4041 case BuiltinType::UShort:
4043 case BuiltinType::UInt:
4045 case BuiltinType::ULong:
4046 case BuiltinType::ULongLong:
4048 case BuiltinType::Half:
4050 case BuiltinType::Float:
4052 case BuiltinType::Double:
4054 case BuiltinType::BFloat16:
4056 case BuiltinType::MFloat8:
4059 llvm_unreachable(
"Unexpected vector element base type");
4066void CXXNameMangler::mangleAArch64NeonVectorType(
const VectorType *T) {
4068 assert(EltType->
isBuiltinType() &&
"Neon vector element not a BuiltinType");
4073 assert((BitSize == 64 || BitSize == 128) &&
4074 "Neon vector type not 64 or 128 bits");
4079 case BuiltinType::UChar:
4082 case BuiltinType::UShort:
4085 case BuiltinType::ULong:
4086 case BuiltinType::ULongLong:
4090 llvm_unreachable(
"unexpected Neon polynomial vector element type");
4096 (
"__" + EltName +
"x" + Twine(T->
getNumElements()) +
"_t").str();
4099void CXXNameMangler::mangleAArch64NeonVectorType(
const DependentVectorType *T) {
4100 DiagnosticsEngine &Diags = Context.getDiags();
4102 << UnsupportedItaniumManglingKind::DependentNeonVector;
4129void CXXNameMangler::mangleAArch64FixedSveVectorType(
const VectorType *T) {
4130 assert((T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4131 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) &&
4132 "expected fixed-length SVE vector!");
4136 "expected builtin type for fixed-length SVE vector!");
4140 case BuiltinType::SChar:
4143 case BuiltinType::UChar: {
4150 case BuiltinType::Short:
4153 case BuiltinType::UShort:
4156 case BuiltinType::Int:
4159 case BuiltinType::UInt:
4162 case BuiltinType::Long:
4165 case BuiltinType::ULong:
4168 case BuiltinType::Half:
4171 case BuiltinType::Float:
4174 case BuiltinType::Double:
4177 case BuiltinType::BFloat16:
4181 llvm_unreachable(
"unexpected element type for fixed-length SVE vector!");
4184 unsigned VecSizeInBits = getASTContext().getTypeInfo(T).Width;
4186 if (T->
getVectorKind() == VectorKind::SveFixedLengthPredicate)
4189 Out <<
"9__SVE_VLSI";
4190 mangleVendorType(TypeName);
4191 Out <<
"Lj" << VecSizeInBits <<
"EE";
4194void CXXNameMangler::mangleAArch64FixedSveVectorType(
4195 const DependentVectorType *T) {
4196 DiagnosticsEngine &Diags = Context.getDiags();
4198 << UnsupportedItaniumManglingKind::DependentFixedLengthSVEVector;
4201void CXXNameMangler::mangleRISCVFixedRVVVectorType(
const VectorType *T) {
4202 assert((T->
getVectorKind() == VectorKind::RVVFixedLengthData ||
4207 "expected fixed-length RVV vector!");
4211 "expected builtin type for fixed-length RVV vector!");
4213 SmallString<20> TypeNameStr;
4214 llvm::raw_svector_ostream TypeNameOS(TypeNameStr);
4215 TypeNameOS <<
"__rvv_";
4217 case BuiltinType::SChar:
4218 TypeNameOS <<
"int8";
4220 case BuiltinType::UChar:
4222 TypeNameOS <<
"uint8";
4224 TypeNameOS <<
"bool";
4226 case BuiltinType::Short:
4227 TypeNameOS <<
"int16";
4229 case BuiltinType::UShort:
4230 TypeNameOS <<
"uint16";
4232 case BuiltinType::Int:
4233 TypeNameOS <<
"int32";
4235 case BuiltinType::UInt:
4236 TypeNameOS <<
"uint32";
4238 case BuiltinType::Long:
4239 case BuiltinType::LongLong:
4240 TypeNameOS <<
"int64";
4242 case BuiltinType::ULong:
4243 case BuiltinType::ULongLong:
4244 TypeNameOS <<
"uint64";
4246 case BuiltinType::Float16:
4247 TypeNameOS <<
"float16";
4249 case BuiltinType::Float:
4250 TypeNameOS <<
"float32";
4252 case BuiltinType::Double:
4253 TypeNameOS <<
"float64";
4255 case BuiltinType::BFloat16:
4256 TypeNameOS <<
"bfloat16";
4259 llvm_unreachable(
"unexpected element type for fixed-length RVV vector!");
4262 unsigned VecSizeInBits;
4264 case VectorKind::RVVFixedLengthMask_1:
4267 case VectorKind::RVVFixedLengthMask_2:
4270 case VectorKind::RVVFixedLengthMask_4:
4274 VecSizeInBits = getASTContext().getTypeInfo(T).Width;
4279 auto VScale = getASTContext().getTargetInfo().getVScaleRange(
4280 getASTContext().getLangOpts(),
4281 TargetInfo::ArmStreamingKind::NotStreaming);
4282 unsigned VLen = VScale->first * llvm::RISCV::RVVBitsPerBlock;
4286 if (VecSizeInBits >= VLen)
4287 TypeNameOS << (VecSizeInBits / VLen);
4289 TypeNameOS <<
'f' << (VLen / VecSizeInBits);
4291 TypeNameOS << (VLen / VecSizeInBits);
4295 Out <<
"9__RVV_VLSI";
4296 mangleVendorType(TypeNameStr);
4297 Out <<
"Lj" << VecSizeInBits <<
"EE";
4300void CXXNameMangler::mangleRISCVFixedRVVVectorType(
4301 const DependentVectorType *T) {
4302 DiagnosticsEngine &Diags = Context.getDiags();
4304 << UnsupportedItaniumManglingKind::DependentFixedLengthRVVVectorType;
4315void CXXNameMangler::mangleType(
const VectorType *T) {
4318 llvm::Triple
Target = getASTContext().getTargetInfo().getTriple();
4319 llvm::Triple::ArchType
Arch =
4320 getASTContext().getTargetInfo().getTriple().getArch();
4321 if ((
Arch == llvm::Triple::aarch64 ||
4322 Arch == llvm::Triple::aarch64_be) && !
Target.isOSDarwin())
4323 mangleAArch64NeonVectorType(T);
4325 mangleNeonVectorType(T);
4327 }
else if (T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4328 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) {
4329 mangleAArch64FixedSveVectorType(T);
4331 }
else if (T->
getVectorKind() == VectorKind::RVVFixedLengthData ||
4336 mangleRISCVFixedRVVVectorType(T);
4348void CXXNameMangler::mangleType(
const DependentVectorType *T) {
4351 llvm::Triple
Target = getASTContext().getTargetInfo().getTriple();
4352 llvm::Triple::ArchType
Arch =
4353 getASTContext().getTargetInfo().getTriple().getArch();
4354 if ((
Arch == llvm::Triple::aarch64 ||
Arch == llvm::Triple::aarch64_be) &&
4356 mangleAArch64NeonVectorType(T);
4358 mangleNeonVectorType(T);
4360 }
else if (T->
getVectorKind() == VectorKind::SveFixedLengthData ||
4361 T->
getVectorKind() == VectorKind::SveFixedLengthPredicate) {
4362 mangleAArch64FixedSveVectorType(T);
4364 }
else if (T->
getVectorKind() == VectorKind::RVVFixedLengthData) {
4365 mangleRISCVFixedRVVVectorType(T);
4380void CXXNameMangler::mangleType(
const ExtVectorType *T) {
4381 mangleType(
static_cast<const VectorType*
>(T));
4383void CXXNameMangler::mangleType(
const DependentSizedExtVectorType *T) {
4390void CXXNameMangler::mangleType(
const ConstantMatrixType *T) {
4394 mangleVendorType(
"matrix_type");
4397 auto &ASTCtx = getASTContext();
4398 unsigned BitWidth = ASTCtx.getTypeSize(ASTCtx.getSizeType());
4399 llvm::APSInt Rows(BitWidth);
4401 mangleIntegerLiteral(ASTCtx.getSizeType(), Rows);
4402 llvm::APSInt Columns(BitWidth);
4404 mangleIntegerLiteral(ASTCtx.getSizeType(), Columns);
4409void CXXNameMangler::mangleType(
const DependentSizedMatrixType *T) {
4412 mangleVendorType(
"matrix_type");
4421void CXXNameMangler::mangleType(
const DependentAddressSpaceType *T) {
4423 mangleQualifiers(split.
Quals, T);
4424 mangleType(QualType(split.
Ty, 0));
4427void CXXNameMangler::mangleType(
const PackExpansionType *T) {
4430 mangleType(T->getPattern());
4433void CXXNameMangler::mangleType(
const PackIndexingType *T) {
4436 mangleType(T->getPattern());
4437 mangleExpression(T->getIndexExpr());
4440void CXXNameMangler::mangleType(
const ObjCInterfaceType *T) {
4444void CXXNameMangler::mangleType(
const ObjCObjectType *T) {
4446 if (T->isKindOfType())
4447 Out <<
"U8__kindof";
4449 if (!T->qual_empty()) {
4451 SmallString<64> QualStr;
4452 llvm::raw_svector_ostream QualOS(QualStr);
4453 QualOS <<
"objcproto";
4454 for (
const auto *I : T->quals()) {
4455 StringRef
name = I->getName();
4458 mangleVendorQualifier(QualStr);
4461 mangleType(T->getBaseType());
4463 if (T->isSpecialized()) {
4466 for (
auto typeArg : T->getTypeArgs())
4467 mangleType(typeArg);
4472void CXXNameMangler::mangleType(
const BlockPointerType *T) {
4473 Out <<
"U13block_pointer";
4477void CXXNameMangler::mangleType(
const InjectedClassNameType *T) {
4482 T->getDecl()->getCanonicalTemplateSpecializationType(getASTContext()));
4485void CXXNameMangler::mangleType(
const TemplateSpecializationType *T) {
4486 if (TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl()) {
4487 mangleTemplateName(TD, T->template_arguments());
4490 mangleTemplatePrefix(T->getTemplateName());
4495 mangleTemplateArgs(T->getTemplateName(), T->template_arguments());
4500void CXXNameMangler::mangleType(
const DependentNameType *T) {
4511 switch (T->getKeyword()) {
4512 case ElaboratedTypeKeyword::None:
4513 case ElaboratedTypeKeyword::Typename:
4515 case ElaboratedTypeKeyword::Struct:
4516 case ElaboratedTypeKeyword::Class:
4517 case ElaboratedTypeKeyword::Interface:
4520 case ElaboratedTypeKeyword::Union:
4523 case ElaboratedTypeKeyword::Enum:
4529 manglePrefix(T->getQualifier());
4530 mangleSourceName(T->getIdentifier());
4534void CXXNameMangler::mangleType(
const TypeOfType *T) {
4540void CXXNameMangler::mangleType(
const TypeOfExprType *T) {
4546void CXXNameMangler::mangleType(
const DecltypeType *T) {
4547 Expr *E = T->getUnderlyingExpr();
4566 mangleExpression(E);
4570void CXXNameMangler::mangleType(
const UnaryTransformType *T) {
4573 if (T->isDependentType()) {
4574 StringRef BuiltinName;
4575 switch (T->getUTTKind()) {
4576#define TRANSFORM_TYPE_TRAIT_DEF(Enum, Trait) \
4577 case UnaryTransformType::Enum: \
4578 BuiltinName = "__" #Trait; \
4580#include "clang/Basic/TransformTypeTraits.def"
4582 mangleVendorType(BuiltinName);
4586 mangleType(T->getBaseType());
4590void CXXNameMangler::mangleType(
const AutoType *T) {
4591 assert(T->getDeducedType().isNull() &&
4592 "Deduced AutoType shouldn't be handled here!");
4593 assert(T->getKeyword() != AutoTypeKeyword::GNUAutoType &&
4594 "shouldn't need to mangle __auto_type!");
4599 if (T->isConstrained() && !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
4600 Out << (T->isDecltypeAuto() ?
"DK" :
"Dk");
4601 mangleTypeConstraint(T->getTypeConstraintConcept(),
4602 T->getTypeConstraintArguments());
4604 Out << (T->isDecltypeAuto() ?
"Dc" :
"Da");
4608void CXXNameMangler::mangleType(
const DeducedTemplateSpecializationType *T) {
4609 QualType
Deduced = T->getDeducedType();
4615 "shouldn't form deduced TST unless we know we have a template");
4619void CXXNameMangler::mangleType(
const AtomicType *T) {
4626void CXXNameMangler::mangleType(
const PipeType *T) {
4633void CXXNameMangler::mangleType(
const OverflowBehaviorType *T) {
4636 if (T->isWrapKind()) {
4637 Out <<
"U8ObtWrap_";
4639 Out <<
"U8ObtTrap_";
4641 mangleType(T->getUnderlyingType());
4644void CXXNameMangler::mangleType(
const BitIntType *T) {
4651void CXXNameMangler::mangleType(
const DependentBitIntType *T) {
4660void CXXNameMangler::mangleType(
const ArrayParameterType *T) {
4664void CXXNameMangler::mangleType(
const HLSLAttributedResourceType *T) {
4665 llvm::SmallString<64> Str(
"_Res");
4666 const HLSLAttributedResourceType::Attributes &Attrs = T->getAttrs();
4668 switch (Attrs.ResourceClass) {
4669 case llvm::dxil::ResourceClass::UAV:
4672 case llvm::dxil::ResourceClass::SRV:
4675 case llvm::dxil::ResourceClass::CBuffer:
4678 case llvm::dxil::ResourceClass::Sampler:
4684 if (Attrs.RawBuffer)
4686 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 QualType ParamType = SNTTPE->getParameterType(Context.getASTContext());
5153 assert(CE->hasAPValueResult() &&
"expected the NTTP to have an APValue");
5154 mangleValueInTemplateArg(ParamType, 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.enterResultType();
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) {
6023 assert(parmDepth < FunctionTypeDepth.getDepth());
6024 unsigned nestingDepth = FunctionTypeDepth.getDepth() - parmDepth;
6025 if (FunctionTypeDepth.isInResultType())
6028 if (nestingDepth == 0) {
6031 Out <<
"fL" << (nestingDepth - 1) <<
'p';
6039 &&
"parameter's type is still an array type?");
6041 if (
const DependentAddressSpaceType *DAST =
6042 dyn_cast<DependentAddressSpaceType>(parm->
getType())) {
6049 if (parmIndex != 0) {
6050 Out << (parmIndex - 1);
6055void CXXNameMangler::mangleCXXCtorType(
CXXCtorType T,
6056 const CXXRecordDecl *InheritedFrom) {
6083 llvm_unreachable(
"closure constructors don't exist for the Itanium ABI!");
6086 mangleName(InheritedFrom);
6089void CXXNameMangler::mangleCXXDtorType(
CXXDtorType T) {
6114 llvm_unreachable(
"Itanium ABI does not use vector deleting dtors");
6118void CXXNameMangler::mangleReferenceToPack(
const NamedDecl *Pack) {
6119 if (
const auto *TTP = dyn_cast<TemplateTypeParmDecl>(Pack))
6120 mangleTemplateParameter(TTP->getDepth(), TTP->getIndex());
6121 else if (
const auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Pack))
6122 mangleTemplateParameter(NTTP->getDepth(), NTTP->getIndex());
6123 else if (
const auto *TempTP = dyn_cast<TemplateTemplateParmDecl>(Pack))
6124 mangleTemplateParameter(TempTP->getDepth(), TempTP->getIndex());
6158 if (
auto *FTD = dyn_cast_or_null<FunctionTemplateDecl>(
ResolvedTemplate)) {
6159 auto *RD = dyn_cast<CXXRecordDecl>(FTD->getDeclContext());
6160 if (!RD || !RD->isGenericLambda())
6176 if (
auto *TTP = dyn_cast<TemplateTypeParmDecl>(Param))
6177 return TTP->hasTypeConstraint();
6194 if (
auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param))
6195 return NTTP->getType()->isInstantiationDependentType() ||
6196 NTTP->getType()->getContainedDeducedType();
6203 "A DeducedTemplateName shouldn't escape partial ordering");
6214 auto MangleTemplateParamListToString =
6216 unsigned DepthOffset) {
6217 llvm::raw_svector_ostream Stream(Buffer);
6218 CXXNameMangler(
Mangler.Context, Stream,
6219 WithTemplateDepthOffset{DepthOffset})
6220 .mangleTemplateParameterList(Params);
6223 MangleTemplateParamListToString(ParamTemplateHead,
6224 TTP->getTemplateParameters(), 0);
6228 MangleTemplateParamListToString(ArgTemplateHead,
6230 TTP->getTemplateParameters()->
getDepth());
6231 return ParamTemplateHead != ArgTemplateHead;
6241 return {
true,
nullptr};
6246 assert(ParamIdx < ResolvedTemplate->getTemplateParameters()->size() &&
6247 "no parameter for argument");
6268 return {
true,
nullptr};
6283 auto *NTTP = dyn_cast<NonTypeTemplateParmDecl>(Param);
6284 bool NeedExactType = NTTP && NTTP->getType()->getContainedDeducedType();
6285 return {NeedExactType,
nullptr};
6297void CXXNameMangler::mangleTemplateArgs(
TemplateName TN,
6299 unsigned NumTemplateArgs) {
6302 TemplateArgManglingInfo Info(*
this, TN);
6303 for (
unsigned i = 0; i != NumTemplateArgs; ++i) {
6304 mangleTemplateArg(Info, i, TemplateArgs[i].
getArgument());
6306 mangleRequiresClause(Info.getTrailingRequiresClauseToMangle());
6310void CXXNameMangler::mangleTemplateArgs(
TemplateName TN,
6311 const TemplateArgumentList &AL) {
6314 TemplateArgManglingInfo Info(*
this, TN);
6315 for (
unsigned i = 0, e = AL.
size(); i != e; ++i) {
6316 mangleTemplateArg(Info, i, AL[i]);
6318 mangleRequiresClause(Info.getTrailingRequiresClauseToMangle());
6322void CXXNameMangler::mangleTemplateArgs(
TemplateName TN,
6323 ArrayRef<TemplateArgument> Args) {
6326 TemplateArgManglingInfo Info(*
this, TN);
6327 for (
unsigned i = 0; i != Args.size(); ++i) {
6328 mangleTemplateArg(Info, i, Args[i]);
6330 mangleRequiresClause(Info.getTrailingRequiresClauseToMangle());
6334void CXXNameMangler::mangleTemplateArg(TemplateArgManglingInfo &Info,
6335 unsigned Index, TemplateArgument A) {
6336 TemplateArgManglingInfo::Info ArgInfo = Info.getArgInfo(Index, A);
6339 if (ArgInfo.TemplateParameterToMangle &&
6340 !isCompatibleWith(LangOptions::ClangABI::Ver17)) {
6347 mangleTemplateParamDecl(ArgInfo.TemplateParameterToMangle);
6350 mangleTemplateArg(A, ArgInfo.NeedExactType);
6353void CXXNameMangler::mangleTemplateArg(TemplateArgument A,
bool NeedExactType) {
6363 llvm_unreachable(
"Cannot mangle NULL template argument");
6391 mangleValueInTemplateArg(TPO->getType().getUnqualifiedType(),
6392 TPO->getValue(),
true,
6397 ASTContext &Ctx = Context.getASTContext();
6405 !isCompatibleWith(LangOptions::ClangABI::Ver11))
6413 ArrayRef<APValue::LValuePathEntry>(),
6426 true, NeedExactType);
6432 mangleTemplateArg(P, NeedExactType);
6438void CXXNameMangler::mangleTemplateArgExpr(
const Expr *E) {
6439 if (!isCompatibleWith(LangOptions::ClangABI::Ver11)) {
6440 mangleExpression(E, UnknownArity,
true);
6455 if (
const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) {
6456 const ValueDecl *D = DRE->getDecl();
6465 mangleExpression(E);
6478 switch (
V.getKind()) {
6486 assert(RD &&
"unexpected type for record value");
6495 if (!FD->isUnnamedBitField() &&
6505 assert(RD &&
"unexpected type for union value");
6508 if (!FD->isUnnamedBitField())
6518 QualType ElemT(T->getArrayElementTypeNoTypeQual(), 0);
6519 for (
unsigned I = 0, N =
V.getArrayInitializedElts(); I != N; ++I)
6527 for (
unsigned I = 0, N =
V.getVectorLength(); I != N; ++I)
6534 llvm_unreachable(
"Matrix APValues not yet supported");
6540 return V.getFloat().isPosZero();
6543 return !
V.getFixedPoint().getValue();
6546 return V.getComplexFloatReal().isPosZero() &&
6547 V.getComplexFloatImag().isPosZero();
6550 return !
V.getComplexIntReal() && !
V.getComplexIntImag();
6553 return V.isNullPointer();
6556 return !
V.getMemberPointerDecl();
6559 llvm_unreachable(
"Unhandled APValue::ValueKind enum");
6566 T = AT->getElementType();
6568 dyn_cast<FieldDecl>(E.getAsBaseOrMember().getPointer()))
6611 Diags.
Report(UnionLoc, diag::err_unsupported_itanium_mangling)
6612 << UnsupportedItaniumManglingKind::UnnamedUnionNTTP;
6617void CXXNameMangler::mangleValueInTemplateArg(QualType T,
const APValue &
V,
6619 bool NeedExactType) {
6622 T = getASTContext().getUnqualifiedArrayType(T, Quals);
6625 bool IsPrimaryExpr =
true;
6626 auto NotPrimaryExpr = [&] {
6627 if (TopLevel && IsPrimaryExpr)
6629 IsPrimaryExpr =
false;
6633 switch (
V.getKind()) {
6642 llvm_unreachable(
"unexpected value kind in template argument");
6646 assert(RD &&
"unexpected type for record value");
6649 llvm::SmallVector<const FieldDecl *, 16> Fields(RD->
fields());
6652 (Fields.back()->isUnnamedBitField() ||
6654 V.getStructField(Fields.back()->getFieldIndex())))) {
6658 if (Fields.empty()) {
6659 while (!Bases.empty() &&
6661 V.getStructBase(Bases.size() - 1)))
6662 Bases = Bases.drop_back();
6669 for (
unsigned I = 0, N = Bases.size(); I != N; ++I)
6670 mangleValueInTemplateArg(Bases[I].
getType(),
V.getStructBase(I),
false);
6671 for (
unsigned I = 0, N = Fields.size(); I != N; ++I) {
6672 if (Fields[I]->isUnnamedBitField())
6674 mangleValueInTemplateArg(Fields[I]->
getType(),
6675 V.getStructField(Fields[I]->getFieldIndex()),
6684 const FieldDecl *FD =
V.getUnionField();
6702 mangleSourceName(II);
6703 mangleValueInTemplateArg(FD->
getType(),
V.getUnionValue(),
false);
6717 unsigned N =
V.getArraySize();
6719 N =
V.getArrayInitializedElts();
6724 for (
unsigned I = 0; I != N; ++I) {
6725 const APValue &Elem = I <
V.getArrayInitializedElts()
6726 ?
V.getArrayInitializedElt(I)
6727 :
V.getArrayFiller();
6728 mangleValueInTemplateArg(ElemT, Elem,
false);
6735 const VectorType *VT = T->
castAs<VectorType>();
6740 unsigned N =
V.getVectorLength();
6743 for (
unsigned I = 0; I != N; ++I)
6744 mangleValueInTemplateArg(VT->
getElementType(),
V.getVectorElt(I),
false);
6750 llvm_unreachable(
"Matrix template argument mangling not yet supported");
6753 mangleIntegerLiteral(T,
V.getInt());
6757 mangleFloatLiteral(T,
V.getFloat());
6761 mangleFixedPointLiteral();
6765 const ComplexType *CT = T->
castAs<ComplexType>();
6769 if (!
V.getComplexFloatReal().isPosZero() ||
6770 !
V.getComplexFloatImag().isPosZero())
6772 if (!
V.getComplexFloatImag().isPosZero())
6779 const ComplexType *CT = T->
castAs<ComplexType>();
6783 if (
V.getComplexIntReal().getBoolValue() ||
6784 V.getComplexIntImag().getBoolValue())
6786 if (
V.getComplexIntImag().getBoolValue())
6795 "unexpected type for LValue template arg");
6797 if (
V.isNullPointer()) {
6798 mangleNullPointer(T);
6802 APValue::LValueBase B =
V.getLValueBase();
6806 CharUnits Offset =
V.getLValueOffset();
6824 ASTContext &Ctx = Context.getASTContext();
6827 if (!
V.hasLValuePath()) {
6843 bool IsArrayToPointerDecayMangledAsDecl =
false;
6844 if (TopLevel && Ctx.
getLangOpts().getClangABICompat() <=
6845 LangOptions::ClangABI::Ver11) {
6847 IsArrayToPointerDecayMangledAsDecl =
6848 BType->
isArrayType() &&
V.getLValuePath().size() == 1 &&
6849 V.getLValuePath()[0].getAsArrayIndex() == 0 &&
6853 if ((!
V.getLValuePath().empty() ||
V.isLValueOnePastTheEnd()) &&
6854 !IsArrayToPointerDecayMangledAsDecl) {
6871 if (NeedExactType &&
6873 !isCompatibleWith(LangOptions::ClangABI::Ver11)) {
6886 QualType TypeSoFar = B.
getType();
6887 if (
auto *VD = B.
dyn_cast<
const ValueDecl*>()) {
6891 }
else if (
auto *E = B.
dyn_cast<
const Expr*>()) {
6893 mangleExpression(E);
6894 }
else if (
auto TI = B.
dyn_cast<TypeInfoLValue>()) {
6897 mangleType(QualType(TI.getType(), 0));
6900 llvm_unreachable(
"unexpected lvalue base kind in template argument");
6910 mangleNumber(
V.getLValueOffset().getQuantity());
6917 if (!
V.getLValueOffset().isZero())
6918 mangleNumber(
V.getLValueOffset().getQuantity());
6922 bool OnePastTheEnd =
V.isLValueOnePastTheEnd();
6924 for (APValue::LValuePathEntry E :
V.getLValuePath()) {
6926 if (
auto *CAT = dyn_cast<ConstantArrayType>(AT))
6927 OnePastTheEnd |= CAT->getSize() == E.getAsArrayIndex();
6928 TypeSoFar = AT->getElementType();
6930 const Decl *D = E.getAsBaseOrMember().getPointer();
6931 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
6956 if (!
V.getMemberPointerDecl()) {
6957 mangleNullPointer(T);
6961 ASTContext &Ctx = Context.getASTContext();
6964 if (!
V.getMemberPointerPath().empty()) {
6967 }
else if (NeedExactType &&
6969 T->
castAs<MemberPointerType>()->getPointeeType(),
6970 V.getMemberPointerDecl()->getType()) &&
6971 !isCompatibleWith(LangOptions::ClangABI::Ver11)) {
6976 mangle(
V.getMemberPointerDecl());
6978 if (!
V.getMemberPointerPath().empty()) {
6988 if (TopLevel && !IsPrimaryExpr)
6992void CXXNameMangler::mangleTemplateParameter(
unsigned Depth,
unsigned Index) {
7002 Depth += TemplateDepthOffset;
7004 Out <<
'L' << (Depth - 1) <<
'_';
7010void CXXNameMangler::mangleSeqID(
unsigned SeqID) {
7013 }
else if (SeqID == 1) {
7020 MutableArrayRef<char> BufferRef(Buffer);
7021 MutableArrayRef<char>::reverse_iterator I = BufferRef.rbegin();
7023 for (; SeqID != 0; SeqID /= 36) {
7024 unsigned C = SeqID % 36;
7025 *I++ = (
C < 10 ?
'0' +
C :
'A' +
C - 10);
7028 Out.write(I.base(), I - BufferRef.rbegin());
7033void CXXNameMangler::mangleExistingSubstitution(
TemplateName tname) {
7034 bool result = mangleSubstitution(tname);
7035 assert(result &&
"no existing substitution for template name");
7041bool CXXNameMangler::mangleSubstitution(
const NamedDecl *ND) {
7043 if (mangleStandardSubstitution(ND))
7047 return mangleSubstitution(
reinterpret_cast<uintptr_t>(ND));
7057bool CXXNameMangler::mangleSubstitution(QualType T) {
7060 return mangleSubstitution(RD);
7065 return mangleSubstitution(TypePtr);
7069 if (TemplateDecl *TD =
Template.getAsTemplateDecl())
7070 return mangleSubstitution(TD);
7073 return mangleSubstitution(
7077bool CXXNameMangler::mangleSubstitution(
uintptr_t Ptr) {
7078 llvm::DenseMap<uintptr_t, unsigned>::iterator I = Substitutions.find(Ptr);
7079 if (I == Substitutions.end())
7082 unsigned SeqID = I->second;
7091bool CXXNameMangler::isSpecializedAs(QualType S, llvm::StringRef Name,
7100 const auto *SD = dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
7101 if (!SD || !SD->getIdentifier()->isStr(Name))
7104 if (!isStdNamespace(Context.getEffectiveDeclContext(SD)))
7107 const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs();
7108 if (TemplateArgs.
size() != 1)
7111 if (TemplateArgs[0].getAsType() != A)
7114 if (SD->getSpecializedTemplate()->getOwningModuleForLinkage())
7123bool CXXNameMangler::isStdCharSpecialization(
7124 const ClassTemplateSpecializationDecl *SD, llvm::StringRef Name,
7125 bool HasAllocator) {
7130 if (TemplateArgs.
size() != (HasAllocator ? 3 : 2))
7133 QualType A = TemplateArgs[0].getAsType();
7141 if (!isSpecializedAs(TemplateArgs[1].getAsType(),
"char_traits", A))
7145 !isSpecializedAs(TemplateArgs[2].getAsType(),
"allocator", A))
7154bool CXXNameMangler::mangleStandardSubstitution(
const NamedDecl *ND) {
7156 if (
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
7164 if (
const ClassTemplateDecl *TD = dyn_cast<ClassTemplateDecl>(ND)) {
7165 if (!isStdNamespace(Context.getEffectiveDeclContext(TD)))
7185 if (
const ClassTemplateSpecializationDecl *SD =
7186 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
7187 if (!isStdNamespace(Context.getEffectiveDeclContext(SD)))
7196 if (isStdCharSpecialization(SD,
"basic_string",
true)) {
7203 if (isStdCharSpecialization(SD,
"basic_istream",
false)) {
7210 if (isStdCharSpecialization(SD,
"basic_ostream",
false)) {
7217 if (isStdCharSpecialization(SD,
"basic_iostream",
false)) {
7227void CXXNameMangler::addSubstitution(QualType T) {
7230 addSubstitution(RD);
7236 addSubstitution(TypePtr);
7240 if (TemplateDecl *TD =
Template.getAsTemplateDecl())
7241 return addSubstitution(TD);
7247void CXXNameMangler::addSubstitution(
uintptr_t Ptr) {
7248 assert(!Substitutions.count(Ptr) &&
"Substitution already exists!");
7249 Substitutions[Ptr] = SeqID++;
7252void CXXNameMangler::extendSubstitutions(CXXNameMangler*
Other) {
7253 assert(
Other->SeqID >= SeqID &&
"Must be superset of substitutions!");
7254 if (
Other->SeqID > SeqID) {
7255 Substitutions.swap(
Other->Substitutions);
7256 SeqID =
Other->SeqID;
7260CXXNameMangler::AbiTagList
7261CXXNameMangler::makeFunctionReturnTypeTags(
const FunctionDecl *FD) {
7263 if (DisableDerivedAbiTags)
7264 return AbiTagList();
7266 llvm::raw_null_ostream NullOutStream;
7267 CXXNameMangler TrackReturnTypeTags(*
this, NullOutStream);
7268 TrackReturnTypeTags.disableDerivedAbiTags();
7270 const FunctionProtoType *Proto =
7272 FunctionTypeDepthState saved = TrackReturnTypeTags.FunctionTypeDepth.push();
7273 TrackReturnTypeTags.FunctionTypeDepth.enterResultType();
7275 TrackReturnTypeTags.FunctionTypeDepth.leaveResultType();
7276 TrackReturnTypeTags.FunctionTypeDepth.pop(saved);
7278 return TrackReturnTypeTags.AbiTagsRoot.getSortedUniqueUsedAbiTags();
7281CXXNameMangler::AbiTagList
7282CXXNameMangler::makeVariableTypeTags(
const VarDecl *VD) {
7284 if (DisableDerivedAbiTags)
7285 return AbiTagList();
7287 llvm::raw_null_ostream NullOutStream;
7288 CXXNameMangler TrackVariableType(*
this, NullOutStream);
7289 TrackVariableType.disableDerivedAbiTags();
7291 TrackVariableType.mangleType(VD->
getType());
7293 return TrackVariableType.AbiTagsRoot.getSortedUniqueUsedAbiTags();
7296bool CXXNameMangler::shouldHaveAbiTags(ItaniumMangleContextImpl &
C,
7297 const VarDecl *VD) {
7298 llvm::raw_null_ostream NullOutStream;
7299 CXXNameMangler TrackAbiTags(
C, NullOutStream,
nullptr,
true);
7300 TrackAbiTags.mangle(VD);
7301 return TrackAbiTags.AbiTagsRoot.getUsedAbiTags().size();
7306void ItaniumMangleContextImpl::mangleCXXName(GlobalDecl GD,
7310 "Invalid mangleName() call, argument is not a variable or function!");
7312 PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
7313 getASTContext().getSourceManager(),
7314 "Mangling declaration");
7316 if (
auto *CD = dyn_cast<CXXConstructorDecl>(D)) {
7318 CXXNameMangler Mangler(*
this, Out, CD,
Type);
7319 return Mangler.mangle(GlobalDecl(CD,
Type));
7322 if (
auto *DD = dyn_cast<CXXDestructorDecl>(D)) {
7324 CXXNameMangler Mangler(*
this, Out, DD,
Type);
7325 return Mangler.mangle(GlobalDecl(DD,
Type));
7328 CXXNameMangler Mangler(*
this, Out, D);
7332void ItaniumMangleContextImpl::mangleCXXCtorComdat(
const CXXConstructorDecl *D,
7334 CXXNameMangler Mangler(*
this, Out, D,
Ctor_Comdat);
7338void ItaniumMangleContextImpl::mangleCXXDtorComdat(
const CXXDestructorDecl *D,
7340 CXXNameMangler Mangler(*
this, Out, D,
Dtor_Comdat);
7362 auto &LangOpts = Context.getLangOpts();
7365 Context.baseForVTableAuthentication(ThisRD);
7366 unsigned TypedDiscriminator =
7367 Context.getPointerAuthVTablePointerDiscriminator(ThisRD);
7368 Mangler.mangleVendorQualifier(
"__vtptrauth");
7369 auto &ManglerStream = Mangler.getStream();
7370 ManglerStream <<
"I";
7371 if (
const auto *ExplicitAuth =
7372 PtrauthClassRD->
getAttr<VTablePointerAuthenticationAttr>()) {
7373 ManglerStream <<
"Lj" << ExplicitAuth->getKey();
7375 if (ExplicitAuth->getAddressDiscrimination() ==
7376 VTablePointerAuthenticationAttr::DefaultAddressDiscrimination)
7377 ManglerStream <<
"Lb" << LangOpts.PointerAuthVTPtrAddressDiscrimination;
7379 ManglerStream <<
"Lb"
7380 << (ExplicitAuth->getAddressDiscrimination() ==
7381 VTablePointerAuthenticationAttr::AddressDiscrimination);
7383 switch (ExplicitAuth->getExtraDiscrimination()) {
7384 case VTablePointerAuthenticationAttr::DefaultExtraDiscrimination: {
7385 if (LangOpts.PointerAuthVTPtrTypeDiscrimination)
7386 ManglerStream <<
"Lj" << TypedDiscriminator;
7388 ManglerStream <<
"Lj" << 0;
7391 case VTablePointerAuthenticationAttr::TypeDiscrimination:
7392 ManglerStream <<
"Lj" << TypedDiscriminator;
7394 case VTablePointerAuthenticationAttr::CustomDiscrimination:
7395 ManglerStream <<
"Lj" << ExplicitAuth->getCustomDiscriminationValue();
7397 case VTablePointerAuthenticationAttr::NoExtraDiscrimination:
7398 ManglerStream <<
"Lj" << 0;
7402 ManglerStream <<
"Lj"
7403 << (
unsigned)VTablePointerAuthenticationAttr::DefaultKey;
7404 ManglerStream <<
"Lb" << LangOpts.PointerAuthVTPtrAddressDiscrimination;
7405 if (LangOpts.PointerAuthVTPtrTypeDiscrimination)
7406 ManglerStream <<
"Lj" << TypedDiscriminator;
7408 ManglerStream <<
"Lj" << 0;
7410 ManglerStream <<
"E";
7413void ItaniumMangleContextImpl::mangleThunk(
const CXXMethodDecl *MD,
7414 const ThunkInfo &Thunk,
7415 bool ElideOverrideInfo,
7425 "Use mangleCXXDtor for destructor decls!");
7426 CXXNameMangler Mangler(*
this, Out);
7427 Mangler.getStream() <<
"_ZT";
7429 Mangler.getStream() <<
'c';
7440 Mangler.mangleFunctionEncoding(MD);
7441 if (!ElideOverrideInfo)
7445void ItaniumMangleContextImpl::mangleCXXDtorThunk(
const CXXDestructorDecl *DD,
7447 const ThunkInfo &Thunk,
7448 bool ElideOverrideInfo,
7452 CXXNameMangler Mangler(*
this, Out, DD,
Type);
7453 Mangler.getStream() <<
"_ZT";
7455 auto &ThisAdjustment = Thunk.
This;
7457 Mangler.mangleCallOffset(ThisAdjustment.NonVirtual,
7458 ThisAdjustment.Virtual.Itanium.VCallOffsetOffset);
7460 Mangler.mangleFunctionEncoding(GlobalDecl(DD,
Type));
7461 if (!ElideOverrideInfo)
7466void ItaniumMangleContextImpl::mangleStaticGuardVariable(
const VarDecl *D,
7470 CXXNameMangler Mangler(*
this, Out);
7473 Mangler.getStream() <<
"_ZGV";
7474 Mangler.mangleName(D);
7477void ItaniumMangleContextImpl::mangleDynamicInitializer(
const VarDecl *MD,
7482 Out <<
"__cxx_global_var_init";
7485void ItaniumMangleContextImpl::mangleDynamicAtExitDestructor(
const VarDecl *D,
7488 CXXNameMangler Mangler(*
this, Out);
7489 Mangler.getStream() <<
"__dtor_";
7490 if (shouldMangleDeclName(D))
7493 Mangler.getStream() << D->
getName();
7496void ItaniumMangleContextImpl::mangleDynamicStermFinalizer(
const VarDecl *D,
7500 CXXNameMangler Mangler(*
this, Out);
7501 Mangler.getStream() <<
"__finalize_";
7502 if (shouldMangleDeclName(D))
7505 Mangler.getStream() << D->
getName();
7508void ItaniumMangleContextImpl::mangleSEHFilterExpression(
7509 GlobalDecl EnclosingDecl, raw_ostream &Out) {
7510 CXXNameMangler Mangler(*
this, Out);
7511 Mangler.getStream() <<
"__filt_";
7513 if (shouldMangleDeclName(EnclosingFD))
7514 Mangler.mangle(EnclosingDecl);
7516 Mangler.getStream() << EnclosingFD->getName();
7519void ItaniumMangleContextImpl::mangleSEHFinallyBlock(
7520 GlobalDecl EnclosingDecl, raw_ostream &Out) {
7521 CXXNameMangler Mangler(*
this, Out);
7522 Mangler.getStream() <<
"__fin_";
7524 if (shouldMangleDeclName(EnclosingFD))
7525 Mangler.mangle(EnclosingDecl);
7527 Mangler.getStream() << EnclosingFD->getName();
7530void ItaniumMangleContextImpl::mangleItaniumThreadLocalInit(
const VarDecl *D,
7533 CXXNameMangler Mangler(*
this, Out);
7534 Mangler.getStream() <<
"_ZTH";
7535 Mangler.mangleName(D);
7539ItaniumMangleContextImpl::mangleItaniumThreadLocalWrapper(
const VarDecl *D,
7542 CXXNameMangler Mangler(*
this, Out);
7543 Mangler.getStream() <<
"_ZTW";
7544 Mangler.mangleName(D);
7547void ItaniumMangleContextImpl::mangleReferenceTemporary(
const VarDecl *D,
7548 unsigned ManglingNumber,
7552 CXXNameMangler Mangler(*
this, Out);
7553 Mangler.getStream() <<
"_ZGR";
7554 Mangler.mangleName(D);
7555 assert(ManglingNumber > 0 &&
"Reference temporary mangling number is zero!");
7556 Mangler.mangleSeqID(ManglingNumber - 1);
7559void ItaniumMangleContextImpl::mangleCXXVTable(
const CXXRecordDecl *RD,
7562 CXXNameMangler Mangler(*
this, Out);
7563 Mangler.getStream() <<
"_ZTV";
7564 Mangler.mangleCXXRecordDecl(RD);
7567void ItaniumMangleContextImpl::mangleCXXVTT(
const CXXRecordDecl *RD,
7570 CXXNameMangler Mangler(*
this, Out);
7571 Mangler.getStream() <<
"_ZTT";
7572 Mangler.mangleCXXRecordDecl(RD);
7575void ItaniumMangleContextImpl::mangleCXXCtorVTable(
const CXXRecordDecl *RD,
7577 const CXXRecordDecl *
Type,
7580 CXXNameMangler Mangler(*
this, Out);
7581 Mangler.getStream() <<
"_ZTC";
7584 bool SuppressSubstitution =
7585 getASTContext().getLangOpts().getClangABICompat() <=
7586 LangOptions::ClangABI::Ver19;
7587 Mangler.mangleCXXRecordDecl(RD, SuppressSubstitution);
7588 Mangler.getStream() << Offset;
7589 Mangler.getStream() <<
'_';
7590 Mangler.mangleCXXRecordDecl(
Type);
7593void ItaniumMangleContextImpl::mangleCXXRTTI(QualType Ty, raw_ostream &Out) {
7595 assert(!Ty.
hasQualifiers() &&
"RTTI info cannot have top-level qualifiers");
7596 CXXNameMangler Mangler(*
this, Out);
7597 Mangler.getStream() <<
"_ZTI";
7598 Mangler.mangleType(Ty);
7601void ItaniumMangleContextImpl::mangleCXXRTTIName(
7602 QualType Ty, raw_ostream &Out,
bool NormalizeIntegers =
false) {
7604 CXXNameMangler Mangler(*
this, Out, NormalizeIntegers);
7605 Mangler.getStream() <<
"_ZTS";
7606 Mangler.mangleType(Ty);
7609void ItaniumMangleContextImpl::mangleCanonicalTypeName(
7610 QualType Ty, raw_ostream &Out,
bool NormalizeIntegers =
false) {
7611 mangleCXXRTTIName(Ty, Out, NormalizeIntegers);
7614void ItaniumMangleContextImpl::mangleStringLiteral(
const StringLiteral *, raw_ostream &) {
7615 llvm_unreachable(
"Can't mangle string literals");
7618void ItaniumMangleContextImpl::mangleLambdaSig(
const CXXRecordDecl *Lambda,
7620 CXXNameMangler Mangler(*
this, Out);
7621 Mangler.mangleLambdaSig(Lambda);
7624void ItaniumMangleContextImpl::mangleModuleInitializer(
const Module *M,
7627 CXXNameMangler Mangler(*
this, Out);
7628 Mangler.getStream() <<
"_ZGI";
7632 auto Partition = M->
Name.find(
':');
7633 Mangler.mangleModuleNamePrefix(
7634 StringRef(&M->
Name[Partition + 1], M->
Name.size() - Partition - 1),
7642 return new ItaniumMangleContextImpl(
7645 return std::nullopt;
7654 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.
static DeclT * getDefinitionOrSelf(DeclT *D)
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
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.