33#include "llvm/ADT/SmallVector.h"
34#include "llvm/ADT/StringExtras.h"
35#include "llvm/Support/CRC.h"
36#include "llvm/Support/MD5.h"
37#include "llvm/Support/StringSaver.h"
38#include "llvm/Support/xxhash.h"
49 if (
auto *CD = dyn_cast<CXXConstructorDecl>(DC))
51 else if (
auto *DD = dyn_cast<CXXDestructorDecl>(DC))
58struct msvc_hashing_ostream :
public llvm::raw_svector_ostream {
61 llvm::SmallString<64> Buffer;
63 msvc_hashing_ostream(raw_ostream &OS,
size_t Threshold = 4096)
64 : llvm::raw_svector_ostream(Buffer), OS(OS), Threshold(Threshold) {}
65 ~msvc_hashing_ostream()
override {
66 StringRef MangledName = str();
67 bool StartsWithEscape = MangledName.starts_with(
"\01");
69 MangledName = MangledName.drop_front(1);
70 if (MangledName.size() < Threshold) {
76 llvm::MD5::MD5Result Hash;
77 Hasher.update(MangledName);
80 SmallString<32> HexString;
81 llvm::MD5::stringifyResult(Hash, HexString);
85 OS <<
"??@" << HexString <<
'@';
90getLambdaDefaultArgumentDeclContext(
const Decl *D) {
91 if (
const auto *RD = dyn_cast<CXXRecordDecl>(D))
93 if (
const auto *Parm =
94 dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl()))
95 return Parm->getDeclContext();
108 if (
const auto *LDADC = getLambdaDefaultArgumentDeclContext(D))
112 if (
const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
114 dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl()))
115 return ContextParam->getDeclContext();
121 return getEffectiveDeclContext(
cast<Decl>(DC));
128 if (
const auto *FTD = dyn_cast<FunctionTemplateDecl>(ND))
132 if (
const auto *FTD = FD->getPrimaryTemplate())
133 return FTD->getTemplatedDecl()->getCanonicalDecl();
135 return FD->getCanonicalDecl();
141 typedef std::pair<const DeclContext *, IdentifierInfo *> DiscriminatorKeyTy;
142 llvm::DenseMap<DiscriminatorKeyTy, unsigned> Discriminator;
143 llvm::DenseMap<const NamedDecl *, unsigned> Uniquifier;
144 llvm::DenseMap<const CXXRecordDecl *, unsigned> LambdaIds;
145 llvm::DenseMap<GlobalDecl, unsigned> SEHFilterIds;
146 llvm::DenseMap<GlobalDecl, unsigned> SEHFinallyIds;
147 SmallString<16> AnonymousNamespaceHash;
150 MicrosoftMangleContextImpl(ASTContext &Context, DiagnosticsEngine &Diags,
152 bool shouldMangleCXXName(
const NamedDecl *D)
override;
153 bool shouldMangleStringLiteral(
const StringLiteral *SL)
override;
154 void mangleCXXName(GlobalDecl GD, raw_ostream &Out)
override;
155 void mangleVirtualMemPtrThunk(
const CXXMethodDecl *MD,
156 const MethodVFTableLocation &ML,
157 raw_ostream &Out)
override;
158 void mangleThunk(
const CXXMethodDecl *MD,
const ThunkInfo &Thunk,
159 bool ElideOverrideInfo, raw_ostream &)
override;
161 const ThunkInfo &Thunk,
bool ElideOverrideInfo,
162 raw_ostream &)
override;
163 void mangleCXXVFTable(
const CXXRecordDecl *Derived,
164 ArrayRef<const CXXRecordDecl *> BasePath,
165 raw_ostream &Out)
override;
166 void mangleCXXVBTable(
const CXXRecordDecl *Derived,
167 ArrayRef<const CXXRecordDecl *> BasePath,
168 raw_ostream &Out)
override;
170 void mangleCXXVTable(
const CXXRecordDecl *, raw_ostream &)
override;
171 void mangleCXXVirtualDisplacementMap(
const CXXRecordDecl *SrcRD,
172 const CXXRecordDecl *DstRD,
173 raw_ostream &Out)
override;
174 void mangleCXXThrowInfo(QualType
T,
bool IsConst,
bool IsVolatile,
175 bool IsUnaligned,
uint32_t NumEntries,
176 raw_ostream &Out)
override;
177 void mangleCXXCatchableTypeArray(QualType
T,
uint32_t NumEntries,
178 raw_ostream &Out)
override;
179 void mangleCXXCatchableType(QualType
T,
const CXXConstructorDecl *CD,
182 raw_ostream &Out)
override;
183 void mangleCXXRTTI(QualType
T, raw_ostream &Out)
override;
184 void mangleCXXRTTIName(QualType
T, raw_ostream &Out,
185 bool NormalizeIntegers)
override;
186 void mangleCXXRTTIBaseClassDescriptor(
const CXXRecordDecl *Derived,
189 raw_ostream &Out)
override;
190 void mangleCXXRTTIBaseClassArray(
const CXXRecordDecl *Derived,
191 raw_ostream &Out)
override;
192 void mangleCXXRTTIClassHierarchyDescriptor(
const CXXRecordDecl *Derived,
193 raw_ostream &Out)
override;
195 mangleCXXRTTICompleteObjectLocator(
const CXXRecordDecl *Derived,
196 ArrayRef<const CXXRecordDecl *> BasePath,
197 raw_ostream &Out)
override;
198 void mangleCanonicalTypeName(QualType
T, raw_ostream &,
199 bool NormalizeIntegers)
override;
200 void mangleReferenceTemporary(
const VarDecl *,
unsigned ManglingNumber,
201 raw_ostream &)
override;
202 void mangleStaticGuardVariable(
const VarDecl *D, raw_ostream &Out)
override;
203 void mangleThreadSafeStaticGuardVariable(
const VarDecl *D,
unsigned GuardNum,
204 raw_ostream &Out)
override;
205 void mangleDynamicInitializer(
const VarDecl *D, raw_ostream &Out)
override;
206 void mangleDynamicAtExitDestructor(
const VarDecl *D,
207 raw_ostream &Out)
override;
208 void mangleSEHFilterExpression(GlobalDecl EnclosingDecl,
209 raw_ostream &Out)
override;
210 void mangleSEHFinallyBlock(GlobalDecl EnclosingDecl,
211 raw_ostream &Out)
override;
212 void mangleStringLiteral(
const StringLiteral *SL, raw_ostream &Out)
override;
213 bool getNextDiscriminator(
const NamedDecl *ND,
unsigned &disc) {
214 const DeclContext *DC = getEffectiveDeclContext(ND);
220 if (
const auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
221 if (RD->isLambda()) {
229 disc = getASTContext().getManglingNumber(ND, isAux());
234 if (
const TagDecl *Tag = dyn_cast<TagDecl>(ND)) {
235 if (!
Tag->hasNameForLinkage() &&
236 !getASTContext().getDeclaratorForUnnamedTagDecl(Tag) &&
237 !getASTContext().getTypedefNameForUnnamedTagDecl(Tag))
242 unsigned &discriminator = Uniquifier[ND];
244 discriminator = ++Discriminator[std::make_pair(DC, ND->
getIdentifier())];
245 disc = discriminator + 1;
249 std::string getLambdaString(
const CXXRecordDecl *Lambda)
override {
250 assert(Lambda->
isLambda() &&
"RD must be a lambda!");
251 std::string Name(
"<lambda_");
256 const ParmVarDecl *Parm = dyn_cast_or_null<ParmVarDecl>(LambdaContextDecl);
257 const FunctionDecl *
Func =
261 unsigned DefaultArgNo =
263 Name += llvm::utostr(DefaultArgNo);
267 if (LambdaManglingNumber)
268 LambdaId = LambdaManglingNumber;
270 LambdaId = getLambdaIdForDebugInfo(Lambda);
272 Name += llvm::utostr(LambdaId);
277 unsigned getLambdaId(
const CXXRecordDecl *RD) {
278 assert(RD->
isLambda() &&
"RD must be a lambda!");
281 "RD must not have a mangling number!");
282 std::pair<llvm::DenseMap<const CXXRecordDecl *, unsigned>::iterator,
bool>
283 Result = LambdaIds.insert(std::make_pair(RD, LambdaIds.size()));
284 return Result.first->second;
287 unsigned getLambdaIdForDebugInfo(
const CXXRecordDecl *RD) {
288 assert(RD->
isLambda() &&
"RD must be a lambda!");
291 "RD must not have a mangling number!");
293 return LambdaIds.lookup(RD);
298 StringRef getAnonymousNamespaceHash()
const {
299 return AnonymousNamespaceHash;
303 void mangleInitFiniStub(
const VarDecl *D,
char CharCode, raw_ostream &Out);
308class MicrosoftCXXNameMangler {
309 MicrosoftMangleContextImpl &Context;
315 const NamedDecl *Structor;
316 unsigned StructorType;
318 typedef llvm::SmallVector<std::string, 10> BackRefVec;
319 BackRefVec NameBackReferences;
321 typedef llvm::DenseMap<const void *, unsigned> ArgBackRefMap;
322 ArgBackRefMap FunArgBackReferences;
323 ArgBackRefMap TemplateArgBackReferences;
325 typedef llvm::DenseMap<const void *, StringRef> TemplateArgStringMap;
326 TemplateArgStringMap TemplateArgStrings;
327 llvm::BumpPtrAllocator TemplateArgStringStorageAlloc;
328 llvm::StringSaver TemplateArgStringStorage;
330 typedef std::set<std::pair<int, bool>> PassObjectSizeArgsSet;
331 PassObjectSizeArgsSet PassObjectSizeArgs;
333 ASTContext &getASTContext()
const {
return Context.getASTContext(); }
335 const bool PointersAre64Bit;
337 DiagnosticBuilder
Error(SourceLocation, StringRef, StringRef);
338 DiagnosticBuilder
Error(SourceLocation, StringRef);
339 DiagnosticBuilder
Error(StringRef);
342 enum QualifierMangleMode { QMM_Drop, QMM_Mangle, QMM_Escape, QMM_Result };
343 enum class TplArgKind { ClassNTTP, StructuralValue };
345 MicrosoftCXXNameMangler(MicrosoftMangleContextImpl &
C, raw_ostream &Out_)
346 : Context(
C), Out(Out_), Structor(
nullptr), StructorType(-1),
347 TemplateArgStringStorage(TemplateArgStringStorageAlloc),
348 PointersAre64Bit(
C.getASTContext().getTargetInfo().getPointerWidth(
351 MicrosoftCXXNameMangler(MicrosoftMangleContextImpl &
C, raw_ostream &Out_,
353 : Context(
C), Out(Out_), Structor(getStructor(D)), StructorType(
Type),
354 TemplateArgStringStorage(TemplateArgStringStorageAlloc),
355 PointersAre64Bit(
C.getASTContext().getTargetInfo().getPointerWidth(
358 MicrosoftCXXNameMangler(MicrosoftMangleContextImpl &
C, raw_ostream &Out_,
360 : Context(
C), Out(Out_), Structor(getStructor(D)), StructorType(
Type),
361 TemplateArgStringStorage(TemplateArgStringStorageAlloc),
362 PointersAre64Bit(
C.getASTContext().getTargetInfo().getPointerWidth(
365 raw_ostream &getStream()
const {
return Out; }
367 void mangle(GlobalDecl GD, StringRef Prefix =
"?");
368 void mangleName(GlobalDecl GD);
369 void mangleFunctionEncoding(GlobalDecl GD,
bool ShouldMangle);
370 void mangleVariableEncoding(
const VarDecl *VD);
371 void mangleMemberDataPointer(
const CXXRecordDecl *RD,
const ValueDecl *VD,
372 const NonTypeTemplateParmDecl *PD,
373 QualType TemplateArgType,
374 StringRef Prefix =
"$");
375 void mangleMemberDataPointerInClassNTTP(
const CXXRecordDecl *,
377 void mangleMemberFunctionPointer(
const CXXRecordDecl *RD,
378 const CXXMethodDecl *MD,
379 const NonTypeTemplateParmDecl *PD,
380 QualType TemplateArgType,
381 StringRef Prefix =
"$");
382 void mangleFunctionPointer(
const FunctionDecl *FD,
383 const NonTypeTemplateParmDecl *PD,
384 QualType TemplateArgType);
385 void mangleVarDecl(
const VarDecl *VD,
const NonTypeTemplateParmDecl *PD,
386 QualType TemplateArgType);
387 void mangleMemberFunctionPointerInClassNTTP(
const CXXRecordDecl *RD,
388 const CXXMethodDecl *MD);
389 void mangleVirtualMemPtrThunk(
const CXXMethodDecl *MD,
390 const MethodVFTableLocation &ML);
391 void mangleNumber(int64_t Number);
392 void mangleNumber(llvm::APSInt Number);
393 void mangleFloat(llvm::APFloat Number);
394 void mangleBits(llvm::APInt Number);
396 void mangleArtificialTagType(
TagTypeKind TK, StringRef UnqualifiedName,
397 ArrayRef<StringRef> NestedNames = {});
398 void mangleAddressSpaceType(QualType
T, Qualifiers Quals, SourceRange Range);
399 void mangleType(QualType
T, SourceRange Range,
400 QualifierMangleMode QMM = QMM_Mangle);
401 void mangleFunctionType(
const FunctionType *
T,
402 const FunctionDecl *D =
nullptr,
403 bool ForceThisQuals =
false,
404 bool MangleExceptionSpec =
true);
405 void mangleSourceName(StringRef Name);
406 void mangleNestedName(GlobalDecl GD);
408 void mangleAutoReturnType(QualType
T, QualifierMangleMode QMM);
411 bool isStructorDecl(
const NamedDecl *ND)
const {
412 return ND == Structor || getStructor(ND) == Structor;
415 bool is64BitPointer(Qualifiers Quals)
const {
417 return AddrSpace == LangAS::ptr64 ||
418 (PointersAre64Bit && !(AddrSpace == LangAS::ptr32_sptr ||
419 AddrSpace == LangAS::ptr32_uptr));
422 void mangleUnqualifiedName(GlobalDecl GD) {
425 void mangleUnqualifiedName(GlobalDecl GD, DeclarationName Name);
428 void mangleQualifiers(Qualifiers Quals,
bool IsMember);
430 void manglePointerCVQualifiers(Qualifiers Quals);
431 void manglePointerExtQualifiers(Qualifiers Quals, QualType PointeeType);
432 void manglePointerAuthQualifier(Qualifiers Quals);
434 void mangleUnscopedTemplateName(GlobalDecl GD);
436 mangleTemplateInstantiationName(GlobalDecl GD,
437 const TemplateArgumentList &TemplateArgs);
440 void mangleFunctionArgumentType(QualType
T, SourceRange Range);
441 void manglePassObjectSizeArg(
const PassObjectSizeAttr *POSA);
443 bool isArtificialTagType(QualType
T)
const;
446#define ABSTRACT_TYPE(CLASS, PARENT)
447#define NON_CANONICAL_TYPE(CLASS, PARENT)
448#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T, \
451#include "clang/AST/TypeNodes.inc"
453#undef NON_CANONICAL_TYPE
456 void mangleType(
const TagDecl *TD);
457 void mangleDecayedArrayType(
const ArrayType *
T);
462 void mangleIntegerLiteral(
const llvm::APSInt &Number,
473 bool WithScalarType =
false);
488MicrosoftMangleContextImpl::MicrosoftMangleContextImpl(
ASTContext &Context,
508 SmallString<256> Path(FE->getName());
510 clang::Preprocessor::processPathForFileMacro(Path, Context.getLangOpts(),
511 Context.getTargetInfo());
514 uint32_t TruncatedHash = uint32_t(xxh3_64bits(Path));
515 AnonymousNamespaceHash = llvm::utohexstr(TruncatedHash);
518 AnonymousNamespaceHash =
"0";
522bool MicrosoftMangleContextImpl::shouldMangleCXXName(
const NamedDecl *D) {
523 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
526 if (FD->hasAttr<OverloadableAttr>())
538 if (FD->isMSVCRTEntryPoint())
552 if (!getASTContext().getLangOpts().
CPlusPlus)
555 const VarDecl *VD = dyn_cast<VarDecl>(D);
562 const DeclContext *DC = getEffectiveDeclContext(D);
572MicrosoftMangleContextImpl::shouldMangleStringLiteral(
const StringLiteral *SL) {
576DiagnosticBuilder MicrosoftCXXNameMangler::Error(SourceLocation loc,
579 DiagnosticsEngine &Diags = Context.getDiags();
580 return Diags.
Report(loc, diag::err_ms_mangle_unsupported_with_detail)
584DiagnosticBuilder MicrosoftCXXNameMangler::Error(SourceLocation loc,
586 DiagnosticsEngine &Diags = Context.getDiags();
587 return Diags.
Report(loc, diag::err_ms_mangle_unsupported) << thingy;
590DiagnosticBuilder MicrosoftCXXNameMangler::Error(StringRef thingy) {
591 DiagnosticsEngine &Diags = Context.getDiags();
593 return Diags.
Report(diag::err_ms_mangle_unsupported) << thingy;
596void MicrosoftCXXNameMangler::mangle(GlobalDecl GD, StringRef Prefix) {
607 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
608 mangleFunctionEncoding(GD, Context.shouldMangleDeclName(FD));
609 else if (
const VarDecl *VD = dyn_cast<VarDecl>(D))
610 mangleVariableEncoding(VD);
614 Out <<
"3U__s_GUID@@B";
619 llvm_unreachable(
"Tried to mangle unexpected NamedDecl!");
622void MicrosoftCXXNameMangler::mangleFunctionEncoding(GlobalDecl GD,
634 const FunctionProtoType *FT = FD->
getType()->
castAs<FunctionProtoType>();
647 mangleFunctionClass(FD);
649 mangleFunctionType(FT, FD,
false,
false);
655void MicrosoftCXXNameMangler::mangleVariableEncoding(
const VarDecl *VD) {
686 mangleType(Ty, SR, QMM_Drop);
687 manglePointerExtQualifiers(
689 if (
const MemberPointerType *MPT = Ty->
getAs<MemberPointerType>()) {
690 mangleQualifiers(MPT->getPointeeType().getQualifiers(),
true);
693 mangleName(MPT->getMostRecentCXXRecordDecl());
696 }
else if (
const ArrayType *AT = getASTContext().getAsArrayType(Ty)) {
698 mangleDecayedArrayType(AT);
699 if (AT->getElementType()->isArrayType())
704 mangleType(Ty, SR, QMM_Drop);
709void MicrosoftCXXNameMangler::mangleMemberDataPointer(
710 const CXXRecordDecl *RD,
const ValueDecl *VD,
711 const NonTypeTemplateParmDecl *PD, QualType TemplateArgType,
725 FieldOffset = getASTContext().getFieldOffset(VD);
726 assert(FieldOffset % getASTContext().
getCharWidth() == 0 &&
727 "cannot take address of bitfield");
728 FieldOffset /= getASTContext().getCharWidth();
732 if (IM == MSInheritanceModel::Virtual)
733 FieldOffset -= getASTContext().getOffsetOfBaseWithVBPtr(RD).getQuantity();
742 case MSInheritanceModel::Single: Code =
'0';
break;
743 case MSInheritanceModel::Multiple: Code =
'0';
break;
744 case MSInheritanceModel::Virtual: Code =
'F';
break;
745 case MSInheritanceModel::Unspecified: Code =
'G';
break;
751 getASTContext().getLangOpts().isCompatibleWithMSVC(
752 LangOptions::MSVC2019) &&
754 !TemplateArgType.
isNull()) {
756 mangleType(TemplateArgType, SourceRange(), QMM_Drop);
761 mangleNumber(FieldOffset);
769 mangleNumber(VBTableOffset);
772void MicrosoftCXXNameMangler::mangleMemberDataPointerInClassNTTP(
773 const CXXRecordDecl *RD,
const ValueDecl *VD) {
779 if (IM != MSInheritanceModel::Single && IM != MSInheritanceModel::Multiple)
780 return mangleMemberDataPointer(RD, VD,
nullptr, QualType(),
"");
788 mangleNestedName(VD);
790 mangleUnqualifiedName(VD);
794void MicrosoftCXXNameMangler::mangleMemberFunctionPointer(
795 const CXXRecordDecl *RD,
const CXXMethodDecl *MD,
796 const NonTypeTemplateParmDecl *PD, QualType TemplateArgType,
812 case MSInheritanceModel::Single: Code =
'1';
break;
813 case MSInheritanceModel::Multiple: Code =
'H';
break;
814 case MSInheritanceModel::Virtual: Code =
'I';
break;
815 case MSInheritanceModel::Unspecified: Code =
'J';
break;
826 if (getASTContext().getLangOpts().isCompatibleWithMSVC(
827 LangOptions::MSVC2019) &&
829 !TemplateArgType.
isNull()) {
831 mangleType(TemplateArgType, SourceRange(), QMM_Drop);
836 MicrosoftVTableContext *VTContext =
838 MethodVFTableLocation ML =
840 mangleVirtualMemPtrThunk(MD, ML);
844 const ASTRecordLayout &Layout = getASTContext().getASTRecordLayout(RD);
849 mangleFunctionEncoding(MD,
true);
852 if (VBTableOffset == 0 && IM == MSInheritanceModel::Virtual)
853 NVOffset -= getASTContext().getOffsetOfBaseWithVBPtr(RD).getQuantity();
856 if (IM == MSInheritanceModel::Single) {
857 Out << Prefix <<
"0A@";
860 if (IM == MSInheritanceModel::Unspecified)
862 Out << Prefix << Code;
866 mangleNumber(
static_cast<uint32_t>(NVOffset));
868 mangleNumber(VBPtrOffset);
870 mangleNumber(VBTableOffset);
873void MicrosoftCXXNameMangler::mangleFunctionPointer(
874 const FunctionDecl *FD,
const NonTypeTemplateParmDecl *PD,
875 QualType TemplateArgType) {
882 if (getASTContext().getLangOpts().isCompatibleWithMSVC(
883 LangOptions::MSVC2019) &&
885 !TemplateArgType.
isNull()) {
887 mangleType(TemplateArgType, SourceRange(), QMM_Drop);
892 mangleFunctionEncoding(FD,
true);
895void MicrosoftCXXNameMangler::mangleVarDecl(
const VarDecl *VD,
896 const NonTypeTemplateParmDecl *PD,
897 QualType TemplateArgType) {
904 if (getASTContext().getLangOpts().isCompatibleWithMSVC(
905 LangOptions::MSVC2019) &&
907 !TemplateArgType.
isNull()) {
909 mangleType(TemplateArgType, SourceRange(), QMM_Drop);
914 mangleVariableEncoding(VD);
917void MicrosoftCXXNameMangler::mangleMemberFunctionPointerInClassNTTP(
918 const CXXRecordDecl *RD,
const CXXMethodDecl *MD) {
926 return mangleMemberFunctionPointer(RD, MD,
nullptr, QualType(),
"");
934 MicrosoftVTableContext *VTContext =
936 MethodVFTableLocation ML =
938 mangleVirtualMemPtrThunk(MD, ML);
941 mangleFunctionEncoding(MD,
true);
945void MicrosoftCXXNameMangler::mangleVirtualMemPtrThunk(
946 const CXXMethodDecl *MD,
const MethodVFTableLocation &ML) {
948 CharUnits PointerWidth = getASTContext().toCharUnitsFromBits(
949 getASTContext().getTargetInfo().getPointerWidth(LangAS::Default));
955 mangleNumber(OffsetInVFTable);
957 mangleCallingConvention(MD->
getType()->
castAs<FunctionProtoType>(),
961void MicrosoftCXXNameMangler::mangleName(GlobalDecl GD) {
965 mangleUnqualifiedName(GD);
967 mangleNestedName(GD);
973void MicrosoftCXXNameMangler::mangleNumber(int64_t Number) {
974 mangleNumber(llvm::APSInt(llvm::APInt(64, Number),
false));
977void MicrosoftCXXNameMangler::mangleNumber(llvm::APSInt Number) {
982 unsigned Width = std::max(
Number.getBitWidth(), 64U);
991 if (
Value.isNegative()) {
998void MicrosoftCXXNameMangler::mangleFloat(llvm::APFloat Number) {
1001 switch (APFloat::SemanticsToEnum(
Number.getSemantics())) {
1002 case APFloat::S_IEEEsingle:
Out <<
'A';
break;
1003 case APFloat::S_IEEEdouble:
Out <<
'B';
break;
1007 case APFloat::S_IEEEhalf:
Out <<
'V';
break;
1008 case APFloat::S_BFloat:
Out <<
'W';
break;
1009 case APFloat::S_x87DoubleExtended:
Out <<
'X';
break;
1010 case APFloat::S_IEEEquad:
Out <<
'Y';
break;
1011 case APFloat::S_PPCDoubleDouble:
Out <<
'Z';
break;
1012 case APFloat::S_PPCDoubleDoubleLegacy:
1013 case APFloat::S_Float8E5M2:
1014 case APFloat::S_Float8E4M3:
1015 case APFloat::S_Float8E4M3FN:
1016 case APFloat::S_Float8E5M2FNUZ:
1017 case APFloat::S_Float8E4M3FNUZ:
1018 case APFloat::S_Float8E4M3B11FNUZ:
1019 case APFloat::S_Float8E3M4:
1020 case APFloat::S_FloatTF32:
1021 case APFloat::S_Float8E8M0FNU:
1022 case APFloat::S_Float8E5M3FNU:
1023 case APFloat::S_Float6E3M2FN:
1024 case APFloat::S_Float6E2M3FN:
1025 case APFloat::S_Float4E2M1FN:
1026 llvm_unreachable(
"Tried to mangle unexpected APFloat semantics");
1029 mangleBits(
Number.bitcastToAPInt());
1032void MicrosoftCXXNameMangler::mangleBits(llvm::APInt
Value) {
1041 llvm::SmallString<32> EncodedNumberBuffer;
1043 EncodedNumberBuffer.push_back(
'A' + (
Value & 0xf).getZExtValue());
1044 std::reverse(EncodedNumberBuffer.begin(), EncodedNumberBuffer.end());
1045 Out.write(EncodedNumberBuffer.data(), EncodedNumberBuffer.size());
1054 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1063 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
1064 TemplateArgs = &Spec->getTemplateArgs();
1065 return GD.
getWithDecl(Spec->getSpecializedTemplate());
1070 dyn_cast<VarTemplateSpecializationDecl>(ND)) {
1071 TemplateArgs = &Spec->getTemplateArgs();
1072 return GD.
getWithDecl(Spec->getSpecializedTemplate());
1078void MicrosoftCXXNameMangler::mangleUnqualifiedName(GlobalDecl GD,
1079 DeclarationName Name) {
1087 const TemplateArgumentList *TemplateArgs =
nullptr;
1088 if (GlobalDecl TD =
isTemplate(GD, TemplateArgs)) {
1093 mangleTemplateInstantiationName(TD, *TemplateArgs);
1116 ArgBackRefMap::iterator
Found = TemplateArgBackReferences.find(ND);
1117 if (
Found == TemplateArgBackReferences.end()) {
1119 TemplateArgStringMap::iterator
Found = TemplateArgStrings.find(ND);
1120 if (
Found == TemplateArgStrings.end()) {
1122 llvm::SmallString<64> TemplateMangling;
1123 llvm::raw_svector_ostream Stream(TemplateMangling);
1124 MicrosoftCXXNameMangler
Extra(Context, Stream);
1125 Extra.mangleTemplateInstantiationName(TD, *TemplateArgs);
1128 mangleSourceName(TemplateMangling);
1132 BackRefVec::iterator StringFound =
1133 llvm::find(NameBackReferences, TemplateMangling);
1134 if (StringFound != NameBackReferences.end()) {
1135 TemplateArgBackReferences[ND] =
1136 StringFound - NameBackReferences.begin();
1138 TemplateArgStrings[ND] =
1139 TemplateArgStringStorage.save(TemplateMangling.str());
1158 ->getTemplatedDecl()
1161 bool IsOCLDeviceStub =
1163 DeviceKernelAttr::isOpenCLSpelling(
1164 ND->
getAttr<DeviceKernelAttr>()) &&
1168 (llvm::Twine(
"__device_stub__") + II->getName()).str());
1169 else if (IsOCLDeviceStub)
1171 (llvm::Twine(
"__clang_ocl_kern_imp_") + II->getName()).str());
1173 mangleSourceName(II->getName());
1178 assert(ND &&
"mangling empty name without declaration");
1180 if (
const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
1181 if (NS->isAnonymousNamespace()) {
1182 llvm::SmallString<16> Name(
"?A0x");
1183 Name += Context.getAnonymousNamespaceHash();
1184 mangleSourceName(Name);
1189 if (
const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(ND)) {
1192 llvm::SmallString<64> Name(
"$S");
1194 Name += llvm::utostr(Context.getAnonymousStructId(DD) + 1);
1195 mangleSourceName(Name);
1199 if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1202 assert(RD &&
"expected variable decl to have a record type");
1206 llvm::SmallString<64> Name(
"$S");
1208 Name += llvm::utostr(Context.getAnonymousStructId(RD) + 1);
1209 mangleSourceName(Name.str());
1213 if (
const MSGuidDecl *GD = dyn_cast<MSGuidDecl>(ND)) {
1216 SmallString<
sizeof(
"_GUID_12345678_1234_1234_1234_1234567890ab")> GUID;
1217 llvm::raw_svector_ostream GUIDOS(GUID);
1218 Context.mangleMSGuidDecl(GD, GUIDOS);
1219 mangleSourceName(GUID);
1223 if (
const auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
1225 mangleTemplateArgValue(TPO->getType().getUnqualifiedType(),
1226 TPO->getValue(), TplArgKind::ClassNTTP);
1234 "Typedef should not be in another decl context!");
1236 "Typedef was not named!");
1241 if (
const CXXRecordDecl *
Record = dyn_cast<CXXRecordDecl>(TD)) {
1242 if (
Record->isLambda()) {
1243 llvm::SmallString<10> Name(
"<lambda_");
1245 Decl *LambdaContextDecl =
Record->getLambdaContextDecl();
1246 unsigned LambdaManglingNumber =
Record->getLambdaManglingNumber();
1248 const ParmVarDecl *Parm =
1249 dyn_cast_or_null<ParmVarDecl>(LambdaContextDecl);
1250 const FunctionDecl *
Func =
1254 unsigned DefaultArgNo =
1256 Name += llvm::utostr(DefaultArgNo);
1260 if (LambdaManglingNumber)
1261 LambdaId = LambdaManglingNumber;
1263 LambdaId = Context.getLambdaId(
Record);
1265 Name += llvm::utostr(LambdaId);
1268 mangleSourceName(Name);
1272 if (LambdaManglingNumber && LambdaContextDecl) {
1283 llvm::SmallString<64> Name;
1284 if (DeclaratorDecl *DD =
1288 Name +=
"<unnamed-type-";
1289 Name += DD->getName();
1290 }
else if (TypedefNameDecl *TND =
1295 Name +=
"<unnamed-type-";
1296 Name += TND->getName();
1301 Name +=
"<unnamed-enum-";
1302 Name += ED->enumerator_begin()->getName();
1305 Name +=
"<unnamed-type-$S";
1306 Name += llvm::utostr(Context.getAnonymousStructId(TD) + 1);
1309 mangleSourceName(Name.str());
1319 llvm::SmallString<64> Name;
1320 mangleSourceName(Name.str());
1325 if (isStructorDecl(ND)) {
1339 if (isStructorDecl(ND))
1342 mangleCXXDtorType(
static_cast<CXXDtorType>(StructorType));
1356 mangleOperatorName(Name.getCXXOverloadedOperator(), ND->
getLocation());
1361 mangleSourceName(Name.getCXXLiteralIdentifier()->getName());
1366 llvm_unreachable(
"Can't mangle a deduction guide name!");
1369 llvm_unreachable(
"Can't mangle a using directive name!");
1375void MicrosoftCXXNameMangler::mangleNestedName(GlobalDecl GD) {
1378 if (
const auto *ID = dyn_cast<IndirectFieldDecl>(ND))
1379 for (
unsigned I = 1, IE =
ID->getChainingSize(); I < IE; ++I)
1380 mangleSourceName(
"<unnamed-tag>");
1382 const DeclContext *DC = getEffectiveDeclContext(ND);
1386 if (Context.getNextDiscriminator(ND, Disc)) {
1393 if (
const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
1395 [](StringRef Name,
const unsigned Discriminator,
1396 const unsigned ParameterDiscriminator) -> std::string {
1398 llvm::raw_string_ostream Stream(Buffer);
1401 Stream <<
'_' << Discriminator;
1402 if (ParameterDiscriminator)
1403 Stream <<
'_' << ParameterDiscriminator;
1407 unsigned Discriminator = BD->getBlockManglingNumber();
1409 Discriminator = Context.getBlockId(BD,
false);
1414 unsigned ParameterDiscriminator = 0;
1415 if (
const auto *MC = BD->getBlockManglingContextDecl())
1416 if (
const auto *P = dyn_cast<ParmVarDecl>(MC))
1417 if (
const auto *F = dyn_cast<FunctionDecl>(P->getDeclContext()))
1418 ParameterDiscriminator =
1419 F->getNumParams() - P->getFunctionScopeIndex();
1421 DC = getEffectiveDeclContext(BD);
1424 mangleSourceName(Discriminate(
"_block_invoke", Discriminator,
1425 ParameterDiscriminator));
1430 if (
const auto *MC = BD->getBlockManglingContextDecl())
1432 if (
const auto *ND = dyn_cast<NamedDecl>(MC))
1433 mangleUnqualifiedName(ND);
1437 if (
const auto *RD = dyn_cast<RecordDecl>(DC))
1446 if (PointersAre64Bit)
1449 mangleArtificialTagType(TagTypeKind::Struct,
1450 Discriminate(
"__block_literal", Discriminator,
1451 ParameterDiscriminator));
1459 }
else if (
const ObjCMethodDecl *
Method = dyn_cast<ObjCMethodDecl>(DC)) {
1463 if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1464 mangle(getGlobalDeclAsDeclContext(FD),
"?");
1467 mangleUnqualifiedName(ND);
1470 if (
const auto *LDADC = getLambdaDefaultArgumentDeclContext(ND)) {
1480void MicrosoftCXXNameMangler::mangleCXXDtorType(
CXXDtorType T) {
1496 llvm_unreachable(
"not expecting a COMDAT");
1498 llvm_unreachable(
"not expecting a unified dtor type");
1500 llvm_unreachable(
"Unsupported dtor type?");
1504 SourceLocation Loc) {
1509 case OO_New:
Out <<
"?2";
break;
1511 case OO_Delete:
Out <<
"?3";
break;
1513 case OO_Equal:
Out <<
"?4";
break;
1515 case OO_GreaterGreater:
Out <<
"?5";
break;
1517 case OO_LessLess:
Out <<
"?6";
break;
1519 case OO_Exclaim:
Out <<
"?7";
break;
1521 case OO_EqualEqual:
Out <<
"?8";
break;
1523 case OO_ExclaimEqual:
Out <<
"?9";
break;
1525 case OO_Subscript:
Out <<
"?A";
break;
1528 case OO_Arrow:
Out <<
"?C";
break;
1530 case OO_Star:
Out <<
"?D";
break;
1532 case OO_PlusPlus:
Out <<
"?E";
break;
1534 case OO_MinusMinus:
Out <<
"?F";
break;
1536 case OO_Minus:
Out <<
"?G";
break;
1538 case OO_Plus:
Out <<
"?H";
break;
1540 case OO_Amp:
Out <<
"?I";
break;
1542 case OO_ArrowStar:
Out <<
"?J";
break;
1544 case OO_Slash:
Out <<
"?K";
break;
1546 case OO_Percent:
Out <<
"?L";
break;
1548 case OO_Less:
Out <<
"?M";
break;
1550 case OO_LessEqual:
Out <<
"?N";
break;
1552 case OO_Greater:
Out <<
"?O";
break;
1554 case OO_GreaterEqual:
Out <<
"?P";
break;
1556 case OO_Comma:
Out <<
"?Q";
break;
1558 case OO_Call:
Out <<
"?R";
break;
1560 case OO_Tilde:
Out <<
"?S";
break;
1562 case OO_Caret:
Out <<
"?T";
break;
1564 case OO_Pipe:
Out <<
"?U";
break;
1566 case OO_AmpAmp:
Out <<
"?V";
break;
1568 case OO_PipePipe:
Out <<
"?W";
break;
1570 case OO_StarEqual:
Out <<
"?X";
break;
1572 case OO_PlusEqual:
Out <<
"?Y";
break;
1574 case OO_MinusEqual:
Out <<
"?Z";
break;
1576 case OO_SlashEqual:
Out <<
"?_0";
break;
1578 case OO_PercentEqual:
Out <<
"?_1";
break;
1580 case OO_GreaterGreaterEqual:
Out <<
"?_2";
break;
1582 case OO_LessLessEqual:
Out <<
"?_3";
break;
1584 case OO_AmpEqual:
Out <<
"?_4";
break;
1586 case OO_PipeEqual:
Out <<
"?_5";
break;
1588 case OO_CaretEqual:
Out <<
"?_6";
break;
1617 case OO_Array_New:
Out <<
"?_U";
break;
1619 case OO_Array_Delete:
Out <<
"?_V";
break;
1621 case OO_Coawait:
Out <<
"?__L";
break;
1623 case OO_Spaceship:
Out <<
"?__M";
break;
1625 case OO_Conditional: {
1626 Error(Loc,
"conditional operator");
1632 llvm_unreachable(
"Not an overloaded operator");
1636void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) {
1638 BackRefVec::iterator
Found = llvm::find(NameBackReferences, Name);
1639 if (
Found == NameBackReferences.end()) {
1640 if (NameBackReferences.size() < 10)
1641 NameBackReferences.push_back(std::string(Name));
1644 Out << (
Found - NameBackReferences.begin());
1648void MicrosoftCXXNameMangler::mangleObjCMethodName(
const ObjCMethodDecl *MD) {
1649 Context.mangleObjCMethodNameAsSourceName(MD, Out);
1652void MicrosoftCXXNameMangler::mangleTemplateInstantiationName(
1653 GlobalDecl GD,
const TemplateArgumentList &TemplateArgs) {
1659 ArgBackRefMap OuterFunArgsContext;
1660 ArgBackRefMap OuterTemplateArgsContext;
1661 BackRefVec OuterTemplateContext;
1662 PassObjectSizeArgsSet OuterPassObjectSizeArgs;
1663 NameBackReferences.swap(OuterTemplateContext);
1664 FunArgBackReferences.swap(OuterFunArgsContext);
1665 TemplateArgBackReferences.swap(OuterTemplateArgsContext);
1666 PassObjectSizeArgs.swap(OuterPassObjectSizeArgs);
1668 mangleUnscopedTemplateName(GD);
1672 NameBackReferences.swap(OuterTemplateContext);
1673 FunArgBackReferences.swap(OuterFunArgsContext);
1674 TemplateArgBackReferences.swap(OuterTemplateArgsContext);
1675 PassObjectSizeArgs.swap(OuterPassObjectSizeArgs);
1678void MicrosoftCXXNameMangler::mangleUnscopedTemplateName(GlobalDecl GD) {
1681 mangleUnqualifiedName(GD);
1684void MicrosoftCXXNameMangler::mangleIntegerLiteral(
1685 const llvm::APSInt &
Value,
const NonTypeTemplateParmDecl *PD,
1686 QualType TemplateArgType) {
1695 if (getASTContext().getLangOpts().isCompatibleWithMSVC(
1696 LangOptions::MSVC2019) &&
1698 !TemplateArgType.
isNull()) {
1700 mangleType(TemplateArgType, SourceRange(), QMM_Drop);
1705 mangleNumber(
Value);
1708void MicrosoftCXXNameMangler::mangleExpression(
1709 const Expr *E,
const NonTypeTemplateParmDecl *PD) {
1711 if (std::optional<llvm::APSInt>
Value =
1722void MicrosoftCXXNameMangler::mangleTemplateArgs(
1723 const TemplateDecl *TD,
const TemplateArgumentList &TemplateArgs) {
1726 assert(TPL->
size() == TemplateArgs.
size() &&
1727 "size mismatch between args and parms!");
1729 for (
size_t i = 0; i < TemplateArgs.
size(); ++i) {
1730 const TemplateArgument &TA = TemplateArgs[i];
1737 mangleTemplateArg(TD, TA, TPL->
getParam(i));
1745 if (!
T->isPointerType() || !
V.isLValue() || !
V.hasLValuePath() ||
1749 QualType BaseT =
V.getLValueBase().getType();
1750 if (!BaseT->
isArrayType() ||
V.getLValuePath().size() != 1 ||
1751 V.getLValuePath()[0].getAsArrayIndex() != 0)
1754 V.getLValueBase().dyn_cast<const ValueDecl *>());
1757void MicrosoftCXXNameMangler::mangleTemplateArg(
const TemplateDecl *TD,
1758 const TemplateArgument &TA,
1759 const NamedDecl *Parm) {
1797 llvm_unreachable(
"Can't mangle null template arguments!");
1799 llvm_unreachable(
"Can't mangle template expansion arguments!");
1802 mangleType(
T, SourceRange(), QMM_Escape);
1808 mangleMemberDataPointer(
1812 }
else if (
const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1813 const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
1825 mangleTemplateArgValue(TPO->getType().getUnqualifiedType(),
1826 TPO->getValue(), TplArgKind::ClassNTTP);
1827 }
else if (
const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1843 if (
const MemberPointerType *MPT =
T->
getAs<MemberPointerType>()) {
1844 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
1845 if (MPT->isMemberFunctionPointerType() &&
1847 mangleMemberFunctionPointer(RD,
nullptr,
nullptr, QualType());
1850 if (MPT->isMemberDataPointer()) {
1852 mangleMemberDataPointer(RD,
nullptr,
nullptr, QualType());
1862 mangleIntegerLiteral(llvm::APSInt::get(-1),
1868 mangleIntegerLiteral(llvm::APSInt::getUnsigned(0),
1878 return mangleTemplateArg(
1884 ->getContainedDeducedType()) {
1890 TplArgKind::StructuralValue,
1898 if (TemplateArgs.empty()) {
1903 Out << (Context.getASTContext().getLangOpts().isCompatibleWithMSVC(
1904 LangOptions::MSVC2015)
1910 llvm_unreachable(
"unexpected template parameter decl!");
1912 for (
const TemplateArgument &PA : TemplateArgs)
1913 mangleTemplateArg(TD, PA, Parm);
1918 const NamedDecl *ND =
1920 if (
const auto *TD = dyn_cast<TagDecl>(ND)) {
1926 llvm_unreachable(
"unexpected template template NamedDecl!");
1933void MicrosoftCXXNameMangler::mangleTemplateArgValue(QualType
T,
1936 bool WithScalarType) {
1937 switch (
V.getKind()) {
1943 mangleType(
T, SourceRange(), QMM_Escape);
1949 mangleType(
T, SourceRange(), QMM_Escape);
1951 mangleNumber(
V.getInt());
1956 mangleType(
T, SourceRange(), QMM_Escape);
1957 mangleFloat(
V.getFloat());
1962 mangleType(
T, SourceRange(), QMM_Escape);
1964 APValue::LValueBase
Base =
V.getLValueBase();
1968 if (
V.isLValueOnePastTheEnd()) {
1970 auto *VD =
Base.dyn_cast<
const ValueDecl *>();
1977 if (!
V.hasLValuePath() ||
V.getLValuePath().empty()) {
1979 if (
Base.isNull()) {
1985 mangleNumber(
V.getLValueOffset().getQuantity());
1986 }
else if (!
V.hasLValuePath()) {
1988 Error(
"template argument (extension not comaptible with ms mangler)");
1990 }
else if (
auto *VD =
Base.dyn_cast<
const ValueDecl*>()) {
1994 Error(
"template argument (undeclared base)");
2001 SmallVector<char, 2> EntryTypes;
2003 QualType ET =
Base.getType();
2004 for (APValue::LValuePathEntry E :
V.getLValuePath()) {
2006 EntryTypes.push_back(
'C');
2007 EntryManglers.push_back([
this, I = E.getAsArrayIndex()] {
2012 ET = AT->getElementType();
2016 const Decl *D = E.getAsBaseOrMember().getPointer();
2017 if (
auto *FD = dyn_cast<FieldDecl>(D)) {
2029 EntryTypes.push_back(
'6');
2030 EntryManglers.push_back([
this, D] {
2036 for (
auto I = EntryTypes.rbegin(), E = EntryTypes.rend(); I != E; ++I)
2039 auto *VD =
Base.dyn_cast<
const ValueDecl*>();
2041 Error(
"template argument (null value decl)");
2044 Out << (TAK == TplArgKind::ClassNTTP ?
'E' :
'1');
2058 mangleType(
T, SourceRange(), QMM_Escape);
2060 const CXXRecordDecl *RD =
2061 T->
castAs<MemberPointerType>()->getMostRecentCXXRecordDecl();
2062 const ValueDecl *D =
V.getMemberPointerDecl();
2063 if (TAK == TplArgKind::ClassNTTP) {
2065 mangleMemberDataPointerInClassNTTP(RD, D);
2067 mangleMemberFunctionPointerInClassNTTP(RD,
2068 cast_or_null<CXXMethodDecl>(D));
2071 mangleMemberDataPointer(RD, D,
nullptr, QualType(),
"");
2073 mangleMemberFunctionPointer(RD, cast_or_null<CXXMethodDecl>(D),
nullptr,
2081 mangleType(
T, SourceRange(), QMM_Escape);
2083 assert(RD &&
"unexpected type for record value");
2085 unsigned BaseIndex = 0;
2086 for (
const CXXBaseSpecifier &B : RD->
bases())
2087 mangleTemplateArgValue(B.getType(),
V.getStructBase(BaseIndex++), TAK);
2088 for (
const FieldDecl *FD : RD->
fields())
2089 if (!FD->isUnnamedBitField())
2090 mangleTemplateArgValue(FD->
getType(),
2091 V.getStructField(FD->getFieldIndex()), TAK,
2099 mangleType(
T, SourceRange(), QMM_Escape);
2100 if (
const FieldDecl *FD =
V.getUnionField()) {
2101 mangleUnqualifiedName(FD);
2102 mangleTemplateArgValue(FD->
getType(),
V.getUnionValue(), TAK);
2110 mangleType(
T, SourceRange(), QMM_Escape);
2112 mangleNumber(
V.getComplexIntReal());
2114 mangleNumber(
V.getComplexIntImag());
2120 mangleType(
T, SourceRange(), QMM_Escape);
2121 mangleFloat(
V.getComplexFloatReal());
2122 mangleFloat(
V.getComplexFloatImag());
2128 QualType ElemT = getASTContext().getAsArrayType(
T)->getElementType();
2129 mangleType(ElemT, SourceRange(), QMM_Escape);
2130 for (
unsigned I = 0, N =
V.getArraySize(); I != N; ++I) {
2131 const APValue &ElemV = I <
V.getArrayInitializedElts()
2132 ?
V.getArrayInitializedElt(I)
2133 :
V.getArrayFiller();
2134 mangleTemplateArgValue(ElemT, ElemV, TAK);
2145 mangleType(
T, SourceRange(), QMM_Escape);
2147 QualType ElemT =
T->
castAs<VectorType>()->getElementType();
2148 mangleType(ElemT, SourceRange(), QMM_Escape);
2149 for (
unsigned I = 0, N =
V.getVectorLength(); I != N; ++I) {
2151 mangleTemplateArgValue(ElemT, ElemV, TAK);
2159 Error(
"template argument (value type: matrix)");
2164 Error(
"template argument (value type: address label diff)");
2169 Error(
"template argument (value type: fixed point)");
2174 Error(
"template argument (value type: reflection)");
2180void MicrosoftCXXNameMangler::mangleObjCProtocol(
const ObjCProtocolDecl *PD) {
2181 llvm::SmallString<64> TemplateMangling;
2182 llvm::raw_svector_ostream Stream(TemplateMangling);
2183 MicrosoftCXXNameMangler
Extra(Context, Stream);
2186 Extra.mangleSourceName(
"Protocol");
2187 Extra.mangleArtificialTagType(TagTypeKind::Struct, PD->
getName());
2189 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__ObjC"});
2192void MicrosoftCXXNameMangler::mangleObjCLifetime(
const QualType
Type,
2194 SourceRange Range) {
2195 llvm::SmallString<64> TemplateMangling;
2196 llvm::raw_svector_ostream Stream(TemplateMangling);
2197 MicrosoftCXXNameMangler
Extra(Context, Stream);
2205 Extra.mangleSourceName(
"Autoreleasing");
2208 Extra.mangleSourceName(
"Strong");
2211 Extra.mangleSourceName(
"Weak");
2214 Extra.manglePointerCVQualifiers(Quals);
2215 Extra.manglePointerExtQualifiers(Quals,
Type);
2218 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__ObjC"});
2221void MicrosoftCXXNameMangler::mangleObjCKindOfType(
const ObjCObjectType *
T,
2223 SourceRange Range) {
2224 llvm::SmallString<64> TemplateMangling;
2225 llvm::raw_svector_ostream Stream(TemplateMangling);
2226 MicrosoftCXXNameMangler
Extra(Context, Stream);
2229 Extra.mangleSourceName(
"KindOf");
2230 Extra.mangleType(QualType(
T, 0)
2231 .stripObjCKindOfType(getASTContext())
2232 ->castAs<ObjCObjectType>(),
2235 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__ObjC"});
2238void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
2296 if (HasConst && HasVolatile) {
2298 }
else if (HasVolatile) {
2300 }
else if (HasConst) {
2306 if (HasConst && HasVolatile) {
2308 }
else if (HasVolatile) {
2310 }
else if (HasConst) {
2321MicrosoftCXXNameMangler::mangleRefQualifier(
RefQualifierKind RefQualifier) {
2324 switch (RefQualifier) {
2338void MicrosoftCXXNameMangler::manglePointerExtQualifiers(Qualifiers Quals,
2339 QualType PointeeType) {
2341 bool is64Bit = PointeeType.
isNull() ? PointersAre64Bit :
2354void MicrosoftCXXNameMangler::manglePointerAuthQualifier(Qualifiers Quals) {
2360 mangleNumber(PointerAuth.
getKey());
2365void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) {
2373 if (HasConst && HasVolatile) {
2375 }
else if (HasVolatile) {
2377 }
else if (HasConst) {
2384void MicrosoftCXXNameMangler::mangleFunctionArgumentType(QualType
T,
2385 SourceRange Range) {
2394 if (
const auto *DT =
T->
getAs<DecayedType>()) {
2395 QualType OriginalType = DT->getOriginalType();
2398 if (
const auto *AT = getASTContext().getAsArrayType(OriginalType))
2399 OriginalType = getASTContext().getIncompleteArrayType(
2400 AT->getElementType(), AT->getSizeModifier(),
2401 AT->getIndexTypeCVRQualifiers());
2412 TypePtr =
T.getCanonicalType().getAsOpaquePtr();
2415 ArgBackRefMap::iterator
Found = FunArgBackReferences.find(TypePtr);
2417 if (
Found == FunArgBackReferences.end()) {
2418 size_t OutSizeBefore =
Out.tell();
2420 mangleType(
T, Range, QMM_Drop);
2425 bool LongerThanOneChar = (
Out.tell() - OutSizeBefore > 1);
2426 if (LongerThanOneChar && FunArgBackReferences.size() < 10) {
2427 size_t Size = FunArgBackReferences.size();
2428 FunArgBackReferences[TypePtr] =
Size;
2435void MicrosoftCXXNameMangler::manglePassObjectSizeArg(
2436 const PassObjectSizeAttr *POSA) {
2437 int Type = POSA->getType();
2438 bool Dynamic = POSA->isDynamic();
2440 auto Iter = PassObjectSizeArgs.insert({
Type,
Dynamic}).first;
2441 auto *TypePtr = (
const void *)&*Iter;
2442 ArgBackRefMap::iterator
Found = FunArgBackReferences.find(TypePtr);
2444 if (
Found == FunArgBackReferences.end()) {
2446 Dynamic ?
"__pass_dynamic_object_size" :
"__pass_object_size";
2447 mangleArtificialTagType(TagTypeKind::Enum, Name + llvm::utostr(
Type),
2450 if (FunArgBackReferences.size() < 10) {
2451 size_t Size = FunArgBackReferences.size();
2452 FunArgBackReferences[TypePtr] =
Size;
2459void MicrosoftCXXNameMangler::mangleAddressSpaceType(QualType
T,
2461 SourceRange Range) {
2479 llvm::SmallString<32> ASMangling;
2480 llvm::raw_svector_ostream Stream(ASMangling);
2481 MicrosoftCXXNameMangler
Extra(Context, Stream);
2487 Extra.mangleSourceName(
"_AS");
2488 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(TargetAS));
2492 llvm_unreachable(
"Not a language specific address space");
2493 case LangAS::opencl_global:
2494 Extra.mangleSourceName(
"_ASCLglobal");
2496 case LangAS::opencl_global_device:
2497 Extra.mangleSourceName(
"_ASCLdevice");
2499 case LangAS::opencl_global_host:
2500 Extra.mangleSourceName(
"_ASCLhost");
2502 case LangAS::opencl_local:
2503 Extra.mangleSourceName(
"_ASCLlocal");
2505 case LangAS::opencl_constant:
2506 Extra.mangleSourceName(
"_ASCLconstant");
2508 case LangAS::opencl_private:
2509 Extra.mangleSourceName(
"_ASCLprivate");
2511 case LangAS::opencl_generic:
2512 Extra.mangleSourceName(
"_ASCLgeneric");
2514 case LangAS::sycl_global:
2515 Extra.mangleSourceName(
"_ASSYglobal");
2517 case LangAS::sycl_global_device:
2518 Extra.mangleSourceName(
"_ASSYdevice");
2520 case LangAS::sycl_global_host:
2521 Extra.mangleSourceName(
"_ASSYhost");
2523 case LangAS::sycl_local:
2524 Extra.mangleSourceName(
"_ASSYlocal");
2526 case LangAS::sycl_private:
2527 Extra.mangleSourceName(
"_ASSYprivate");
2529 case LangAS::sycl_generic:
2530 Extra.mangleSourceName(
"_ASSYgeneric");
2532 case LangAS::sycl_constant:
2533 Extra.mangleSourceName(
"_ASSYconstant");
2535 case LangAS::cuda_device:
2536 Extra.mangleSourceName(
"_ASCUdevice");
2538 case LangAS::cuda_constant:
2539 Extra.mangleSourceName(
"_ASCUconstant");
2541 case LangAS::cuda_shared:
2542 Extra.mangleSourceName(
"_ASCUshared");
2544 case LangAS::ptr32_sptr:
2545 case LangAS::ptr32_uptr:
2547 llvm_unreachable(
"don't mangle ptr address spaces with _AS");
2551 Extra.mangleType(
T, Range, QMM_Escape);
2552 mangleQualifiers(Qualifiers(),
false);
2553 mangleArtificialTagType(TagTypeKind::Struct, ASMangling, {
"__clang"});
2556void MicrosoftCXXNameMangler::mangleAutoReturnType(QualType
T,
2557 QualifierMangleMode QMM) {
2558 assert(getASTContext().getLangOpts().isCompatibleWithMSVC(
2559 LangOptions::MSVC2019) &&
2560 "Cannot mangle MSVC 2017 auto return types!");
2564 Qualifiers Quals =
T.getLocalQualifiers();
2566 if (QMM == QMM_Result)
2568 if (QMM != QMM_Drop)
2569 mangleQualifiers(Quals,
false);
2570 Out << (AT->isDecltypeAuto() ?
"_T" :
"_P");
2574 T =
T.getDesugaredType(getASTContext());
2575 Qualifiers Quals =
T.getLocalQualifiers();
2582 mangleQualifiers(Quals,
false);
2585 llvm_unreachable(
"QMM_Escape unexpected");
2588 const Type *ty =
T.getTypePtr();
2590 case Type::MemberPointer:
2596 case Type::LValueReference:
2599 case Type::RValueReference:
2603 llvm_unreachable(
"Invalid type expected");
2607void MicrosoftCXXNameMangler::mangleType(QualType
T, SourceRange Range,
2608 QualifierMangleMode QMM) {
2611 T =
T.getDesugaredType(getASTContext());
2612 Qualifiers Quals =
T.getLocalQualifiers();
2614 if (
const ArrayType *AT = getASTContext().getAsArrayType(
T)) {
2617 if (QMM == QMM_Mangle)
2619 else if (QMM == QMM_Escape || QMM == QMM_Result)
2621 mangleArrayType(AT);
2634 if (
const FunctionType *FT = dyn_cast<FunctionType>(
T)) {
2636 mangleFunctionType(FT);
2639 mangleQualifiers(Quals,
false);
2642 if (!IsPointer && Quals) {
2644 mangleQualifiers(Quals,
false);
2652 if ((!IsPointer && Quals) ||
isa<TagType>(
T) || isArtificialTagType(
T)) {
2654 mangleQualifiers(Quals,
false);
2659 const Type *ty =
T.getTypePtr();
2662#define ABSTRACT_TYPE(CLASS, PARENT)
2663#define NON_CANONICAL_TYPE(CLASS, PARENT) \
2665 llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
2667#define TYPE(CLASS, PARENT) \
2669 mangleType(cast<CLASS##Type>(ty), Quals, Range); \
2671#include "clang/AST/TypeNodes.inc"
2673#undef NON_CANONICAL_TYPE
2678void MicrosoftCXXNameMangler::mangleType(
const BuiltinType *
T, Qualifiers,
2679 SourceRange Range) {
2707 switch (
T->getKind()) {
2708 case BuiltinType::Void:
2711 case BuiltinType::SChar:
2714 case BuiltinType::Char_U:
2715 case BuiltinType::Char_S:
2718 case BuiltinType::UChar:
2721 case BuiltinType::Short:
2724 case BuiltinType::UShort:
2727 case BuiltinType::Int:
2730 case BuiltinType::UInt:
2733 case BuiltinType::Long:
2736 case BuiltinType::ULong:
2739 case BuiltinType::Float:
2742 case BuiltinType::Double:
2746 case BuiltinType::LongDouble:
2749 case BuiltinType::LongLong:
2752 case BuiltinType::ULongLong:
2755 case BuiltinType::Int128:
2758 case BuiltinType::UInt128:
2761 case BuiltinType::Bool:
2764 case BuiltinType::Char8:
2767 case BuiltinType::Char16:
2770 case BuiltinType::Char32:
2773 case BuiltinType::WChar_S:
2774 case BuiltinType::WChar_U:
2778#define BUILTIN_TYPE(Id, SingletonId)
2779#define PLACEHOLDER_TYPE(Id, SingletonId) \
2780 case BuiltinType::Id:
2781#include "clang/AST/BuiltinTypes.def"
2782 case BuiltinType::Dependent:
2783 llvm_unreachable(
"placeholder types shouldn't get to name mangling");
2785 case BuiltinType::ObjCId:
2786 mangleArtificialTagType(TagTypeKind::Struct,
"objc_object");
2788 case BuiltinType::ObjCClass:
2789 mangleArtificialTagType(TagTypeKind::Struct,
"objc_class");
2791 case BuiltinType::ObjCSel:
2792 mangleArtificialTagType(TagTypeKind::Struct,
"objc_selector");
2795#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2796 case BuiltinType::Id: \
2797 Out << "PAUocl_" #ImgType "_" #Suffix "@@"; \
2799#include "clang/Basic/OpenCLImageTypes.def"
2800 case BuiltinType::OCLSampler:
2802 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_sampler");
2804 case BuiltinType::OCLEvent:
2806 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_event");
2808 case BuiltinType::OCLClkEvent:
2810 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_clkevent");
2812 case BuiltinType::OCLQueue:
2814 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_queue");
2816 case BuiltinType::OCLReserveID:
2818 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_reserveid");
2820#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2821 case BuiltinType::Id: \
2822 mangleArtificialTagType(TagTypeKind::Struct, "ocl_" #ExtType); \
2824#include "clang/Basic/OpenCLExtensionTypes.def"
2826 case BuiltinType::NullPtr:
2830 case BuiltinType::Float16:
2831 mangleArtificialTagType(TagTypeKind::Struct,
"_Float16", {
"__clang"});
2834 case BuiltinType::Half:
2835 if (!getASTContext().getLangOpts().
HLSL)
2836 mangleArtificialTagType(TagTypeKind::Struct,
"_Half", {
"__clang"});
2837 else if (getASTContext().getLangOpts().NativeHalfType)
2843 case BuiltinType::BFloat16:
2844 mangleArtificialTagType(TagTypeKind::Struct,
"__bf16", {
"__clang"});
2847 case BuiltinType::MFloat8:
2848 mangleArtificialTagType(TagTypeKind::Struct,
"__mfp8", {
"__clang"});
2851#define WASM_REF_TYPE(InternalName, MangledName, Id, SingletonId, AS) \
2852 case BuiltinType::Id: \
2853 mangleArtificialTagType(TagTypeKind::Struct, MangledName); \
2854 mangleArtificialTagType(TagTypeKind::Struct, MangledName, {"__clang"}); \
2857#include "clang/Basic/WebAssemblyReferenceTypes.def"
2859#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
2860 case BuiltinType::Id: \
2861 mangleArtificialTagType(TagTypeKind::Struct, #Name); \
2863#include "clang/Basic/HLSLIntangibleTypes.def"
2865#define HLSL_PACKED_TYPE(Name, Id, SingletonId) \
2866 case BuiltinType::Id: \
2867 mangleArtificialTagType(TagTypeKind::Struct, #Name); \
2869#include "clang/Basic/HLSLPackedTypes.def"
2871 case BuiltinType::SveBool:
2875 case BuiltinType::SveInt8:
2878 case BuiltinType::SveInt16:
2881 case BuiltinType::SveInt32:
2884 case BuiltinType::SveInt64:
2888 case BuiltinType::SveUint8:
2891 case BuiltinType::SveUint16:
2894 case BuiltinType::SveUint32:
2897 case BuiltinType::SveUint64:
2901 case BuiltinType::SveBFloat16:
2904 case BuiltinType::SveFloat16:
2907 case BuiltinType::SveFloat32:
2910 case BuiltinType::SveFloat64:
2914 case BuiltinType::SveInt8x2:
2917 case BuiltinType::SveInt16x2:
2920 case BuiltinType::SveInt32x2:
2923 case BuiltinType::SveInt64x2:
2927 case BuiltinType::SveUint8x2:
2930 case BuiltinType::SveUint16x2:
2933 case BuiltinType::SveUint32x2:
2936 case BuiltinType::SveUint64x2:
2940 case BuiltinType::SveBFloat16x2:
2943 case BuiltinType::SveFloat16x2:
2946 case BuiltinType::SveFloat32x2:
2949 case BuiltinType::SveFloat64x2:
2953 case BuiltinType::SveInt8x3:
2956 case BuiltinType::SveInt16x3:
2959 case BuiltinType::SveInt32x3:
2962 case BuiltinType::SveInt64x3:
2966 case BuiltinType::SveUint8x3:
2969 case BuiltinType::SveUint16x3:
2972 case BuiltinType::SveUint32x3:
2975 case BuiltinType::SveUint64x3:
2979 case BuiltinType::SveBFloat16x3:
2982 case BuiltinType::SveFloat16x3:
2985 case BuiltinType::SveFloat32x3:
2988 case BuiltinType::SveFloat64x3:
2992 case BuiltinType::SveInt8x4:
2995 case BuiltinType::SveInt16x4:
2998 case BuiltinType::SveInt32x4:
3001 case BuiltinType::SveInt64x4:
3005 case BuiltinType::SveUint8x4:
3008 case BuiltinType::SveUint16x4:
3011 case BuiltinType::SveUint32x4:
3014 case BuiltinType::SveUint64x4:
3018 case BuiltinType::SveBFloat16x4:
3021 case BuiltinType::SveFloat16x4:
3024 case BuiltinType::SveFloat32x4:
3027 case BuiltinType::SveFloat64x4:
3033 case BuiltinType::SveMFloat8:
3034 mangleArtificialTagType(TagTypeKind::Struct,
"__SVMfloat8_t", {
"__clang"});
3037 case BuiltinType::SveMFloat8x2:
3038 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svmfloat8x2_t",
3042 case BuiltinType::SveMFloat8x3:
3043 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svmfloat8x3_t",
3047 case BuiltinType::SveMFloat8x4:
3048 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svmfloat8x4_t",
3052 case BuiltinType::SveBoolx2:
3053 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svboolx2_t",
3057 case BuiltinType::SveBoolx4:
3058 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svboolx4_t",
3062 case BuiltinType::SveCount:
3063 mangleArtificialTagType(TagTypeKind::Struct,
"__SVCount_t", {
"__clang"});
3066#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3067#include "clang/Basic/SPIRVTypes.def"
3081void MicrosoftCXXNameMangler::mangleType(
const FunctionProtoType *
T, Qualifiers,
3088 mangleFunctionType(
T,
nullptr,
true);
3091 mangleFunctionType(
T);
3094void MicrosoftCXXNameMangler::mangleType(
const FunctionNoProtoType *
T,
3095 Qualifiers, SourceRange) {
3097 mangleFunctionType(
T);
3100void MicrosoftCXXNameMangler::mangleFunctionType(
const FunctionType *
T,
3101 const FunctionDecl *D,
3102 bool ForceThisQuals,
3103 bool MangleExceptionSpec) {
3106 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(
T);
3111 bool IsInLambda =
false;
3112 bool IsStructor =
false, HasThisQuals = ForceThisQuals, IsCtorClosure =
false;
3114 if (
const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(D)) {
3118 HasThisQuals =
true;
3127 CC = getASTContext().getDefaultCallingConvention(
3136 manglePointerExtQualifiers(Quals, QualType());
3138 mangleQualifiers(Quals,
false);
3141 mangleCallingConvention(CC, Range);
3146 Out <<
"__clang_sme_attr" << SMEAttrs;
3159 Out << (PointersAre64Bit ?
"PEAXI@Z" :
"PAXI@Z");
3168 if (IsCtorClosure) {
3178 mangleFunctionArgumentType(getASTContext().getLValueReferenceType(
3180 ->
castAs<LValueReferenceType>()
3186 llvm_unreachable(
"unexpected constructor closure!");
3192 }
else if (IsInLambda && isa_and_nonnull<CXXConversionDecl>(D)) {
3203 mangleType(ResultType, Range, QMM_Result);
3204 }
else if (IsInLambda) {
3206 assert(AT->getKeyword() != AutoTypeKeyword::GNUAutoType &&
3207 "shouldn't need to mangle __auto_type!");
3211 mangleSourceName(AT->isDecltypeAuto() ?
"<decltype-auto>" :
"<auto>");
3217 assert(AT->getKeyword() != AutoTypeKeyword::GNUAutoType &&
3218 "shouldn't need to mangle __auto_type!");
3224 auto UseClangMangling = [](QualType ResultType) {
3225 QualType
T = ResultType;
3228 if (
T.getQualifiers().hasAddressSpace())
3234 if (getASTContext().getLangOpts().isCompatibleWithMSVC(
3235 LangOptions::MSVC2019) &&
3236 !UseClangMangling(ResultType)) {
3245 ->
castAs<FunctionProtoType>();
3248 mangleAutoReturnType(ResultType, QMM_Result);
3254 mangleSourceName(AT->isDecltypeAuto() ?
"<decltype-auto>" :
"<auto>");
3260 mangleType(ResultType, Range, QMM_Result);
3276 for (
unsigned I = 0, E = Proto->
getNumParams(); I != E; ++I) {
3281 mangleFunctionArgumentType(Proto->
getParamType(I), Range);
3292 manglePassObjectSizeArg(P);
3301 if (MangleExceptionSpec && getASTContext().getLangOpts().
CPlusPlus17 &&
3302 getASTContext().getLangOpts().isCompatibleWithMSVC(
3303 LangOptions::MSVC2017_5))
3304 mangleThrowSpecification(Proto);
3309void MicrosoftCXXNameMangler::mangleFunctionClass(
const FunctionDecl *FD) {
3334 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
3344 llvm_unreachable(
"Unsupported access specifier");
3373void MicrosoftCXXNameMangler::mangleCallingConvention(
CallingConv CC,
3374 SourceRange Range) {
3436 if (getASTContext().getLangOpts().RegCall4)
3445void MicrosoftCXXNameMangler::mangleCallingConvention(
const FunctionType *
T,
3446 SourceRange Range) {
3450void MicrosoftCXXNameMangler::mangleThrowSpecification(
3451 const FunctionProtoType *FT) {
3460void MicrosoftCXXNameMangler::mangleType(
const UnresolvedUsingType *
T,
3461 Qualifiers, SourceRange Range) {
3472void MicrosoftCXXNameMangler::mangleTagTypeKind(
TagTypeKind TTK) {
3474 case TagTypeKind::Union:
3477 case TagTypeKind::Struct:
3478 case TagTypeKind::Interface:
3481 case TagTypeKind::Class:
3484 case TagTypeKind::Enum:
3489void MicrosoftCXXNameMangler::mangleType(
const EnumType *
T, Qualifiers,
3493void MicrosoftCXXNameMangler::mangleType(
const RecordType *
T, Qualifiers,
3497void MicrosoftCXXNameMangler::mangleType(
const TagDecl *TD) {
3507void MicrosoftCXXNameMangler::mangleArtificialTagType(
3509 ArrayRef<StringRef> NestedNames) {
3511 mangleTagTypeKind(TK);
3514 mangleSourceName(UnqualifiedName);
3516 for (StringRef N : llvm::reverse(NestedNames))
3517 mangleSourceName(N);
3530void MicrosoftCXXNameMangler::mangleDecayedArrayType(
const ArrayType *
T) {
3533 manglePointerCVQualifiers(
T->getElementType().getQualifiers());
3534 mangleType(
T->getElementType(), SourceRange());
3536void MicrosoftCXXNameMangler::mangleType(
const ConstantArrayType *
T, Qualifiers,
3538 llvm_unreachable(
"Should have been special cased");
3540void MicrosoftCXXNameMangler::mangleType(
const VariableArrayType *
T, Qualifiers,
3542 llvm_unreachable(
"Should have been special cased");
3544void MicrosoftCXXNameMangler::mangleType(
const DependentSizedArrayType *
T,
3545 Qualifiers, SourceRange) {
3546 llvm_unreachable(
"Should have been special cased");
3548void MicrosoftCXXNameMangler::mangleType(
const IncompleteArrayType *
T,
3549 Qualifiers, SourceRange) {
3550 llvm_unreachable(
"Should have been special cased");
3552void MicrosoftCXXNameMangler::mangleArrayType(
const ArrayType *
T) {
3553 QualType ElementTy(
T, 0);
3554 SmallVector<llvm::APInt, 3> Dimensions;
3556 if (ElementTy->isConstantArrayType()) {
3557 const ConstantArrayType *CAT =
3558 getASTContext().getAsConstantArrayType(ElementTy);
3559 Dimensions.push_back(CAT->
getSize());
3561 }
else if (ElementTy->isIncompleteArrayType()) {
3562 const IncompleteArrayType *IAT =
3563 getASTContext().getAsIncompleteArrayType(ElementTy);
3564 Dimensions.push_back(llvm::APInt(32, 0));
3566 }
else if (ElementTy->isVariableArrayType()) {
3567 const VariableArrayType *VAT =
3568 getASTContext().getAsVariableArrayType(ElementTy);
3569 Dimensions.push_back(llvm::APInt(32, 0));
3571 }
else if (ElementTy->isDependentSizedArrayType()) {
3573 const DependentSizedArrayType *DSAT =
3574 getASTContext().getAsDependentSizedArrayType(ElementTy);
3584 mangleNumber(Dimensions.size());
3585 for (
const llvm::APInt &Dimension : Dimensions)
3586 mangleNumber(Dimension.getLimitedValue());
3587 mangleType(ElementTy, SourceRange(), QMM_Escape);
3590void MicrosoftCXXNameMangler::mangleType(
const ArrayParameterType *
T,
3591 Qualifiers, SourceRange) {
3598void MicrosoftCXXNameMangler::mangleType(
const MemberPointerType *
T,
3599 Qualifiers Quals, SourceRange Range) {
3601 manglePointerCVQualifiers(Quals);
3602 manglePointerExtQualifiers(Quals, PointeeType);
3603 if (
const FunctionProtoType *FPT = PointeeType->
getAs<FunctionProtoType>()) {
3605 mangleName(
T->getMostRecentCXXRecordDecl());
3606 mangleFunctionType(FPT,
nullptr,
true);
3609 mangleName(
T->getMostRecentCXXRecordDecl());
3610 mangleType(PointeeType, Range, QMM_Drop);
3614void MicrosoftCXXNameMangler::mangleType(
const TemplateTypeParmType *
T,
3615 Qualifiers, SourceRange Range) {
3618 llvm::SmallString<64> Name;
3620 Name += llvm::utostr(
T->getDepth());
3622 Name += llvm::utostr(
T->getIndex());
3624 mangleSourceName(Name);
3627void MicrosoftCXXNameMangler::mangleType(
const SubstTemplateTypeParmPackType *
T,
3628 Qualifiers, SourceRange Range) {
3632void MicrosoftCXXNameMangler::mangleType(
const SubstBuiltinTemplatePackType *
T,
3633 Qualifiers, SourceRange Range) {
3634 Error(
Range.getBegin(),
"substituted builtin template pack") <<
Range;
3640void MicrosoftCXXNameMangler::mangleType(
const PointerType *
T, Qualifiers Quals,
3641 SourceRange Range) {
3643 manglePointerCVQualifiers(Quals);
3644 manglePointerExtQualifiers(Quals, PointeeType);
3645 manglePointerAuthQualifier(Quals);
3651 mangleType(PointeeType, Range);
3653 mangleAddressSpaceType(PointeeType, PointeeType.
getQualifiers(), Range);
3656void MicrosoftCXXNameMangler::mangleType(
const ObjCObjectPointerType *
T,
3657 Qualifiers Quals, SourceRange Range) {
3666 return mangleObjCLifetime(PointeeType, Quals, Range);
3668 manglePointerCVQualifiers(Quals);
3669 manglePointerExtQualifiers(Quals, PointeeType);
3670 mangleType(PointeeType, Range);
3676void MicrosoftCXXNameMangler::mangleType(
const LValueReferenceType *
T,
3677 Qualifiers Quals, SourceRange Range) {
3681 manglePointerExtQualifiers(Quals, PointeeType);
3682 mangleType(PointeeType, Range);
3688void MicrosoftCXXNameMangler::mangleType(
const RValueReferenceType *
T,
3689 Qualifiers Quals, SourceRange Range) {
3693 manglePointerExtQualifiers(Quals, PointeeType);
3694 mangleType(PointeeType, Range);
3697void MicrosoftCXXNameMangler::mangleType(
const ComplexType *
T, Qualifiers,
3698 SourceRange Range) {
3699 QualType ElementType =
T->getElementType();
3701 llvm::SmallString<64> TemplateMangling;
3702 llvm::raw_svector_ostream Stream(TemplateMangling);
3703 MicrosoftCXXNameMangler
Extra(Context, Stream);
3705 Extra.mangleSourceName(
"_Complex");
3706 Extra.mangleType(ElementType, Range, QMM_Escape);
3708 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3716bool MicrosoftCXXNameMangler::isArtificialTagType(QualType
T)
const {
3717 const Type *ty =
T.getTypePtr();
3722 case Type::Vector: {
3731void MicrosoftCXXNameMangler::mangleType(
const VectorType *
T, Qualifiers Quals,
3732 SourceRange Range) {
3733 QualType EltTy =
T->getElementType();
3734 const BuiltinType *ET = EltTy->
getAs<BuiltinType>();
3735 const BitIntType *BitIntTy = EltTy->
getAs<BitIntType>();
3736 assert((ET || BitIntTy) &&
3737 "vectors with non-builtin/_BitInt elements are unsupported");
3738 uint64_t Width = getASTContext().getTypeSize(
T);
3741 size_t OutSizeBefore =
Out.tell();
3743 if (getASTContext().getTargetInfo().
getTriple().isX86() && ET) {
3744 if (Width == 64 && ET->
getKind() == BuiltinType::LongLong) {
3745 mangleArtificialTagType(TagTypeKind::Union,
"__m64");
3746 }
else if (Width >= 128) {
3747 if (ET->
getKind() == BuiltinType::Float)
3748 mangleArtificialTagType(TagTypeKind::Union,
3749 "__m" + llvm::utostr(Width));
3750 else if (ET->
getKind() == BuiltinType::LongLong)
3751 mangleArtificialTagType(TagTypeKind::Union,
3752 "__m" + llvm::utostr(Width) +
'i');
3753 else if (ET->
getKind() == BuiltinType::Double)
3754 mangleArtificialTagType(TagTypeKind::Struct,
3755 "__m" + llvm::utostr(Width) +
'd');
3760 bool IsBuiltin =
Out.tell() != OutSizeBefore;
3766 llvm::SmallString<64> TemplateMangling;
3767 llvm::raw_svector_ostream Stream(TemplateMangling);
3768 MicrosoftCXXNameMangler
Extra(Context, Stream);
3770 Extra.mangleSourceName(
"__vector");
3771 Extra.mangleType(QualType(ET ?
static_cast<const Type *
>(ET) : BitIntTy, 0),
3773 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumElements()));
3775 mangleArtificialTagType(TagTypeKind::Union, TemplateMangling, {
"__clang"});
3779void MicrosoftCXXNameMangler::mangleType(
const ExtVectorType *
T,
3780 Qualifiers Quals, SourceRange Range) {
3781 mangleType(
static_cast<const VectorType *
>(
T), Quals, Range);
3784void MicrosoftCXXNameMangler::mangleType(
const DependentVectorType *
T,
3785 Qualifiers, SourceRange Range) {
3789void MicrosoftCXXNameMangler::mangleType(
const DependentSizedExtVectorType *
T,
3790 Qualifiers, SourceRange Range) {
3791 Error(
Range.getBegin(),
"dependent-sized extended vector type") <<
Range;
3794void MicrosoftCXXNameMangler::mangleType(
const ConstantMatrixType *
T,
3795 Qualifiers quals, SourceRange Range) {
3796 QualType EltTy =
T->getElementType();
3798 llvm::SmallString<64> TemplateMangling;
3799 llvm::raw_svector_ostream Stream(TemplateMangling);
3800 MicrosoftCXXNameMangler
Extra(Context, Stream);
3804 Extra.mangleSourceName(
"__matrix");
3805 Extra.mangleType(EltTy, Range, QMM_Escape);
3807 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumRows()));
3808 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumColumns()));
3810 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3813void MicrosoftCXXNameMangler::mangleType(
const DependentSizedMatrixType *
T,
3814 Qualifiers quals, SourceRange Range) {
3818void MicrosoftCXXNameMangler::mangleType(
const DependentAddressSpaceType *
T,
3819 Qualifiers, SourceRange Range) {
3823void MicrosoftCXXNameMangler::mangleType(
const ObjCInterfaceType *
T, Qualifiers,
3826 mangleTagTypeKind(TagTypeKind::Struct);
3827 mangleName(
T->getDecl());
3830void MicrosoftCXXNameMangler::mangleType(
const ObjCObjectType *
T,
3831 Qualifiers Quals, SourceRange Range) {
3832 if (
T->isKindOfType())
3833 return mangleObjCKindOfType(
T, Quals, Range);
3835 if (
T->qual_empty() && !
T->isSpecialized())
3836 return mangleType(
T->getBaseType(), Range, QMM_Drop);
3838 ArgBackRefMap OuterFunArgsContext;
3839 ArgBackRefMap OuterTemplateArgsContext;
3840 BackRefVec OuterTemplateContext;
3842 FunArgBackReferences.swap(OuterFunArgsContext);
3843 TemplateArgBackReferences.swap(OuterTemplateArgsContext);
3844 NameBackReferences.swap(OuterTemplateContext);
3846 mangleTagTypeKind(TagTypeKind::Struct);
3850 mangleSourceName(
"objc_object");
3851 else if (
T->isObjCClass())
3852 mangleSourceName(
"objc_class");
3854 mangleSourceName(
T->getInterface()->getName());
3856 for (
const auto &Q :
T->quals())
3857 mangleObjCProtocol(Q);
3859 if (
T->isSpecialized())
3860 for (
const auto &TA :
T->getTypeArgs())
3861 mangleType(TA, Range, QMM_Drop);
3867 FunArgBackReferences.swap(OuterFunArgsContext);
3868 TemplateArgBackReferences.swap(OuterTemplateArgsContext);
3869 NameBackReferences.swap(OuterTemplateContext);
3872void MicrosoftCXXNameMangler::mangleType(
const BlockPointerType *
T,
3873 Qualifiers Quals, SourceRange Range) {
3875 manglePointerCVQualifiers(Quals);
3876 manglePointerExtQualifiers(Quals, PointeeType);
3880 mangleFunctionType(PointeeType->
castAs<FunctionProtoType>());
3883void MicrosoftCXXNameMangler::mangleType(
const InjectedClassNameType *,
3884 Qualifiers, SourceRange) {
3885 llvm_unreachable(
"Cannot mangle injected class name type.");
3888void MicrosoftCXXNameMangler::mangleType(
const TemplateSpecializationType *
T,
3889 Qualifiers, SourceRange Range) {
3893void MicrosoftCXXNameMangler::mangleType(
const DependentNameType *
T, Qualifiers,
3894 SourceRange Range) {
3898void MicrosoftCXXNameMangler::mangleType(
const PackExpansionType *
T, Qualifiers,
3899 SourceRange Range) {
3903void MicrosoftCXXNameMangler::mangleType(
const PackIndexingType *
T,
3904 Qualifiers Quals, SourceRange Range) {
3905 manglePointerCVQualifiers(Quals);
3906 mangleType(
T->getSelectedType(), Range);
3909void MicrosoftCXXNameMangler::mangleType(
const TypeOfType *
T, Qualifiers,
3910 SourceRange Range) {
3914void MicrosoftCXXNameMangler::mangleType(
const TypeOfExprType *
T, Qualifiers,
3915 SourceRange Range) {
3919void MicrosoftCXXNameMangler::mangleType(
const DecltypeType *
T, Qualifiers,
3920 SourceRange Range) {
3924void MicrosoftCXXNameMangler::mangleType(
const UnaryTransformType *
T,
3925 Qualifiers, SourceRange Range) {
3929void MicrosoftCXXNameMangler::mangleType(
const AutoType *
T, Qualifiers,
3930 SourceRange Range) {
3931 assert(
T->getDeducedType().isNull() &&
"expecting a dependent type!");
3936void MicrosoftCXXNameMangler::mangleType(
3937 const DeducedTemplateSpecializationType *
T, Qualifiers, SourceRange Range) {
3938 assert(
T->getDeducedType().isNull() &&
"expecting a dependent type!");
3940 Error(
Range.getBegin(),
"deduced class template specialization type")
3944void MicrosoftCXXNameMangler::mangleType(
const AtomicType *
T, Qualifiers,
3945 SourceRange Range) {
3946 QualType ValueType =
T->getValueType();
3948 llvm::SmallString<64> TemplateMangling;
3949 llvm::raw_svector_ostream Stream(TemplateMangling);
3950 MicrosoftCXXNameMangler
Extra(Context, Stream);
3952 Extra.mangleSourceName(
"_Atomic");
3953 Extra.mangleType(ValueType, Range, QMM_Escape);
3955 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3958void MicrosoftCXXNameMangler::mangleType(
const PipeType *
T, Qualifiers,
3959 SourceRange Range) {
3960 QualType ElementType =
T->getElementType();
3962 llvm::SmallString<64> TemplateMangling;
3963 llvm::raw_svector_ostream Stream(TemplateMangling);
3964 MicrosoftCXXNameMangler
Extra(Context, Stream);
3966 Extra.mangleSourceName(
"ocl_pipe");
3967 Extra.mangleType(ElementType, Range, QMM_Escape);
3968 Extra.mangleIntegerLiteral(llvm::APSInt::get(
T->isReadOnly()));
3970 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3973void MicrosoftMangleContextImpl::mangleCXXName(GlobalDecl GD,
3976 PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
3977 getASTContext().getSourceManager(),
3978 "Mangling declaration");
3980 msvc_hashing_ostream MHO(Out);
3982 if (
auto *CD = dyn_cast<CXXConstructorDecl>(D)) {
3984 MicrosoftCXXNameMangler mangler(*
this, MHO, CD,
Type);
3985 return mangler.mangle(GD);
3988 if (
auto *DD = dyn_cast<CXXDestructorDecl>(D)) {
3990 MicrosoftCXXNameMangler mangler(*
this, MHO, DD,
Type);
3991 return mangler.mangle(GD);
3994 MicrosoftCXXNameMangler Mangler(*
this, MHO);
3995 return Mangler.mangle(GD);
3998void MicrosoftCXXNameMangler::mangleType(
const BitIntType *
T, Qualifiers,
3999 SourceRange Range) {
4000 llvm::SmallString<64> TemplateMangling;
4001 llvm::raw_svector_ostream Stream(TemplateMangling);
4002 MicrosoftCXXNameMangler
Extra(Context, Stream);
4004 if (
T->isUnsigned())
4005 Extra.mangleSourceName(
"_UBitInt");
4007 Extra.mangleSourceName(
"_BitInt");
4008 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumBits()));
4010 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
4013void MicrosoftCXXNameMangler::mangleType(
const DependentBitIntType *
T,
4014 Qualifiers, SourceRange Range) {
4018void MicrosoftCXXNameMangler::mangleType(
const HLSLAttributedResourceType *
T,
4019 Qualifiers, SourceRange Range) {
4020 llvm_unreachable(
"HLSL uses Itanium name mangling");
4023void MicrosoftCXXNameMangler::mangleType(
const HLSLInlineSpirvType *
T,
4024 Qualifiers, SourceRange Range) {
4025 llvm_unreachable(
"HLSL uses Itanium name mangling");
4028void MicrosoftCXXNameMangler::mangleType(
const OverflowBehaviorType *
T,
4029 Qualifiers, SourceRange Range) {
4030 QualType UnderlyingType =
T->getUnderlyingType();
4032 llvm::SmallString<64> TemplateMangling;
4033 llvm::raw_svector_ostream Stream(TemplateMangling);
4034 MicrosoftCXXNameMangler
Extra(Context, Stream);
4036 if (
T->isWrapKind()) {
4037 Extra.mangleSourceName(
"ObtWrap_");
4039 Extra.mangleSourceName(
"ObtTrap_");
4041 Extra.mangleType(UnderlyingType, Range, QMM_Escape);
4043 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
4072 MicrosoftCXXNameMangler &Mangler,
4079 llvm_unreachable(
"Unsupported access specifier");
4090 Out <<
'R' << AccessSpec;
4091 Mangler.mangleNumber(
4093 Mangler.mangleNumber(
4095 Mangler.mangleNumber(
4100 Mangler.mangleNumber(
4107 llvm_unreachable(
"Unsupported access specifier");
4121 llvm_unreachable(
"Unsupported access specifier");
4134void MicrosoftMangleContextImpl::mangleVirtualMemPtrThunk(
4135 const CXXMethodDecl *MD,
const MethodVFTableLocation &ML,
4137 msvc_hashing_ostream MHO(Out);
4138 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4139 Mangler.getStream() <<
'?';
4140 Mangler.mangleVirtualMemPtrThunk(MD, ML);
4143void MicrosoftMangleContextImpl::mangleThunk(
const CXXMethodDecl *MD,
4144 const ThunkInfo &Thunk,
4147 msvc_hashing_ostream MHO(Out);
4148 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4149 Mangler.getStream() <<
'?';
4150 Mangler.mangleName(MD);
4159 assert(Thunk.
Method !=
nullptr &&
4160 "Thunk info should hold the overridee decl");
4162 const CXXMethodDecl *DeclForFPT = Thunk.
Method ? Thunk.
Method : MD;
4163 Mangler.mangleFunctionType(
4167void MicrosoftMangleContextImpl::mangleCXXDtorThunk(
const CXXDestructorDecl *DD,
4169 const ThunkInfo &Thunk,
4176 msvc_hashing_ostream MHO(Out);
4177 MicrosoftCXXNameMangler Mangler(*
this, MHO, DD,
Type);
4178 Mangler.getStream() <<
"??_E";
4180 auto &Adjustment = Thunk.
This;
4182 Mangler.mangleFunctionType(DD->
getType()->
castAs<FunctionProtoType>(), DD);
4185void MicrosoftMangleContextImpl::mangleCXXVFTable(
4186 const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
4192 msvc_hashing_ostream MHO(Out);
4193 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4194 if (Derived->
hasAttr<DLLImportAttr>())
4195 Mangler.getStream() <<
"??_S";
4197 Mangler.getStream() <<
"??_7";
4198 Mangler.mangleName(Derived);
4199 Mangler.getStream() <<
"6B";
4200 for (
const CXXRecordDecl *RD : BasePath)
4201 Mangler.mangleName(RD);
4202 Mangler.getStream() <<
'@';
4205void MicrosoftMangleContextImpl::mangleCXXVTable(
const CXXRecordDecl *Derived,
4208 mangleCXXVFTable(Derived, {},
Out);
4211void MicrosoftMangleContextImpl::mangleCXXVBTable(
4212 const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
4218 msvc_hashing_ostream MHO(Out);
4219 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4220 Mangler.getStream() <<
"??_8";
4221 Mangler.mangleName(Derived);
4222 Mangler.getStream() <<
"7B";
4223 for (
const CXXRecordDecl *RD : BasePath)
4224 Mangler.mangleName(RD);
4225 Mangler.getStream() <<
'@';
4228void MicrosoftMangleContextImpl::mangleCXXRTTI(QualType
T, raw_ostream &Out) {
4229 msvc_hashing_ostream MHO(Out);
4230 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4231 Mangler.getStream() <<
"??_R0";
4232 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4233 Mangler.getStream() <<
"@8";
4236void MicrosoftMangleContextImpl::mangleCXXRTTIName(
4237 QualType
T, raw_ostream &Out,
bool NormalizeIntegers =
false) {
4243 msvc_hashing_ostream MHO(Out, 4095);
4244 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4245 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4248void MicrosoftMangleContextImpl::mangleCXXVirtualDisplacementMap(
4249 const CXXRecordDecl *SrcRD,
const CXXRecordDecl *DstRD, raw_ostream &Out) {
4250 msvc_hashing_ostream MHO(Out);
4251 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4252 Mangler.getStream() <<
"??_K";
4253 Mangler.mangleName(SrcRD);
4254 Mangler.getStream() <<
"$C";
4255 Mangler.mangleName(DstRD);
4258void MicrosoftMangleContextImpl::mangleCXXThrowInfo(QualType
T,
bool IsConst,
4263 msvc_hashing_ostream MHO(Out);
4264 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4265 Mangler.getStream() <<
"_TI";
4267 Mangler.getStream() <<
'C';
4269 Mangler.getStream() <<
'V';
4271 Mangler.getStream() <<
'U';
4272 Mangler.getStream() << NumEntries;
4273 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4276void MicrosoftMangleContextImpl::mangleCXXCatchableTypeArray(
4277 QualType
T,
uint32_t NumEntries, raw_ostream &Out) {
4278 msvc_hashing_ostream MHO(Out);
4279 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4280 Mangler.getStream() <<
"_CTA";
4281 Mangler.getStream() << NumEntries;
4282 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4285void MicrosoftMangleContextImpl::mangleCXXCatchableType(
4289 MicrosoftCXXNameMangler Mangler(*
this, Out);
4290 Mangler.getStream() <<
"_CT";
4292 llvm::SmallString<64> RTTIMangling;
4294 llvm::raw_svector_ostream Stream(RTTIMangling);
4295 msvc_hashing_ostream MHO(Stream);
4296 mangleCXXRTTI(
T, MHO);
4298 Mangler.getStream() << RTTIMangling;
4306 bool OmitCopyCtor = getASTContext().getLangOpts().isCompatibleWithMSVC(
4307 LangOptions::MSVC2015) &&
4308 !getASTContext().getLangOpts().isCompatibleWithMSVC(
4309 LangOptions::MSVC2017_7);
4310 llvm::SmallString<64> CopyCtorMangling;
4311 if (!OmitCopyCtor && CD) {
4312 llvm::raw_svector_ostream Stream(CopyCtorMangling);
4313 msvc_hashing_ostream MHO(Stream);
4314 mangleCXXName(GlobalDecl(CD, CT), MHO);
4316 Mangler.getStream() << CopyCtorMangling;
4318 Mangler.getStream() <<
Size;
4319 if (VBPtrOffset == -1) {
4321 Mangler.getStream() << NVOffset;
4324 Mangler.getStream() << NVOffset;
4325 Mangler.getStream() << VBPtrOffset;
4326 Mangler.getStream() << VBIndex;
4330void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassDescriptor(
4333 msvc_hashing_ostream MHO(Out);
4334 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4335 Mangler.getStream() <<
"??_R1";
4336 Mangler.mangleNumber(NVOffset);
4337 Mangler.mangleNumber(VBPtrOffset);
4338 Mangler.mangleNumber(VBTableOffset);
4339 Mangler.mangleNumber(Flags);
4340 Mangler.mangleName(Derived);
4341 Mangler.getStream() <<
"8";
4344void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassArray(
4345 const CXXRecordDecl *Derived, raw_ostream &Out) {
4346 msvc_hashing_ostream MHO(Out);
4347 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4348 Mangler.getStream() <<
"??_R2";
4349 Mangler.mangleName(Derived);
4350 Mangler.getStream() <<
"8";
4353void MicrosoftMangleContextImpl::mangleCXXRTTIClassHierarchyDescriptor(
4354 const CXXRecordDecl *Derived, raw_ostream &Out) {
4355 msvc_hashing_ostream MHO(Out);
4356 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4357 Mangler.getStream() <<
"??_R3";
4358 Mangler.mangleName(Derived);
4359 Mangler.getStream() <<
"8";
4362void MicrosoftMangleContextImpl::mangleCXXRTTICompleteObjectLocator(
4363 const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
4369 llvm::SmallString<64> VFTableMangling;
4370 llvm::raw_svector_ostream Stream(VFTableMangling);
4371 mangleCXXVFTable(Derived, BasePath, Stream);
4373 if (VFTableMangling.starts_with(
"??@")) {
4374 assert(VFTableMangling.ends_with(
"@"));
4375 Out << VFTableMangling <<
"??_R4@";
4379 assert(VFTableMangling.starts_with(
"??_7") ||
4380 VFTableMangling.starts_with(
"??_S"));
4382 Out <<
"??_R4" << VFTableMangling.str().drop_front(4);
4385void MicrosoftMangleContextImpl::mangleSEHFilterExpression(
4386 GlobalDecl EnclosingDecl, raw_ostream &Out) {
4387 msvc_hashing_ostream MHO(Out);
4388 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4393 Mangler.getStream() <<
"?filt$" << SEHFilterIds[EnclosingDecl]++ <<
"@0@";
4394 Mangler.mangleName(EnclosingDecl);
4397void MicrosoftMangleContextImpl::mangleSEHFinallyBlock(
4398 GlobalDecl EnclosingDecl, raw_ostream &Out) {
4399 msvc_hashing_ostream MHO(Out);
4400 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4405 Mangler.getStream() <<
"?fin$" << SEHFinallyIds[EnclosingDecl]++ <<
"@0@";
4406 Mangler.mangleName(EnclosingDecl);
4409void MicrosoftMangleContextImpl::mangleCanonicalTypeName(
4410 QualType
T, raw_ostream &Out,
bool NormalizeIntegers =
false) {
4413 MicrosoftCXXNameMangler Mangler(*
this, Out);
4414 Mangler.getStream() <<
'?';
4415 Mangler.mangleType(
T.getCanonicalType(), SourceRange());
4418void MicrosoftMangleContextImpl::mangleReferenceTemporary(
4419 const VarDecl *VD,
unsigned ManglingNumber, raw_ostream &Out) {
4420 msvc_hashing_ostream MHO(Out);
4421 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4423 Mangler.getStream() <<
"?";
4424 Mangler.mangleSourceName(
"$RT" + llvm::utostr(ManglingNumber));
4425 Mangler.mangle(VD,
"");
4428void MicrosoftMangleContextImpl::mangleThreadSafeStaticGuardVariable(
4429 const VarDecl *VD,
unsigned GuardNum, raw_ostream &Out) {
4430 msvc_hashing_ostream MHO(Out);
4431 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4433 Mangler.getStream() <<
"?";
4434 Mangler.mangleSourceName(
"$TSS" + llvm::utostr(GuardNum));
4435 Mangler.mangleNestedName(VD);
4436 Mangler.getStream() <<
"@4HA";
4439void MicrosoftMangleContextImpl::mangleStaticGuardVariable(
const VarDecl *VD,
4451 msvc_hashing_ostream MHO(Out);
4452 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4456 Mangler.getStream() << (VD->
getTLSKind() ?
"??__J" :
"??_B");
4458 Mangler.getStream() <<
"?$S1@";
4460 unsigned ScopeDepth = 0;
4461 if (Visible && !getNextDiscriminator(VD, ScopeDepth))
4465 Mangler.mangle(VD,
"");
4467 Mangler.mangleNestedName(VD);
4468 Mangler.getStream() << (Visible ?
"@5" :
"@4IA");
4470 Mangler.mangleNumber(ScopeDepth);
4473void MicrosoftMangleContextImpl::mangleInitFiniStub(
const VarDecl *D,
4476 msvc_hashing_ostream MHO(Out);
4477 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4478 Mangler.getStream() <<
"??__" << CharCode;
4480 Mangler.getStream() <<
'?';
4481 Mangler.mangleName(D);
4482 Mangler.mangleVariableEncoding(D);
4483 Mangler.getStream() <<
"@@";
4485 Mangler.mangleName(D);
4489 Mangler.getStream() <<
"YAXXZ";
4492void MicrosoftMangleContextImpl::mangleDynamicInitializer(
const VarDecl *D,
4495 mangleInitFiniStub(D,
'E', Out);
4499MicrosoftMangleContextImpl::mangleDynamicAtExitDestructor(
const VarDecl *D,
4502 mangleInitFiniStub(D,
'F', Out);
4505void MicrosoftMangleContextImpl::mangleStringLiteral(
const StringLiteral *SL,
4526 MicrosoftCXXNameMangler Mangler(*
this, Out);
4527 Mangler.getStream() <<
"??_C@_";
4535 unsigned StringLength =
4536 getASTContext().getAsConstantArrayType(SL->
getType())->getZExtSize();
4541 Mangler.getStream() <<
'1';
4543 Mangler.getStream() <<
'0';
4547 Mangler.mangleNumber(StringByteLength);
4549 auto GetLittleEndianByte = [&SL](
unsigned Index) {
4551 if (Index / CharByteWidth >= SL->
getLength())
4552 return static_cast<char>(0);
4554 unsigned OffsetInCodeUnit = Index % CharByteWidth;
4555 return static_cast<char>((CodeUnit >> (8 * OffsetInCodeUnit)) & 0xff);
4558 auto GetBigEndianByte = [&SL](
unsigned Index) {
4560 if (Index / CharByteWidth >= SL->
getLength())
4561 return static_cast<char>(0);
4563 unsigned OffsetInCodeUnit = (CharByteWidth - 1) - (Index % CharByteWidth);
4564 return static_cast<char>((CodeUnit >> (8 * OffsetInCodeUnit)) & 0xff);
4569 for (
unsigned I = 0, E = StringByteLength; I != E; ++I)
4570 JC.update(GetLittleEndianByte(I));
4574 Mangler.mangleNumber(JC.getCRC());
4580 auto MangleByte = [&Mangler](
char Byte) {
4588 Mangler.getStream() << Byte;
4589 }
else if (
isLetter(Byte & 0x7f)) {
4590 Mangler.getStream() <<
'?' <<
static_cast<char>(Byte & 0x7f);
4592 const char SpecialChars[] = {
',',
'/',
'\\',
':',
'.',
4593 ' ',
'\n',
'\t',
'\'',
'-'};
4594 const char *Pos = llvm::find(SpecialChars, Byte);
4595 if (Pos != std::end(SpecialChars)) {
4596 Mangler.getStream() <<
'?' << (Pos - std::begin(SpecialChars));
4598 Mangler.getStream() <<
"?$";
4599 Mangler.getStream() <<
static_cast<char>(
'A' + ((Byte >> 4) & 0xf));
4600 Mangler.getStream() <<
static_cast<char>(
'A' + (Byte & 0xf));
4606 unsigned MaxBytesToMangle = SL->
isWide() ? 64U : 32U;
4607 unsigned NumBytesToMangle = std::min(MaxBytesToMangle, StringByteLength);
4608 for (
unsigned I = 0; I != NumBytesToMangle; ++I) {
4610 MangleByte(GetBigEndianByte(I));
4612 MangleByte(GetLittleEndianByte(I));
4615 Mangler.getStream() <<
'@';
4618void MicrosoftCXXNameMangler::mangleAutoReturnType(
const MemberPointerType *
T,
4621 manglePointerCVQualifiers(Quals);
4622 manglePointerExtQualifiers(Quals, PointeeType);
4623 if (
const FunctionProtoType *FPT = PointeeType->
getAs<FunctionProtoType>()) {
4625 mangleName(
T->getMostRecentCXXRecordDecl());
4626 mangleFunctionType(FPT,
nullptr,
true);
4629 mangleName(
T->getMostRecentCXXRecordDecl());
4630 mangleAutoReturnType(PointeeType, QMM_Drop);
4634void MicrosoftCXXNameMangler::mangleAutoReturnType(
const PointerType *
T,
4638 "Unexpected address space mangling required");
4640 manglePointerCVQualifiers(Quals);
4641 manglePointerExtQualifiers(Quals, PointeeType);
4643 if (
const FunctionProtoType *FPT = PointeeType->
getAs<FunctionProtoType>()) {
4645 mangleFunctionType(FPT);
4647 mangleAutoReturnType(PointeeType, QMM_Mangle);
4651void MicrosoftCXXNameMangler::mangleAutoReturnType(
const LValueReferenceType *
T,
4656 manglePointerExtQualifiers(Quals, PointeeType);
4657 mangleAutoReturnType(PointeeType, QMM_Mangle);
4660void MicrosoftCXXNameMangler::mangleAutoReturnType(
const RValueReferenceType *
T,
4665 manglePointerExtQualifiers(Quals, PointeeType);
4666 mangleAutoReturnType(PointeeType, QMM_Mangle);
4672 return new MicrosoftMangleContextImpl(Context, Diags, IsAux);
Enums/classes describing ABI related information about constructors, destructors and thunks.
Defines the clang::ASTContext interface.
Defines the C++ Decl subclasses, other than those for templates (found in DeclTemplate....
This file defines OpenMP nodes for declarative directives.
Defines the C++ template declaration subclasses.
Defines the clang::Expr interface and subclasses for C++ expressions.
static const GlobalDecl isTemplate(GlobalDecl GD, const TemplateArgumentList *&TemplateArgs)
static unsigned getCharWidth(tok::TokenKind kind, const TargetInfo &Target)
llvm::MachO::Record Record
static ValueDecl * getAsArrayToPointerDecayedDecl(QualType T, const APValue &V)
If value V (with type T) represents a decayed pointer to the first element of an array,...
static void mangleThunkThisAdjustment(AccessSpecifier AS, const ThisAdjustment &Adjustment, MicrosoftCXXNameMangler &Mangler, raw_ostream &Out)
static StringRef getTriple(const Command &Job)
Defines the clang::Preprocessor interface.
static bool hasAttr(const Decl *D, bool IgnoreImplicitAttr)
Defines the SourceManager interface.
APValue - This class implements a discriminated union of [uninitialized] [APSInt] [APFloat],...
APValue & getVectorElt(unsigned I)
@ 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 ...
TypedefNameDecl * getTypedefNameForUnnamedTagDecl(const TagDecl *TD)
bool addressSpaceMapManglingFor(LangAS AS) const
const clang::PrintingPolicy & getPrintingPolicy() const
DeclaratorDecl * getDeclaratorForUnnamedTagDecl(const TagDecl *TD)
unsigned getTargetAddressSpace(LangAS AS) const
CharUnits getVBPtrOffset() const
getVBPtrOffset - Get the offset for virtual base table pointer.
Represents an array type, per C99 6.7.5.2 - Array Declarators.
QualType getElementType() const
Represents a block literal declaration, which is like an unnamed FunctionDecl.
bool isImplicitObjectMemberFunction() const
[C++2b][dcl.fct]/p7 An implicit object member function is a non-static member function without an exp...
const CXXRecordDecl * getParent() const
Return the parent of this method declaration, which is the class in which this method is defined.
Decl * getLambdaContextDecl() const
Retrieve the declaration that provides additional context for a lambda, when the normal declaration c...
CXXRecordDecl * getMostRecentDecl()
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 ...
MSInheritanceModel getMSInheritanceModel() const
Returns the inheritance model used for this record.
bool nullFieldOffsetIsZero() const
In the Microsoft C++ ABI, use zero for the field offset of a null data member pointer if we can guara...
QuantityType getQuantity() const
Get the raw integer representation of this quantity.
Represents a class template specialization, which refers to a class template with a given set of temp...
llvm::APInt getSize() const
Return the constant array size as an APInt.
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 isTranslationUnit() const
DeclContext * getRedeclContext()
getRedeclContext - Retrieve the context in which an entity conflicts with other entities of the same ...
bool isFunctionOrMethod() const
Returns true if this DeclContext is a function, Objective-C method, or block, or a DeclContext that c...
Decl - This represents one declaration (or definition), e.g.
SourceLocation getLocation() const
DeclContext * getDeclContext()
AccessSpecifier getAccess() const
IdentifierInfo * getAsIdentifierInfo() const
Retrieve the IdentifierInfo * stored in this declaration name, or null if this declaration name isn't...
@ CXXConversionFunctionName
NameKind getNameKind() const
Determine what kind of name this is.
Expr * getSizeExpr() 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.
This represents one expression.
std::optional< llvm::APSInt > getIntegerConstantExpr(const ASTContext &Ctx, bool AllowRelaxedEval=false) const
isIntegerConstantExpr - Return the value if this expression is a valid integer constant expression.
SourceLocation getExprLoc() const LLVM_READONLY
getExprLoc - Return the preferred location for the arrow when diagnosing a problem with a generic exp...
Represents a function declaration or definition.
const ParmVarDecl * getParamDecl(unsigned i) const
FunctionTemplateDecl * getPrimaryTemplate() const
Retrieve the primary template that this function template specialization either specializes or was in...
FunctionDecl * getCanonicalDecl() override
Retrieves the "canonical" declaration of the given declaration.
const TemplateArgumentList * getTemplateSpecializationArgs() const
Retrieve the template arguments used to produce this function template specialization from the primar...
bool isExternC() const
Determines whether this function is a function with external, C linkage.
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
Represents a prototype with parameter type info, e.g.
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...
CanThrowResult canThrow() const
Determine whether this function type has a non-throwing exception specification.
bool isVariadic() const
Whether this function prototype is variadic.
RefQualifierKind getRefQualifier() const
Retrieve the ref-qualifier associated with this function type.
FunctionDecl * getTemplatedDecl() const
Get the underlying function declaration of the template.
FunctionType - C99 6.7.5.3 - Function Declarators.
CallingConv getCallConv() const
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
StringRef getName() const
Return the actual identifier string.
An lvalue reference type, per C++11 [dcl.ref].
A pointer to member type per C++ 8.3.3 - Pointers to members.
static MicrosoftMangleContext * create(ASTContext &Context, DiagnosticsEngine &Diags, bool IsAux=false)
MicrosoftMangleContext(ASTContext &C, DiagnosticsEngine &D, bool IsAux=false)
MethodVFTableLocation getMethodVFTableLocation(GlobalDecl GD)
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 isExternallyVisible() const
NonTypeTemplateParmDecl - Declares a non-type template parameter, e.g., "Size" in.
Represents an Objective-C protocol declaration.
Represents a parameter to a function.
unsigned getFunctionScopeIndex() const
Returns the index of this parameter in its prototype or method scope.
bool isExplicitObjectParameter() const
bool isAddressDiscriminated() const
unsigned getExtraDiscriminator() const
PointerType - C99 6.7.5.1 - Pointer Declarators.
A (possibly-)qualified type.
QualType getDesugaredType(const ASTContext &Context) const
Return the specified type with any "sugar" removed from the type.
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.
QualType getCanonicalType() const
QualType getUnqualifiedType() const
Retrieve the unqualified variant of the given type, removing as little sugar as possible.
void * getAsOpaquePtr() const
Qualifiers getLocalQualifiers() const
Retrieve the set of qualifiers local to this particular QualType instance, not including any qualifie...
The collection of all-type qualifiers we support.
@ 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.
bool hasUnaligned() const
bool hasAddressSpace() const
PointerAuthQualifier getPointerAuth() const
bool hasObjCLifetime() const
ObjCLifetime getObjCLifetime() const
Qualifiers withoutObjCLifetime() const
LangAS getAddressSpace() const
An rvalue reference type, per C++11 [dcl.ref].
field_range fields() const
bool isAnonymousStructOrUnion() const
Whether this is an anonymous struct or union.
decl_type * getFirstDecl()
Return the first declaration of this declaration or itself if this is the only declaration.
This class handles loading and caching of source files into memory.
OptionalFileEntryRef getFileEntryRefForID(FileID FID) const
Returns the FileEntryRef for the provided FileID.
FileID getMainFileID() const
Returns the FileID of the main source file.
A trivial tuple used to represent a source range.
SourceRange getSourceRange() const LLVM_READONLY
SourceLocation tokens are not useful in isolation - they are low level value objects created/interpre...
const char * getStmtClassName() const
unsigned getLength() const
uint32_t getCodeUnit(size_t I) const
Return the code unit at the given position.
unsigned getCharByteWidth() const
Represents the declaration of a struct/union/class/enum.
TagDecl * getDefinition() const
Returns the TagDecl that actually defines this struct/union/class/enum.
TypedefNameDecl * getTypedefNameForAnonDecl() const
TagKind getTagKind() const
A template argument list.
unsigned size() const
Retrieve the number of template arguments in this template argument list.
Represents a template argument.
ArrayRef< TemplateArgument > getPackAsArray() const
Return the array of arguments in this template argument pack.
QualType getStructuralValueType() const
Get the type of a StructuralValue.
QualType getParamTypeForDecl() const
Expr * getAsExpr() const
Retrieve the template argument as an expression.
QualType getNonTypeTemplateArgumentType() const
If this is a non-type template argument, get its type.
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.
QualType getIntegralType() const
Retrieve the type of the integral value.
ValueDecl * getAsDecl() const
Retrieve the declaration for a declaration non-type template argument.
@ 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.
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.
TemplateDecl * getAsTemplateDecl(bool IgnoreDeduced=false) const
Retrieve the underlying template declaration that this template name refers to, if known.
NamedDecl * getParam(unsigned Idx)
bool isBlockPointerType() const
CXXRecordDecl * getAsCXXRecordDecl() const
Retrieves the CXXRecordDecl that this type refers to, either because the type is a RecordType or beca...
RecordDecl * getAsRecordDecl() const
Retrieves the RecordDecl this type refers to.
bool isPointerType() const
const T * castAs() const
Member-template castAs<specific type>.
bool isReferenceType() const
QualType getPointeeType() const
If this is a pointer, ObjC object pointer, or block pointer, this returns the respective pointee.
AutoType * getContainedAutoType() const
Get the AutoType whose type will be deduced for a variable with an initializer of this type.
bool isMemberDataPointerType() const
bool isMemberPointerType() const
const ArrayType * getAsArrayTypeUnsafe() const
A variant of getAs<> for array types which silently discards qualifiers from the outermost type.
bool isFunctionType() const
bool isAnyPointerType() const
TypeClass getTypeClass() const
const T * getAs() const
Member-template getAs<specific type>'.
bool isRecordType() const
Represent the declaration of a variable (in which case it is an lvalue) a function (in which case it ...
TLSKind getTLSKind() const
SourceRange getSourceRange() const override LLVM_READONLY
Source range that this declaration covers.
bool isStaticDataMember() const
Determines whether this is a static data member.
bool isStaticLocal() const
Returns true if a variable with function scope is a static local variable.
bool isExternC() const
Determines whether this variable is a variable with external, C linkage.
Represents a variable template specialization, which refers to a variable template with a given set o...
Defines the clang::TargetInfo interface.
@ 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.
Top level wrappers for InstallAPI frontend operations.
OverloadedOperatorKind
Enumeration specifying the different kinds of C++ overloaded operators.
@ OO_None
Not an overloaded operator.
@ NUM_OVERLOADED_OPERATORS
CXXCtorType
C++ constructor types.
@ Ctor_DefaultClosure
Default closure variant of a ctor.
@ Ctor_CopyingClosure
Copying closure variant of a ctor.
@ Ctor_Complete
Complete object ctor.
bool isa(CodeGen::Address addr)
CustomizableOptional< FileEntryRef > OptionalFileEntryRef
LLVM_READONLY bool isAsciiIdentifierContinue(unsigned char c)
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 (&&).
bool inheritanceModelHasNVOffsetField(bool IsMemberFunction, MSInheritanceModel Inheritance)
AccessSpecifier
A C++ access specifier (public, private, protected), plus the special value "none" which means differ...
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.
bool inheritanceModelHasVBPtrOffsetField(MSInheritanceModel Inheritance)
LLVM_READONLY bool isLetter(unsigned char c)
Return true if this character is an ASCII letter: [a-zA-Z].
bool inheritanceModelHasVBTableOffsetField(MSInheritanceModel Inheritance)
@ Default
Set to the current date and time.
@ Result
The result type of a method or function.
const FunctionProtoType * T
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.
TagTypeKind
The kind of a tag type.
LangAS
Defines the address space values used by the address space qualifier of QualType.
bool isPtrSizeAddressSpace(LangAS AS)
MSInheritanceModel
Assigned inheritance model for a class in the MS C++ ABI.
CallingConv
CallingConv - Specifies the calling convention that a function uses.
U cast(CodeGen::Address addr)
int const char * function
__builtin_bitreverse32 uint32_t __builtin_riscv_aaddu_u32 __builtin_riscv_asubu_u32 __builtin_elementwise_add_sat __builtin_elementwise_sub_sat int32_t
const CXXRecordDecl * VBase
If nonnull, holds the last vbase which contains the vfptr that the method definition is adjusted to.
CharUnits VFPtrOffset
This is the offset of the vfptr from the start of the last vbase, or the complete type if there are n...
uint64_t VBTableIndex
If nonzero, holds the vbtable index of the virtual base with the vfptr.
uint64_t Index
Method's index in the vftable.
A this pointer adjustment.
union clang::ThisAdjustment::VirtualAdjustment Virtual
int64_t NonVirtual
The non-virtual adjustment from the derived object to its nearest virtual base.
ThisAdjustment This
The this pointer adjustment.
const CXXMethodDecl * Method
Holds a pointer to the overridden method this thunk is for, if needed by the ABI to distinguish diffe...
ReturnAdjustment Return
The return adjustment.
int32_t VtordispOffset
The offset of the vtordisp (in bytes), relative to the ECX.
struct clang::ThisAdjustment::VirtualAdjustment::@312251255113040203233347230177110330127151157305 Microsoft
int32_t VBOffsetOffset
The offset (in bytes) of the vbase offset in the vbtable.
int32_t VBPtrOffset
The offset of the vbptr of the derived class (in bytes), relative to the ECX after vtordisp adjustmen...