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)");
2175void MicrosoftCXXNameMangler::mangleObjCProtocol(
const ObjCProtocolDecl *PD) {
2176 llvm::SmallString<64> TemplateMangling;
2177 llvm::raw_svector_ostream Stream(TemplateMangling);
2178 MicrosoftCXXNameMangler
Extra(Context, Stream);
2181 Extra.mangleSourceName(
"Protocol");
2182 Extra.mangleArtificialTagType(TagTypeKind::Struct, PD->
getName());
2184 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__ObjC"});
2187void MicrosoftCXXNameMangler::mangleObjCLifetime(
const QualType
Type,
2189 SourceRange Range) {
2190 llvm::SmallString<64> TemplateMangling;
2191 llvm::raw_svector_ostream Stream(TemplateMangling);
2192 MicrosoftCXXNameMangler
Extra(Context, Stream);
2200 Extra.mangleSourceName(
"Autoreleasing");
2203 Extra.mangleSourceName(
"Strong");
2206 Extra.mangleSourceName(
"Weak");
2209 Extra.manglePointerCVQualifiers(Quals);
2210 Extra.manglePointerExtQualifiers(Quals,
Type);
2213 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__ObjC"});
2216void MicrosoftCXXNameMangler::mangleObjCKindOfType(
const ObjCObjectType *
T,
2218 SourceRange Range) {
2219 llvm::SmallString<64> TemplateMangling;
2220 llvm::raw_svector_ostream Stream(TemplateMangling);
2221 MicrosoftCXXNameMangler
Extra(Context, Stream);
2224 Extra.mangleSourceName(
"KindOf");
2225 Extra.mangleType(QualType(
T, 0)
2226 .stripObjCKindOfType(getASTContext())
2227 ->castAs<ObjCObjectType>(),
2230 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__ObjC"});
2233void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
2291 if (HasConst && HasVolatile) {
2293 }
else if (HasVolatile) {
2295 }
else if (HasConst) {
2301 if (HasConst && HasVolatile) {
2303 }
else if (HasVolatile) {
2305 }
else if (HasConst) {
2316MicrosoftCXXNameMangler::mangleRefQualifier(
RefQualifierKind RefQualifier) {
2319 switch (RefQualifier) {
2333void MicrosoftCXXNameMangler::manglePointerExtQualifiers(Qualifiers Quals,
2334 QualType PointeeType) {
2336 bool is64Bit = PointeeType.
isNull() ? PointersAre64Bit :
2349void MicrosoftCXXNameMangler::manglePointerAuthQualifier(Qualifiers Quals) {
2355 mangleNumber(PointerAuth.
getKey());
2360void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) {
2368 if (HasConst && HasVolatile) {
2370 }
else if (HasVolatile) {
2372 }
else if (HasConst) {
2379void MicrosoftCXXNameMangler::mangleFunctionArgumentType(QualType
T,
2380 SourceRange Range) {
2389 if (
const auto *DT =
T->
getAs<DecayedType>()) {
2390 QualType OriginalType = DT->getOriginalType();
2393 if (
const auto *AT = getASTContext().getAsArrayType(OriginalType))
2394 OriginalType = getASTContext().getIncompleteArrayType(
2395 AT->getElementType(), AT->getSizeModifier(),
2396 AT->getIndexTypeCVRQualifiers());
2407 TypePtr =
T.getCanonicalType().getAsOpaquePtr();
2410 ArgBackRefMap::iterator
Found = FunArgBackReferences.find(TypePtr);
2412 if (
Found == FunArgBackReferences.end()) {
2413 size_t OutSizeBefore =
Out.tell();
2415 mangleType(
T, Range, QMM_Drop);
2420 bool LongerThanOneChar = (
Out.tell() - OutSizeBefore > 1);
2421 if (LongerThanOneChar && FunArgBackReferences.size() < 10) {
2422 size_t Size = FunArgBackReferences.size();
2423 FunArgBackReferences[TypePtr] =
Size;
2430void MicrosoftCXXNameMangler::manglePassObjectSizeArg(
2431 const PassObjectSizeAttr *POSA) {
2432 int Type = POSA->getType();
2433 bool Dynamic = POSA->isDynamic();
2435 auto Iter = PassObjectSizeArgs.insert({
Type,
Dynamic}).first;
2436 auto *TypePtr = (
const void *)&*Iter;
2437 ArgBackRefMap::iterator
Found = FunArgBackReferences.find(TypePtr);
2439 if (
Found == FunArgBackReferences.end()) {
2441 Dynamic ?
"__pass_dynamic_object_size" :
"__pass_object_size";
2442 mangleArtificialTagType(TagTypeKind::Enum, Name + llvm::utostr(
Type),
2445 if (FunArgBackReferences.size() < 10) {
2446 size_t Size = FunArgBackReferences.size();
2447 FunArgBackReferences[TypePtr] =
Size;
2454void MicrosoftCXXNameMangler::mangleAddressSpaceType(QualType
T,
2456 SourceRange Range) {
2474 llvm::SmallString<32> ASMangling;
2475 llvm::raw_svector_ostream Stream(ASMangling);
2476 MicrosoftCXXNameMangler
Extra(Context, Stream);
2482 Extra.mangleSourceName(
"_AS");
2483 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(TargetAS));
2487 llvm_unreachable(
"Not a language specific address space");
2488 case LangAS::opencl_global:
2489 Extra.mangleSourceName(
"_ASCLglobal");
2491 case LangAS::opencl_global_device:
2492 Extra.mangleSourceName(
"_ASCLdevice");
2494 case LangAS::opencl_global_host:
2495 Extra.mangleSourceName(
"_ASCLhost");
2497 case LangAS::opencl_local:
2498 Extra.mangleSourceName(
"_ASCLlocal");
2500 case LangAS::opencl_constant:
2501 Extra.mangleSourceName(
"_ASCLconstant");
2503 case LangAS::opencl_private:
2504 Extra.mangleSourceName(
"_ASCLprivate");
2506 case LangAS::opencl_generic:
2507 Extra.mangleSourceName(
"_ASCLgeneric");
2509 case LangAS::sycl_global:
2510 Extra.mangleSourceName(
"_ASSYglobal");
2512 case LangAS::sycl_global_device:
2513 Extra.mangleSourceName(
"_ASSYdevice");
2515 case LangAS::sycl_global_host:
2516 Extra.mangleSourceName(
"_ASSYhost");
2518 case LangAS::sycl_local:
2519 Extra.mangleSourceName(
"_ASSYlocal");
2521 case LangAS::sycl_private:
2522 Extra.mangleSourceName(
"_ASSYprivate");
2524 case LangAS::sycl_generic:
2525 Extra.mangleSourceName(
"_ASSYgeneric");
2527 case LangAS::sycl_constant:
2528 Extra.mangleSourceName(
"_ASSYconstant");
2530 case LangAS::cuda_device:
2531 Extra.mangleSourceName(
"_ASCUdevice");
2533 case LangAS::cuda_constant:
2534 Extra.mangleSourceName(
"_ASCUconstant");
2536 case LangAS::cuda_shared:
2537 Extra.mangleSourceName(
"_ASCUshared");
2539 case LangAS::ptr32_sptr:
2540 case LangAS::ptr32_uptr:
2542 llvm_unreachable(
"don't mangle ptr address spaces with _AS");
2546 Extra.mangleType(
T, Range, QMM_Escape);
2547 mangleQualifiers(Qualifiers(),
false);
2548 mangleArtificialTagType(TagTypeKind::Struct, ASMangling, {
"__clang"});
2551void MicrosoftCXXNameMangler::mangleAutoReturnType(QualType
T,
2552 QualifierMangleMode QMM) {
2553 assert(getASTContext().getLangOpts().isCompatibleWithMSVC(
2554 LangOptions::MSVC2019) &&
2555 "Cannot mangle MSVC 2017 auto return types!");
2559 Qualifiers Quals =
T.getLocalQualifiers();
2561 if (QMM == QMM_Result)
2563 if (QMM != QMM_Drop)
2564 mangleQualifiers(Quals,
false);
2565 Out << (AT->isDecltypeAuto() ?
"_T" :
"_P");
2569 T =
T.getDesugaredType(getASTContext());
2570 Qualifiers Quals =
T.getLocalQualifiers();
2577 mangleQualifiers(Quals,
false);
2580 llvm_unreachable(
"QMM_Escape unexpected");
2583 const Type *ty =
T.getTypePtr();
2585 case Type::MemberPointer:
2591 case Type::LValueReference:
2594 case Type::RValueReference:
2598 llvm_unreachable(
"Invalid type expected");
2602void MicrosoftCXXNameMangler::mangleType(QualType
T, SourceRange Range,
2603 QualifierMangleMode QMM) {
2606 T =
T.getDesugaredType(getASTContext());
2607 Qualifiers Quals =
T.getLocalQualifiers();
2609 if (
const ArrayType *AT = getASTContext().getAsArrayType(
T)) {
2612 if (QMM == QMM_Mangle)
2614 else if (QMM == QMM_Escape || QMM == QMM_Result)
2616 mangleArrayType(AT);
2629 if (
const FunctionType *FT = dyn_cast<FunctionType>(
T)) {
2631 mangleFunctionType(FT);
2634 mangleQualifiers(Quals,
false);
2637 if (!IsPointer && Quals) {
2639 mangleQualifiers(Quals,
false);
2647 if ((!IsPointer && Quals) ||
isa<TagType>(
T) || isArtificialTagType(
T)) {
2649 mangleQualifiers(Quals,
false);
2654 const Type *ty =
T.getTypePtr();
2657#define ABSTRACT_TYPE(CLASS, PARENT)
2658#define NON_CANONICAL_TYPE(CLASS, PARENT) \
2660 llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
2662#define TYPE(CLASS, PARENT) \
2664 mangleType(cast<CLASS##Type>(ty), Quals, Range); \
2666#include "clang/AST/TypeNodes.inc"
2668#undef NON_CANONICAL_TYPE
2673void MicrosoftCXXNameMangler::mangleType(
const BuiltinType *
T, Qualifiers,
2674 SourceRange Range) {
2702 switch (
T->getKind()) {
2703 case BuiltinType::Void:
2706 case BuiltinType::SChar:
2709 case BuiltinType::Char_U:
2710 case BuiltinType::Char_S:
2713 case BuiltinType::UChar:
2716 case BuiltinType::Short:
2719 case BuiltinType::UShort:
2722 case BuiltinType::Int:
2725 case BuiltinType::UInt:
2728 case BuiltinType::Long:
2731 case BuiltinType::ULong:
2734 case BuiltinType::Float:
2737 case BuiltinType::Double:
2741 case BuiltinType::LongDouble:
2744 case BuiltinType::LongLong:
2747 case BuiltinType::ULongLong:
2750 case BuiltinType::Int128:
2753 case BuiltinType::UInt128:
2756 case BuiltinType::Bool:
2759 case BuiltinType::Char8:
2762 case BuiltinType::Char16:
2765 case BuiltinType::Char32:
2768 case BuiltinType::WChar_S:
2769 case BuiltinType::WChar_U:
2773#define BUILTIN_TYPE(Id, SingletonId)
2774#define PLACEHOLDER_TYPE(Id, SingletonId) \
2775 case BuiltinType::Id:
2776#include "clang/AST/BuiltinTypes.def"
2777 case BuiltinType::Dependent:
2778 llvm_unreachable(
"placeholder types shouldn't get to name mangling");
2780 case BuiltinType::ObjCId:
2781 mangleArtificialTagType(TagTypeKind::Struct,
"objc_object");
2783 case BuiltinType::ObjCClass:
2784 mangleArtificialTagType(TagTypeKind::Struct,
"objc_class");
2786 case BuiltinType::ObjCSel:
2787 mangleArtificialTagType(TagTypeKind::Struct,
"objc_selector");
2790#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2791 case BuiltinType::Id: \
2792 Out << "PAUocl_" #ImgType "_" #Suffix "@@"; \
2794#include "clang/Basic/OpenCLImageTypes.def"
2795 case BuiltinType::OCLSampler:
2797 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_sampler");
2799 case BuiltinType::OCLEvent:
2801 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_event");
2803 case BuiltinType::OCLClkEvent:
2805 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_clkevent");
2807 case BuiltinType::OCLQueue:
2809 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_queue");
2811 case BuiltinType::OCLReserveID:
2813 mangleArtificialTagType(TagTypeKind::Struct,
"ocl_reserveid");
2815#define EXT_OPAQUE_TYPE(ExtType, Id, Ext) \
2816 case BuiltinType::Id: \
2817 mangleArtificialTagType(TagTypeKind::Struct, "ocl_" #ExtType); \
2819#include "clang/Basic/OpenCLExtensionTypes.def"
2821 case BuiltinType::NullPtr:
2825 case BuiltinType::Float16:
2826 mangleArtificialTagType(TagTypeKind::Struct,
"_Float16", {
"__clang"});
2829 case BuiltinType::Half:
2830 if (!getASTContext().getLangOpts().
HLSL)
2831 mangleArtificialTagType(TagTypeKind::Struct,
"_Half", {
"__clang"});
2832 else if (getASTContext().getLangOpts().NativeHalfType)
2838 case BuiltinType::BFloat16:
2839 mangleArtificialTagType(TagTypeKind::Struct,
"__bf16", {
"__clang"});
2842 case BuiltinType::MFloat8:
2843 mangleArtificialTagType(TagTypeKind::Struct,
"__mfp8", {
"__clang"});
2846#define WASM_REF_TYPE(InternalName, MangledName, Id, SingletonId, AS) \
2847 case BuiltinType::Id: \
2848 mangleArtificialTagType(TagTypeKind::Struct, MangledName); \
2849 mangleArtificialTagType(TagTypeKind::Struct, MangledName, {"__clang"}); \
2852#include "clang/Basic/WebAssemblyReferenceTypes.def"
2854#define HLSL_INTANGIBLE_TYPE(Name, Id, SingletonId) \
2855 case BuiltinType::Id: \
2856 mangleArtificialTagType(TagTypeKind::Struct, #Name); \
2858#include "clang/Basic/HLSLIntangibleTypes.def"
2860 case BuiltinType::SveBool:
2864 case BuiltinType::SveInt8:
2867 case BuiltinType::SveInt16:
2870 case BuiltinType::SveInt32:
2873 case BuiltinType::SveInt64:
2877 case BuiltinType::SveUint8:
2880 case BuiltinType::SveUint16:
2883 case BuiltinType::SveUint32:
2886 case BuiltinType::SveUint64:
2890 case BuiltinType::SveBFloat16:
2893 case BuiltinType::SveFloat16:
2896 case BuiltinType::SveFloat32:
2899 case BuiltinType::SveFloat64:
2903 case BuiltinType::SveInt8x2:
2906 case BuiltinType::SveInt16x2:
2909 case BuiltinType::SveInt32x2:
2912 case BuiltinType::SveInt64x2:
2916 case BuiltinType::SveUint8x2:
2919 case BuiltinType::SveUint16x2:
2922 case BuiltinType::SveUint32x2:
2925 case BuiltinType::SveUint64x2:
2929 case BuiltinType::SveBFloat16x2:
2932 case BuiltinType::SveFloat16x2:
2935 case BuiltinType::SveFloat32x2:
2938 case BuiltinType::SveFloat64x2:
2942 case BuiltinType::SveInt8x3:
2945 case BuiltinType::SveInt16x3:
2948 case BuiltinType::SveInt32x3:
2951 case BuiltinType::SveInt64x3:
2955 case BuiltinType::SveUint8x3:
2958 case BuiltinType::SveUint16x3:
2961 case BuiltinType::SveUint32x3:
2964 case BuiltinType::SveUint64x3:
2968 case BuiltinType::SveBFloat16x3:
2971 case BuiltinType::SveFloat16x3:
2974 case BuiltinType::SveFloat32x3:
2977 case BuiltinType::SveFloat64x3:
2981 case BuiltinType::SveInt8x4:
2984 case BuiltinType::SveInt16x4:
2987 case BuiltinType::SveInt32x4:
2990 case BuiltinType::SveInt64x4:
2994 case BuiltinType::SveUint8x4:
2997 case BuiltinType::SveUint16x4:
3000 case BuiltinType::SveUint32x4:
3003 case BuiltinType::SveUint64x4:
3007 case BuiltinType::SveBFloat16x4:
3010 case BuiltinType::SveFloat16x4:
3013 case BuiltinType::SveFloat32x4:
3016 case BuiltinType::SveFloat64x4:
3022 case BuiltinType::SveMFloat8:
3023 mangleArtificialTagType(TagTypeKind::Struct,
"__SVMfloat8_t", {
"__clang"});
3026 case BuiltinType::SveMFloat8x2:
3027 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svmfloat8x2_t",
3031 case BuiltinType::SveMFloat8x3:
3032 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svmfloat8x3_t",
3036 case BuiltinType::SveMFloat8x4:
3037 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svmfloat8x4_t",
3041 case BuiltinType::SveBoolx2:
3042 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svboolx2_t",
3046 case BuiltinType::SveBoolx4:
3047 mangleArtificialTagType(TagTypeKind::Struct,
"__clang_svboolx4_t",
3051 case BuiltinType::SveCount:
3052 mangleArtificialTagType(TagTypeKind::Struct,
"__SVCount_t", {
"__clang"});
3055#define SPIRV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
3056#include "clang/Basic/SPIRVTypes.def"
3070void MicrosoftCXXNameMangler::mangleType(
const FunctionProtoType *
T, Qualifiers,
3077 mangleFunctionType(
T,
nullptr,
true);
3080 mangleFunctionType(
T);
3083void MicrosoftCXXNameMangler::mangleType(
const FunctionNoProtoType *
T,
3084 Qualifiers, SourceRange) {
3086 mangleFunctionType(
T);
3089void MicrosoftCXXNameMangler::mangleFunctionType(
const FunctionType *
T,
3090 const FunctionDecl *D,
3091 bool ForceThisQuals,
3092 bool MangleExceptionSpec) {
3095 const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(
T);
3100 bool IsInLambda =
false;
3101 bool IsStructor =
false, HasThisQuals = ForceThisQuals, IsCtorClosure =
false;
3103 if (
const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(D)) {
3107 HasThisQuals =
true;
3116 CC = getASTContext().getDefaultCallingConvention(
3125 manglePointerExtQualifiers(Quals, QualType());
3127 mangleQualifiers(Quals,
false);
3130 mangleCallingConvention(CC, Range);
3135 Out <<
"__clang_sme_attr" << SMEAttrs;
3148 Out << (PointersAre64Bit ?
"PEAXI@Z" :
"PAXI@Z");
3157 if (IsCtorClosure) {
3167 mangleFunctionArgumentType(getASTContext().getLValueReferenceType(
3169 ->
castAs<LValueReferenceType>()
3175 llvm_unreachable(
"unexpected constructor closure!");
3181 }
else if (IsInLambda && isa_and_nonnull<CXXConversionDecl>(D)) {
3192 mangleType(ResultType, Range, QMM_Result);
3193 }
else if (IsInLambda) {
3195 assert(AT->getKeyword() != AutoTypeKeyword::GNUAutoType &&
3196 "shouldn't need to mangle __auto_type!");
3200 mangleSourceName(AT->isDecltypeAuto() ?
"<decltype-auto>" :
"<auto>");
3206 assert(AT->getKeyword() != AutoTypeKeyword::GNUAutoType &&
3207 "shouldn't need to mangle __auto_type!");
3213 auto UseClangMangling = [](QualType ResultType) {
3214 QualType
T = ResultType;
3217 if (
T.getQualifiers().hasAddressSpace())
3223 if (getASTContext().getLangOpts().isCompatibleWithMSVC(
3224 LangOptions::MSVC2019) &&
3225 !UseClangMangling(ResultType)) {
3234 ->
castAs<FunctionProtoType>();
3237 mangleAutoReturnType(ResultType, QMM_Result);
3243 mangleSourceName(AT->isDecltypeAuto() ?
"<decltype-auto>" :
"<auto>");
3249 mangleType(ResultType, Range, QMM_Result);
3265 for (
unsigned I = 0, E = Proto->
getNumParams(); I != E; ++I) {
3270 mangleFunctionArgumentType(Proto->
getParamType(I), Range);
3281 manglePassObjectSizeArg(P);
3290 if (MangleExceptionSpec && getASTContext().getLangOpts().
CPlusPlus17 &&
3291 getASTContext().getLangOpts().isCompatibleWithMSVC(
3292 LangOptions::MSVC2017_5))
3293 mangleThrowSpecification(Proto);
3298void MicrosoftCXXNameMangler::mangleFunctionClass(
const FunctionDecl *FD) {
3323 if (
const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
3333 llvm_unreachable(
"Unsupported access specifier");
3362void MicrosoftCXXNameMangler::mangleCallingConvention(
CallingConv CC,
3363 SourceRange Range) {
3425 if (getASTContext().getLangOpts().RegCall4)
3434void MicrosoftCXXNameMangler::mangleCallingConvention(
const FunctionType *
T,
3435 SourceRange Range) {
3439void MicrosoftCXXNameMangler::mangleThrowSpecification(
3440 const FunctionProtoType *FT) {
3449void MicrosoftCXXNameMangler::mangleType(
const UnresolvedUsingType *
T,
3450 Qualifiers, SourceRange Range) {
3461void MicrosoftCXXNameMangler::mangleTagTypeKind(
TagTypeKind TTK) {
3463 case TagTypeKind::Union:
3466 case TagTypeKind::Struct:
3467 case TagTypeKind::Interface:
3470 case TagTypeKind::Class:
3473 case TagTypeKind::Enum:
3478void MicrosoftCXXNameMangler::mangleType(
const EnumType *
T, Qualifiers,
3482void MicrosoftCXXNameMangler::mangleType(
const RecordType *
T, Qualifiers,
3486void MicrosoftCXXNameMangler::mangleType(
const TagDecl *TD) {
3496void MicrosoftCXXNameMangler::mangleArtificialTagType(
3498 ArrayRef<StringRef> NestedNames) {
3500 mangleTagTypeKind(TK);
3503 mangleSourceName(UnqualifiedName);
3505 for (StringRef N : llvm::reverse(NestedNames))
3506 mangleSourceName(N);
3519void MicrosoftCXXNameMangler::mangleDecayedArrayType(
const ArrayType *
T) {
3522 manglePointerCVQualifiers(
T->getElementType().getQualifiers());
3523 mangleType(
T->getElementType(), SourceRange());
3525void MicrosoftCXXNameMangler::mangleType(
const ConstantArrayType *
T, Qualifiers,
3527 llvm_unreachable(
"Should have been special cased");
3529void MicrosoftCXXNameMangler::mangleType(
const VariableArrayType *
T, Qualifiers,
3531 llvm_unreachable(
"Should have been special cased");
3533void MicrosoftCXXNameMangler::mangleType(
const DependentSizedArrayType *
T,
3534 Qualifiers, SourceRange) {
3535 llvm_unreachable(
"Should have been special cased");
3537void MicrosoftCXXNameMangler::mangleType(
const IncompleteArrayType *
T,
3538 Qualifiers, SourceRange) {
3539 llvm_unreachable(
"Should have been special cased");
3541void MicrosoftCXXNameMangler::mangleArrayType(
const ArrayType *
T) {
3542 QualType ElementTy(
T, 0);
3543 SmallVector<llvm::APInt, 3> Dimensions;
3545 if (ElementTy->isConstantArrayType()) {
3546 const ConstantArrayType *CAT =
3547 getASTContext().getAsConstantArrayType(ElementTy);
3548 Dimensions.push_back(CAT->
getSize());
3550 }
else if (ElementTy->isIncompleteArrayType()) {
3551 const IncompleteArrayType *IAT =
3552 getASTContext().getAsIncompleteArrayType(ElementTy);
3553 Dimensions.push_back(llvm::APInt(32, 0));
3555 }
else if (ElementTy->isVariableArrayType()) {
3556 const VariableArrayType *VAT =
3557 getASTContext().getAsVariableArrayType(ElementTy);
3558 Dimensions.push_back(llvm::APInt(32, 0));
3560 }
else if (ElementTy->isDependentSizedArrayType()) {
3562 const DependentSizedArrayType *DSAT =
3563 getASTContext().getAsDependentSizedArrayType(ElementTy);
3573 mangleNumber(Dimensions.size());
3574 for (
const llvm::APInt &Dimension : Dimensions)
3575 mangleNumber(Dimension.getLimitedValue());
3576 mangleType(ElementTy, SourceRange(), QMM_Escape);
3579void MicrosoftCXXNameMangler::mangleType(
const ArrayParameterType *
T,
3580 Qualifiers, SourceRange) {
3587void MicrosoftCXXNameMangler::mangleType(
const MemberPointerType *
T,
3588 Qualifiers Quals, SourceRange Range) {
3590 manglePointerCVQualifiers(Quals);
3591 manglePointerExtQualifiers(Quals, PointeeType);
3592 if (
const FunctionProtoType *FPT = PointeeType->
getAs<FunctionProtoType>()) {
3594 mangleName(
T->getMostRecentCXXRecordDecl());
3595 mangleFunctionType(FPT,
nullptr,
true);
3598 mangleName(
T->getMostRecentCXXRecordDecl());
3599 mangleType(PointeeType, Range, QMM_Drop);
3603void MicrosoftCXXNameMangler::mangleType(
const TemplateTypeParmType *
T,
3604 Qualifiers, SourceRange Range) {
3607 llvm::SmallString<64> Name;
3609 Name += llvm::utostr(
T->getDepth());
3611 Name += llvm::utostr(
T->getIndex());
3613 mangleSourceName(Name);
3616void MicrosoftCXXNameMangler::mangleType(
const SubstTemplateTypeParmPackType *
T,
3617 Qualifiers, SourceRange Range) {
3621void MicrosoftCXXNameMangler::mangleType(
const SubstBuiltinTemplatePackType *
T,
3622 Qualifiers, SourceRange Range) {
3623 Error(
Range.getBegin(),
"substituted builtin template pack") <<
Range;
3629void MicrosoftCXXNameMangler::mangleType(
const PointerType *
T, Qualifiers Quals,
3630 SourceRange Range) {
3632 manglePointerCVQualifiers(Quals);
3633 manglePointerExtQualifiers(Quals, PointeeType);
3634 manglePointerAuthQualifier(Quals);
3640 mangleType(PointeeType, Range);
3642 mangleAddressSpaceType(PointeeType, PointeeType.
getQualifiers(), Range);
3645void MicrosoftCXXNameMangler::mangleType(
const ObjCObjectPointerType *
T,
3646 Qualifiers Quals, SourceRange Range) {
3655 return mangleObjCLifetime(PointeeType, Quals, Range);
3657 manglePointerCVQualifiers(Quals);
3658 manglePointerExtQualifiers(Quals, PointeeType);
3659 mangleType(PointeeType, Range);
3665void MicrosoftCXXNameMangler::mangleType(
const LValueReferenceType *
T,
3666 Qualifiers Quals, SourceRange Range) {
3670 manglePointerExtQualifiers(Quals, PointeeType);
3671 mangleType(PointeeType, Range);
3677void MicrosoftCXXNameMangler::mangleType(
const RValueReferenceType *
T,
3678 Qualifiers Quals, SourceRange Range) {
3682 manglePointerExtQualifiers(Quals, PointeeType);
3683 mangleType(PointeeType, Range);
3686void MicrosoftCXXNameMangler::mangleType(
const ComplexType *
T, Qualifiers,
3687 SourceRange Range) {
3688 QualType ElementType =
T->getElementType();
3690 llvm::SmallString<64> TemplateMangling;
3691 llvm::raw_svector_ostream Stream(TemplateMangling);
3692 MicrosoftCXXNameMangler
Extra(Context, Stream);
3694 Extra.mangleSourceName(
"_Complex");
3695 Extra.mangleType(ElementType, Range, QMM_Escape);
3697 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3705bool MicrosoftCXXNameMangler::isArtificialTagType(QualType
T)
const {
3706 const Type *ty =
T.getTypePtr();
3711 case Type::Vector: {
3720void MicrosoftCXXNameMangler::mangleType(
const VectorType *
T, Qualifiers Quals,
3721 SourceRange Range) {
3722 QualType EltTy =
T->getElementType();
3723 const BuiltinType *ET = EltTy->
getAs<BuiltinType>();
3724 const BitIntType *BitIntTy = EltTy->
getAs<BitIntType>();
3725 assert((ET || BitIntTy) &&
3726 "vectors with non-builtin/_BitInt elements are unsupported");
3727 uint64_t Width = getASTContext().getTypeSize(
T);
3730 size_t OutSizeBefore =
Out.tell();
3732 if (getASTContext().getTargetInfo().
getTriple().isX86() && ET) {
3733 if (Width == 64 && ET->
getKind() == BuiltinType::LongLong) {
3734 mangleArtificialTagType(TagTypeKind::Union,
"__m64");
3735 }
else if (Width >= 128) {
3736 if (ET->
getKind() == BuiltinType::Float)
3737 mangleArtificialTagType(TagTypeKind::Union,
3738 "__m" + llvm::utostr(Width));
3739 else if (ET->
getKind() == BuiltinType::LongLong)
3740 mangleArtificialTagType(TagTypeKind::Union,
3741 "__m" + llvm::utostr(Width) +
'i');
3742 else if (ET->
getKind() == BuiltinType::Double)
3743 mangleArtificialTagType(TagTypeKind::Struct,
3744 "__m" + llvm::utostr(Width) +
'd');
3749 bool IsBuiltin =
Out.tell() != OutSizeBefore;
3755 llvm::SmallString<64> TemplateMangling;
3756 llvm::raw_svector_ostream Stream(TemplateMangling);
3757 MicrosoftCXXNameMangler
Extra(Context, Stream);
3759 Extra.mangleSourceName(
"__vector");
3760 Extra.mangleType(QualType(ET ?
static_cast<const Type *
>(ET) : BitIntTy, 0),
3762 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumElements()));
3764 mangleArtificialTagType(TagTypeKind::Union, TemplateMangling, {
"__clang"});
3768void MicrosoftCXXNameMangler::mangleType(
const ExtVectorType *
T,
3769 Qualifiers Quals, SourceRange Range) {
3770 mangleType(
static_cast<const VectorType *
>(
T), Quals, Range);
3773void MicrosoftCXXNameMangler::mangleType(
const DependentVectorType *
T,
3774 Qualifiers, SourceRange Range) {
3778void MicrosoftCXXNameMangler::mangleType(
const DependentSizedExtVectorType *
T,
3779 Qualifiers, SourceRange Range) {
3780 Error(
Range.getBegin(),
"dependent-sized extended vector type") <<
Range;
3783void MicrosoftCXXNameMangler::mangleType(
const ConstantMatrixType *
T,
3784 Qualifiers quals, SourceRange Range) {
3785 QualType EltTy =
T->getElementType();
3787 llvm::SmallString<64> TemplateMangling;
3788 llvm::raw_svector_ostream Stream(TemplateMangling);
3789 MicrosoftCXXNameMangler
Extra(Context, Stream);
3793 Extra.mangleSourceName(
"__matrix");
3794 Extra.mangleType(EltTy, Range, QMM_Escape);
3796 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumRows()));
3797 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumColumns()));
3799 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3802void MicrosoftCXXNameMangler::mangleType(
const DependentSizedMatrixType *
T,
3803 Qualifiers quals, SourceRange Range) {
3807void MicrosoftCXXNameMangler::mangleType(
const DependentAddressSpaceType *
T,
3808 Qualifiers, SourceRange Range) {
3812void MicrosoftCXXNameMangler::mangleType(
const ObjCInterfaceType *
T, Qualifiers,
3815 mangleTagTypeKind(TagTypeKind::Struct);
3816 mangleName(
T->getDecl());
3819void MicrosoftCXXNameMangler::mangleType(
const ObjCObjectType *
T,
3820 Qualifiers Quals, SourceRange Range) {
3821 if (
T->isKindOfType())
3822 return mangleObjCKindOfType(
T, Quals, Range);
3824 if (
T->qual_empty() && !
T->isSpecialized())
3825 return mangleType(
T->getBaseType(), Range, QMM_Drop);
3827 ArgBackRefMap OuterFunArgsContext;
3828 ArgBackRefMap OuterTemplateArgsContext;
3829 BackRefVec OuterTemplateContext;
3831 FunArgBackReferences.swap(OuterFunArgsContext);
3832 TemplateArgBackReferences.swap(OuterTemplateArgsContext);
3833 NameBackReferences.swap(OuterTemplateContext);
3835 mangleTagTypeKind(TagTypeKind::Struct);
3839 mangleSourceName(
"objc_object");
3840 else if (
T->isObjCClass())
3841 mangleSourceName(
"objc_class");
3843 mangleSourceName(
T->getInterface()->getName());
3845 for (
const auto &Q :
T->quals())
3846 mangleObjCProtocol(Q);
3848 if (
T->isSpecialized())
3849 for (
const auto &TA :
T->getTypeArgs())
3850 mangleType(TA, Range, QMM_Drop);
3856 FunArgBackReferences.swap(OuterFunArgsContext);
3857 TemplateArgBackReferences.swap(OuterTemplateArgsContext);
3858 NameBackReferences.swap(OuterTemplateContext);
3861void MicrosoftCXXNameMangler::mangleType(
const BlockPointerType *
T,
3862 Qualifiers Quals, SourceRange Range) {
3864 manglePointerCVQualifiers(Quals);
3865 manglePointerExtQualifiers(Quals, PointeeType);
3869 mangleFunctionType(PointeeType->
castAs<FunctionProtoType>());
3872void MicrosoftCXXNameMangler::mangleType(
const InjectedClassNameType *,
3873 Qualifiers, SourceRange) {
3874 llvm_unreachable(
"Cannot mangle injected class name type.");
3877void MicrosoftCXXNameMangler::mangleType(
const TemplateSpecializationType *
T,
3878 Qualifiers, SourceRange Range) {
3882void MicrosoftCXXNameMangler::mangleType(
const DependentNameType *
T, Qualifiers,
3883 SourceRange Range) {
3887void MicrosoftCXXNameMangler::mangleType(
const PackExpansionType *
T, Qualifiers,
3888 SourceRange Range) {
3892void MicrosoftCXXNameMangler::mangleType(
const PackIndexingType *
T,
3893 Qualifiers Quals, SourceRange Range) {
3894 manglePointerCVQualifiers(Quals);
3895 mangleType(
T->getSelectedType(), Range);
3898void MicrosoftCXXNameMangler::mangleType(
const TypeOfType *
T, Qualifiers,
3899 SourceRange Range) {
3903void MicrosoftCXXNameMangler::mangleType(
const TypeOfExprType *
T, Qualifiers,
3904 SourceRange Range) {
3908void MicrosoftCXXNameMangler::mangleType(
const DecltypeType *
T, Qualifiers,
3909 SourceRange Range) {
3913void MicrosoftCXXNameMangler::mangleType(
const UnaryTransformType *
T,
3914 Qualifiers, SourceRange Range) {
3918void MicrosoftCXXNameMangler::mangleType(
const AutoType *
T, Qualifiers,
3919 SourceRange Range) {
3920 assert(
T->getDeducedType().isNull() &&
"expecting a dependent type!");
3925void MicrosoftCXXNameMangler::mangleType(
3926 const DeducedTemplateSpecializationType *
T, Qualifiers, SourceRange Range) {
3927 assert(
T->getDeducedType().isNull() &&
"expecting a dependent type!");
3929 Error(
Range.getBegin(),
"deduced class template specialization type")
3933void MicrosoftCXXNameMangler::mangleType(
const AtomicType *
T, Qualifiers,
3934 SourceRange Range) {
3935 QualType ValueType =
T->getValueType();
3937 llvm::SmallString<64> TemplateMangling;
3938 llvm::raw_svector_ostream Stream(TemplateMangling);
3939 MicrosoftCXXNameMangler
Extra(Context, Stream);
3941 Extra.mangleSourceName(
"_Atomic");
3942 Extra.mangleType(ValueType, Range, QMM_Escape);
3944 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3947void MicrosoftCXXNameMangler::mangleType(
const PipeType *
T, Qualifiers,
3948 SourceRange Range) {
3949 QualType ElementType =
T->getElementType();
3951 llvm::SmallString<64> TemplateMangling;
3952 llvm::raw_svector_ostream Stream(TemplateMangling);
3953 MicrosoftCXXNameMangler
Extra(Context, Stream);
3955 Extra.mangleSourceName(
"ocl_pipe");
3956 Extra.mangleType(ElementType, Range, QMM_Escape);
3957 Extra.mangleIntegerLiteral(llvm::APSInt::get(
T->isReadOnly()));
3959 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
3962void MicrosoftMangleContextImpl::mangleCXXName(GlobalDecl GD,
3965 PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
3966 getASTContext().getSourceManager(),
3967 "Mangling declaration");
3969 msvc_hashing_ostream MHO(Out);
3971 if (
auto *CD = dyn_cast<CXXConstructorDecl>(D)) {
3973 MicrosoftCXXNameMangler mangler(*
this, MHO, CD,
Type);
3974 return mangler.mangle(GD);
3977 if (
auto *DD = dyn_cast<CXXDestructorDecl>(D)) {
3979 MicrosoftCXXNameMangler mangler(*
this, MHO, DD,
Type);
3980 return mangler.mangle(GD);
3983 MicrosoftCXXNameMangler Mangler(*
this, MHO);
3984 return Mangler.mangle(GD);
3987void MicrosoftCXXNameMangler::mangleType(
const BitIntType *
T, Qualifiers,
3988 SourceRange Range) {
3989 llvm::SmallString<64> TemplateMangling;
3990 llvm::raw_svector_ostream Stream(TemplateMangling);
3991 MicrosoftCXXNameMangler
Extra(Context, Stream);
3993 if (
T->isUnsigned())
3994 Extra.mangleSourceName(
"_UBitInt");
3996 Extra.mangleSourceName(
"_BitInt");
3997 Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(
T->getNumBits()));
3999 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
4002void MicrosoftCXXNameMangler::mangleType(
const DependentBitIntType *
T,
4003 Qualifiers, SourceRange Range) {
4007void MicrosoftCXXNameMangler::mangleType(
const HLSLAttributedResourceType *
T,
4008 Qualifiers, SourceRange Range) {
4009 llvm_unreachable(
"HLSL uses Itanium name mangling");
4012void MicrosoftCXXNameMangler::mangleType(
const HLSLInlineSpirvType *
T,
4013 Qualifiers, SourceRange Range) {
4014 llvm_unreachable(
"HLSL uses Itanium name mangling");
4017void MicrosoftCXXNameMangler::mangleType(
const OverflowBehaviorType *
T,
4018 Qualifiers, SourceRange Range) {
4019 QualType UnderlyingType =
T->getUnderlyingType();
4021 llvm::SmallString<64> TemplateMangling;
4022 llvm::raw_svector_ostream Stream(TemplateMangling);
4023 MicrosoftCXXNameMangler
Extra(Context, Stream);
4025 if (
T->isWrapKind()) {
4026 Extra.mangleSourceName(
"ObtWrap_");
4028 Extra.mangleSourceName(
"ObtTrap_");
4030 Extra.mangleType(UnderlyingType, Range, QMM_Escape);
4032 mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {
"__clang"});
4061 MicrosoftCXXNameMangler &Mangler,
4068 llvm_unreachable(
"Unsupported access specifier");
4079 Out <<
'R' << AccessSpec;
4080 Mangler.mangleNumber(
4082 Mangler.mangleNumber(
4084 Mangler.mangleNumber(
4089 Mangler.mangleNumber(
4096 llvm_unreachable(
"Unsupported access specifier");
4110 llvm_unreachable(
"Unsupported access specifier");
4123void MicrosoftMangleContextImpl::mangleVirtualMemPtrThunk(
4124 const CXXMethodDecl *MD,
const MethodVFTableLocation &ML,
4126 msvc_hashing_ostream MHO(Out);
4127 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4128 Mangler.getStream() <<
'?';
4129 Mangler.mangleVirtualMemPtrThunk(MD, ML);
4132void MicrosoftMangleContextImpl::mangleThunk(
const CXXMethodDecl *MD,
4133 const ThunkInfo &Thunk,
4136 msvc_hashing_ostream MHO(Out);
4137 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4138 Mangler.getStream() <<
'?';
4139 Mangler.mangleName(MD);
4148 assert(Thunk.
Method !=
nullptr &&
4149 "Thunk info should hold the overridee decl");
4151 const CXXMethodDecl *DeclForFPT = Thunk.
Method ? Thunk.
Method : MD;
4152 Mangler.mangleFunctionType(
4156void MicrosoftMangleContextImpl::mangleCXXDtorThunk(
const CXXDestructorDecl *DD,
4158 const ThunkInfo &Thunk,
4165 msvc_hashing_ostream MHO(Out);
4166 MicrosoftCXXNameMangler Mangler(*
this, MHO, DD,
Type);
4167 Mangler.getStream() <<
"??_E";
4169 auto &Adjustment = Thunk.
This;
4171 Mangler.mangleFunctionType(DD->
getType()->
castAs<FunctionProtoType>(), DD);
4174void MicrosoftMangleContextImpl::mangleCXXVFTable(
4175 const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
4181 msvc_hashing_ostream MHO(Out);
4182 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4183 if (Derived->
hasAttr<DLLImportAttr>())
4184 Mangler.getStream() <<
"??_S";
4186 Mangler.getStream() <<
"??_7";
4187 Mangler.mangleName(Derived);
4188 Mangler.getStream() <<
"6B";
4189 for (
const CXXRecordDecl *RD : BasePath)
4190 Mangler.mangleName(RD);
4191 Mangler.getStream() <<
'@';
4194void MicrosoftMangleContextImpl::mangleCXXVTable(
const CXXRecordDecl *Derived,
4197 mangleCXXVFTable(Derived, {},
Out);
4200void MicrosoftMangleContextImpl::mangleCXXVBTable(
4201 const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
4207 msvc_hashing_ostream MHO(Out);
4208 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4209 Mangler.getStream() <<
"??_8";
4210 Mangler.mangleName(Derived);
4211 Mangler.getStream() <<
"7B";
4212 for (
const CXXRecordDecl *RD : BasePath)
4213 Mangler.mangleName(RD);
4214 Mangler.getStream() <<
'@';
4217void MicrosoftMangleContextImpl::mangleCXXRTTI(QualType
T, raw_ostream &Out) {
4218 msvc_hashing_ostream MHO(Out);
4219 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4220 Mangler.getStream() <<
"??_R0";
4221 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4222 Mangler.getStream() <<
"@8";
4225void MicrosoftMangleContextImpl::mangleCXXRTTIName(
4226 QualType
T, raw_ostream &Out,
bool NormalizeIntegers =
false) {
4232 msvc_hashing_ostream MHO(Out, 4095);
4233 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4234 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4237void MicrosoftMangleContextImpl::mangleCXXVirtualDisplacementMap(
4238 const CXXRecordDecl *SrcRD,
const CXXRecordDecl *DstRD, raw_ostream &Out) {
4239 msvc_hashing_ostream MHO(Out);
4240 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4241 Mangler.getStream() <<
"??_K";
4242 Mangler.mangleName(SrcRD);
4243 Mangler.getStream() <<
"$C";
4244 Mangler.mangleName(DstRD);
4247void MicrosoftMangleContextImpl::mangleCXXThrowInfo(QualType
T,
bool IsConst,
4252 msvc_hashing_ostream MHO(Out);
4253 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4254 Mangler.getStream() <<
"_TI";
4256 Mangler.getStream() <<
'C';
4258 Mangler.getStream() <<
'V';
4260 Mangler.getStream() <<
'U';
4261 Mangler.getStream() << NumEntries;
4262 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4265void MicrosoftMangleContextImpl::mangleCXXCatchableTypeArray(
4266 QualType
T,
uint32_t NumEntries, raw_ostream &Out) {
4267 msvc_hashing_ostream MHO(Out);
4268 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4269 Mangler.getStream() <<
"_CTA";
4270 Mangler.getStream() << NumEntries;
4271 Mangler.mangleType(
T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
4274void MicrosoftMangleContextImpl::mangleCXXCatchableType(
4278 MicrosoftCXXNameMangler Mangler(*
this, Out);
4279 Mangler.getStream() <<
"_CT";
4281 llvm::SmallString<64> RTTIMangling;
4283 llvm::raw_svector_ostream Stream(RTTIMangling);
4284 msvc_hashing_ostream MHO(Stream);
4285 mangleCXXRTTI(
T, MHO);
4287 Mangler.getStream() << RTTIMangling;
4295 bool OmitCopyCtor = getASTContext().getLangOpts().isCompatibleWithMSVC(
4296 LangOptions::MSVC2015) &&
4297 !getASTContext().getLangOpts().isCompatibleWithMSVC(
4298 LangOptions::MSVC2017_7);
4299 llvm::SmallString<64> CopyCtorMangling;
4300 if (!OmitCopyCtor && CD) {
4301 llvm::raw_svector_ostream Stream(CopyCtorMangling);
4302 msvc_hashing_ostream MHO(Stream);
4303 mangleCXXName(GlobalDecl(CD, CT), MHO);
4305 Mangler.getStream() << CopyCtorMangling;
4307 Mangler.getStream() <<
Size;
4308 if (VBPtrOffset == -1) {
4310 Mangler.getStream() << NVOffset;
4313 Mangler.getStream() << NVOffset;
4314 Mangler.getStream() << VBPtrOffset;
4315 Mangler.getStream() << VBIndex;
4319void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassDescriptor(
4322 msvc_hashing_ostream MHO(Out);
4323 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4324 Mangler.getStream() <<
"??_R1";
4325 Mangler.mangleNumber(NVOffset);
4326 Mangler.mangleNumber(VBPtrOffset);
4327 Mangler.mangleNumber(VBTableOffset);
4328 Mangler.mangleNumber(Flags);
4329 Mangler.mangleName(Derived);
4330 Mangler.getStream() <<
"8";
4333void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassArray(
4334 const CXXRecordDecl *Derived, raw_ostream &Out) {
4335 msvc_hashing_ostream MHO(Out);
4336 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4337 Mangler.getStream() <<
"??_R2";
4338 Mangler.mangleName(Derived);
4339 Mangler.getStream() <<
"8";
4342void MicrosoftMangleContextImpl::mangleCXXRTTIClassHierarchyDescriptor(
4343 const CXXRecordDecl *Derived, raw_ostream &Out) {
4344 msvc_hashing_ostream MHO(Out);
4345 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4346 Mangler.getStream() <<
"??_R3";
4347 Mangler.mangleName(Derived);
4348 Mangler.getStream() <<
"8";
4351void MicrosoftMangleContextImpl::mangleCXXRTTICompleteObjectLocator(
4352 const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
4358 llvm::SmallString<64> VFTableMangling;
4359 llvm::raw_svector_ostream Stream(VFTableMangling);
4360 mangleCXXVFTable(Derived, BasePath, Stream);
4362 if (VFTableMangling.starts_with(
"??@")) {
4363 assert(VFTableMangling.ends_with(
"@"));
4364 Out << VFTableMangling <<
"??_R4@";
4368 assert(VFTableMangling.starts_with(
"??_7") ||
4369 VFTableMangling.starts_with(
"??_S"));
4371 Out <<
"??_R4" << VFTableMangling.str().drop_front(4);
4374void MicrosoftMangleContextImpl::mangleSEHFilterExpression(
4375 GlobalDecl EnclosingDecl, raw_ostream &Out) {
4376 msvc_hashing_ostream MHO(Out);
4377 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4382 Mangler.getStream() <<
"?filt$" << SEHFilterIds[EnclosingDecl]++ <<
"@0@";
4383 Mangler.mangleName(EnclosingDecl);
4386void MicrosoftMangleContextImpl::mangleSEHFinallyBlock(
4387 GlobalDecl EnclosingDecl, raw_ostream &Out) {
4388 msvc_hashing_ostream MHO(Out);
4389 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4394 Mangler.getStream() <<
"?fin$" << SEHFinallyIds[EnclosingDecl]++ <<
"@0@";
4395 Mangler.mangleName(EnclosingDecl);
4398void MicrosoftMangleContextImpl::mangleCanonicalTypeName(
4399 QualType
T, raw_ostream &Out,
bool NormalizeIntegers =
false) {
4402 MicrosoftCXXNameMangler Mangler(*
this, Out);
4403 Mangler.getStream() <<
'?';
4404 Mangler.mangleType(
T.getCanonicalType(), SourceRange());
4407void MicrosoftMangleContextImpl::mangleReferenceTemporary(
4408 const VarDecl *VD,
unsigned ManglingNumber, raw_ostream &Out) {
4409 msvc_hashing_ostream MHO(Out);
4410 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4412 Mangler.getStream() <<
"?";
4413 Mangler.mangleSourceName(
"$RT" + llvm::utostr(ManglingNumber));
4414 Mangler.mangle(VD,
"");
4417void MicrosoftMangleContextImpl::mangleThreadSafeStaticGuardVariable(
4418 const VarDecl *VD,
unsigned GuardNum, raw_ostream &Out) {
4419 msvc_hashing_ostream MHO(Out);
4420 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4422 Mangler.getStream() <<
"?";
4423 Mangler.mangleSourceName(
"$TSS" + llvm::utostr(GuardNum));
4424 Mangler.mangleNestedName(VD);
4425 Mangler.getStream() <<
"@4HA";
4428void MicrosoftMangleContextImpl::mangleStaticGuardVariable(
const VarDecl *VD,
4440 msvc_hashing_ostream MHO(Out);
4441 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4445 Mangler.getStream() << (VD->
getTLSKind() ?
"??__J" :
"??_B");
4447 Mangler.getStream() <<
"?$S1@";
4449 unsigned ScopeDepth = 0;
4450 if (Visible && !getNextDiscriminator(VD, ScopeDepth))
4454 Mangler.mangle(VD,
"");
4456 Mangler.mangleNestedName(VD);
4457 Mangler.getStream() << (Visible ?
"@5" :
"@4IA");
4459 Mangler.mangleNumber(ScopeDepth);
4462void MicrosoftMangleContextImpl::mangleInitFiniStub(
const VarDecl *D,
4465 msvc_hashing_ostream MHO(Out);
4466 MicrosoftCXXNameMangler Mangler(*
this, MHO);
4467 Mangler.getStream() <<
"??__" << CharCode;
4469 Mangler.getStream() <<
'?';
4470 Mangler.mangleName(D);
4471 Mangler.mangleVariableEncoding(D);
4472 Mangler.getStream() <<
"@@";
4474 Mangler.mangleName(D);
4478 Mangler.getStream() <<
"YAXXZ";
4481void MicrosoftMangleContextImpl::mangleDynamicInitializer(
const VarDecl *D,
4484 mangleInitFiniStub(D,
'E', Out);
4488MicrosoftMangleContextImpl::mangleDynamicAtExitDestructor(
const VarDecl *D,
4491 mangleInitFiniStub(D,
'F', Out);
4494void MicrosoftMangleContextImpl::mangleStringLiteral(
const StringLiteral *SL,
4515 MicrosoftCXXNameMangler Mangler(*
this, Out);
4516 Mangler.getStream() <<
"??_C@_";
4524 unsigned StringLength =
4525 getASTContext().getAsConstantArrayType(SL->
getType())->getZExtSize();
4530 Mangler.getStream() <<
'1';
4532 Mangler.getStream() <<
'0';
4536 Mangler.mangleNumber(StringByteLength);
4538 auto GetLittleEndianByte = [&SL](
unsigned Index) {
4540 if (Index / CharByteWidth >= SL->
getLength())
4541 return static_cast<char>(0);
4543 unsigned OffsetInCodeUnit = Index % CharByteWidth;
4544 return static_cast<char>((CodeUnit >> (8 * OffsetInCodeUnit)) & 0xff);
4547 auto GetBigEndianByte = [&SL](
unsigned Index) {
4549 if (Index / CharByteWidth >= SL->
getLength())
4550 return static_cast<char>(0);
4552 unsigned OffsetInCodeUnit = (CharByteWidth - 1) - (Index % CharByteWidth);
4553 return static_cast<char>((CodeUnit >> (8 * OffsetInCodeUnit)) & 0xff);
4558 for (
unsigned I = 0, E = StringByteLength; I != E; ++I)
4559 JC.update(GetLittleEndianByte(I));
4563 Mangler.mangleNumber(JC.getCRC());
4569 auto MangleByte = [&Mangler](
char Byte) {
4577 Mangler.getStream() << Byte;
4578 }
else if (
isLetter(Byte & 0x7f)) {
4579 Mangler.getStream() <<
'?' <<
static_cast<char>(Byte & 0x7f);
4581 const char SpecialChars[] = {
',',
'/',
'\\',
':',
'.',
4582 ' ',
'\n',
'\t',
'\'',
'-'};
4583 const char *Pos = llvm::find(SpecialChars, Byte);
4584 if (Pos != std::end(SpecialChars)) {
4585 Mangler.getStream() <<
'?' << (Pos - std::begin(SpecialChars));
4587 Mangler.getStream() <<
"?$";
4588 Mangler.getStream() <<
static_cast<char>(
'A' + ((Byte >> 4) & 0xf));
4589 Mangler.getStream() <<
static_cast<char>(
'A' + (Byte & 0xf));
4595 unsigned MaxBytesToMangle = SL->
isWide() ? 64U : 32U;
4596 unsigned NumBytesToMangle = std::min(MaxBytesToMangle, StringByteLength);
4597 for (
unsigned I = 0; I != NumBytesToMangle; ++I) {
4599 MangleByte(GetBigEndianByte(I));
4601 MangleByte(GetLittleEndianByte(I));
4604 Mangler.getStream() <<
'@';
4607void MicrosoftCXXNameMangler::mangleAutoReturnType(
const MemberPointerType *
T,
4610 manglePointerCVQualifiers(Quals);
4611 manglePointerExtQualifiers(Quals, PointeeType);
4612 if (
const FunctionProtoType *FPT = PointeeType->
getAs<FunctionProtoType>()) {
4614 mangleName(
T->getMostRecentCXXRecordDecl());
4615 mangleFunctionType(FPT,
nullptr,
true);
4618 mangleName(
T->getMostRecentCXXRecordDecl());
4619 mangleAutoReturnType(PointeeType, QMM_Drop);
4623void MicrosoftCXXNameMangler::mangleAutoReturnType(
const PointerType *
T,
4627 "Unexpected address space mangling required");
4629 manglePointerCVQualifiers(Quals);
4630 manglePointerExtQualifiers(Quals, PointeeType);
4632 if (
const FunctionProtoType *FPT = PointeeType->
getAs<FunctionProtoType>()) {
4634 mangleFunctionType(FPT);
4636 mangleAutoReturnType(PointeeType, QMM_Mangle);
4640void MicrosoftCXXNameMangler::mangleAutoReturnType(
const LValueReferenceType *
T,
4645 manglePointerExtQualifiers(Quals, PointeeType);
4646 mangleAutoReturnType(PointeeType, QMM_Mangle);
4649void MicrosoftCXXNameMangler::mangleAutoReturnType(
const RValueReferenceType *
T,
4654 manglePointerExtQualifiers(Quals, PointeeType);
4655 mangleAutoReturnType(PointeeType, QMM_Mangle);
4661 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
getQuantity - 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.
@ Type
The name was classified as a 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_elementwise_add_sat __builtin_elementwise_sub_sat uint32_t __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 __packed_splat2 __packed_splat4 __packed_splat2 __packed_splat8 __packed_splat4 uint32_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...