xref: /freebsd/contrib/llvm-project/clang/lib/AST/MicrosoftMangle.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
1 //===--- MicrosoftMangle.cpp - Microsoft Visual C++ Name Mangling ---------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This provides C++ name mangling targeting the Microsoft Visual C++ ABI.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #include "clang/AST/ASTContext.h"
14 #include "clang/AST/Attr.h"
15 #include "clang/AST/CXXInheritance.h"
16 #include "clang/AST/CharUnits.h"
17 #include "clang/AST/Decl.h"
18 #include "clang/AST/DeclCXX.h"
19 #include "clang/AST/DeclObjC.h"
20 #include "clang/AST/DeclOpenMP.h"
21 #include "clang/AST/DeclTemplate.h"
22 #include "clang/AST/Expr.h"
23 #include "clang/AST/ExprCXX.h"
24 #include "clang/AST/GlobalDecl.h"
25 #include "clang/AST/Mangle.h"
26 #include "clang/AST/VTableBuilder.h"
27 #include "clang/Basic/ABI.h"
28 #include "clang/Basic/DiagnosticOptions.h"
29 #include "clang/Basic/FileManager.h"
30 #include "clang/Basic/SourceManager.h"
31 #include "clang/Basic/TargetInfo.h"
32 #include "llvm/ADT/SmallVector.h"
33 #include "llvm/ADT/StringExtras.h"
34 #include "llvm/Support/CRC.h"
35 #include "llvm/Support/MD5.h"
36 #include "llvm/Support/MathExtras.h"
37 #include "llvm/Support/StringSaver.h"
38 #include "llvm/Support/xxhash.h"
39 #include <functional>
40 #include <optional>
41 
42 using namespace clang;
43 
44 namespace {
45 
46 // Get GlobalDecl of DeclContext of local entities.
getGlobalDeclAsDeclContext(const DeclContext * DC)47 static GlobalDecl getGlobalDeclAsDeclContext(const DeclContext *DC) {
48   GlobalDecl GD;
49   if (auto *CD = dyn_cast<CXXConstructorDecl>(DC))
50     GD = GlobalDecl(CD, Ctor_Complete);
51   else if (auto *DD = dyn_cast<CXXDestructorDecl>(DC))
52     GD = GlobalDecl(DD, Dtor_Complete);
53   else
54     GD = GlobalDecl(cast<FunctionDecl>(DC));
55   return GD;
56 }
57 
58 struct msvc_hashing_ostream : public llvm::raw_svector_ostream {
59   raw_ostream &OS;
60   llvm::SmallString<64> Buffer;
61 
msvc_hashing_ostream__anon77df3dfb0111::msvc_hashing_ostream62   msvc_hashing_ostream(raw_ostream &OS)
63       : llvm::raw_svector_ostream(Buffer), OS(OS) {}
~msvc_hashing_ostream__anon77df3dfb0111::msvc_hashing_ostream64   ~msvc_hashing_ostream() override {
65     StringRef MangledName = str();
66     bool StartsWithEscape = MangledName.starts_with("\01");
67     if (StartsWithEscape)
68       MangledName = MangledName.drop_front(1);
69     if (MangledName.size() < 4096) {
70       OS << str();
71       return;
72     }
73 
74     llvm::MD5 Hasher;
75     llvm::MD5::MD5Result Hash;
76     Hasher.update(MangledName);
77     Hasher.final(Hash);
78 
79     SmallString<32> HexString;
80     llvm::MD5::stringifyResult(Hash, HexString);
81 
82     if (StartsWithEscape)
83       OS << '\01';
84     OS << "??@" << HexString << '@';
85   }
86 };
87 
88 static const DeclContext *
getLambdaDefaultArgumentDeclContext(const Decl * D)89 getLambdaDefaultArgumentDeclContext(const Decl *D) {
90   if (const auto *RD = dyn_cast<CXXRecordDecl>(D))
91     if (RD->isLambda())
92       if (const auto *Parm =
93               dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl()))
94         return Parm->getDeclContext();
95   return nullptr;
96 }
97 
98 /// Retrieve the declaration context that should be used when mangling
99 /// the given declaration.
getEffectiveDeclContext(const Decl * D)100 static const DeclContext *getEffectiveDeclContext(const Decl *D) {
101   // The ABI assumes that lambda closure types that occur within
102   // default arguments live in the context of the function. However, due to
103   // the way in which Clang parses and creates function declarations, this is
104   // not the case: the lambda closure type ends up living in the context
105   // where the function itself resides, because the function declaration itself
106   // had not yet been created. Fix the context here.
107   if (const auto *LDADC = getLambdaDefaultArgumentDeclContext(D))
108     return LDADC;
109 
110   // Perform the same check for block literals.
111   if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) {
112     if (ParmVarDecl *ContextParam =
113             dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl()))
114       return ContextParam->getDeclContext();
115   }
116 
117   const DeclContext *DC = D->getDeclContext();
118   if (isa<CapturedDecl>(DC) || isa<OMPDeclareReductionDecl>(DC) ||
119       isa<OMPDeclareMapperDecl>(DC)) {
120     return getEffectiveDeclContext(cast<Decl>(DC));
121   }
122 
123   return DC->getRedeclContext();
124 }
125 
getEffectiveParentContext(const DeclContext * DC)126 static const DeclContext *getEffectiveParentContext(const DeclContext *DC) {
127   return getEffectiveDeclContext(cast<Decl>(DC));
128 }
129 
getStructor(const NamedDecl * ND)130 static const FunctionDecl *getStructor(const NamedDecl *ND) {
131   if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(ND))
132     return FTD->getTemplatedDecl()->getCanonicalDecl();
133 
134   const auto *FD = cast<FunctionDecl>(ND);
135   if (const auto *FTD = FD->getPrimaryTemplate())
136     return FTD->getTemplatedDecl()->getCanonicalDecl();
137 
138   return FD->getCanonicalDecl();
139 }
140 
141 /// MicrosoftMangleContextImpl - Overrides the default MangleContext for the
142 /// Microsoft Visual C++ ABI.
143 class MicrosoftMangleContextImpl : public MicrosoftMangleContext {
144   typedef std::pair<const DeclContext *, IdentifierInfo *> DiscriminatorKeyTy;
145   llvm::DenseMap<DiscriminatorKeyTy, unsigned> Discriminator;
146   llvm::DenseMap<const NamedDecl *, unsigned> Uniquifier;
147   llvm::DenseMap<const CXXRecordDecl *, unsigned> LambdaIds;
148   llvm::DenseMap<GlobalDecl, unsigned> SEHFilterIds;
149   llvm::DenseMap<GlobalDecl, unsigned> SEHFinallyIds;
150   SmallString<16> AnonymousNamespaceHash;
151 
152 public:
153   MicrosoftMangleContextImpl(ASTContext &Context, DiagnosticsEngine &Diags,
154                              bool IsAux = false);
155   bool shouldMangleCXXName(const NamedDecl *D) override;
156   bool shouldMangleStringLiteral(const StringLiteral *SL) override;
157   void mangleCXXName(GlobalDecl GD, raw_ostream &Out) override;
158   void mangleVirtualMemPtrThunk(const CXXMethodDecl *MD,
159                                 const MethodVFTableLocation &ML,
160                                 raw_ostream &Out) override;
161   void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk,
162                    bool ElideOverrideInfo, raw_ostream &) override;
163   void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
164                           const ThunkInfo &Thunk, bool ElideOverrideInfo,
165                           raw_ostream &) override;
166   void mangleCXXVFTable(const CXXRecordDecl *Derived,
167                         ArrayRef<const CXXRecordDecl *> BasePath,
168                         raw_ostream &Out) override;
169   void mangleCXXVBTable(const CXXRecordDecl *Derived,
170                         ArrayRef<const CXXRecordDecl *> BasePath,
171                         raw_ostream &Out) override;
172 
173   void mangleCXXVTable(const CXXRecordDecl *, raw_ostream &) override;
174   void mangleCXXVirtualDisplacementMap(const CXXRecordDecl *SrcRD,
175                                        const CXXRecordDecl *DstRD,
176                                        raw_ostream &Out) override;
177   void mangleCXXThrowInfo(QualType T, bool IsConst, bool IsVolatile,
178                           bool IsUnaligned, uint32_t NumEntries,
179                           raw_ostream &Out) override;
180   void mangleCXXCatchableTypeArray(QualType T, uint32_t NumEntries,
181                                    raw_ostream &Out) override;
182   void mangleCXXCatchableType(QualType T, const CXXConstructorDecl *CD,
183                               CXXCtorType CT, uint32_t Size, uint32_t NVOffset,
184                               int32_t VBPtrOffset, uint32_t VBIndex,
185                               raw_ostream &Out) override;
186   void mangleCXXRTTI(QualType T, raw_ostream &Out) override;
187   void mangleCXXRTTIName(QualType T, raw_ostream &Out,
188                          bool NormalizeIntegers) override;
189   void mangleCXXRTTIBaseClassDescriptor(const CXXRecordDecl *Derived,
190                                         uint32_t NVOffset, int32_t VBPtrOffset,
191                                         uint32_t VBTableOffset, uint32_t Flags,
192                                         raw_ostream &Out) override;
193   void mangleCXXRTTIBaseClassArray(const CXXRecordDecl *Derived,
194                                    raw_ostream &Out) override;
195   void mangleCXXRTTIClassHierarchyDescriptor(const CXXRecordDecl *Derived,
196                                              raw_ostream &Out) override;
197   void
198   mangleCXXRTTICompleteObjectLocator(const CXXRecordDecl *Derived,
199                                      ArrayRef<const CXXRecordDecl *> BasePath,
200                                      raw_ostream &Out) override;
201   void mangleCanonicalTypeName(QualType T, raw_ostream &,
202                                bool NormalizeIntegers) override;
203   void mangleReferenceTemporary(const VarDecl *, unsigned ManglingNumber,
204                                 raw_ostream &) override;
205   void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &Out) override;
206   void mangleThreadSafeStaticGuardVariable(const VarDecl *D, unsigned GuardNum,
207                                            raw_ostream &Out) override;
208   void mangleDynamicInitializer(const VarDecl *D, raw_ostream &Out) override;
209   void mangleDynamicAtExitDestructor(const VarDecl *D,
210                                      raw_ostream &Out) override;
211   void mangleSEHFilterExpression(GlobalDecl EnclosingDecl,
212                                  raw_ostream &Out) override;
213   void mangleSEHFinallyBlock(GlobalDecl EnclosingDecl,
214                              raw_ostream &Out) override;
215   void mangleStringLiteral(const StringLiteral *SL, raw_ostream &Out) override;
getNextDiscriminator(const NamedDecl * ND,unsigned & disc)216   bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) {
217     const DeclContext *DC = getEffectiveDeclContext(ND);
218     if (!DC->isFunctionOrMethod())
219       return false;
220 
221     // Lambda closure types are already numbered, give out a phony number so
222     // that they demangle nicely.
223     if (const auto *RD = dyn_cast<CXXRecordDecl>(ND)) {
224       if (RD->isLambda()) {
225         disc = 1;
226         return true;
227       }
228     }
229 
230     // Use the canonical number for externally visible decls.
231     if (ND->isExternallyVisible()) {
232       disc = getASTContext().getManglingNumber(ND, isAux());
233       return true;
234     }
235 
236     // Anonymous tags are already numbered.
237     if (const TagDecl *Tag = dyn_cast<TagDecl>(ND)) {
238       if (!Tag->hasNameForLinkage() &&
239           !getASTContext().getDeclaratorForUnnamedTagDecl(Tag) &&
240           !getASTContext().getTypedefNameForUnnamedTagDecl(Tag))
241         return false;
242     }
243 
244     // Make up a reasonable number for internal decls.
245     unsigned &discriminator = Uniquifier[ND];
246     if (!discriminator)
247       discriminator = ++Discriminator[std::make_pair(DC, ND->getIdentifier())];
248     disc = discriminator + 1;
249     return true;
250   }
251 
getLambdaString(const CXXRecordDecl * Lambda)252   std::string getLambdaString(const CXXRecordDecl *Lambda) override {
253     assert(Lambda->isLambda() && "RD must be a lambda!");
254     std::string Name("<lambda_");
255 
256     Decl *LambdaContextDecl = Lambda->getLambdaContextDecl();
257     unsigned LambdaManglingNumber = Lambda->getLambdaManglingNumber();
258     unsigned LambdaId;
259     const ParmVarDecl *Parm = dyn_cast_or_null<ParmVarDecl>(LambdaContextDecl);
260     const FunctionDecl *Func =
261         Parm ? dyn_cast<FunctionDecl>(Parm->getDeclContext()) : nullptr;
262 
263     if (Func) {
264       unsigned DefaultArgNo =
265           Func->getNumParams() - Parm->getFunctionScopeIndex();
266       Name += llvm::utostr(DefaultArgNo);
267       Name += "_";
268     }
269 
270     if (LambdaManglingNumber)
271       LambdaId = LambdaManglingNumber;
272     else
273       LambdaId = getLambdaIdForDebugInfo(Lambda);
274 
275     Name += llvm::utostr(LambdaId);
276     Name += ">";
277     return Name;
278   }
279 
getLambdaId(const CXXRecordDecl * RD)280   unsigned getLambdaId(const CXXRecordDecl *RD) {
281     assert(RD->isLambda() && "RD must be a lambda!");
282     assert(!RD->isExternallyVisible() && "RD must not be visible!");
283     assert(RD->getLambdaManglingNumber() == 0 &&
284            "RD must not have a mangling number!");
285     std::pair<llvm::DenseMap<const CXXRecordDecl *, unsigned>::iterator, bool>
286         Result = LambdaIds.insert(std::make_pair(RD, LambdaIds.size()));
287     return Result.first->second;
288   }
289 
getLambdaIdForDebugInfo(const CXXRecordDecl * RD)290   unsigned getLambdaIdForDebugInfo(const CXXRecordDecl *RD) {
291     assert(RD->isLambda() && "RD must be a lambda!");
292     assert(!RD->isExternallyVisible() && "RD must not be visible!");
293     assert(RD->getLambdaManglingNumber() == 0 &&
294            "RD must not have a mangling number!");
295     // The lambda should exist, but return 0 in case it doesn't.
296     return LambdaIds.lookup(RD);
297   }
298 
299   /// Return a character sequence that is (somewhat) unique to the TU suitable
300   /// for mangling anonymous namespaces.
getAnonymousNamespaceHash() const301   StringRef getAnonymousNamespaceHash() const {
302     return AnonymousNamespaceHash;
303   }
304 
305 private:
306   void mangleInitFiniStub(const VarDecl *D, char CharCode, raw_ostream &Out);
307 };
308 
309 /// MicrosoftCXXNameMangler - Manage the mangling of a single name for the
310 /// Microsoft Visual C++ ABI.
311 class MicrosoftCXXNameMangler {
312   MicrosoftMangleContextImpl &Context;
313   raw_ostream &Out;
314 
315   /// The "structor" is the top-level declaration being mangled, if
316   /// that's not a template specialization; otherwise it's the pattern
317   /// for that specialization.
318   const NamedDecl *Structor;
319   unsigned StructorType;
320 
321   typedef llvm::SmallVector<std::string, 10> BackRefVec;
322   BackRefVec NameBackReferences;
323 
324   typedef llvm::DenseMap<const void *, unsigned> ArgBackRefMap;
325   ArgBackRefMap FunArgBackReferences;
326   ArgBackRefMap TemplateArgBackReferences;
327 
328   typedef llvm::DenseMap<const void *, StringRef> TemplateArgStringMap;
329   TemplateArgStringMap TemplateArgStrings;
330   llvm::BumpPtrAllocator TemplateArgStringStorageAlloc;
331   llvm::StringSaver TemplateArgStringStorage;
332 
333   typedef std::set<std::pair<int, bool>> PassObjectSizeArgsSet;
334   PassObjectSizeArgsSet PassObjectSizeArgs;
335 
getASTContext() const336   ASTContext &getASTContext() const { return Context.getASTContext(); }
337 
338   const bool PointersAre64Bit;
339 
340 public:
341   enum QualifierMangleMode { QMM_Drop, QMM_Mangle, QMM_Escape, QMM_Result };
342   enum class TplArgKind { ClassNTTP, StructuralValue };
343 
MicrosoftCXXNameMangler(MicrosoftMangleContextImpl & C,raw_ostream & Out_)344   MicrosoftCXXNameMangler(MicrosoftMangleContextImpl &C, raw_ostream &Out_)
345       : Context(C), Out(Out_), Structor(nullptr), StructorType(-1),
346         TemplateArgStringStorage(TemplateArgStringStorageAlloc),
347         PointersAre64Bit(C.getASTContext().getTargetInfo().getPointerWidth(
348                              LangAS::Default) == 64) {}
349 
MicrosoftCXXNameMangler(MicrosoftMangleContextImpl & C,raw_ostream & Out_,const CXXConstructorDecl * D,CXXCtorType Type)350   MicrosoftCXXNameMangler(MicrosoftMangleContextImpl &C, raw_ostream &Out_,
351                           const CXXConstructorDecl *D, CXXCtorType Type)
352       : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type),
353         TemplateArgStringStorage(TemplateArgStringStorageAlloc),
354         PointersAre64Bit(C.getASTContext().getTargetInfo().getPointerWidth(
355                              LangAS::Default) == 64) {}
356 
MicrosoftCXXNameMangler(MicrosoftMangleContextImpl & C,raw_ostream & Out_,const CXXDestructorDecl * D,CXXDtorType Type)357   MicrosoftCXXNameMangler(MicrosoftMangleContextImpl &C, raw_ostream &Out_,
358                           const CXXDestructorDecl *D, CXXDtorType Type)
359       : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type),
360         TemplateArgStringStorage(TemplateArgStringStorageAlloc),
361         PointersAre64Bit(C.getASTContext().getTargetInfo().getPointerWidth(
362                              LangAS::Default) == 64) {}
363 
getStream() const364   raw_ostream &getStream() const { return Out; }
365 
366   void mangle(GlobalDecl GD, StringRef Prefix = "?");
367   void mangleName(GlobalDecl GD);
368   void mangleFunctionEncoding(GlobalDecl GD, bool ShouldMangle);
369   void mangleVariableEncoding(const VarDecl *VD);
370   void mangleMemberDataPointer(const CXXRecordDecl *RD, const ValueDecl *VD,
371                                const NonTypeTemplateParmDecl *PD,
372                                QualType TemplateArgType,
373                                StringRef Prefix = "$");
374   void mangleMemberDataPointerInClassNTTP(const CXXRecordDecl *,
375                                           const ValueDecl *);
376   void mangleMemberFunctionPointer(const CXXRecordDecl *RD,
377                                    const CXXMethodDecl *MD,
378                                    const NonTypeTemplateParmDecl *PD,
379                                    QualType TemplateArgType,
380                                    StringRef Prefix = "$");
381   void mangleFunctionPointer(const FunctionDecl *FD,
382                              const NonTypeTemplateParmDecl *PD,
383                              QualType TemplateArgType);
384   void mangleVarDecl(const VarDecl *VD, const NonTypeTemplateParmDecl *PD,
385                      QualType TemplateArgType);
386   void mangleMemberFunctionPointerInClassNTTP(const CXXRecordDecl *RD,
387                                               const CXXMethodDecl *MD);
388   void mangleVirtualMemPtrThunk(const CXXMethodDecl *MD,
389                                 const MethodVFTableLocation &ML);
390   void mangleNumber(int64_t Number);
391   void mangleNumber(llvm::APSInt Number);
392   void mangleFloat(llvm::APFloat Number);
393   void mangleBits(llvm::APInt Number);
394   void mangleTagTypeKind(TagTypeKind TK);
395   void mangleArtificialTagType(TagTypeKind TK, StringRef UnqualifiedName,
396                                ArrayRef<StringRef> NestedNames = std::nullopt);
397   void mangleAddressSpaceType(QualType T, Qualifiers Quals, SourceRange Range);
398   void mangleType(QualType T, SourceRange Range,
399                   QualifierMangleMode QMM = QMM_Mangle);
400   void mangleFunctionType(const FunctionType *T,
401                           const FunctionDecl *D = nullptr,
402                           bool ForceThisQuals = false,
403                           bool MangleExceptionSpec = true);
404   void mangleSourceName(StringRef Name);
405   void mangleNestedName(GlobalDecl GD);
406 
407 private:
isStructorDecl(const NamedDecl * ND) const408   bool isStructorDecl(const NamedDecl *ND) const {
409     return ND == Structor || getStructor(ND) == Structor;
410   }
411 
is64BitPointer(Qualifiers Quals) const412   bool is64BitPointer(Qualifiers Quals) const {
413     LangAS AddrSpace = Quals.getAddressSpace();
414     return AddrSpace == LangAS::ptr64 ||
415            (PointersAre64Bit && !(AddrSpace == LangAS::ptr32_sptr ||
416                                   AddrSpace == LangAS::ptr32_uptr));
417   }
418 
mangleUnqualifiedName(GlobalDecl GD)419   void mangleUnqualifiedName(GlobalDecl GD) {
420     mangleUnqualifiedName(GD, cast<NamedDecl>(GD.getDecl())->getDeclName());
421   }
422   void mangleUnqualifiedName(GlobalDecl GD, DeclarationName Name);
423   void mangleOperatorName(OverloadedOperatorKind OO, SourceLocation Loc);
424   void mangleCXXDtorType(CXXDtorType T);
425   void mangleQualifiers(Qualifiers Quals, bool IsMember);
426   void mangleRefQualifier(RefQualifierKind RefQualifier);
427   void manglePointerCVQualifiers(Qualifiers Quals);
428   void manglePointerExtQualifiers(Qualifiers Quals, QualType PointeeType);
429 
430   void mangleUnscopedTemplateName(GlobalDecl GD);
431   void
432   mangleTemplateInstantiationName(GlobalDecl GD,
433                                   const TemplateArgumentList &TemplateArgs);
434   void mangleObjCMethodName(const ObjCMethodDecl *MD);
435 
436   void mangleFunctionArgumentType(QualType T, SourceRange Range);
437   void manglePassObjectSizeArg(const PassObjectSizeAttr *POSA);
438 
439   bool isArtificialTagType(QualType T) const;
440 
441   // Declare manglers for every type class.
442 #define ABSTRACT_TYPE(CLASS, PARENT)
443 #define NON_CANONICAL_TYPE(CLASS, PARENT)
444 #define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T, \
445                                             Qualifiers Quals, \
446                                             SourceRange Range);
447 #include "clang/AST/TypeNodes.inc"
448 #undef ABSTRACT_TYPE
449 #undef NON_CANONICAL_TYPE
450 #undef TYPE
451 
452   void mangleType(const TagDecl *TD);
453   void mangleDecayedArrayType(const ArrayType *T);
454   void mangleArrayType(const ArrayType *T);
455   void mangleFunctionClass(const FunctionDecl *FD);
456   void mangleCallingConvention(CallingConv CC, SourceRange Range);
457   void mangleCallingConvention(const FunctionType *T, SourceRange Range);
458   void mangleIntegerLiteral(const llvm::APSInt &Number,
459                             const NonTypeTemplateParmDecl *PD = nullptr,
460                             QualType TemplateArgType = QualType());
461   void mangleExpression(const Expr *E, const NonTypeTemplateParmDecl *PD);
462   void mangleThrowSpecification(const FunctionProtoType *T);
463 
464   void mangleTemplateArgs(const TemplateDecl *TD,
465                           const TemplateArgumentList &TemplateArgs);
466   void mangleTemplateArg(const TemplateDecl *TD, const TemplateArgument &TA,
467                          const NamedDecl *Parm);
468   void mangleTemplateArgValue(QualType T, const APValue &V, TplArgKind,
469                               bool WithScalarType = false);
470 
471   void mangleObjCProtocol(const ObjCProtocolDecl *PD);
472   void mangleObjCLifetime(const QualType T, Qualifiers Quals,
473                           SourceRange Range);
474   void mangleObjCKindOfType(const ObjCObjectType *T, Qualifiers Quals,
475                             SourceRange Range);
476 };
477 }
478 
MicrosoftMangleContextImpl(ASTContext & Context,DiagnosticsEngine & Diags,bool IsAux)479 MicrosoftMangleContextImpl::MicrosoftMangleContextImpl(ASTContext &Context,
480                                                        DiagnosticsEngine &Diags,
481                                                        bool IsAux)
482     : MicrosoftMangleContext(Context, Diags, IsAux) {
483   // To mangle anonymous namespaces, hash the path to the main source file. The
484   // path should be whatever (probably relative) path was passed on the command
485   // line. The goal is for the compiler to produce the same output regardless of
486   // working directory, so use the uncanonicalized relative path.
487   //
488   // It's important to make the mangled names unique because, when CodeView
489   // debug info is in use, the debugger uses mangled type names to distinguish
490   // between otherwise identically named types in anonymous namespaces.
491   //
492   // These symbols are always internal, so there is no need for the hash to
493   // match what MSVC produces. For the same reason, clang is free to change the
494   // hash at any time without breaking compatibility with old versions of clang.
495   // The generated names are intended to look similar to what MSVC generates,
496   // which are something like "?A0x01234567@".
497   SourceManager &SM = Context.getSourceManager();
498   if (OptionalFileEntryRef FE = SM.getFileEntryRefForID(SM.getMainFileID())) {
499     // Truncate the hash so we get 8 characters of hexadecimal.
500     uint32_t TruncatedHash = uint32_t(xxh3_64bits(FE->getName()));
501     AnonymousNamespaceHash = llvm::utohexstr(TruncatedHash);
502   } else {
503     // If we don't have a path to the main file, we'll just use 0.
504     AnonymousNamespaceHash = "0";
505   }
506 }
507 
shouldMangleCXXName(const NamedDecl * D)508 bool MicrosoftMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) {
509   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) {
510     LanguageLinkage L = FD->getLanguageLinkage();
511     // Overloadable functions need mangling.
512     if (FD->hasAttr<OverloadableAttr>())
513       return true;
514 
515     // The ABI expects that we would never mangle "typical" user-defined entry
516     // points regardless of visibility or freestanding-ness.
517     //
518     // N.B. This is distinct from asking about "main".  "main" has a lot of
519     // special rules associated with it in the standard while these
520     // user-defined entry points are outside of the purview of the standard.
521     // For example, there can be only one definition for "main" in a standards
522     // compliant program; however nothing forbids the existence of wmain and
523     // WinMain in the same translation unit.
524     if (FD->isMSVCRTEntryPoint())
525       return false;
526 
527     // C++ functions and those whose names are not a simple identifier need
528     // mangling.
529     if (!FD->getDeclName().isIdentifier() || L == CXXLanguageLinkage)
530       return true;
531 
532     // C functions are not mangled.
533     if (L == CLanguageLinkage)
534       return false;
535   }
536 
537   // Otherwise, no mangling is done outside C++ mode.
538   if (!getASTContext().getLangOpts().CPlusPlus)
539     return false;
540 
541   const VarDecl *VD = dyn_cast<VarDecl>(D);
542   if (VD && !isa<DecompositionDecl>(D)) {
543     // C variables are not mangled.
544     if (VD->isExternC())
545       return false;
546 
547     // Variables at global scope with internal linkage are not mangled.
548     const DeclContext *DC = getEffectiveDeclContext(D);
549     // Check for extern variable declared locally.
550     if (DC->isFunctionOrMethod() && D->hasLinkage())
551       while (!DC->isNamespace() && !DC->isTranslationUnit())
552         DC = getEffectiveParentContext(DC);
553 
554     if (DC->isTranslationUnit() && D->getFormalLinkage() == Linkage::Internal &&
555         !isa<VarTemplateSpecializationDecl>(D) && D->getIdentifier() != nullptr)
556       return false;
557   }
558 
559   return true;
560 }
561 
562 bool
shouldMangleStringLiteral(const StringLiteral * SL)563 MicrosoftMangleContextImpl::shouldMangleStringLiteral(const StringLiteral *SL) {
564   return true;
565 }
566 
mangle(GlobalDecl GD,StringRef Prefix)567 void MicrosoftCXXNameMangler::mangle(GlobalDecl GD, StringRef Prefix) {
568   const NamedDecl *D = cast<NamedDecl>(GD.getDecl());
569   // MSVC doesn't mangle C++ names the same way it mangles extern "C" names.
570   // Therefore it's really important that we don't decorate the
571   // name with leading underscores or leading/trailing at signs. So, by
572   // default, we emit an asm marker at the start so we get the name right.
573   // Callers can override this with a custom prefix.
574 
575   // <mangled-name> ::= ? <name> <type-encoding>
576   Out << Prefix;
577   mangleName(GD);
578   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
579     mangleFunctionEncoding(GD, Context.shouldMangleDeclName(FD));
580   else if (const VarDecl *VD = dyn_cast<VarDecl>(D))
581     mangleVariableEncoding(VD);
582   else if (isa<MSGuidDecl>(D))
583     // MSVC appears to mangle GUIDs as if they were variables of type
584     // 'const struct __s_GUID'.
585     Out << "3U__s_GUID@@B";
586   else if (isa<TemplateParamObjectDecl>(D)) {
587     // Template parameter objects don't get a <type-encoding>; their type is
588     // specified as part of their value.
589   } else
590     llvm_unreachable("Tried to mangle unexpected NamedDecl!");
591 }
592 
mangleFunctionEncoding(GlobalDecl GD,bool ShouldMangle)593 void MicrosoftCXXNameMangler::mangleFunctionEncoding(GlobalDecl GD,
594                                                      bool ShouldMangle) {
595   const FunctionDecl *FD = cast<FunctionDecl>(GD.getDecl());
596   // <type-encoding> ::= <function-class> <function-type>
597 
598   // Since MSVC operates on the type as written and not the canonical type, it
599   // actually matters which decl we have here.  MSVC appears to choose the
600   // first, since it is most likely to be the declaration in a header file.
601   FD = FD->getFirstDecl();
602 
603   // We should never ever see a FunctionNoProtoType at this point.
604   // We don't even know how to mangle their types anyway :).
605   const FunctionProtoType *FT = FD->getType()->castAs<FunctionProtoType>();
606 
607   // extern "C" functions can hold entities that must be mangled.
608   // As it stands, these functions still need to get expressed in the full
609   // external name.  They have their class and type omitted, replaced with '9'.
610   if (ShouldMangle) {
611     // We would like to mangle all extern "C" functions using this additional
612     // component but this would break compatibility with MSVC's behavior.
613     // Instead, do this when we know that compatibility isn't important (in
614     // other words, when it is an overloaded extern "C" function).
615     if (FD->isExternC() && FD->hasAttr<OverloadableAttr>())
616       Out << "$$J0";
617 
618     mangleFunctionClass(FD);
619 
620     mangleFunctionType(FT, FD, false, false);
621   } else {
622     Out << '9';
623   }
624 }
625 
mangleVariableEncoding(const VarDecl * VD)626 void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
627   // <type-encoding> ::= <storage-class> <variable-type>
628   // <storage-class> ::= 0  # private static member
629   //                 ::= 1  # protected static member
630   //                 ::= 2  # public static member
631   //                 ::= 3  # global
632   //                 ::= 4  # static local
633 
634   // The first character in the encoding (after the name) is the storage class.
635   if (VD->isStaticDataMember()) {
636     // If it's a static member, it also encodes the access level.
637     switch (VD->getAccess()) {
638       default:
639       case AS_private: Out << '0'; break;
640       case AS_protected: Out << '1'; break;
641       case AS_public: Out << '2'; break;
642     }
643   }
644   else if (!VD->isStaticLocal())
645     Out << '3';
646   else
647     Out << '4';
648   // Now mangle the type.
649   // <variable-type> ::= <type> <cvr-qualifiers>
650   //                 ::= <type> <pointee-cvr-qualifiers> # pointers, references
651   // Pointers and references are odd. The type of 'int * const foo;' gets
652   // mangled as 'QAHA' instead of 'PAHB', for example.
653   SourceRange SR = VD->getSourceRange();
654   QualType Ty = VD->getType();
655   if (Ty->isPointerType() || Ty->isReferenceType() ||
656       Ty->isMemberPointerType()) {
657     mangleType(Ty, SR, QMM_Drop);
658     manglePointerExtQualifiers(
659         Ty.getDesugaredType(getASTContext()).getLocalQualifiers(), QualType());
660     if (const MemberPointerType *MPT = Ty->getAs<MemberPointerType>()) {
661       mangleQualifiers(MPT->getPointeeType().getQualifiers(), true);
662       // Member pointers are suffixed with a back reference to the member
663       // pointer's class name.
664       mangleName(MPT->getClass()->getAsCXXRecordDecl());
665     } else
666       mangleQualifiers(Ty->getPointeeType().getQualifiers(), false);
667   } else if (const ArrayType *AT = getASTContext().getAsArrayType(Ty)) {
668     // Global arrays are funny, too.
669     mangleDecayedArrayType(AT);
670     if (AT->getElementType()->isArrayType())
671       Out << 'A';
672     else
673       mangleQualifiers(Ty.getQualifiers(), false);
674   } else {
675     mangleType(Ty, SR, QMM_Drop);
676     mangleQualifiers(Ty.getQualifiers(), false);
677   }
678 }
679 
mangleMemberDataPointer(const CXXRecordDecl * RD,const ValueDecl * VD,const NonTypeTemplateParmDecl * PD,QualType TemplateArgType,StringRef Prefix)680 void MicrosoftCXXNameMangler::mangleMemberDataPointer(
681     const CXXRecordDecl *RD, const ValueDecl *VD,
682     const NonTypeTemplateParmDecl *PD, QualType TemplateArgType,
683     StringRef Prefix) {
684   // <member-data-pointer> ::= <integer-literal>
685   //                       ::= $F <number> <number>
686   //                       ::= $G <number> <number> <number>
687   //
688   // <auto-nttp> ::= $ M <type> <integer-literal>
689   // <auto-nttp> ::= $ M <type> F <name> <number>
690   // <auto-nttp> ::= $ M <type> G <name> <number> <number>
691 
692   int64_t FieldOffset;
693   int64_t VBTableOffset;
694   MSInheritanceModel IM = RD->getMSInheritanceModel();
695   if (VD) {
696     FieldOffset = getASTContext().getFieldOffset(VD);
697     assert(FieldOffset % getASTContext().getCharWidth() == 0 &&
698            "cannot take address of bitfield");
699     FieldOffset /= getASTContext().getCharWidth();
700 
701     VBTableOffset = 0;
702 
703     if (IM == MSInheritanceModel::Virtual)
704       FieldOffset -= getASTContext().getOffsetOfBaseWithVBPtr(RD).getQuantity();
705   } else {
706     FieldOffset = RD->nullFieldOffsetIsZero() ? 0 : -1;
707 
708     VBTableOffset = -1;
709   }
710 
711   char Code = '\0';
712   switch (IM) {
713   case MSInheritanceModel::Single:      Code = '0'; break;
714   case MSInheritanceModel::Multiple:    Code = '0'; break;
715   case MSInheritanceModel::Virtual:     Code = 'F'; break;
716   case MSInheritanceModel::Unspecified: Code = 'G'; break;
717   }
718 
719   Out << Prefix;
720 
721   if (VD &&
722       getASTContext().getLangOpts().isCompatibleWithMSVC(
723           LangOptions::MSVC2019) &&
724       PD && PD->getType()->getTypeClass() == Type::Auto &&
725       !TemplateArgType.isNull()) {
726     Out << "M";
727     mangleType(TemplateArgType, SourceRange(), QMM_Drop);
728   }
729 
730   Out << Code;
731 
732   mangleNumber(FieldOffset);
733 
734   // The C++ standard doesn't allow base-to-derived member pointer conversions
735   // in template parameter contexts, so the vbptr offset of data member pointers
736   // is always zero.
737   if (inheritanceModelHasVBPtrOffsetField(IM))
738     mangleNumber(0);
739   if (inheritanceModelHasVBTableOffsetField(IM))
740     mangleNumber(VBTableOffset);
741 }
742 
mangleMemberDataPointerInClassNTTP(const CXXRecordDecl * RD,const ValueDecl * VD)743 void MicrosoftCXXNameMangler::mangleMemberDataPointerInClassNTTP(
744     const CXXRecordDecl *RD, const ValueDecl *VD) {
745   MSInheritanceModel IM = RD->getMSInheritanceModel();
746   // <nttp-class-member-data-pointer> ::= <member-data-pointer>
747   //                                  ::= N
748   //                                  ::= 8 <postfix> @ <unqualified-name> @
749 
750   if (IM != MSInheritanceModel::Single && IM != MSInheritanceModel::Multiple)
751     return mangleMemberDataPointer(RD, VD, nullptr, QualType(), "");
752 
753   if (!VD) {
754     Out << 'N';
755     return;
756   }
757 
758   Out << '8';
759   mangleNestedName(VD);
760   Out << '@';
761   mangleUnqualifiedName(VD);
762   Out << '@';
763 }
764 
mangleMemberFunctionPointer(const CXXRecordDecl * RD,const CXXMethodDecl * MD,const NonTypeTemplateParmDecl * PD,QualType TemplateArgType,StringRef Prefix)765 void MicrosoftCXXNameMangler::mangleMemberFunctionPointer(
766     const CXXRecordDecl *RD, const CXXMethodDecl *MD,
767     const NonTypeTemplateParmDecl *PD, QualType TemplateArgType,
768     StringRef Prefix) {
769   // <member-function-pointer> ::= $1? <name>
770   //                           ::= $H? <name> <number>
771   //                           ::= $I? <name> <number> <number>
772   //                           ::= $J? <name> <number> <number> <number>
773   //
774   // <auto-nttp> ::= $ M <type> 1? <name>
775   // <auto-nttp> ::= $ M <type> H? <name> <number>
776   // <auto-nttp> ::= $ M <type> I? <name> <number> <number>
777   // <auto-nttp> ::= $ M <type> J? <name> <number> <number> <number>
778 
779   MSInheritanceModel IM = RD->getMSInheritanceModel();
780 
781   char Code = '\0';
782   switch (IM) {
783   case MSInheritanceModel::Single:      Code = '1'; break;
784   case MSInheritanceModel::Multiple:    Code = 'H'; break;
785   case MSInheritanceModel::Virtual:     Code = 'I'; break;
786   case MSInheritanceModel::Unspecified: Code = 'J'; break;
787   }
788 
789   // If non-virtual, mangle the name.  If virtual, mangle as a virtual memptr
790   // thunk.
791   uint64_t NVOffset = 0;
792   uint64_t VBTableOffset = 0;
793   uint64_t VBPtrOffset = 0;
794   if (MD) {
795     Out << Prefix;
796 
797     if (getASTContext().getLangOpts().isCompatibleWithMSVC(
798             LangOptions::MSVC2019) &&
799         PD && PD->getType()->getTypeClass() == Type::Auto &&
800         !TemplateArgType.isNull()) {
801       Out << "M";
802       mangleType(TemplateArgType, SourceRange(), QMM_Drop);
803     }
804 
805     Out << Code << '?';
806     if (MD->isVirtual()) {
807       MicrosoftVTableContext *VTContext =
808           cast<MicrosoftVTableContext>(getASTContext().getVTableContext());
809       MethodVFTableLocation ML =
810           VTContext->getMethodVFTableLocation(GlobalDecl(MD));
811       mangleVirtualMemPtrThunk(MD, ML);
812       NVOffset = ML.VFPtrOffset.getQuantity();
813       VBTableOffset = ML.VBTableIndex * 4;
814       if (ML.VBase) {
815         const ASTRecordLayout &Layout = getASTContext().getASTRecordLayout(RD);
816         VBPtrOffset = Layout.getVBPtrOffset().getQuantity();
817       }
818     } else {
819       mangleName(MD);
820       mangleFunctionEncoding(MD, /*ShouldMangle=*/true);
821     }
822 
823     if (VBTableOffset == 0 && IM == MSInheritanceModel::Virtual)
824       NVOffset -= getASTContext().getOffsetOfBaseWithVBPtr(RD).getQuantity();
825   } else {
826     // Null single inheritance member functions are encoded as a simple nullptr.
827     if (IM == MSInheritanceModel::Single) {
828       Out << Prefix << "0A@";
829       return;
830     }
831     if (IM == MSInheritanceModel::Unspecified)
832       VBTableOffset = -1;
833     Out << Prefix << Code;
834   }
835 
836   if (inheritanceModelHasNVOffsetField(/*IsMemberFunction=*/true, IM))
837     mangleNumber(static_cast<uint32_t>(NVOffset));
838   if (inheritanceModelHasVBPtrOffsetField(IM))
839     mangleNumber(VBPtrOffset);
840   if (inheritanceModelHasVBTableOffsetField(IM))
841     mangleNumber(VBTableOffset);
842 }
843 
mangleFunctionPointer(const FunctionDecl * FD,const NonTypeTemplateParmDecl * PD,QualType TemplateArgType)844 void MicrosoftCXXNameMangler::mangleFunctionPointer(
845     const FunctionDecl *FD, const NonTypeTemplateParmDecl *PD,
846     QualType TemplateArgType) {
847   // <func-ptr> ::= $1? <mangled-name>
848   // <func-ptr> ::= <auto-nttp>
849   //
850   // <auto-nttp> ::= $ M <type> 1? <mangled-name>
851   Out << '$';
852 
853   if (getASTContext().getLangOpts().isCompatibleWithMSVC(
854           LangOptions::MSVC2019) &&
855       PD && PD->getType()->getTypeClass() == Type::Auto &&
856       !TemplateArgType.isNull()) {
857     Out << "M";
858     mangleType(TemplateArgType, SourceRange(), QMM_Drop);
859   }
860 
861   Out << "1?";
862   mangleName(FD);
863   mangleFunctionEncoding(FD, /*ShouldMangle=*/true);
864 }
865 
mangleVarDecl(const VarDecl * VD,const NonTypeTemplateParmDecl * PD,QualType TemplateArgType)866 void MicrosoftCXXNameMangler::mangleVarDecl(const VarDecl *VD,
867                                             const NonTypeTemplateParmDecl *PD,
868                                             QualType TemplateArgType) {
869   // <var-ptr> ::= $1? <mangled-name>
870   // <var-ptr> ::= <auto-nttp>
871   //
872   // <auto-nttp> ::= $ M <type> 1? <mangled-name>
873   Out << '$';
874 
875   if (getASTContext().getLangOpts().isCompatibleWithMSVC(
876           LangOptions::MSVC2019) &&
877       PD && PD->getType()->getTypeClass() == Type::Auto &&
878       !TemplateArgType.isNull()) {
879     Out << "M";
880     mangleType(TemplateArgType, SourceRange(), QMM_Drop);
881   }
882 
883   Out << "1?";
884   mangleName(VD);
885   mangleVariableEncoding(VD);
886 }
887 
mangleMemberFunctionPointerInClassNTTP(const CXXRecordDecl * RD,const CXXMethodDecl * MD)888 void MicrosoftCXXNameMangler::mangleMemberFunctionPointerInClassNTTP(
889     const CXXRecordDecl *RD, const CXXMethodDecl *MD) {
890   // <nttp-class-member-function-pointer> ::= <member-function-pointer>
891   //                           ::= N
892   //                           ::= E? <virtual-mem-ptr-thunk>
893   //                           ::= E? <mangled-name> <type-encoding>
894 
895   if (!MD) {
896     if (RD->getMSInheritanceModel() != MSInheritanceModel::Single)
897       return mangleMemberFunctionPointer(RD, MD, nullptr, QualType(), "");
898 
899     Out << 'N';
900     return;
901   }
902 
903   Out << "E?";
904   if (MD->isVirtual()) {
905     MicrosoftVTableContext *VTContext =
906         cast<MicrosoftVTableContext>(getASTContext().getVTableContext());
907     MethodVFTableLocation ML =
908         VTContext->getMethodVFTableLocation(GlobalDecl(MD));
909     mangleVirtualMemPtrThunk(MD, ML);
910   } else {
911     mangleName(MD);
912     mangleFunctionEncoding(MD, /*ShouldMangle=*/true);
913   }
914 }
915 
mangleVirtualMemPtrThunk(const CXXMethodDecl * MD,const MethodVFTableLocation & ML)916 void MicrosoftCXXNameMangler::mangleVirtualMemPtrThunk(
917     const CXXMethodDecl *MD, const MethodVFTableLocation &ML) {
918   // Get the vftable offset.
919   CharUnits PointerWidth = getASTContext().toCharUnitsFromBits(
920       getASTContext().getTargetInfo().getPointerWidth(LangAS::Default));
921   uint64_t OffsetInVFTable = ML.Index * PointerWidth.getQuantity();
922 
923   Out << "?_9";
924   mangleName(MD->getParent());
925   Out << "$B";
926   mangleNumber(OffsetInVFTable);
927   Out << 'A';
928   mangleCallingConvention(MD->getType()->castAs<FunctionProtoType>(),
929                           MD->getSourceRange());
930 }
931 
mangleName(GlobalDecl GD)932 void MicrosoftCXXNameMangler::mangleName(GlobalDecl GD) {
933   // <name> ::= <unscoped-name> {[<named-scope>]+ | [<nested-name>]}? @
934 
935   // Always start with the unqualified name.
936   mangleUnqualifiedName(GD);
937 
938   mangleNestedName(GD);
939 
940   // Terminate the whole name with an '@'.
941   Out << '@';
942 }
943 
mangleNumber(int64_t Number)944 void MicrosoftCXXNameMangler::mangleNumber(int64_t Number) {
945   mangleNumber(llvm::APSInt(llvm::APInt(64, Number), /*IsUnsigned*/false));
946 }
947 
mangleNumber(llvm::APSInt Number)948 void MicrosoftCXXNameMangler::mangleNumber(llvm::APSInt Number) {
949   // MSVC never mangles any integer wider than 64 bits. In general it appears
950   // to convert every integer to signed 64 bit before mangling (including
951   // unsigned 64 bit values). Do the same, but preserve bits beyond the bottom
952   // 64.
953   unsigned Width = std::max(Number.getBitWidth(), 64U);
954   llvm::APInt Value = Number.extend(Width);
955 
956   // <non-negative integer> ::= A@              # when Number == 0
957   //                        ::= <decimal digit> # when 1 <= Number <= 10
958   //                        ::= <hex digit>+ @  # when Number >= 10
959   //
960   // <number>               ::= [?] <non-negative integer>
961 
962   if (Value.isNegative()) {
963     Value = -Value;
964     Out << '?';
965   }
966   mangleBits(Value);
967 }
968 
mangleFloat(llvm::APFloat Number)969 void MicrosoftCXXNameMangler::mangleFloat(llvm::APFloat Number) {
970   using llvm::APFloat;
971 
972   switch (APFloat::SemanticsToEnum(Number.getSemantics())) {
973   case APFloat::S_IEEEsingle: Out << 'A'; break;
974   case APFloat::S_IEEEdouble: Out << 'B'; break;
975 
976   // The following are all Clang extensions. We try to pick manglings that are
977   // unlikely to conflict with MSVC's scheme.
978   case APFloat::S_IEEEhalf: Out << 'V'; break;
979   case APFloat::S_BFloat: Out << 'W'; break;
980   case APFloat::S_x87DoubleExtended: Out << 'X'; break;
981   case APFloat::S_IEEEquad: Out << 'Y'; break;
982   case APFloat::S_PPCDoubleDouble: Out << 'Z'; break;
983   case APFloat::S_Float8E5M2:
984   case APFloat::S_Float8E4M3:
985   case APFloat::S_Float8E4M3FN:
986   case APFloat::S_Float8E5M2FNUZ:
987   case APFloat::S_Float8E4M3FNUZ:
988   case APFloat::S_Float8E4M3B11FNUZ:
989   case APFloat::S_FloatTF32:
990   case APFloat::S_Float6E3M2FN:
991   case APFloat::S_Float6E2M3FN:
992   case APFloat::S_Float4E2M1FN:
993     llvm_unreachable("Tried to mangle unexpected APFloat semantics");
994   }
995 
996   mangleBits(Number.bitcastToAPInt());
997 }
998 
mangleBits(llvm::APInt Value)999 void MicrosoftCXXNameMangler::mangleBits(llvm::APInt Value) {
1000   if (Value == 0)
1001     Out << "A@";
1002   else if (Value.uge(1) && Value.ule(10))
1003     Out << (Value - 1);
1004   else {
1005     // Numbers that are not encoded as decimal digits are represented as nibbles
1006     // in the range of ASCII characters 'A' to 'P'.
1007     // The number 0x123450 would be encoded as 'BCDEFA'
1008     llvm::SmallString<32> EncodedNumberBuffer;
1009     for (; Value != 0; Value.lshrInPlace(4))
1010       EncodedNumberBuffer.push_back('A' + (Value & 0xf).getZExtValue());
1011     std::reverse(EncodedNumberBuffer.begin(), EncodedNumberBuffer.end());
1012     Out.write(EncodedNumberBuffer.data(), EncodedNumberBuffer.size());
1013     Out << '@';
1014   }
1015 }
1016 
isTemplate(GlobalDecl GD,const TemplateArgumentList * & TemplateArgs)1017 static GlobalDecl isTemplate(GlobalDecl GD,
1018                              const TemplateArgumentList *&TemplateArgs) {
1019   const NamedDecl *ND = cast<NamedDecl>(GD.getDecl());
1020   // Check if we have a function template.
1021   if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1022     if (const TemplateDecl *TD = FD->getPrimaryTemplate()) {
1023       TemplateArgs = FD->getTemplateSpecializationArgs();
1024       return GD.getWithDecl(TD);
1025     }
1026   }
1027 
1028   // Check if we have a class template.
1029   if (const ClassTemplateSpecializationDecl *Spec =
1030           dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
1031     TemplateArgs = &Spec->getTemplateArgs();
1032     return GD.getWithDecl(Spec->getSpecializedTemplate());
1033   }
1034 
1035   // Check if we have a variable template.
1036   if (const VarTemplateSpecializationDecl *Spec =
1037           dyn_cast<VarTemplateSpecializationDecl>(ND)) {
1038     TemplateArgs = &Spec->getTemplateArgs();
1039     return GD.getWithDecl(Spec->getSpecializedTemplate());
1040   }
1041 
1042   return GlobalDecl();
1043 }
1044 
mangleUnqualifiedName(GlobalDecl GD,DeclarationName Name)1045 void MicrosoftCXXNameMangler::mangleUnqualifiedName(GlobalDecl GD,
1046                                                     DeclarationName Name) {
1047   const NamedDecl *ND = cast<NamedDecl>(GD.getDecl());
1048   //  <unqualified-name> ::= <operator-name>
1049   //                     ::= <ctor-dtor-name>
1050   //                     ::= <source-name>
1051   //                     ::= <template-name>
1052 
1053   // Check if we have a template.
1054   const TemplateArgumentList *TemplateArgs = nullptr;
1055   if (GlobalDecl TD = isTemplate(GD, TemplateArgs)) {
1056     // Function templates aren't considered for name back referencing.  This
1057     // makes sense since function templates aren't likely to occur multiple
1058     // times in a symbol.
1059     if (isa<FunctionTemplateDecl>(TD.getDecl())) {
1060       mangleTemplateInstantiationName(TD, *TemplateArgs);
1061       Out << '@';
1062       return;
1063     }
1064 
1065     // Here comes the tricky thing: if we need to mangle something like
1066     //   void foo(A::X<Y>, B::X<Y>),
1067     // the X<Y> part is aliased. However, if you need to mangle
1068     //   void foo(A::X<A::Y>, A::X<B::Y>),
1069     // the A::X<> part is not aliased.
1070     // That is, from the mangler's perspective we have a structure like this:
1071     //   namespace[s] -> type[ -> template-parameters]
1072     // but from the Clang perspective we have
1073     //   type [ -> template-parameters]
1074     //      \-> namespace[s]
1075     // What we do is we create a new mangler, mangle the same type (without
1076     // a namespace suffix) to a string using the extra mangler and then use
1077     // the mangled type name as a key to check the mangling of different types
1078     // for aliasing.
1079 
1080     // It's important to key cache reads off ND, not TD -- the same TD can
1081     // be used with different TemplateArgs, but ND uniquely identifies
1082     // TD / TemplateArg pairs.
1083     ArgBackRefMap::iterator Found = TemplateArgBackReferences.find(ND);
1084     if (Found == TemplateArgBackReferences.end()) {
1085 
1086       TemplateArgStringMap::iterator Found = TemplateArgStrings.find(ND);
1087       if (Found == TemplateArgStrings.end()) {
1088         // Mangle full template name into temporary buffer.
1089         llvm::SmallString<64> TemplateMangling;
1090         llvm::raw_svector_ostream Stream(TemplateMangling);
1091         MicrosoftCXXNameMangler Extra(Context, Stream);
1092         Extra.mangleTemplateInstantiationName(TD, *TemplateArgs);
1093 
1094         // Use the string backref vector to possibly get a back reference.
1095         mangleSourceName(TemplateMangling);
1096 
1097         // Memoize back reference for this type if one exist, else memoize
1098         // the mangling itself.
1099         BackRefVec::iterator StringFound =
1100             llvm::find(NameBackReferences, TemplateMangling);
1101         if (StringFound != NameBackReferences.end()) {
1102           TemplateArgBackReferences[ND] =
1103               StringFound - NameBackReferences.begin();
1104         } else {
1105           TemplateArgStrings[ND] =
1106               TemplateArgStringStorage.save(TemplateMangling.str());
1107         }
1108       } else {
1109         Out << Found->second << '@'; // Outputs a StringRef.
1110       }
1111     } else {
1112       Out << Found->second; // Outputs a back reference (an int).
1113     }
1114     return;
1115   }
1116 
1117   switch (Name.getNameKind()) {
1118     case DeclarationName::Identifier: {
1119       if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
1120         bool IsDeviceStub =
1121             ND &&
1122             ((isa<FunctionDecl>(ND) && ND->hasAttr<CUDAGlobalAttr>()) ||
1123              (isa<FunctionTemplateDecl>(ND) &&
1124               cast<FunctionTemplateDecl>(ND)
1125                   ->getTemplatedDecl()
1126                   ->hasAttr<CUDAGlobalAttr>())) &&
1127             GD.getKernelReferenceKind() == KernelReferenceKind::Stub;
1128         if (IsDeviceStub)
1129           mangleSourceName(
1130               (llvm::Twine("__device_stub__") + II->getName()).str());
1131         else
1132           mangleSourceName(II->getName());
1133         break;
1134       }
1135 
1136       // Otherwise, an anonymous entity.  We must have a declaration.
1137       assert(ND && "mangling empty name without declaration");
1138 
1139       if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
1140         if (NS->isAnonymousNamespace()) {
1141           Out << "?A0x" << Context.getAnonymousNamespaceHash() << '@';
1142           break;
1143         }
1144       }
1145 
1146       if (const DecompositionDecl *DD = dyn_cast<DecompositionDecl>(ND)) {
1147         // Decomposition declarations are considered anonymous, and get
1148         // numbered with a $S prefix.
1149         llvm::SmallString<64> Name("$S");
1150         // Get a unique id for the anonymous struct.
1151         Name += llvm::utostr(Context.getAnonymousStructId(DD) + 1);
1152         mangleSourceName(Name);
1153         break;
1154       }
1155 
1156       if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1157         // We must have an anonymous union or struct declaration.
1158         const CXXRecordDecl *RD = VD->getType()->getAsCXXRecordDecl();
1159         assert(RD && "expected variable decl to have a record type");
1160         // Anonymous types with no tag or typedef get the name of their
1161         // declarator mangled in.  If they have no declarator, number them with
1162         // a $S prefix.
1163         llvm::SmallString<64> Name("$S");
1164         // Get a unique id for the anonymous struct.
1165         Name += llvm::utostr(Context.getAnonymousStructId(RD) + 1);
1166         mangleSourceName(Name.str());
1167         break;
1168       }
1169 
1170       if (const MSGuidDecl *GD = dyn_cast<MSGuidDecl>(ND)) {
1171         // Mangle a GUID object as if it were a variable with the corresponding
1172         // mangled name.
1173         SmallString<sizeof("_GUID_12345678_1234_1234_1234_1234567890ab")> GUID;
1174         llvm::raw_svector_ostream GUIDOS(GUID);
1175         Context.mangleMSGuidDecl(GD, GUIDOS);
1176         mangleSourceName(GUID);
1177         break;
1178       }
1179 
1180       if (const auto *TPO = dyn_cast<TemplateParamObjectDecl>(ND)) {
1181         Out << "?__N";
1182         mangleTemplateArgValue(TPO->getType().getUnqualifiedType(),
1183                                TPO->getValue(), TplArgKind::ClassNTTP);
1184         break;
1185       }
1186 
1187       // We must have an anonymous struct.
1188       const TagDecl *TD = cast<TagDecl>(ND);
1189       if (const TypedefNameDecl *D = TD->getTypedefNameForAnonDecl()) {
1190         assert(TD->getDeclContext() == D->getDeclContext() &&
1191                "Typedef should not be in another decl context!");
1192         assert(D->getDeclName().getAsIdentifierInfo() &&
1193                "Typedef was not named!");
1194         mangleSourceName(D->getDeclName().getAsIdentifierInfo()->getName());
1195         break;
1196       }
1197 
1198       if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(TD)) {
1199         if (Record->isLambda()) {
1200           llvm::SmallString<10> Name("<lambda_");
1201 
1202           Decl *LambdaContextDecl = Record->getLambdaContextDecl();
1203           unsigned LambdaManglingNumber = Record->getLambdaManglingNumber();
1204           unsigned LambdaId;
1205           const ParmVarDecl *Parm =
1206               dyn_cast_or_null<ParmVarDecl>(LambdaContextDecl);
1207           const FunctionDecl *Func =
1208               Parm ? dyn_cast<FunctionDecl>(Parm->getDeclContext()) : nullptr;
1209 
1210           if (Func) {
1211             unsigned DefaultArgNo =
1212                 Func->getNumParams() - Parm->getFunctionScopeIndex();
1213             Name += llvm::utostr(DefaultArgNo);
1214             Name += "_";
1215           }
1216 
1217           if (LambdaManglingNumber)
1218             LambdaId = LambdaManglingNumber;
1219           else
1220             LambdaId = Context.getLambdaId(Record);
1221 
1222           Name += llvm::utostr(LambdaId);
1223           Name += ">";
1224 
1225           mangleSourceName(Name);
1226 
1227           // If the context is a variable or a class member and not a parameter,
1228           // it is encoded in a qualified name.
1229           if (LambdaManglingNumber && LambdaContextDecl) {
1230             if ((isa<VarDecl>(LambdaContextDecl) ||
1231                  isa<FieldDecl>(LambdaContextDecl)) &&
1232                 !isa<ParmVarDecl>(LambdaContextDecl)) {
1233               mangleUnqualifiedName(cast<NamedDecl>(LambdaContextDecl));
1234             }
1235           }
1236           break;
1237         }
1238       }
1239 
1240       llvm::SmallString<64> Name;
1241       if (DeclaratorDecl *DD =
1242               Context.getASTContext().getDeclaratorForUnnamedTagDecl(TD)) {
1243         // Anonymous types without a name for linkage purposes have their
1244         // declarator mangled in if they have one.
1245         Name += "<unnamed-type-";
1246         Name += DD->getName();
1247       } else if (TypedefNameDecl *TND =
1248                      Context.getASTContext().getTypedefNameForUnnamedTagDecl(
1249                          TD)) {
1250         // Anonymous types without a name for linkage purposes have their
1251         // associate typedef mangled in if they have one.
1252         Name += "<unnamed-type-";
1253         Name += TND->getName();
1254       } else if (isa<EnumDecl>(TD) &&
1255                  cast<EnumDecl>(TD)->enumerator_begin() !=
1256                      cast<EnumDecl>(TD)->enumerator_end()) {
1257         // Anonymous non-empty enums mangle in the first enumerator.
1258         auto *ED = cast<EnumDecl>(TD);
1259         Name += "<unnamed-enum-";
1260         Name += ED->enumerator_begin()->getName();
1261       } else {
1262         // Otherwise, number the types using a $S prefix.
1263         Name += "<unnamed-type-$S";
1264         Name += llvm::utostr(Context.getAnonymousStructId(TD) + 1);
1265       }
1266       Name += ">";
1267       mangleSourceName(Name.str());
1268       break;
1269     }
1270 
1271     case DeclarationName::ObjCZeroArgSelector:
1272     case DeclarationName::ObjCOneArgSelector:
1273     case DeclarationName::ObjCMultiArgSelector: {
1274       // This is reachable only when constructing an outlined SEH finally
1275       // block.  Nothing depends on this mangling and it's used only with
1276       // functinos with internal linkage.
1277       llvm::SmallString<64> Name;
1278       mangleSourceName(Name.str());
1279       break;
1280     }
1281 
1282     case DeclarationName::CXXConstructorName:
1283       if (isStructorDecl(ND)) {
1284         if (StructorType == Ctor_CopyingClosure) {
1285           Out << "?_O";
1286           return;
1287         }
1288         if (StructorType == Ctor_DefaultClosure) {
1289           Out << "?_F";
1290           return;
1291         }
1292       }
1293       Out << "?0";
1294       return;
1295 
1296     case DeclarationName::CXXDestructorName:
1297       if (isStructorDecl(ND))
1298         // If the named decl is the C++ destructor we're mangling,
1299         // use the type we were given.
1300         mangleCXXDtorType(static_cast<CXXDtorType>(StructorType));
1301       else
1302         // Otherwise, use the base destructor name. This is relevant if a
1303         // class with a destructor is declared within a destructor.
1304         mangleCXXDtorType(Dtor_Base);
1305       break;
1306 
1307     case DeclarationName::CXXConversionFunctionName:
1308       // <operator-name> ::= ?B # (cast)
1309       // The target type is encoded as the return type.
1310       Out << "?B";
1311       break;
1312 
1313     case DeclarationName::CXXOperatorName:
1314       mangleOperatorName(Name.getCXXOverloadedOperator(), ND->getLocation());
1315       break;
1316 
1317     case DeclarationName::CXXLiteralOperatorName: {
1318       Out << "?__K";
1319       mangleSourceName(Name.getCXXLiteralIdentifier()->getName());
1320       break;
1321     }
1322 
1323     case DeclarationName::CXXDeductionGuideName:
1324       llvm_unreachable("Can't mangle a deduction guide name!");
1325 
1326     case DeclarationName::CXXUsingDirective:
1327       llvm_unreachable("Can't mangle a using directive name!");
1328   }
1329 }
1330 
1331 // <postfix> ::= <unqualified-name> [<postfix>]
1332 //           ::= <substitution> [<postfix>]
mangleNestedName(GlobalDecl GD)1333 void MicrosoftCXXNameMangler::mangleNestedName(GlobalDecl GD) {
1334   const NamedDecl *ND = cast<NamedDecl>(GD.getDecl());
1335 
1336   if (const auto *ID = dyn_cast<IndirectFieldDecl>(ND))
1337     for (unsigned I = 1, IE = ID->getChainingSize(); I < IE; ++I)
1338       mangleSourceName("<unnamed-tag>");
1339 
1340   const DeclContext *DC = getEffectiveDeclContext(ND);
1341   while (!DC->isTranslationUnit()) {
1342     if (isa<TagDecl>(ND) || isa<VarDecl>(ND)) {
1343       unsigned Disc;
1344       if (Context.getNextDiscriminator(ND, Disc)) {
1345         Out << '?';
1346         mangleNumber(Disc);
1347         Out << '?';
1348       }
1349     }
1350 
1351     if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
1352       auto Discriminate =
1353           [](StringRef Name, const unsigned Discriminator,
1354              const unsigned ParameterDiscriminator) -> std::string {
1355         std::string Buffer;
1356         llvm::raw_string_ostream Stream(Buffer);
1357         Stream << Name;
1358         if (Discriminator)
1359           Stream << '_' << Discriminator;
1360         if (ParameterDiscriminator)
1361           Stream << '_' << ParameterDiscriminator;
1362         return Stream.str();
1363       };
1364 
1365       unsigned Discriminator = BD->getBlockManglingNumber();
1366       if (!Discriminator)
1367         Discriminator = Context.getBlockId(BD, /*Local=*/false);
1368 
1369       // Mangle the parameter position as a discriminator to deal with unnamed
1370       // parameters.  Rather than mangling the unqualified parameter name,
1371       // always use the position to give a uniform mangling.
1372       unsigned ParameterDiscriminator = 0;
1373       if (const auto *MC = BD->getBlockManglingContextDecl())
1374         if (const auto *P = dyn_cast<ParmVarDecl>(MC))
1375           if (const auto *F = dyn_cast<FunctionDecl>(P->getDeclContext()))
1376             ParameterDiscriminator =
1377                 F->getNumParams() - P->getFunctionScopeIndex();
1378 
1379       DC = getEffectiveDeclContext(BD);
1380 
1381       Out << '?';
1382       mangleSourceName(Discriminate("_block_invoke", Discriminator,
1383                                     ParameterDiscriminator));
1384       // If we have a block mangling context, encode that now.  This allows us
1385       // to discriminate between named static data initializers in the same
1386       // scope.  This is handled differently from parameters, which use
1387       // positions to discriminate between multiple instances.
1388       if (const auto *MC = BD->getBlockManglingContextDecl())
1389         if (!isa<ParmVarDecl>(MC))
1390           if (const auto *ND = dyn_cast<NamedDecl>(MC))
1391             mangleUnqualifiedName(ND);
1392       // MS ABI and Itanium manglings are in inverted scopes.  In the case of a
1393       // RecordDecl, mangle the entire scope hierarchy at this point rather than
1394       // just the unqualified name to get the ordering correct.
1395       if (const auto *RD = dyn_cast<RecordDecl>(DC))
1396         mangleName(RD);
1397       else
1398         Out << '@';
1399       // void __cdecl
1400       Out << "YAX";
1401       // struct __block_literal *
1402       Out << 'P';
1403       // __ptr64
1404       if (PointersAre64Bit)
1405         Out << 'E';
1406       Out << 'A';
1407       mangleArtificialTagType(TagTypeKind::Struct,
1408                               Discriminate("__block_literal", Discriminator,
1409                                            ParameterDiscriminator));
1410       Out << "@Z";
1411 
1412       // If the effective context was a Record, we have fully mangled the
1413       // qualified name and do not need to continue.
1414       if (isa<RecordDecl>(DC))
1415         break;
1416       continue;
1417     } else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC)) {
1418       mangleObjCMethodName(Method);
1419     } else if (isa<NamedDecl>(DC)) {
1420       ND = cast<NamedDecl>(DC);
1421       if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1422         mangle(getGlobalDeclAsDeclContext(FD), "?");
1423         break;
1424       } else {
1425         mangleUnqualifiedName(ND);
1426         // Lambdas in default arguments conceptually belong to the function the
1427         // parameter corresponds to.
1428         if (const auto *LDADC = getLambdaDefaultArgumentDeclContext(ND)) {
1429           DC = LDADC;
1430           continue;
1431         }
1432       }
1433     }
1434     DC = DC->getParent();
1435   }
1436 }
1437 
mangleCXXDtorType(CXXDtorType T)1438 void MicrosoftCXXNameMangler::mangleCXXDtorType(CXXDtorType T) {
1439   // Microsoft uses the names on the case labels for these dtor variants.  Clang
1440   // uses the Itanium terminology internally.  Everything in this ABI delegates
1441   // towards the base dtor.
1442   switch (T) {
1443   // <operator-name> ::= ?1  # destructor
1444   case Dtor_Base: Out << "?1"; return;
1445   // <operator-name> ::= ?_D # vbase destructor
1446   case Dtor_Complete: Out << "?_D"; return;
1447   // <operator-name> ::= ?_G # scalar deleting destructor
1448   case Dtor_Deleting: Out << "?_G"; return;
1449   // <operator-name> ::= ?_E # vector deleting destructor
1450   // FIXME: Add a vector deleting dtor type.  It goes in the vtable, so we need
1451   // it.
1452   case Dtor_Comdat:
1453     llvm_unreachable("not expecting a COMDAT");
1454   }
1455   llvm_unreachable("Unsupported dtor type?");
1456 }
1457 
mangleOperatorName(OverloadedOperatorKind OO,SourceLocation Loc)1458 void MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO,
1459                                                  SourceLocation Loc) {
1460   switch (OO) {
1461   //                     ?0 # constructor
1462   //                     ?1 # destructor
1463   // <operator-name> ::= ?2 # new
1464   case OO_New: Out << "?2"; break;
1465   // <operator-name> ::= ?3 # delete
1466   case OO_Delete: Out << "?3"; break;
1467   // <operator-name> ::= ?4 # =
1468   case OO_Equal: Out << "?4"; break;
1469   // <operator-name> ::= ?5 # >>
1470   case OO_GreaterGreater: Out << "?5"; break;
1471   // <operator-name> ::= ?6 # <<
1472   case OO_LessLess: Out << "?6"; break;
1473   // <operator-name> ::= ?7 # !
1474   case OO_Exclaim: Out << "?7"; break;
1475   // <operator-name> ::= ?8 # ==
1476   case OO_EqualEqual: Out << "?8"; break;
1477   // <operator-name> ::= ?9 # !=
1478   case OO_ExclaimEqual: Out << "?9"; break;
1479   // <operator-name> ::= ?A # []
1480   case OO_Subscript: Out << "?A"; break;
1481   //                     ?B # conversion
1482   // <operator-name> ::= ?C # ->
1483   case OO_Arrow: Out << "?C"; break;
1484   // <operator-name> ::= ?D # *
1485   case OO_Star: Out << "?D"; break;
1486   // <operator-name> ::= ?E # ++
1487   case OO_PlusPlus: Out << "?E"; break;
1488   // <operator-name> ::= ?F # --
1489   case OO_MinusMinus: Out << "?F"; break;
1490   // <operator-name> ::= ?G # -
1491   case OO_Minus: Out << "?G"; break;
1492   // <operator-name> ::= ?H # +
1493   case OO_Plus: Out << "?H"; break;
1494   // <operator-name> ::= ?I # &
1495   case OO_Amp: Out << "?I"; break;
1496   // <operator-name> ::= ?J # ->*
1497   case OO_ArrowStar: Out << "?J"; break;
1498   // <operator-name> ::= ?K # /
1499   case OO_Slash: Out << "?K"; break;
1500   // <operator-name> ::= ?L # %
1501   case OO_Percent: Out << "?L"; break;
1502   // <operator-name> ::= ?M # <
1503   case OO_Less: Out << "?M"; break;
1504   // <operator-name> ::= ?N # <=
1505   case OO_LessEqual: Out << "?N"; break;
1506   // <operator-name> ::= ?O # >
1507   case OO_Greater: Out << "?O"; break;
1508   // <operator-name> ::= ?P # >=
1509   case OO_GreaterEqual: Out << "?P"; break;
1510   // <operator-name> ::= ?Q # ,
1511   case OO_Comma: Out << "?Q"; break;
1512   // <operator-name> ::= ?R # ()
1513   case OO_Call: Out << "?R"; break;
1514   // <operator-name> ::= ?S # ~
1515   case OO_Tilde: Out << "?S"; break;
1516   // <operator-name> ::= ?T # ^
1517   case OO_Caret: Out << "?T"; break;
1518   // <operator-name> ::= ?U # |
1519   case OO_Pipe: Out << "?U"; break;
1520   // <operator-name> ::= ?V # &&
1521   case OO_AmpAmp: Out << "?V"; break;
1522   // <operator-name> ::= ?W # ||
1523   case OO_PipePipe: Out << "?W"; break;
1524   // <operator-name> ::= ?X # *=
1525   case OO_StarEqual: Out << "?X"; break;
1526   // <operator-name> ::= ?Y # +=
1527   case OO_PlusEqual: Out << "?Y"; break;
1528   // <operator-name> ::= ?Z # -=
1529   case OO_MinusEqual: Out << "?Z"; break;
1530   // <operator-name> ::= ?_0 # /=
1531   case OO_SlashEqual: Out << "?_0"; break;
1532   // <operator-name> ::= ?_1 # %=
1533   case OO_PercentEqual: Out << "?_1"; break;
1534   // <operator-name> ::= ?_2 # >>=
1535   case OO_GreaterGreaterEqual: Out << "?_2"; break;
1536   // <operator-name> ::= ?_3 # <<=
1537   case OO_LessLessEqual: Out << "?_3"; break;
1538   // <operator-name> ::= ?_4 # &=
1539   case OO_AmpEqual: Out << "?_4"; break;
1540   // <operator-name> ::= ?_5 # |=
1541   case OO_PipeEqual: Out << "?_5"; break;
1542   // <operator-name> ::= ?_6 # ^=
1543   case OO_CaretEqual: Out << "?_6"; break;
1544   //                     ?_7 # vftable
1545   //                     ?_8 # vbtable
1546   //                     ?_9 # vcall
1547   //                     ?_A # typeof
1548   //                     ?_B # local static guard
1549   //                     ?_C # string
1550   //                     ?_D # vbase destructor
1551   //                     ?_E # vector deleting destructor
1552   //                     ?_F # default constructor closure
1553   //                     ?_G # scalar deleting destructor
1554   //                     ?_H # vector constructor iterator
1555   //                     ?_I # vector destructor iterator
1556   //                     ?_J # vector vbase constructor iterator
1557   //                     ?_K # virtual displacement map
1558   //                     ?_L # eh vector constructor iterator
1559   //                     ?_M # eh vector destructor iterator
1560   //                     ?_N # eh vector vbase constructor iterator
1561   //                     ?_O # copy constructor closure
1562   //                     ?_P<name> # udt returning <name>
1563   //                     ?_Q # <unknown>
1564   //                     ?_R0 # RTTI Type Descriptor
1565   //                     ?_R1 # RTTI Base Class Descriptor at (a,b,c,d)
1566   //                     ?_R2 # RTTI Base Class Array
1567   //                     ?_R3 # RTTI Class Hierarchy Descriptor
1568   //                     ?_R4 # RTTI Complete Object Locator
1569   //                     ?_S # local vftable
1570   //                     ?_T # local vftable constructor closure
1571   // <operator-name> ::= ?_U # new[]
1572   case OO_Array_New: Out << "?_U"; break;
1573   // <operator-name> ::= ?_V # delete[]
1574   case OO_Array_Delete: Out << "?_V"; break;
1575   // <operator-name> ::= ?__L # co_await
1576   case OO_Coawait: Out << "?__L"; break;
1577   // <operator-name> ::= ?__M # <=>
1578   case OO_Spaceship: Out << "?__M"; break;
1579 
1580   case OO_Conditional: {
1581     DiagnosticsEngine &Diags = Context.getDiags();
1582     unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1583       "cannot mangle this conditional operator yet");
1584     Diags.Report(Loc, DiagID);
1585     break;
1586   }
1587 
1588   case OO_None:
1589   case NUM_OVERLOADED_OPERATORS:
1590     llvm_unreachable("Not an overloaded operator");
1591   }
1592 }
1593 
mangleSourceName(StringRef Name)1594 void MicrosoftCXXNameMangler::mangleSourceName(StringRef Name) {
1595   // <source name> ::= <identifier> @
1596   BackRefVec::iterator Found = llvm::find(NameBackReferences, Name);
1597   if (Found == NameBackReferences.end()) {
1598     if (NameBackReferences.size() < 10)
1599       NameBackReferences.push_back(std::string(Name));
1600     Out << Name << '@';
1601   } else {
1602     Out << (Found - NameBackReferences.begin());
1603   }
1604 }
1605 
mangleObjCMethodName(const ObjCMethodDecl * MD)1606 void MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
1607   Context.mangleObjCMethodNameAsSourceName(MD, Out);
1608 }
1609 
mangleTemplateInstantiationName(GlobalDecl GD,const TemplateArgumentList & TemplateArgs)1610 void MicrosoftCXXNameMangler::mangleTemplateInstantiationName(
1611     GlobalDecl GD, const TemplateArgumentList &TemplateArgs) {
1612   // <template-name> ::= <unscoped-template-name> <template-args>
1613   //                 ::= <substitution>
1614   // Always start with the unqualified name.
1615 
1616   // Templates have their own context for back references.
1617   ArgBackRefMap OuterFunArgsContext;
1618   ArgBackRefMap OuterTemplateArgsContext;
1619   BackRefVec OuterTemplateContext;
1620   PassObjectSizeArgsSet OuterPassObjectSizeArgs;
1621   NameBackReferences.swap(OuterTemplateContext);
1622   FunArgBackReferences.swap(OuterFunArgsContext);
1623   TemplateArgBackReferences.swap(OuterTemplateArgsContext);
1624   PassObjectSizeArgs.swap(OuterPassObjectSizeArgs);
1625 
1626   mangleUnscopedTemplateName(GD);
1627   mangleTemplateArgs(cast<TemplateDecl>(GD.getDecl()), TemplateArgs);
1628 
1629   // Restore the previous back reference contexts.
1630   NameBackReferences.swap(OuterTemplateContext);
1631   FunArgBackReferences.swap(OuterFunArgsContext);
1632   TemplateArgBackReferences.swap(OuterTemplateArgsContext);
1633   PassObjectSizeArgs.swap(OuterPassObjectSizeArgs);
1634 }
1635 
mangleUnscopedTemplateName(GlobalDecl GD)1636 void MicrosoftCXXNameMangler::mangleUnscopedTemplateName(GlobalDecl GD) {
1637   // <unscoped-template-name> ::= ?$ <unqualified-name>
1638   Out << "?$";
1639   mangleUnqualifiedName(GD);
1640 }
1641 
mangleIntegerLiteral(const llvm::APSInt & Value,const NonTypeTemplateParmDecl * PD,QualType TemplateArgType)1642 void MicrosoftCXXNameMangler::mangleIntegerLiteral(
1643     const llvm::APSInt &Value, const NonTypeTemplateParmDecl *PD,
1644     QualType TemplateArgType) {
1645   // <integer-literal> ::= $0 <number>
1646   // <integer-literal> ::= <auto-nttp>
1647   //
1648   // <auto-nttp> ::= $ M <type> 0 <number>
1649   Out << "$";
1650 
1651   // Since MSVC 2019, add 'M[<type>]' after '$' for auto template parameter when
1652   // argument is integer.
1653   if (getASTContext().getLangOpts().isCompatibleWithMSVC(
1654           LangOptions::MSVC2019) &&
1655       PD && PD->getType()->getTypeClass() == Type::Auto &&
1656       !TemplateArgType.isNull()) {
1657     Out << "M";
1658     mangleType(TemplateArgType, SourceRange(), QMM_Drop);
1659   }
1660 
1661   Out << "0";
1662 
1663   mangleNumber(Value);
1664 }
1665 
mangleExpression(const Expr * E,const NonTypeTemplateParmDecl * PD)1666 void MicrosoftCXXNameMangler::mangleExpression(
1667     const Expr *E, const NonTypeTemplateParmDecl *PD) {
1668   // See if this is a constant expression.
1669   if (std::optional<llvm::APSInt> Value =
1670           E->getIntegerConstantExpr(Context.getASTContext())) {
1671     mangleIntegerLiteral(*Value, PD, E->getType());
1672     return;
1673   }
1674 
1675   // As bad as this diagnostic is, it's better than crashing.
1676   DiagnosticsEngine &Diags = Context.getDiags();
1677   unsigned DiagID = Diags.getCustomDiagID(
1678       DiagnosticsEngine::Error, "cannot yet mangle expression type %0");
1679   Diags.Report(E->getExprLoc(), DiagID) << E->getStmtClassName()
1680                                         << E->getSourceRange();
1681 }
1682 
mangleTemplateArgs(const TemplateDecl * TD,const TemplateArgumentList & TemplateArgs)1683 void MicrosoftCXXNameMangler::mangleTemplateArgs(
1684     const TemplateDecl *TD, const TemplateArgumentList &TemplateArgs) {
1685   // <template-args> ::= <template-arg>+
1686   const TemplateParameterList *TPL = TD->getTemplateParameters();
1687   assert(TPL->size() == TemplateArgs.size() &&
1688          "size mismatch between args and parms!");
1689 
1690   for (size_t i = 0; i < TemplateArgs.size(); ++i) {
1691     const TemplateArgument &TA = TemplateArgs[i];
1692 
1693     // Separate consecutive packs by $$Z.
1694     if (i > 0 && TA.getKind() == TemplateArgument::Pack &&
1695         TemplateArgs[i - 1].getKind() == TemplateArgument::Pack)
1696       Out << "$$Z";
1697 
1698     mangleTemplateArg(TD, TA, TPL->getParam(i));
1699   }
1700 }
1701 
1702 /// If value V (with type T) represents a decayed pointer to the first element
1703 /// of an array, return that array.
getAsArrayToPointerDecayedDecl(QualType T,const APValue & V)1704 static ValueDecl *getAsArrayToPointerDecayedDecl(QualType T, const APValue &V) {
1705   // Must be a pointer...
1706   if (!T->isPointerType() || !V.isLValue() || !V.hasLValuePath() ||
1707       !V.getLValueBase())
1708     return nullptr;
1709   // ... to element 0 of an array.
1710   QualType BaseT = V.getLValueBase().getType();
1711   if (!BaseT->isArrayType() || V.getLValuePath().size() != 1 ||
1712       V.getLValuePath()[0].getAsArrayIndex() != 0)
1713     return nullptr;
1714   return const_cast<ValueDecl *>(
1715       V.getLValueBase().dyn_cast<const ValueDecl *>());
1716 }
1717 
mangleTemplateArg(const TemplateDecl * TD,const TemplateArgument & TA,const NamedDecl * Parm)1718 void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD,
1719                                                 const TemplateArgument &TA,
1720                                                 const NamedDecl *Parm) {
1721   // <template-arg> ::= <type>
1722   //                ::= <integer-literal>
1723   //                ::= <member-data-pointer>
1724   //                ::= <member-function-pointer>
1725   //                ::= $ <constant-value>
1726   //                ::= $ <auto-nttp-constant-value>
1727   //                ::= <template-args>
1728   //
1729   // <auto-nttp-constant-value> ::= M <type> <constant-value>
1730   //
1731   // <constant-value> ::= 0 <number>                   # integer
1732   //                  ::= 1 <mangled-name>             # address of D
1733   //                  ::= 2 <type> <typed-constant-value>* @ # struct
1734   //                  ::= 3 <type> <constant-value>* @ # array
1735   //                  ::= 4 ???                        # string
1736   //                  ::= 5 <constant-value> @         # address of subobject
1737   //                  ::= 6 <constant-value> <unqualified-name> @ # a.b
1738   //                  ::= 7 <type> [<unqualified-name> <constant-value>] @
1739   //                      # union, with or without an active member
1740   //                  # pointer to member, symbolically
1741   //                  ::= 8 <class> <unqualified-name> @
1742   //                  ::= A <type> <non-negative integer>  # float
1743   //                  ::= B <type> <non-negative integer>  # double
1744   //                  # pointer to member, by component value
1745   //                  ::= F <number> <number>
1746   //                  ::= G <number> <number> <number>
1747   //                  ::= H <mangled-name> <number>
1748   //                  ::= I <mangled-name> <number> <number>
1749   //                  ::= J <mangled-name> <number> <number> <number>
1750   //
1751   // <typed-constant-value> ::= [<type>] <constant-value>
1752   //
1753   // The <type> appears to be included in a <typed-constant-value> only in the
1754   // '0', '1', '8', 'A', 'B', and 'E' cases.
1755 
1756   switch (TA.getKind()) {
1757   case TemplateArgument::Null:
1758     llvm_unreachable("Can't mangle null template arguments!");
1759   case TemplateArgument::TemplateExpansion:
1760     llvm_unreachable("Can't mangle template expansion arguments!");
1761   case TemplateArgument::Type: {
1762     QualType T = TA.getAsType();
1763     mangleType(T, SourceRange(), QMM_Escape);
1764     break;
1765   }
1766   case TemplateArgument::Declaration: {
1767     const NamedDecl *ND = TA.getAsDecl();
1768     if (isa<FieldDecl>(ND) || isa<IndirectFieldDecl>(ND)) {
1769       mangleMemberDataPointer(cast<CXXRecordDecl>(ND->getDeclContext())
1770                                   ->getMostRecentNonInjectedDecl(),
1771                               cast<ValueDecl>(ND),
1772                               cast<NonTypeTemplateParmDecl>(Parm),
1773                               TA.getParamTypeForDecl());
1774     } else if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)) {
1775       const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
1776       if (MD && MD->isInstance()) {
1777         mangleMemberFunctionPointer(
1778             MD->getParent()->getMostRecentNonInjectedDecl(), MD,
1779             cast<NonTypeTemplateParmDecl>(Parm), TA.getParamTypeForDecl());
1780       } else {
1781         mangleFunctionPointer(FD, cast<NonTypeTemplateParmDecl>(Parm),
1782                               TA.getParamTypeForDecl());
1783       }
1784     } else if (TA.getParamTypeForDecl()->isRecordType()) {
1785       Out << "$";
1786       auto *TPO = cast<TemplateParamObjectDecl>(ND);
1787       mangleTemplateArgValue(TPO->getType().getUnqualifiedType(),
1788                              TPO->getValue(), TplArgKind::ClassNTTP);
1789     } else if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) {
1790       mangleVarDecl(VD, cast<NonTypeTemplateParmDecl>(Parm),
1791                     TA.getParamTypeForDecl());
1792     } else {
1793       mangle(ND, "$1?");
1794     }
1795     break;
1796   }
1797   case TemplateArgument::Integral: {
1798     QualType T = TA.getIntegralType();
1799     mangleIntegerLiteral(TA.getAsIntegral(),
1800                          cast<NonTypeTemplateParmDecl>(Parm), T);
1801     break;
1802   }
1803   case TemplateArgument::NullPtr: {
1804     QualType T = TA.getNullPtrType();
1805     if (const MemberPointerType *MPT = T->getAs<MemberPointerType>()) {
1806       const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
1807       if (MPT->isMemberFunctionPointerType() &&
1808           !isa<FunctionTemplateDecl>(TD)) {
1809         mangleMemberFunctionPointer(RD, nullptr, nullptr, QualType());
1810         return;
1811       }
1812       if (MPT->isMemberDataPointer()) {
1813         if (!isa<FunctionTemplateDecl>(TD)) {
1814           mangleMemberDataPointer(RD, nullptr, nullptr, QualType());
1815           return;
1816         }
1817         // nullptr data pointers are always represented with a single field
1818         // which is initialized with either 0 or -1.  Why -1?  Well, we need to
1819         // distinguish the case where the data member is at offset zero in the
1820         // record.
1821         // However, we are free to use 0 *if* we would use multiple fields for
1822         // non-nullptr member pointers.
1823         if (!RD->nullFieldOffsetIsZero()) {
1824           mangleIntegerLiteral(llvm::APSInt::get(-1),
1825                                cast<NonTypeTemplateParmDecl>(Parm), T);
1826           return;
1827         }
1828       }
1829     }
1830     mangleIntegerLiteral(llvm::APSInt::getUnsigned(0),
1831                          cast<NonTypeTemplateParmDecl>(Parm), T);
1832     break;
1833   }
1834   case TemplateArgument::StructuralValue:
1835     if (ValueDecl *D = getAsArrayToPointerDecayedDecl(
1836             TA.getStructuralValueType(), TA.getAsStructuralValue())) {
1837       // Mangle the result of array-to-pointer decay as if it were a reference
1838       // to the original declaration, to match MSVC's behavior. This can result
1839       // in mangling collisions in some cases!
1840       return mangleTemplateArg(
1841           TD, TemplateArgument(D, TA.getStructuralValueType()), Parm);
1842     }
1843     Out << "$";
1844     if (cast<NonTypeTemplateParmDecl>(Parm)
1845             ->getType()
1846             ->getContainedDeducedType()) {
1847       Out << "M";
1848       mangleType(TA.getNonTypeTemplateArgumentType(), SourceRange(), QMM_Drop);
1849     }
1850     mangleTemplateArgValue(TA.getStructuralValueType(),
1851                            TA.getAsStructuralValue(),
1852                            TplArgKind::StructuralValue,
1853                            /*WithScalarType=*/false);
1854     break;
1855   case TemplateArgument::Expression:
1856     mangleExpression(TA.getAsExpr(), cast<NonTypeTemplateParmDecl>(Parm));
1857     break;
1858   case TemplateArgument::Pack: {
1859     ArrayRef<TemplateArgument> TemplateArgs = TA.getPackAsArray();
1860     if (TemplateArgs.empty()) {
1861       if (isa<TemplateTypeParmDecl>(Parm) ||
1862           isa<TemplateTemplateParmDecl>(Parm))
1863         // MSVC 2015 changed the mangling for empty expanded template packs,
1864         // use the old mangling for link compatibility for old versions.
1865         Out << (Context.getASTContext().getLangOpts().isCompatibleWithMSVC(
1866                     LangOptions::MSVC2015)
1867                     ? "$$V"
1868                     : "$$$V");
1869       else if (isa<NonTypeTemplateParmDecl>(Parm))
1870         Out << "$S";
1871       else
1872         llvm_unreachable("unexpected template parameter decl!");
1873     } else {
1874       for (const TemplateArgument &PA : TemplateArgs)
1875         mangleTemplateArg(TD, PA, Parm);
1876     }
1877     break;
1878   }
1879   case TemplateArgument::Template: {
1880     const NamedDecl *ND =
1881         TA.getAsTemplate().getAsTemplateDecl()->getTemplatedDecl();
1882     if (const auto *TD = dyn_cast<TagDecl>(ND)) {
1883       mangleType(TD);
1884     } else if (isa<TypeAliasDecl>(ND)) {
1885       Out << "$$Y";
1886       mangleName(ND);
1887     } else {
1888       llvm_unreachable("unexpected template template NamedDecl!");
1889     }
1890     break;
1891   }
1892   }
1893 }
1894 
mangleTemplateArgValue(QualType T,const APValue & V,TplArgKind TAK,bool WithScalarType)1895 void MicrosoftCXXNameMangler::mangleTemplateArgValue(QualType T,
1896                                                      const APValue &V,
1897                                                      TplArgKind TAK,
1898                                                      bool WithScalarType) {
1899   switch (V.getKind()) {
1900   case APValue::None:
1901   case APValue::Indeterminate:
1902     // FIXME: MSVC doesn't allow this, so we can't be sure how it should be
1903     // mangled.
1904     if (WithScalarType)
1905       mangleType(T, SourceRange(), QMM_Escape);
1906     Out << '@';
1907     return;
1908 
1909   case APValue::Int:
1910     if (WithScalarType)
1911       mangleType(T, SourceRange(), QMM_Escape);
1912     Out << '0';
1913     mangleNumber(V.getInt());
1914     return;
1915 
1916   case APValue::Float:
1917     if (WithScalarType)
1918       mangleType(T, SourceRange(), QMM_Escape);
1919     mangleFloat(V.getFloat());
1920     return;
1921 
1922   case APValue::LValue: {
1923     if (WithScalarType)
1924       mangleType(T, SourceRange(), QMM_Escape);
1925 
1926     // We don't know how to mangle past-the-end pointers yet.
1927     if (V.isLValueOnePastTheEnd())
1928       break;
1929 
1930     APValue::LValueBase Base = V.getLValueBase();
1931     if (!V.hasLValuePath() || V.getLValuePath().empty()) {
1932       // Taking the address of a complete object has a special-case mangling.
1933       if (Base.isNull()) {
1934         // MSVC emits 0A@ for null pointers. Generalize this for arbitrary
1935         // integers cast to pointers.
1936         // FIXME: This mangles 0 cast to a pointer the same as a null pointer,
1937         // even in cases where the two are different values.
1938         Out << "0";
1939         mangleNumber(V.getLValueOffset().getQuantity());
1940       } else if (!V.hasLValuePath()) {
1941         // FIXME: This can only happen as an extension. Invent a mangling.
1942         break;
1943       } else if (auto *VD = Base.dyn_cast<const ValueDecl*>()) {
1944         Out << "E";
1945         mangle(VD);
1946       } else {
1947         break;
1948       }
1949     } else {
1950       if (TAK == TplArgKind::ClassNTTP && T->isPointerType())
1951         Out << "5";
1952 
1953       SmallVector<char, 2> EntryTypes;
1954       SmallVector<std::function<void()>, 2> EntryManglers;
1955       QualType ET = Base.getType();
1956       for (APValue::LValuePathEntry E : V.getLValuePath()) {
1957         if (auto *AT = ET->getAsArrayTypeUnsafe()) {
1958           EntryTypes.push_back('C');
1959           EntryManglers.push_back([this, I = E.getAsArrayIndex()] {
1960             Out << '0';
1961             mangleNumber(I);
1962             Out << '@';
1963           });
1964           ET = AT->getElementType();
1965           continue;
1966         }
1967 
1968         const Decl *D = E.getAsBaseOrMember().getPointer();
1969         if (auto *FD = dyn_cast<FieldDecl>(D)) {
1970           ET = FD->getType();
1971           if (const auto *RD = ET->getAsRecordDecl())
1972             if (RD->isAnonymousStructOrUnion())
1973               continue;
1974         } else {
1975           ET = getASTContext().getRecordType(cast<CXXRecordDecl>(D));
1976           // Bug in MSVC: fully qualified name of base class should be used for
1977           // mangling to prevent collisions e.g. on base classes with same names
1978           // in different namespaces.
1979         }
1980 
1981         EntryTypes.push_back('6');
1982         EntryManglers.push_back([this, D] {
1983           mangleUnqualifiedName(cast<NamedDecl>(D));
1984           Out << '@';
1985         });
1986       }
1987 
1988       for (auto I = EntryTypes.rbegin(), E = EntryTypes.rend(); I != E; ++I)
1989         Out << *I;
1990 
1991       auto *VD = Base.dyn_cast<const ValueDecl*>();
1992       if (!VD)
1993         break;
1994       Out << (TAK == TplArgKind::ClassNTTP ? 'E' : '1');
1995       mangle(VD);
1996 
1997       for (const std::function<void()> &Mangler : EntryManglers)
1998         Mangler();
1999       if (TAK == TplArgKind::ClassNTTP && T->isPointerType())
2000         Out << '@';
2001     }
2002 
2003     return;
2004   }
2005 
2006   case APValue::MemberPointer: {
2007     if (WithScalarType)
2008       mangleType(T, SourceRange(), QMM_Escape);
2009 
2010     const CXXRecordDecl *RD =
2011         T->castAs<MemberPointerType>()->getMostRecentCXXRecordDecl();
2012     const ValueDecl *D = V.getMemberPointerDecl();
2013     if (TAK == TplArgKind::ClassNTTP) {
2014       if (T->isMemberDataPointerType())
2015         mangleMemberDataPointerInClassNTTP(RD, D);
2016       else
2017         mangleMemberFunctionPointerInClassNTTP(RD,
2018                                                cast_or_null<CXXMethodDecl>(D));
2019     } else {
2020       if (T->isMemberDataPointerType())
2021         mangleMemberDataPointer(RD, D, nullptr, QualType(), "");
2022       else
2023         mangleMemberFunctionPointer(RD, cast_or_null<CXXMethodDecl>(D), nullptr,
2024                                     QualType(), "");
2025     }
2026     return;
2027   }
2028 
2029   case APValue::Struct: {
2030     Out << '2';
2031     mangleType(T, SourceRange(), QMM_Escape);
2032     const CXXRecordDecl *RD = T->getAsCXXRecordDecl();
2033     assert(RD && "unexpected type for record value");
2034 
2035     unsigned BaseIndex = 0;
2036     for (const CXXBaseSpecifier &B : RD->bases())
2037       mangleTemplateArgValue(B.getType(), V.getStructBase(BaseIndex++), TAK);
2038     for (const FieldDecl *FD : RD->fields())
2039       if (!FD->isUnnamedBitField())
2040         mangleTemplateArgValue(FD->getType(),
2041                                V.getStructField(FD->getFieldIndex()), TAK,
2042                                /*WithScalarType*/ true);
2043     Out << '@';
2044     return;
2045   }
2046 
2047   case APValue::Union:
2048     Out << '7';
2049     mangleType(T, SourceRange(), QMM_Escape);
2050     if (const FieldDecl *FD = V.getUnionField()) {
2051       mangleUnqualifiedName(FD);
2052       mangleTemplateArgValue(FD->getType(), V.getUnionValue(), TAK);
2053     }
2054     Out << '@';
2055     return;
2056 
2057   case APValue::ComplexInt:
2058     // We mangle complex types as structs, so mangle the value as a struct too.
2059     Out << '2';
2060     mangleType(T, SourceRange(), QMM_Escape);
2061     Out << '0';
2062     mangleNumber(V.getComplexIntReal());
2063     Out << '0';
2064     mangleNumber(V.getComplexIntImag());
2065     Out << '@';
2066     return;
2067 
2068   case APValue::ComplexFloat:
2069     Out << '2';
2070     mangleType(T, SourceRange(), QMM_Escape);
2071     mangleFloat(V.getComplexFloatReal());
2072     mangleFloat(V.getComplexFloatImag());
2073     Out << '@';
2074     return;
2075 
2076   case APValue::Array: {
2077     Out << '3';
2078     QualType ElemT = getASTContext().getAsArrayType(T)->getElementType();
2079     mangleType(ElemT, SourceRange(), QMM_Escape);
2080     for (unsigned I = 0, N = V.getArraySize(); I != N; ++I) {
2081       const APValue &ElemV = I < V.getArrayInitializedElts()
2082                                  ? V.getArrayInitializedElt(I)
2083                                  : V.getArrayFiller();
2084       mangleTemplateArgValue(ElemT, ElemV, TAK);
2085       Out << '@';
2086     }
2087     Out << '@';
2088     return;
2089   }
2090 
2091   case APValue::Vector: {
2092     // __m128 is mangled as a struct containing an array. We follow this
2093     // approach for all vector types.
2094     Out << '2';
2095     mangleType(T, SourceRange(), QMM_Escape);
2096     Out << '3';
2097     QualType ElemT = T->castAs<VectorType>()->getElementType();
2098     mangleType(ElemT, SourceRange(), QMM_Escape);
2099     for (unsigned I = 0, N = V.getVectorLength(); I != N; ++I) {
2100       const APValue &ElemV = V.getVectorElt(I);
2101       mangleTemplateArgValue(ElemT, ElemV, TAK);
2102       Out << '@';
2103     }
2104     Out << "@@";
2105     return;
2106   }
2107 
2108   case APValue::AddrLabelDiff:
2109   case APValue::FixedPoint:
2110     break;
2111   }
2112 
2113   DiagnosticsEngine &Diags = Context.getDiags();
2114   unsigned DiagID = Diags.getCustomDiagID(
2115       DiagnosticsEngine::Error, "cannot mangle this template argument yet");
2116   Diags.Report(DiagID);
2117 }
2118 
mangleObjCProtocol(const ObjCProtocolDecl * PD)2119 void MicrosoftCXXNameMangler::mangleObjCProtocol(const ObjCProtocolDecl *PD) {
2120   llvm::SmallString<64> TemplateMangling;
2121   llvm::raw_svector_ostream Stream(TemplateMangling);
2122   MicrosoftCXXNameMangler Extra(Context, Stream);
2123 
2124   Stream << "?$";
2125   Extra.mangleSourceName("Protocol");
2126   Extra.mangleArtificialTagType(TagTypeKind::Struct, PD->getName());
2127 
2128   mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__ObjC"});
2129 }
2130 
mangleObjCLifetime(const QualType Type,Qualifiers Quals,SourceRange Range)2131 void MicrosoftCXXNameMangler::mangleObjCLifetime(const QualType Type,
2132                                                  Qualifiers Quals,
2133                                                  SourceRange Range) {
2134   llvm::SmallString<64> TemplateMangling;
2135   llvm::raw_svector_ostream Stream(TemplateMangling);
2136   MicrosoftCXXNameMangler Extra(Context, Stream);
2137 
2138   Stream << "?$";
2139   switch (Quals.getObjCLifetime()) {
2140   case Qualifiers::OCL_None:
2141   case Qualifiers::OCL_ExplicitNone:
2142     break;
2143   case Qualifiers::OCL_Autoreleasing:
2144     Extra.mangleSourceName("Autoreleasing");
2145     break;
2146   case Qualifiers::OCL_Strong:
2147     Extra.mangleSourceName("Strong");
2148     break;
2149   case Qualifiers::OCL_Weak:
2150     Extra.mangleSourceName("Weak");
2151     break;
2152   }
2153   Extra.manglePointerCVQualifiers(Quals);
2154   Extra.manglePointerExtQualifiers(Quals, Type);
2155   Extra.mangleType(Type, Range);
2156 
2157   mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__ObjC"});
2158 }
2159 
mangleObjCKindOfType(const ObjCObjectType * T,Qualifiers Quals,SourceRange Range)2160 void MicrosoftCXXNameMangler::mangleObjCKindOfType(const ObjCObjectType *T,
2161                                                    Qualifiers Quals,
2162                                                    SourceRange Range) {
2163   llvm::SmallString<64> TemplateMangling;
2164   llvm::raw_svector_ostream Stream(TemplateMangling);
2165   MicrosoftCXXNameMangler Extra(Context, Stream);
2166 
2167   Stream << "?$";
2168   Extra.mangleSourceName("KindOf");
2169   Extra.mangleType(QualType(T, 0)
2170                        .stripObjCKindOfType(getASTContext())
2171                        ->castAs<ObjCObjectType>(),
2172                    Quals, Range);
2173 
2174   mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__ObjC"});
2175 }
2176 
mangleQualifiers(Qualifiers Quals,bool IsMember)2177 void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
2178                                                bool IsMember) {
2179   // <cvr-qualifiers> ::= [E] [F] [I] <base-cvr-qualifiers>
2180   // 'E' means __ptr64 (32-bit only); 'F' means __unaligned (32/64-bit only);
2181   // 'I' means __restrict (32/64-bit).
2182   // Note that the MSVC __restrict keyword isn't the same as the C99 restrict
2183   // keyword!
2184   // <base-cvr-qualifiers> ::= A  # near
2185   //                       ::= B  # near const
2186   //                       ::= C  # near volatile
2187   //                       ::= D  # near const volatile
2188   //                       ::= E  # far (16-bit)
2189   //                       ::= F  # far const (16-bit)
2190   //                       ::= G  # far volatile (16-bit)
2191   //                       ::= H  # far const volatile (16-bit)
2192   //                       ::= I  # huge (16-bit)
2193   //                       ::= J  # huge const (16-bit)
2194   //                       ::= K  # huge volatile (16-bit)
2195   //                       ::= L  # huge const volatile (16-bit)
2196   //                       ::= M <basis> # based
2197   //                       ::= N <basis> # based const
2198   //                       ::= O <basis> # based volatile
2199   //                       ::= P <basis> # based const volatile
2200   //                       ::= Q  # near member
2201   //                       ::= R  # near const member
2202   //                       ::= S  # near volatile member
2203   //                       ::= T  # near const volatile member
2204   //                       ::= U  # far member (16-bit)
2205   //                       ::= V  # far const member (16-bit)
2206   //                       ::= W  # far volatile member (16-bit)
2207   //                       ::= X  # far const volatile member (16-bit)
2208   //                       ::= Y  # huge member (16-bit)
2209   //                       ::= Z  # huge const member (16-bit)
2210   //                       ::= 0  # huge volatile member (16-bit)
2211   //                       ::= 1  # huge const volatile member (16-bit)
2212   //                       ::= 2 <basis> # based member
2213   //                       ::= 3 <basis> # based const member
2214   //                       ::= 4 <basis> # based volatile member
2215   //                       ::= 5 <basis> # based const volatile member
2216   //                       ::= 6  # near function (pointers only)
2217   //                       ::= 7  # far function (pointers only)
2218   //                       ::= 8  # near method (pointers only)
2219   //                       ::= 9  # far method (pointers only)
2220   //                       ::= _A <basis> # based function (pointers only)
2221   //                       ::= _B <basis> # based function (far?) (pointers only)
2222   //                       ::= _C <basis> # based method (pointers only)
2223   //                       ::= _D <basis> # based method (far?) (pointers only)
2224   //                       ::= _E # block (Clang)
2225   // <basis> ::= 0 # __based(void)
2226   //         ::= 1 # __based(segment)?
2227   //         ::= 2 <name> # __based(name)
2228   //         ::= 3 # ?
2229   //         ::= 4 # ?
2230   //         ::= 5 # not really based
2231   bool HasConst = Quals.hasConst(),
2232        HasVolatile = Quals.hasVolatile();
2233 
2234   if (!IsMember) {
2235     if (HasConst && HasVolatile) {
2236       Out << 'D';
2237     } else if (HasVolatile) {
2238       Out << 'C';
2239     } else if (HasConst) {
2240       Out << 'B';
2241     } else {
2242       Out << 'A';
2243     }
2244   } else {
2245     if (HasConst && HasVolatile) {
2246       Out << 'T';
2247     } else if (HasVolatile) {
2248       Out << 'S';
2249     } else if (HasConst) {
2250       Out << 'R';
2251     } else {
2252       Out << 'Q';
2253     }
2254   }
2255 
2256   // FIXME: For now, just drop all extension qualifiers on the floor.
2257 }
2258 
2259 void
mangleRefQualifier(RefQualifierKind RefQualifier)2260 MicrosoftCXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) {
2261   // <ref-qualifier> ::= G                # lvalue reference
2262   //                 ::= H                # rvalue-reference
2263   switch (RefQualifier) {
2264   case RQ_None:
2265     break;
2266 
2267   case RQ_LValue:
2268     Out << 'G';
2269     break;
2270 
2271   case RQ_RValue:
2272     Out << 'H';
2273     break;
2274   }
2275 }
2276 
manglePointerExtQualifiers(Qualifiers Quals,QualType PointeeType)2277 void MicrosoftCXXNameMangler::manglePointerExtQualifiers(Qualifiers Quals,
2278                                                          QualType PointeeType) {
2279   // Check if this is a default 64-bit pointer or has __ptr64 qualifier.
2280   bool is64Bit = PointeeType.isNull() ? PointersAre64Bit :
2281       is64BitPointer(PointeeType.getQualifiers());
2282   if (is64Bit && (PointeeType.isNull() || !PointeeType->isFunctionType()))
2283     Out << 'E';
2284 
2285   if (Quals.hasRestrict())
2286     Out << 'I';
2287 
2288   if (Quals.hasUnaligned() ||
2289       (!PointeeType.isNull() && PointeeType.getLocalQualifiers().hasUnaligned()))
2290     Out << 'F';
2291 }
2292 
manglePointerCVQualifiers(Qualifiers Quals)2293 void MicrosoftCXXNameMangler::manglePointerCVQualifiers(Qualifiers Quals) {
2294   // <pointer-cv-qualifiers> ::= P  # no qualifiers
2295   //                         ::= Q  # const
2296   //                         ::= R  # volatile
2297   //                         ::= S  # const volatile
2298   bool HasConst = Quals.hasConst(),
2299        HasVolatile = Quals.hasVolatile();
2300 
2301   if (HasConst && HasVolatile) {
2302     Out << 'S';
2303   } else if (HasVolatile) {
2304     Out << 'R';
2305   } else if (HasConst) {
2306     Out << 'Q';
2307   } else {
2308     Out << 'P';
2309   }
2310 }
2311 
mangleFunctionArgumentType(QualType T,SourceRange Range)2312 void MicrosoftCXXNameMangler::mangleFunctionArgumentType(QualType T,
2313                                                          SourceRange Range) {
2314   // MSVC will backreference two canonically equivalent types that have slightly
2315   // different manglings when mangled alone.
2316 
2317   // Decayed types do not match up with non-decayed versions of the same type.
2318   //
2319   // e.g.
2320   // void (*x)(void) will not form a backreference with void x(void)
2321   void *TypePtr;
2322   if (const auto *DT = T->getAs<DecayedType>()) {
2323     QualType OriginalType = DT->getOriginalType();
2324     // All decayed ArrayTypes should be treated identically; as-if they were
2325     // a decayed IncompleteArrayType.
2326     if (const auto *AT = getASTContext().getAsArrayType(OriginalType))
2327       OriginalType = getASTContext().getIncompleteArrayType(
2328           AT->getElementType(), AT->getSizeModifier(),
2329           AT->getIndexTypeCVRQualifiers());
2330 
2331     TypePtr = OriginalType.getCanonicalType().getAsOpaquePtr();
2332     // If the original parameter was textually written as an array,
2333     // instead treat the decayed parameter like it's const.
2334     //
2335     // e.g.
2336     // int [] -> int * const
2337     if (OriginalType->isArrayType())
2338       T = T.withConst();
2339   } else {
2340     TypePtr = T.getCanonicalType().getAsOpaquePtr();
2341   }
2342 
2343   ArgBackRefMap::iterator Found = FunArgBackReferences.find(TypePtr);
2344 
2345   if (Found == FunArgBackReferences.end()) {
2346     size_t OutSizeBefore = Out.tell();
2347 
2348     mangleType(T, Range, QMM_Drop);
2349 
2350     // See if it's worth creating a back reference.
2351     // Only types longer than 1 character are considered
2352     // and only 10 back references slots are available:
2353     bool LongerThanOneChar = (Out.tell() - OutSizeBefore > 1);
2354     if (LongerThanOneChar && FunArgBackReferences.size() < 10) {
2355       size_t Size = FunArgBackReferences.size();
2356       FunArgBackReferences[TypePtr] = Size;
2357     }
2358   } else {
2359     Out << Found->second;
2360   }
2361 }
2362 
manglePassObjectSizeArg(const PassObjectSizeAttr * POSA)2363 void MicrosoftCXXNameMangler::manglePassObjectSizeArg(
2364     const PassObjectSizeAttr *POSA) {
2365   int Type = POSA->getType();
2366   bool Dynamic = POSA->isDynamic();
2367 
2368   auto Iter = PassObjectSizeArgs.insert({Type, Dynamic}).first;
2369   auto *TypePtr = (const void *)&*Iter;
2370   ArgBackRefMap::iterator Found = FunArgBackReferences.find(TypePtr);
2371 
2372   if (Found == FunArgBackReferences.end()) {
2373     std::string Name =
2374         Dynamic ? "__pass_dynamic_object_size" : "__pass_object_size";
2375     mangleArtificialTagType(TagTypeKind::Enum, Name + llvm::utostr(Type),
2376                             {"__clang"});
2377 
2378     if (FunArgBackReferences.size() < 10) {
2379       size_t Size = FunArgBackReferences.size();
2380       FunArgBackReferences[TypePtr] = Size;
2381     }
2382   } else {
2383     Out << Found->second;
2384   }
2385 }
2386 
mangleAddressSpaceType(QualType T,Qualifiers Quals,SourceRange Range)2387 void MicrosoftCXXNameMangler::mangleAddressSpaceType(QualType T,
2388                                                      Qualifiers Quals,
2389                                                      SourceRange Range) {
2390   // Address space is mangled as an unqualified templated type in the __clang
2391   // namespace. The demangled version of this is:
2392   // In the case of a language specific address space:
2393   // __clang::struct _AS[language_addr_space]<Type>
2394   // where:
2395   //  <language_addr_space> ::= <OpenCL-addrspace> | <CUDA-addrspace>
2396   //    <OpenCL-addrspace> ::= "CL" [ "global" | "local" | "constant" |
2397   //                                "private"| "generic" | "device" | "host" ]
2398   //    <CUDA-addrspace> ::= "CU" [ "device" | "constant" | "shared" ]
2399   //    Note that the above were chosen to match the Itanium mangling for this.
2400   //
2401   // In the case of a non-language specific address space:
2402   //  __clang::struct _AS<TargetAS, Type>
2403   assert(Quals.hasAddressSpace() && "Not valid without address space");
2404   llvm::SmallString<32> ASMangling;
2405   llvm::raw_svector_ostream Stream(ASMangling);
2406   MicrosoftCXXNameMangler Extra(Context, Stream);
2407   Stream << "?$";
2408 
2409   LangAS AS = Quals.getAddressSpace();
2410   if (Context.getASTContext().addressSpaceMapManglingFor(AS)) {
2411     unsigned TargetAS = Context.getASTContext().getTargetAddressSpace(AS);
2412     Extra.mangleSourceName("_AS");
2413     Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(TargetAS));
2414   } else {
2415     switch (AS) {
2416     default:
2417       llvm_unreachable("Not a language specific address space");
2418     case LangAS::opencl_global:
2419       Extra.mangleSourceName("_ASCLglobal");
2420       break;
2421     case LangAS::opencl_global_device:
2422       Extra.mangleSourceName("_ASCLdevice");
2423       break;
2424     case LangAS::opencl_global_host:
2425       Extra.mangleSourceName("_ASCLhost");
2426       break;
2427     case LangAS::opencl_local:
2428       Extra.mangleSourceName("_ASCLlocal");
2429       break;
2430     case LangAS::opencl_constant:
2431       Extra.mangleSourceName("_ASCLconstant");
2432       break;
2433     case LangAS::opencl_private:
2434       Extra.mangleSourceName("_ASCLprivate");
2435       break;
2436     case LangAS::opencl_generic:
2437       Extra.mangleSourceName("_ASCLgeneric");
2438       break;
2439     case LangAS::cuda_device:
2440       Extra.mangleSourceName("_ASCUdevice");
2441       break;
2442     case LangAS::cuda_constant:
2443       Extra.mangleSourceName("_ASCUconstant");
2444       break;
2445     case LangAS::cuda_shared:
2446       Extra.mangleSourceName("_ASCUshared");
2447       break;
2448     case LangAS::ptr32_sptr:
2449     case LangAS::ptr32_uptr:
2450     case LangAS::ptr64:
2451       llvm_unreachable("don't mangle ptr address spaces with _AS");
2452     }
2453   }
2454 
2455   Extra.mangleType(T, Range, QMM_Escape);
2456   mangleQualifiers(Qualifiers(), false);
2457   mangleArtificialTagType(TagTypeKind::Struct, ASMangling, {"__clang"});
2458 }
2459 
mangleType(QualType T,SourceRange Range,QualifierMangleMode QMM)2460 void MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range,
2461                                          QualifierMangleMode QMM) {
2462   // Don't use the canonical types.  MSVC includes things like 'const' on
2463   // pointer arguments to function pointers that canonicalization strips away.
2464   T = T.getDesugaredType(getASTContext());
2465   Qualifiers Quals = T.getLocalQualifiers();
2466 
2467   if (const ArrayType *AT = getASTContext().getAsArrayType(T)) {
2468     // If there were any Quals, getAsArrayType() pushed them onto the array
2469     // element type.
2470     if (QMM == QMM_Mangle)
2471       Out << 'A';
2472     else if (QMM == QMM_Escape || QMM == QMM_Result)
2473       Out << "$$B";
2474     mangleArrayType(AT);
2475     return;
2476   }
2477 
2478   bool IsPointer = T->isAnyPointerType() || T->isMemberPointerType() ||
2479                    T->isReferenceType() || T->isBlockPointerType();
2480 
2481   switch (QMM) {
2482   case QMM_Drop:
2483     if (Quals.hasObjCLifetime())
2484       Quals = Quals.withoutObjCLifetime();
2485     break;
2486   case QMM_Mangle:
2487     if (const FunctionType *FT = dyn_cast<FunctionType>(T)) {
2488       Out << '6';
2489       mangleFunctionType(FT);
2490       return;
2491     }
2492     mangleQualifiers(Quals, false);
2493     break;
2494   case QMM_Escape:
2495     if (!IsPointer && Quals) {
2496       Out << "$$C";
2497       mangleQualifiers(Quals, false);
2498     }
2499     break;
2500   case QMM_Result:
2501     // Presence of __unaligned qualifier shouldn't affect mangling here.
2502     Quals.removeUnaligned();
2503     if (Quals.hasObjCLifetime())
2504       Quals = Quals.withoutObjCLifetime();
2505     if ((!IsPointer && Quals) || isa<TagType>(T) || isArtificialTagType(T)) {
2506       Out << '?';
2507       mangleQualifiers(Quals, false);
2508     }
2509     break;
2510   }
2511 
2512   const Type *ty = T.getTypePtr();
2513 
2514   switch (ty->getTypeClass()) {
2515 #define ABSTRACT_TYPE(CLASS, PARENT)
2516 #define NON_CANONICAL_TYPE(CLASS, PARENT) \
2517   case Type::CLASS: \
2518     llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
2519     return;
2520 #define TYPE(CLASS, PARENT) \
2521   case Type::CLASS: \
2522     mangleType(cast<CLASS##Type>(ty), Quals, Range); \
2523     break;
2524 #include "clang/AST/TypeNodes.inc"
2525 #undef ABSTRACT_TYPE
2526 #undef NON_CANONICAL_TYPE
2527 #undef TYPE
2528   }
2529 }
2530 
mangleType(const BuiltinType * T,Qualifiers,SourceRange Range)2531 void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
2532                                          SourceRange Range) {
2533   //  <type>         ::= <builtin-type>
2534   //  <builtin-type> ::= X  # void
2535   //                 ::= C  # signed char
2536   //                 ::= D  # char
2537   //                 ::= E  # unsigned char
2538   //                 ::= F  # short
2539   //                 ::= G  # unsigned short (or wchar_t if it's not a builtin)
2540   //                 ::= H  # int
2541   //                 ::= I  # unsigned int
2542   //                 ::= J  # long
2543   //                 ::= K  # unsigned long
2544   //                     L  # <none>
2545   //                 ::= M  # float
2546   //                 ::= N  # double
2547   //                 ::= O  # long double (__float80 is mangled differently)
2548   //                 ::= _J # long long, __int64
2549   //                 ::= _K # unsigned long long, __int64
2550   //                 ::= _L # __int128
2551   //                 ::= _M # unsigned __int128
2552   //                 ::= _N # bool
2553   //                     _O # <array in parameter>
2554   //                 ::= _Q # char8_t
2555   //                 ::= _S # char16_t
2556   //                 ::= _T # __float80 (Intel)
2557   //                 ::= _U # char32_t
2558   //                 ::= _W # wchar_t
2559   //                 ::= _Z # __float80 (Digital Mars)
2560   switch (T->getKind()) {
2561   case BuiltinType::Void:
2562     Out << 'X';
2563     break;
2564   case BuiltinType::SChar:
2565     Out << 'C';
2566     break;
2567   case BuiltinType::Char_U:
2568   case BuiltinType::Char_S:
2569     Out << 'D';
2570     break;
2571   case BuiltinType::UChar:
2572     Out << 'E';
2573     break;
2574   case BuiltinType::Short:
2575     Out << 'F';
2576     break;
2577   case BuiltinType::UShort:
2578     Out << 'G';
2579     break;
2580   case BuiltinType::Int:
2581     Out << 'H';
2582     break;
2583   case BuiltinType::UInt:
2584     Out << 'I';
2585     break;
2586   case BuiltinType::Long:
2587     Out << 'J';
2588     break;
2589   case BuiltinType::ULong:
2590     Out << 'K';
2591     break;
2592   case BuiltinType::Float:
2593     Out << 'M';
2594     break;
2595   case BuiltinType::Double:
2596     Out << 'N';
2597     break;
2598   // TODO: Determine size and mangle accordingly
2599   case BuiltinType::LongDouble:
2600     Out << 'O';
2601     break;
2602   case BuiltinType::LongLong:
2603     Out << "_J";
2604     break;
2605   case BuiltinType::ULongLong:
2606     Out << "_K";
2607     break;
2608   case BuiltinType::Int128:
2609     Out << "_L";
2610     break;
2611   case BuiltinType::UInt128:
2612     Out << "_M";
2613     break;
2614   case BuiltinType::Bool:
2615     Out << "_N";
2616     break;
2617   case BuiltinType::Char8:
2618     Out << "_Q";
2619     break;
2620   case BuiltinType::Char16:
2621     Out << "_S";
2622     break;
2623   case BuiltinType::Char32:
2624     Out << "_U";
2625     break;
2626   case BuiltinType::WChar_S:
2627   case BuiltinType::WChar_U:
2628     Out << "_W";
2629     break;
2630 
2631 #define BUILTIN_TYPE(Id, SingletonId)
2632 #define PLACEHOLDER_TYPE(Id, SingletonId) \
2633   case BuiltinType::Id:
2634 #include "clang/AST/BuiltinTypes.def"
2635   case BuiltinType::Dependent:
2636     llvm_unreachable("placeholder types shouldn't get to name mangling");
2637 
2638   case BuiltinType::ObjCId:
2639     mangleArtificialTagType(TagTypeKind::Struct, "objc_object");
2640     break;
2641   case BuiltinType::ObjCClass:
2642     mangleArtificialTagType(TagTypeKind::Struct, "objc_class");
2643     break;
2644   case BuiltinType::ObjCSel:
2645     mangleArtificialTagType(TagTypeKind::Struct, "objc_selector");
2646     break;
2647 
2648 #define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
2649   case BuiltinType::Id: \
2650     Out << "PAUocl_" #ImgType "_" #Suffix "@@"; \
2651     break;
2652 #include "clang/Basic/OpenCLImageTypes.def"
2653   case BuiltinType::OCLSampler:
2654     Out << "PA";
2655     mangleArtificialTagType(TagTypeKind::Struct, "ocl_sampler");
2656     break;
2657   case BuiltinType::OCLEvent:
2658     Out << "PA";
2659     mangleArtificialTagType(TagTypeKind::Struct, "ocl_event");
2660     break;
2661   case BuiltinType::OCLClkEvent:
2662     Out << "PA";
2663     mangleArtificialTagType(TagTypeKind::Struct, "ocl_clkevent");
2664     break;
2665   case BuiltinType::OCLQueue:
2666     Out << "PA";
2667     mangleArtificialTagType(TagTypeKind::Struct, "ocl_queue");
2668     break;
2669   case BuiltinType::OCLReserveID:
2670     Out << "PA";
2671     mangleArtificialTagType(TagTypeKind::Struct, "ocl_reserveid");
2672     break;
2673 #define EXT_OPAQUE_TYPE(ExtType, Id, Ext)                                      \
2674   case BuiltinType::Id:                                                        \
2675     mangleArtificialTagType(TagTypeKind::Struct, "ocl_" #ExtType);             \
2676     break;
2677 #include "clang/Basic/OpenCLExtensionTypes.def"
2678 
2679   case BuiltinType::NullPtr:
2680     Out << "$$T";
2681     break;
2682 
2683   case BuiltinType::Float16:
2684     mangleArtificialTagType(TagTypeKind::Struct, "_Float16", {"__clang"});
2685     break;
2686 
2687   case BuiltinType::Half:
2688     if (!getASTContext().getLangOpts().HLSL)
2689       mangleArtificialTagType(TagTypeKind::Struct, "_Half", {"__clang"});
2690     else if (getASTContext().getLangOpts().NativeHalfType)
2691       Out << "$f16@";
2692     else
2693       Out << "$halff@";
2694     break;
2695 
2696   case BuiltinType::BFloat16:
2697     mangleArtificialTagType(TagTypeKind::Struct, "__bf16", {"__clang"});
2698     break;
2699 
2700 #define WASM_REF_TYPE(InternalName, MangledName, Id, SingletonId, AS)          \
2701   case BuiltinType::Id:                                                        \
2702     mangleArtificialTagType(TagTypeKind::Struct, MangledName);                 \
2703     mangleArtificialTagType(TagTypeKind::Struct, MangledName, {"__clang"});    \
2704     break;
2705 
2706 #include "clang/Basic/WebAssemblyReferenceTypes.def"
2707 #define SVE_TYPE(Name, Id, SingletonId) \
2708   case BuiltinType::Id:
2709 #include "clang/Basic/AArch64SVEACLETypes.def"
2710 #define PPC_VECTOR_TYPE(Name, Id, Size) \
2711   case BuiltinType::Id:
2712 #include "clang/Basic/PPCTypes.def"
2713 #define RVV_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2714 #include "clang/Basic/RISCVVTypes.def"
2715 #define AMDGPU_TYPE(Name, Id, SingletonId) case BuiltinType::Id:
2716 #include "clang/Basic/AMDGPUTypes.def"
2717   case BuiltinType::ShortAccum:
2718   case BuiltinType::Accum:
2719   case BuiltinType::LongAccum:
2720   case BuiltinType::UShortAccum:
2721   case BuiltinType::UAccum:
2722   case BuiltinType::ULongAccum:
2723   case BuiltinType::ShortFract:
2724   case BuiltinType::Fract:
2725   case BuiltinType::LongFract:
2726   case BuiltinType::UShortFract:
2727   case BuiltinType::UFract:
2728   case BuiltinType::ULongFract:
2729   case BuiltinType::SatShortAccum:
2730   case BuiltinType::SatAccum:
2731   case BuiltinType::SatLongAccum:
2732   case BuiltinType::SatUShortAccum:
2733   case BuiltinType::SatUAccum:
2734   case BuiltinType::SatULongAccum:
2735   case BuiltinType::SatShortFract:
2736   case BuiltinType::SatFract:
2737   case BuiltinType::SatLongFract:
2738   case BuiltinType::SatUShortFract:
2739   case BuiltinType::SatUFract:
2740   case BuiltinType::SatULongFract:
2741   case BuiltinType::Ibm128:
2742   case BuiltinType::Float128: {
2743     DiagnosticsEngine &Diags = Context.getDiags();
2744     unsigned DiagID = Diags.getCustomDiagID(
2745         DiagnosticsEngine::Error, "cannot mangle this built-in %0 type yet");
2746     Diags.Report(Range.getBegin(), DiagID)
2747         << T->getName(Context.getASTContext().getPrintingPolicy()) << Range;
2748     break;
2749   }
2750   }
2751 }
2752 
2753 // <type>          ::= <function-type>
mangleType(const FunctionProtoType * T,Qualifiers,SourceRange)2754 void MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T, Qualifiers,
2755                                          SourceRange) {
2756   // Structors only appear in decls, so at this point we know it's not a
2757   // structor type.
2758   // FIXME: This may not be lambda-friendly.
2759   if (T->getMethodQuals() || T->getRefQualifier() != RQ_None) {
2760     Out << "$$A8@@";
2761     mangleFunctionType(T, /*D=*/nullptr, /*ForceThisQuals=*/true);
2762   } else {
2763     Out << "$$A6";
2764     mangleFunctionType(T);
2765   }
2766 }
mangleType(const FunctionNoProtoType * T,Qualifiers,SourceRange)2767 void MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T,
2768                                          Qualifiers, SourceRange) {
2769   Out << "$$A6";
2770   mangleFunctionType(T);
2771 }
2772 
mangleFunctionType(const FunctionType * T,const FunctionDecl * D,bool ForceThisQuals,bool MangleExceptionSpec)2773 void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T,
2774                                                  const FunctionDecl *D,
2775                                                  bool ForceThisQuals,
2776                                                  bool MangleExceptionSpec) {
2777   // <function-type> ::= <this-cvr-qualifiers> <calling-convention>
2778   //                     <return-type> <argument-list> <throw-spec>
2779   const FunctionProtoType *Proto = dyn_cast<FunctionProtoType>(T);
2780 
2781   SourceRange Range;
2782   if (D) Range = D->getSourceRange();
2783 
2784   bool IsInLambda = false;
2785   bool IsStructor = false, HasThisQuals = ForceThisQuals, IsCtorClosure = false;
2786   CallingConv CC = T->getCallConv();
2787   if (const CXXMethodDecl *MD = dyn_cast_or_null<CXXMethodDecl>(D)) {
2788     if (MD->getParent()->isLambda())
2789       IsInLambda = true;
2790     if (MD->isImplicitObjectMemberFunction())
2791       HasThisQuals = true;
2792     if (isa<CXXDestructorDecl>(MD)) {
2793       IsStructor = true;
2794     } else if (isa<CXXConstructorDecl>(MD)) {
2795       IsStructor = true;
2796       IsCtorClosure = (StructorType == Ctor_CopyingClosure ||
2797                        StructorType == Ctor_DefaultClosure) &&
2798                       isStructorDecl(MD);
2799       if (IsCtorClosure)
2800         CC = getASTContext().getDefaultCallingConvention(
2801             /*IsVariadic=*/false, /*IsCXXMethod=*/true);
2802     }
2803   }
2804 
2805   // If this is a C++ instance method, mangle the CVR qualifiers for the
2806   // this pointer.
2807   if (HasThisQuals) {
2808     Qualifiers Quals = Proto->getMethodQuals();
2809     manglePointerExtQualifiers(Quals, /*PointeeType=*/QualType());
2810     mangleRefQualifier(Proto->getRefQualifier());
2811     mangleQualifiers(Quals, /*IsMember=*/false);
2812   }
2813 
2814   mangleCallingConvention(CC, Range);
2815 
2816   // <return-type> ::= <type>
2817   //               ::= @ # structors (they have no declared return type)
2818   if (IsStructor) {
2819     if (isa<CXXDestructorDecl>(D) && isStructorDecl(D)) {
2820       // The scalar deleting destructor takes an extra int argument which is not
2821       // reflected in the AST.
2822       if (StructorType == Dtor_Deleting) {
2823         Out << (PointersAre64Bit ? "PEAXI@Z" : "PAXI@Z");
2824         return;
2825       }
2826       // The vbase destructor returns void which is not reflected in the AST.
2827       if (StructorType == Dtor_Complete) {
2828         Out << "XXZ";
2829         return;
2830       }
2831     }
2832     if (IsCtorClosure) {
2833       // Default constructor closure and copy constructor closure both return
2834       // void.
2835       Out << 'X';
2836 
2837       if (StructorType == Ctor_DefaultClosure) {
2838         // Default constructor closure always has no arguments.
2839         Out << 'X';
2840       } else if (StructorType == Ctor_CopyingClosure) {
2841         // Copy constructor closure always takes an unqualified reference.
2842         mangleFunctionArgumentType(getASTContext().getLValueReferenceType(
2843                                        Proto->getParamType(0)
2844                                            ->castAs<LValueReferenceType>()
2845                                            ->getPointeeType(),
2846                                        /*SpelledAsLValue=*/true),
2847                                    Range);
2848         Out << '@';
2849       } else {
2850         llvm_unreachable("unexpected constructor closure!");
2851       }
2852       Out << 'Z';
2853       return;
2854     }
2855     Out << '@';
2856   } else if (IsInLambda && isa_and_nonnull<CXXConversionDecl>(D)) {
2857     // The only lambda conversion operators are to function pointers, which
2858     // can differ by their calling convention and are typically deduced.  So
2859     // we make sure that this type gets mangled properly.
2860     mangleType(T->getReturnType(), Range, QMM_Result);
2861   } else {
2862     QualType ResultType = T->getReturnType();
2863     if (IsInLambda && isa<CXXConversionDecl>(D)) {
2864       // The only lambda conversion operators are to function pointers, which
2865       // can differ by their calling convention and are typically deduced.  So
2866       // we make sure that this type gets mangled properly.
2867       mangleType(ResultType, Range, QMM_Result);
2868     } else if (const auto *AT = dyn_cast_or_null<AutoType>(
2869                    ResultType->getContainedAutoType())) {
2870       Out << '?';
2871       mangleQualifiers(ResultType.getLocalQualifiers(), /*IsMember=*/false);
2872       Out << '?';
2873       assert(AT->getKeyword() != AutoTypeKeyword::GNUAutoType &&
2874              "shouldn't need to mangle __auto_type!");
2875       mangleSourceName(AT->isDecltypeAuto() ? "<decltype-auto>" : "<auto>");
2876       Out << '@';
2877     } else if (IsInLambda) {
2878       Out << '@';
2879     } else {
2880       if (ResultType->isVoidType())
2881         ResultType = ResultType.getUnqualifiedType();
2882       mangleType(ResultType, Range, QMM_Result);
2883     }
2884   }
2885 
2886   // <argument-list> ::= X # void
2887   //                 ::= <type>+ @
2888   //                 ::= <type>* Z # varargs
2889   if (!Proto) {
2890     // Function types without prototypes can arise when mangling a function type
2891     // within an overloadable function in C. We mangle these as the absence of
2892     // any parameter types (not even an empty parameter list).
2893     Out << '@';
2894   } else if (Proto->getNumParams() == 0 && !Proto->isVariadic()) {
2895     Out << 'X';
2896   } else {
2897     // Happens for function pointer type arguments for example.
2898     for (unsigned I = 0, E = Proto->getNumParams(); I != E; ++I) {
2899       // Explicit object parameters are prefixed by "_V".
2900       if (I == 0 && D && D->getParamDecl(I)->isExplicitObjectParameter())
2901         Out << "_V";
2902 
2903       mangleFunctionArgumentType(Proto->getParamType(I), Range);
2904       // Mangle each pass_object_size parameter as if it's a parameter of enum
2905       // type passed directly after the parameter with the pass_object_size
2906       // attribute. The aforementioned enum's name is __pass_object_size, and we
2907       // pretend it resides in a top-level namespace called __clang.
2908       //
2909       // FIXME: Is there a defined extension notation for the MS ABI, or is it
2910       // necessary to just cross our fingers and hope this type+namespace
2911       // combination doesn't conflict with anything?
2912       if (D)
2913         if (const auto *P = D->getParamDecl(I)->getAttr<PassObjectSizeAttr>())
2914           manglePassObjectSizeArg(P);
2915     }
2916     // <builtin-type>      ::= Z  # ellipsis
2917     if (Proto->isVariadic())
2918       Out << 'Z';
2919     else
2920       Out << '@';
2921   }
2922 
2923   if (MangleExceptionSpec && getASTContext().getLangOpts().CPlusPlus17 &&
2924       getASTContext().getLangOpts().isCompatibleWithMSVC(
2925           LangOptions::MSVC2017_5))
2926     mangleThrowSpecification(Proto);
2927   else
2928     Out << 'Z';
2929 }
2930 
mangleFunctionClass(const FunctionDecl * FD)2931 void MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) {
2932   // <function-class>  ::= <member-function> E? # E designates a 64-bit 'this'
2933   //                                            # pointer. in 64-bit mode *all*
2934   //                                            # 'this' pointers are 64-bit.
2935   //                   ::= <global-function>
2936   // <member-function> ::= A # private: near
2937   //                   ::= B # private: far
2938   //                   ::= C # private: static near
2939   //                   ::= D # private: static far
2940   //                   ::= E # private: virtual near
2941   //                   ::= F # private: virtual far
2942   //                   ::= I # protected: near
2943   //                   ::= J # protected: far
2944   //                   ::= K # protected: static near
2945   //                   ::= L # protected: static far
2946   //                   ::= M # protected: virtual near
2947   //                   ::= N # protected: virtual far
2948   //                   ::= Q # public: near
2949   //                   ::= R # public: far
2950   //                   ::= S # public: static near
2951   //                   ::= T # public: static far
2952   //                   ::= U # public: virtual near
2953   //                   ::= V # public: virtual far
2954   // <global-function> ::= Y # global near
2955   //                   ::= Z # global far
2956   if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
2957     bool IsVirtual = MD->isVirtual();
2958     // When mangling vbase destructor variants, ignore whether or not the
2959     // underlying destructor was defined to be virtual.
2960     if (isa<CXXDestructorDecl>(MD) && isStructorDecl(MD) &&
2961         StructorType == Dtor_Complete) {
2962       IsVirtual = false;
2963     }
2964     switch (MD->getAccess()) {
2965       case AS_none:
2966         llvm_unreachable("Unsupported access specifier");
2967       case AS_private:
2968         if (!MD->isImplicitObjectMemberFunction())
2969           Out << 'C';
2970         else if (IsVirtual)
2971           Out << 'E';
2972         else
2973           Out << 'A';
2974         break;
2975       case AS_protected:
2976         if (!MD->isImplicitObjectMemberFunction())
2977           Out << 'K';
2978         else if (IsVirtual)
2979           Out << 'M';
2980         else
2981           Out << 'I';
2982         break;
2983       case AS_public:
2984         if (!MD->isImplicitObjectMemberFunction())
2985           Out << 'S';
2986         else if (IsVirtual)
2987           Out << 'U';
2988         else
2989           Out << 'Q';
2990     }
2991   } else {
2992     Out << 'Y';
2993   }
2994 }
mangleCallingConvention(CallingConv CC,SourceRange Range)2995 void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC,
2996                                                       SourceRange Range) {
2997   // <calling-convention> ::= A # __cdecl
2998   //                      ::= B # __export __cdecl
2999   //                      ::= C # __pascal
3000   //                      ::= D # __export __pascal
3001   //                      ::= E # __thiscall
3002   //                      ::= F # __export __thiscall
3003   //                      ::= G # __stdcall
3004   //                      ::= H # __export __stdcall
3005   //                      ::= I # __fastcall
3006   //                      ::= J # __export __fastcall
3007   //                      ::= Q # __vectorcall
3008   //                      ::= S # __attribute__((__swiftcall__)) // Clang-only
3009   //                      ::= W # __attribute__((__swiftasynccall__))
3010   //                      ::= U # __attribute__((__preserve_most__))
3011   //                      ::= V # __attribute__((__preserve_none__)) //
3012   //                      Clang-only
3013   //                            // Clang-only
3014   //                      ::= w # __regcall
3015   //                      ::= x # __regcall4
3016   // The 'export' calling conventions are from a bygone era
3017   // (*cough*Win16*cough*) when functions were declared for export with
3018   // that keyword. (It didn't actually export them, it just made them so
3019   // that they could be in a DLL and somebody from another module could call
3020   // them.)
3021 
3022   switch (CC) {
3023     default:
3024       break;
3025     case CC_Win64:
3026     case CC_X86_64SysV:
3027     case CC_C:
3028       Out << 'A';
3029       return;
3030     case CC_X86Pascal:
3031       Out << 'C';
3032       return;
3033     case CC_X86ThisCall:
3034       Out << 'E';
3035       return;
3036     case CC_X86StdCall:
3037       Out << 'G';
3038       return;
3039     case CC_X86FastCall:
3040       Out << 'I';
3041       return;
3042     case CC_X86VectorCall:
3043       Out << 'Q';
3044       return;
3045     case CC_Swift:
3046       Out << 'S';
3047       return;
3048     case CC_SwiftAsync:
3049       Out << 'W';
3050       return;
3051     case CC_PreserveMost:
3052       Out << 'U';
3053       return;
3054     case CC_PreserveNone:
3055       Out << 'V';
3056       return;
3057     case CC_X86RegCall:
3058       if (getASTContext().getLangOpts().RegCall4)
3059         Out << "x";
3060       else
3061         Out << "w";
3062       return;
3063   }
3064 
3065   DiagnosticsEngine &Diags = Context.getDiags();
3066   unsigned DiagID = Diags.getCustomDiagID(
3067       DiagnosticsEngine::Error, "cannot mangle this calling convention yet");
3068   Diags.Report(Range.getBegin(), DiagID) << Range;
3069 }
mangleCallingConvention(const FunctionType * T,SourceRange Range)3070 void MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T,
3071                                                       SourceRange Range) {
3072   mangleCallingConvention(T->getCallConv(), Range);
3073 }
3074 
mangleThrowSpecification(const FunctionProtoType * FT)3075 void MicrosoftCXXNameMangler::mangleThrowSpecification(
3076                                                 const FunctionProtoType *FT) {
3077   // <throw-spec> ::= Z # (default)
3078   //              ::= _E # noexcept
3079   if (FT->canThrow())
3080     Out << 'Z';
3081   else
3082     Out << "_E";
3083 }
3084 
mangleType(const UnresolvedUsingType * T,Qualifiers,SourceRange Range)3085 void MicrosoftCXXNameMangler::mangleType(const UnresolvedUsingType *T,
3086                                          Qualifiers, SourceRange Range) {
3087   // Probably should be mangled as a template instantiation; need to see what
3088   // VC does first.
3089   DiagnosticsEngine &Diags = Context.getDiags();
3090   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3091     "cannot mangle this unresolved dependent type yet");
3092   Diags.Report(Range.getBegin(), DiagID)
3093     << Range;
3094 }
3095 
3096 // <type>        ::= <union-type> | <struct-type> | <class-type> | <enum-type>
3097 // <union-type>  ::= T <name>
3098 // <struct-type> ::= U <name>
3099 // <class-type>  ::= V <name>
3100 // <enum-type>   ::= W4 <name>
mangleTagTypeKind(TagTypeKind TTK)3101 void MicrosoftCXXNameMangler::mangleTagTypeKind(TagTypeKind TTK) {
3102   switch (TTK) {
3103   case TagTypeKind::Union:
3104     Out << 'T';
3105     break;
3106   case TagTypeKind::Struct:
3107   case TagTypeKind::Interface:
3108     Out << 'U';
3109     break;
3110   case TagTypeKind::Class:
3111     Out << 'V';
3112     break;
3113   case TagTypeKind::Enum:
3114     Out << "W4";
3115     break;
3116   }
3117 }
mangleType(const EnumType * T,Qualifiers,SourceRange)3118 void MicrosoftCXXNameMangler::mangleType(const EnumType *T, Qualifiers,
3119                                          SourceRange) {
3120   mangleType(cast<TagType>(T)->getDecl());
3121 }
mangleType(const RecordType * T,Qualifiers,SourceRange)3122 void MicrosoftCXXNameMangler::mangleType(const RecordType *T, Qualifiers,
3123                                          SourceRange) {
3124   mangleType(cast<TagType>(T)->getDecl());
3125 }
mangleType(const TagDecl * TD)3126 void MicrosoftCXXNameMangler::mangleType(const TagDecl *TD) {
3127   mangleTagTypeKind(TD->getTagKind());
3128   mangleName(TD);
3129 }
3130 
3131 // If you add a call to this, consider updating isArtificialTagType() too.
mangleArtificialTagType(TagTypeKind TK,StringRef UnqualifiedName,ArrayRef<StringRef> NestedNames)3132 void MicrosoftCXXNameMangler::mangleArtificialTagType(
3133     TagTypeKind TK, StringRef UnqualifiedName,
3134     ArrayRef<StringRef> NestedNames) {
3135   // <name> ::= <unscoped-name> {[<named-scope>]+ | [<nested-name>]}? @
3136   mangleTagTypeKind(TK);
3137 
3138   // Always start with the unqualified name.
3139   mangleSourceName(UnqualifiedName);
3140 
3141   for (StringRef N : llvm::reverse(NestedNames))
3142     mangleSourceName(N);
3143 
3144   // Terminate the whole name with an '@'.
3145   Out << '@';
3146 }
3147 
3148 // <type>       ::= <array-type>
3149 // <array-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers>
3150 //                  [Y <dimension-count> <dimension>+]
3151 //                  <element-type> # as global, E is never required
3152 // It's supposed to be the other way around, but for some strange reason, it
3153 // isn't. Today this behavior is retained for the sole purpose of backwards
3154 // compatibility.
mangleDecayedArrayType(const ArrayType * T)3155 void MicrosoftCXXNameMangler::mangleDecayedArrayType(const ArrayType *T) {
3156   // This isn't a recursive mangling, so now we have to do it all in this
3157   // one call.
3158   manglePointerCVQualifiers(T->getElementType().getQualifiers());
3159   mangleType(T->getElementType(), SourceRange());
3160 }
mangleType(const ConstantArrayType * T,Qualifiers,SourceRange)3161 void MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T, Qualifiers,
3162                                          SourceRange) {
3163   llvm_unreachable("Should have been special cased");
3164 }
mangleType(const VariableArrayType * T,Qualifiers,SourceRange)3165 void MicrosoftCXXNameMangler::mangleType(const VariableArrayType *T, Qualifiers,
3166                                          SourceRange) {
3167   llvm_unreachable("Should have been special cased");
3168 }
mangleType(const DependentSizedArrayType * T,Qualifiers,SourceRange)3169 void MicrosoftCXXNameMangler::mangleType(const DependentSizedArrayType *T,
3170                                          Qualifiers, SourceRange) {
3171   llvm_unreachable("Should have been special cased");
3172 }
mangleType(const IncompleteArrayType * T,Qualifiers,SourceRange)3173 void MicrosoftCXXNameMangler::mangleType(const IncompleteArrayType *T,
3174                                          Qualifiers, SourceRange) {
3175   llvm_unreachable("Should have been special cased");
3176 }
mangleArrayType(const ArrayType * T)3177 void MicrosoftCXXNameMangler::mangleArrayType(const ArrayType *T) {
3178   QualType ElementTy(T, 0);
3179   SmallVector<llvm::APInt, 3> Dimensions;
3180   for (;;) {
3181     if (ElementTy->isConstantArrayType()) {
3182       const ConstantArrayType *CAT =
3183           getASTContext().getAsConstantArrayType(ElementTy);
3184       Dimensions.push_back(CAT->getSize());
3185       ElementTy = CAT->getElementType();
3186     } else if (ElementTy->isIncompleteArrayType()) {
3187       const IncompleteArrayType *IAT =
3188           getASTContext().getAsIncompleteArrayType(ElementTy);
3189       Dimensions.push_back(llvm::APInt(32, 0));
3190       ElementTy = IAT->getElementType();
3191     } else if (ElementTy->isVariableArrayType()) {
3192       const VariableArrayType *VAT =
3193         getASTContext().getAsVariableArrayType(ElementTy);
3194       Dimensions.push_back(llvm::APInt(32, 0));
3195       ElementTy = VAT->getElementType();
3196     } else if (ElementTy->isDependentSizedArrayType()) {
3197       // The dependent expression has to be folded into a constant (TODO).
3198       const DependentSizedArrayType *DSAT =
3199         getASTContext().getAsDependentSizedArrayType(ElementTy);
3200       DiagnosticsEngine &Diags = Context.getDiags();
3201       unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3202         "cannot mangle this dependent-length array yet");
3203       Diags.Report(DSAT->getSizeExpr()->getExprLoc(), DiagID)
3204         << DSAT->getBracketsRange();
3205       return;
3206     } else {
3207       break;
3208     }
3209   }
3210   Out << 'Y';
3211   // <dimension-count> ::= <number> # number of extra dimensions
3212   mangleNumber(Dimensions.size());
3213   for (const llvm::APInt &Dimension : Dimensions)
3214     mangleNumber(Dimension.getLimitedValue());
3215   mangleType(ElementTy, SourceRange(), QMM_Escape);
3216 }
3217 
mangleType(const ArrayParameterType * T,Qualifiers,SourceRange)3218 void MicrosoftCXXNameMangler::mangleType(const ArrayParameterType *T,
3219                                          Qualifiers, SourceRange) {
3220   mangleArrayType(cast<ConstantArrayType>(T));
3221 }
3222 
3223 // <type>                   ::= <pointer-to-member-type>
3224 // <pointer-to-member-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers>
3225 //                                                          <class name> <type>
mangleType(const MemberPointerType * T,Qualifiers Quals,SourceRange Range)3226 void MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T,
3227                                          Qualifiers Quals, SourceRange Range) {
3228   QualType PointeeType = T->getPointeeType();
3229   manglePointerCVQualifiers(Quals);
3230   manglePointerExtQualifiers(Quals, PointeeType);
3231   if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
3232     Out << '8';
3233     mangleName(T->getClass()->castAs<RecordType>()->getDecl());
3234     mangleFunctionType(FPT, nullptr, true);
3235   } else {
3236     mangleQualifiers(PointeeType.getQualifiers(), true);
3237     mangleName(T->getClass()->castAs<RecordType>()->getDecl());
3238     mangleType(PointeeType, Range, QMM_Drop);
3239   }
3240 }
3241 
mangleType(const TemplateTypeParmType * T,Qualifiers,SourceRange Range)3242 void MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T,
3243                                          Qualifiers, SourceRange Range) {
3244   DiagnosticsEngine &Diags = Context.getDiags();
3245   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3246     "cannot mangle this template type parameter type yet");
3247   Diags.Report(Range.getBegin(), DiagID)
3248     << Range;
3249 }
3250 
mangleType(const SubstTemplateTypeParmPackType * T,Qualifiers,SourceRange Range)3251 void MicrosoftCXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T,
3252                                          Qualifiers, SourceRange Range) {
3253   DiagnosticsEngine &Diags = Context.getDiags();
3254   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3255     "cannot mangle this substituted parameter pack yet");
3256   Diags.Report(Range.getBegin(), DiagID)
3257     << Range;
3258 }
3259 
3260 // <type> ::= <pointer-type>
3261 // <pointer-type> ::= E? <pointer-cvr-qualifiers> <cvr-qualifiers> <type>
3262 //                       # the E is required for 64-bit non-static pointers
mangleType(const PointerType * T,Qualifiers Quals,SourceRange Range)3263 void MicrosoftCXXNameMangler::mangleType(const PointerType *T, Qualifiers Quals,
3264                                          SourceRange Range) {
3265   QualType PointeeType = T->getPointeeType();
3266   manglePointerCVQualifiers(Quals);
3267   manglePointerExtQualifiers(Quals, PointeeType);
3268 
3269   // For pointer size address spaces, go down the same type mangling path as
3270   // non address space types.
3271   LangAS AddrSpace = PointeeType.getQualifiers().getAddressSpace();
3272   if (isPtrSizeAddressSpace(AddrSpace) || AddrSpace == LangAS::Default)
3273     mangleType(PointeeType, Range);
3274   else
3275     mangleAddressSpaceType(PointeeType, PointeeType.getQualifiers(), Range);
3276 }
3277 
mangleType(const ObjCObjectPointerType * T,Qualifiers Quals,SourceRange Range)3278 void MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,
3279                                          Qualifiers Quals, SourceRange Range) {
3280   QualType PointeeType = T->getPointeeType();
3281   switch (Quals.getObjCLifetime()) {
3282   case Qualifiers::OCL_None:
3283   case Qualifiers::OCL_ExplicitNone:
3284     break;
3285   case Qualifiers::OCL_Autoreleasing:
3286   case Qualifiers::OCL_Strong:
3287   case Qualifiers::OCL_Weak:
3288     return mangleObjCLifetime(PointeeType, Quals, Range);
3289   }
3290   manglePointerCVQualifiers(Quals);
3291   manglePointerExtQualifiers(Quals, PointeeType);
3292   mangleType(PointeeType, Range);
3293 }
3294 
3295 // <type> ::= <reference-type>
3296 // <reference-type> ::= A E? <cvr-qualifiers> <type>
3297 //                 # the E is required for 64-bit non-static lvalue references
mangleType(const LValueReferenceType * T,Qualifiers Quals,SourceRange Range)3298 void MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,
3299                                          Qualifiers Quals, SourceRange Range) {
3300   QualType PointeeType = T->getPointeeType();
3301   assert(!Quals.hasConst() && !Quals.hasVolatile() && "unexpected qualifier!");
3302   Out << 'A';
3303   manglePointerExtQualifiers(Quals, PointeeType);
3304   mangleType(PointeeType, Range);
3305 }
3306 
3307 // <type> ::= <r-value-reference-type>
3308 // <r-value-reference-type> ::= $$Q E? <cvr-qualifiers> <type>
3309 //                 # the E is required for 64-bit non-static rvalue references
mangleType(const RValueReferenceType * T,Qualifiers Quals,SourceRange Range)3310 void MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,
3311                                          Qualifiers Quals, SourceRange Range) {
3312   QualType PointeeType = T->getPointeeType();
3313   assert(!Quals.hasConst() && !Quals.hasVolatile() && "unexpected qualifier!");
3314   Out << "$$Q";
3315   manglePointerExtQualifiers(Quals, PointeeType);
3316   mangleType(PointeeType, Range);
3317 }
3318 
mangleType(const ComplexType * T,Qualifiers,SourceRange Range)3319 void MicrosoftCXXNameMangler::mangleType(const ComplexType *T, Qualifiers,
3320                                          SourceRange Range) {
3321   QualType ElementType = T->getElementType();
3322 
3323   llvm::SmallString<64> TemplateMangling;
3324   llvm::raw_svector_ostream Stream(TemplateMangling);
3325   MicrosoftCXXNameMangler Extra(Context, Stream);
3326   Stream << "?$";
3327   Extra.mangleSourceName("_Complex");
3328   Extra.mangleType(ElementType, Range, QMM_Escape);
3329 
3330   mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__clang"});
3331 }
3332 
3333 // Returns true for types that mangleArtificialTagType() gets called for with
3334 // TagTypeKind Union, Struct, Class and where compatibility with MSVC's
3335 // mangling matters.
3336 // (It doesn't matter for Objective-C types and the like that cl.exe doesn't
3337 // support.)
isArtificialTagType(QualType T) const3338 bool MicrosoftCXXNameMangler::isArtificialTagType(QualType T) const {
3339   const Type *ty = T.getTypePtr();
3340   switch (ty->getTypeClass()) {
3341   default:
3342     return false;
3343 
3344   case Type::Vector: {
3345     // For ABI compatibility only __m64, __m128(id), and __m256(id) matter,
3346     // but since mangleType(VectorType*) always calls mangleArtificialTagType()
3347     // just always return true (the other vector types are clang-only).
3348     return true;
3349   }
3350   }
3351 }
3352 
mangleType(const VectorType * T,Qualifiers Quals,SourceRange Range)3353 void MicrosoftCXXNameMangler::mangleType(const VectorType *T, Qualifiers Quals,
3354                                          SourceRange Range) {
3355   QualType EltTy = T->getElementType();
3356   const BuiltinType *ET = EltTy->getAs<BuiltinType>();
3357   const BitIntType *BitIntTy = EltTy->getAs<BitIntType>();
3358   assert((ET || BitIntTy) &&
3359          "vectors with non-builtin/_BitInt elements are unsupported");
3360   uint64_t Width = getASTContext().getTypeSize(T);
3361   // Pattern match exactly the typedefs in our intrinsic headers.  Anything that
3362   // doesn't match the Intel types uses a custom mangling below.
3363   size_t OutSizeBefore = Out.tell();
3364   if (!isa<ExtVectorType>(T)) {
3365     if (getASTContext().getTargetInfo().getTriple().isX86() && ET) {
3366       if (Width == 64 && ET->getKind() == BuiltinType::LongLong) {
3367         mangleArtificialTagType(TagTypeKind::Union, "__m64");
3368       } else if (Width >= 128) {
3369         if (ET->getKind() == BuiltinType::Float)
3370           mangleArtificialTagType(TagTypeKind::Union,
3371                                   "__m" + llvm::utostr(Width));
3372         else if (ET->getKind() == BuiltinType::LongLong)
3373           mangleArtificialTagType(TagTypeKind::Union,
3374                                   "__m" + llvm::utostr(Width) + 'i');
3375         else if (ET->getKind() == BuiltinType::Double)
3376           mangleArtificialTagType(TagTypeKind::Struct,
3377                                   "__m" + llvm::utostr(Width) + 'd');
3378       }
3379     }
3380   }
3381 
3382   bool IsBuiltin = Out.tell() != OutSizeBefore;
3383   if (!IsBuiltin) {
3384     // The MS ABI doesn't have a special mangling for vector types, so we define
3385     // our own mangling to handle uses of __vector_size__ on user-specified
3386     // types, and for extensions like __v4sf.
3387 
3388     llvm::SmallString<64> TemplateMangling;
3389     llvm::raw_svector_ostream Stream(TemplateMangling);
3390     MicrosoftCXXNameMangler Extra(Context, Stream);
3391     Stream << "?$";
3392     Extra.mangleSourceName("__vector");
3393     Extra.mangleType(QualType(ET ? static_cast<const Type *>(ET) : BitIntTy, 0),
3394                      Range, QMM_Escape);
3395     Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(T->getNumElements()));
3396 
3397     mangleArtificialTagType(TagTypeKind::Union, TemplateMangling, {"__clang"});
3398   }
3399 }
3400 
mangleType(const ExtVectorType * T,Qualifiers Quals,SourceRange Range)3401 void MicrosoftCXXNameMangler::mangleType(const ExtVectorType *T,
3402                                          Qualifiers Quals, SourceRange Range) {
3403   mangleType(static_cast<const VectorType *>(T), Quals, Range);
3404 }
3405 
mangleType(const DependentVectorType * T,Qualifiers,SourceRange Range)3406 void MicrosoftCXXNameMangler::mangleType(const DependentVectorType *T,
3407                                          Qualifiers, SourceRange Range) {
3408   DiagnosticsEngine &Diags = Context.getDiags();
3409   unsigned DiagID = Diags.getCustomDiagID(
3410       DiagnosticsEngine::Error,
3411       "cannot mangle this dependent-sized vector type yet");
3412   Diags.Report(Range.getBegin(), DiagID) << Range;
3413 }
3414 
mangleType(const DependentSizedExtVectorType * T,Qualifiers,SourceRange Range)3415 void MicrosoftCXXNameMangler::mangleType(const DependentSizedExtVectorType *T,
3416                                          Qualifiers, SourceRange Range) {
3417   DiagnosticsEngine &Diags = Context.getDiags();
3418   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3419     "cannot mangle this dependent-sized extended vector type yet");
3420   Diags.Report(Range.getBegin(), DiagID)
3421     << Range;
3422 }
3423 
mangleType(const ConstantMatrixType * T,Qualifiers quals,SourceRange Range)3424 void MicrosoftCXXNameMangler::mangleType(const ConstantMatrixType *T,
3425                                          Qualifiers quals, SourceRange Range) {
3426   DiagnosticsEngine &Diags = Context.getDiags();
3427   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3428                                           "Cannot mangle this matrix type yet");
3429   Diags.Report(Range.getBegin(), DiagID) << Range;
3430 }
3431 
mangleType(const DependentSizedMatrixType * T,Qualifiers quals,SourceRange Range)3432 void MicrosoftCXXNameMangler::mangleType(const DependentSizedMatrixType *T,
3433                                          Qualifiers quals, SourceRange Range) {
3434   DiagnosticsEngine &Diags = Context.getDiags();
3435   unsigned DiagID = Diags.getCustomDiagID(
3436       DiagnosticsEngine::Error,
3437       "Cannot mangle this dependent-sized matrix type yet");
3438   Diags.Report(Range.getBegin(), DiagID) << Range;
3439 }
3440 
mangleType(const DependentAddressSpaceType * T,Qualifiers,SourceRange Range)3441 void MicrosoftCXXNameMangler::mangleType(const DependentAddressSpaceType *T,
3442                                          Qualifiers, SourceRange Range) {
3443   DiagnosticsEngine &Diags = Context.getDiags();
3444   unsigned DiagID = Diags.getCustomDiagID(
3445       DiagnosticsEngine::Error,
3446       "cannot mangle this dependent address space type yet");
3447   Diags.Report(Range.getBegin(), DiagID) << Range;
3448 }
3449 
mangleType(const ObjCInterfaceType * T,Qualifiers,SourceRange)3450 void MicrosoftCXXNameMangler::mangleType(const ObjCInterfaceType *T, Qualifiers,
3451                                          SourceRange) {
3452   // ObjC interfaces have structs underlying them.
3453   mangleTagTypeKind(TagTypeKind::Struct);
3454   mangleName(T->getDecl());
3455 }
3456 
mangleType(const ObjCObjectType * T,Qualifiers Quals,SourceRange Range)3457 void MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T,
3458                                          Qualifiers Quals, SourceRange Range) {
3459   if (T->isKindOfType())
3460     return mangleObjCKindOfType(T, Quals, Range);
3461 
3462   if (T->qual_empty() && !T->isSpecialized())
3463     return mangleType(T->getBaseType(), Range, QMM_Drop);
3464 
3465   ArgBackRefMap OuterFunArgsContext;
3466   ArgBackRefMap OuterTemplateArgsContext;
3467   BackRefVec OuterTemplateContext;
3468 
3469   FunArgBackReferences.swap(OuterFunArgsContext);
3470   TemplateArgBackReferences.swap(OuterTemplateArgsContext);
3471   NameBackReferences.swap(OuterTemplateContext);
3472 
3473   mangleTagTypeKind(TagTypeKind::Struct);
3474 
3475   Out << "?$";
3476   if (T->isObjCId())
3477     mangleSourceName("objc_object");
3478   else if (T->isObjCClass())
3479     mangleSourceName("objc_class");
3480   else
3481     mangleSourceName(T->getInterface()->getName());
3482 
3483   for (const auto &Q : T->quals())
3484     mangleObjCProtocol(Q);
3485 
3486   if (T->isSpecialized())
3487     for (const auto &TA : T->getTypeArgs())
3488       mangleType(TA, Range, QMM_Drop);
3489 
3490   Out << '@';
3491 
3492   Out << '@';
3493 
3494   FunArgBackReferences.swap(OuterFunArgsContext);
3495   TemplateArgBackReferences.swap(OuterTemplateArgsContext);
3496   NameBackReferences.swap(OuterTemplateContext);
3497 }
3498 
mangleType(const BlockPointerType * T,Qualifiers Quals,SourceRange Range)3499 void MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T,
3500                                          Qualifiers Quals, SourceRange Range) {
3501   QualType PointeeType = T->getPointeeType();
3502   manglePointerCVQualifiers(Quals);
3503   manglePointerExtQualifiers(Quals, PointeeType);
3504 
3505   Out << "_E";
3506 
3507   mangleFunctionType(PointeeType->castAs<FunctionProtoType>());
3508 }
3509 
mangleType(const InjectedClassNameType *,Qualifiers,SourceRange)3510 void MicrosoftCXXNameMangler::mangleType(const InjectedClassNameType *,
3511                                          Qualifiers, SourceRange) {
3512   llvm_unreachable("Cannot mangle injected class name type.");
3513 }
3514 
mangleType(const TemplateSpecializationType * T,Qualifiers,SourceRange Range)3515 void MicrosoftCXXNameMangler::mangleType(const TemplateSpecializationType *T,
3516                                          Qualifiers, SourceRange Range) {
3517   DiagnosticsEngine &Diags = Context.getDiags();
3518   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3519     "cannot mangle this template specialization type yet");
3520   Diags.Report(Range.getBegin(), DiagID)
3521     << Range;
3522 }
3523 
mangleType(const DependentNameType * T,Qualifiers,SourceRange Range)3524 void MicrosoftCXXNameMangler::mangleType(const DependentNameType *T, Qualifiers,
3525                                          SourceRange Range) {
3526   DiagnosticsEngine &Diags = Context.getDiags();
3527   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3528     "cannot mangle this dependent name type yet");
3529   Diags.Report(Range.getBegin(), DiagID)
3530     << Range;
3531 }
3532 
mangleType(const DependentTemplateSpecializationType * T,Qualifiers,SourceRange Range)3533 void MicrosoftCXXNameMangler::mangleType(
3534     const DependentTemplateSpecializationType *T, Qualifiers,
3535     SourceRange Range) {
3536   DiagnosticsEngine &Diags = Context.getDiags();
3537   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3538     "cannot mangle this dependent template specialization type yet");
3539   Diags.Report(Range.getBegin(), DiagID)
3540     << Range;
3541 }
3542 
mangleType(const PackExpansionType * T,Qualifiers,SourceRange Range)3543 void MicrosoftCXXNameMangler::mangleType(const PackExpansionType *T, Qualifiers,
3544                                          SourceRange Range) {
3545   DiagnosticsEngine &Diags = Context.getDiags();
3546   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3547     "cannot mangle this pack expansion yet");
3548   Diags.Report(Range.getBegin(), DiagID)
3549     << Range;
3550 }
3551 
mangleType(const PackIndexingType * T,Qualifiers Quals,SourceRange Range)3552 void MicrosoftCXXNameMangler::mangleType(const PackIndexingType *T,
3553                                          Qualifiers Quals, SourceRange Range) {
3554   manglePointerCVQualifiers(Quals);
3555   mangleType(T->getSelectedType(), Range);
3556 }
3557 
mangleType(const TypeOfType * T,Qualifiers,SourceRange Range)3558 void MicrosoftCXXNameMangler::mangleType(const TypeOfType *T, Qualifiers,
3559                                          SourceRange Range) {
3560   DiagnosticsEngine &Diags = Context.getDiags();
3561   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3562     "cannot mangle this typeof(type) yet");
3563   Diags.Report(Range.getBegin(), DiagID)
3564     << Range;
3565 }
3566 
mangleType(const TypeOfExprType * T,Qualifiers,SourceRange Range)3567 void MicrosoftCXXNameMangler::mangleType(const TypeOfExprType *T, Qualifiers,
3568                                          SourceRange Range) {
3569   DiagnosticsEngine &Diags = Context.getDiags();
3570   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3571     "cannot mangle this typeof(expression) yet");
3572   Diags.Report(Range.getBegin(), DiagID)
3573     << Range;
3574 }
3575 
mangleType(const DecltypeType * T,Qualifiers,SourceRange Range)3576 void MicrosoftCXXNameMangler::mangleType(const DecltypeType *T, Qualifiers,
3577                                          SourceRange Range) {
3578   DiagnosticsEngine &Diags = Context.getDiags();
3579   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3580     "cannot mangle this decltype() yet");
3581   Diags.Report(Range.getBegin(), DiagID)
3582     << Range;
3583 }
3584 
mangleType(const UnaryTransformType * T,Qualifiers,SourceRange Range)3585 void MicrosoftCXXNameMangler::mangleType(const UnaryTransformType *T,
3586                                          Qualifiers, SourceRange Range) {
3587   DiagnosticsEngine &Diags = Context.getDiags();
3588   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3589     "cannot mangle this unary transform type yet");
3590   Diags.Report(Range.getBegin(), DiagID)
3591     << Range;
3592 }
3593 
mangleType(const AutoType * T,Qualifiers,SourceRange Range)3594 void MicrosoftCXXNameMangler::mangleType(const AutoType *T, Qualifiers,
3595                                          SourceRange Range) {
3596   assert(T->getDeducedType().isNull() && "expecting a dependent type!");
3597 
3598   DiagnosticsEngine &Diags = Context.getDiags();
3599   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3600     "cannot mangle this 'auto' type yet");
3601   Diags.Report(Range.getBegin(), DiagID)
3602     << Range;
3603 }
3604 
mangleType(const DeducedTemplateSpecializationType * T,Qualifiers,SourceRange Range)3605 void MicrosoftCXXNameMangler::mangleType(
3606     const DeducedTemplateSpecializationType *T, Qualifiers, SourceRange Range) {
3607   assert(T->getDeducedType().isNull() && "expecting a dependent type!");
3608 
3609   DiagnosticsEngine &Diags = Context.getDiags();
3610   unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
3611     "cannot mangle this deduced class template specialization type yet");
3612   Diags.Report(Range.getBegin(), DiagID)
3613     << Range;
3614 }
3615 
mangleType(const AtomicType * T,Qualifiers,SourceRange Range)3616 void MicrosoftCXXNameMangler::mangleType(const AtomicType *T, Qualifiers,
3617                                          SourceRange Range) {
3618   QualType ValueType = T->getValueType();
3619 
3620   llvm::SmallString<64> TemplateMangling;
3621   llvm::raw_svector_ostream Stream(TemplateMangling);
3622   MicrosoftCXXNameMangler Extra(Context, Stream);
3623   Stream << "?$";
3624   Extra.mangleSourceName("_Atomic");
3625   Extra.mangleType(ValueType, Range, QMM_Escape);
3626 
3627   mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__clang"});
3628 }
3629 
mangleType(const PipeType * T,Qualifiers,SourceRange Range)3630 void MicrosoftCXXNameMangler::mangleType(const PipeType *T, Qualifiers,
3631                                          SourceRange Range) {
3632   QualType ElementType = T->getElementType();
3633 
3634   llvm::SmallString<64> TemplateMangling;
3635   llvm::raw_svector_ostream Stream(TemplateMangling);
3636   MicrosoftCXXNameMangler Extra(Context, Stream);
3637   Stream << "?$";
3638   Extra.mangleSourceName("ocl_pipe");
3639   Extra.mangleType(ElementType, Range, QMM_Escape);
3640   Extra.mangleIntegerLiteral(llvm::APSInt::get(T->isReadOnly()));
3641 
3642   mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__clang"});
3643 }
3644 
mangleCXXName(GlobalDecl GD,raw_ostream & Out)3645 void MicrosoftMangleContextImpl::mangleCXXName(GlobalDecl GD,
3646                                                raw_ostream &Out) {
3647   const NamedDecl *D = cast<NamedDecl>(GD.getDecl());
3648   PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
3649                                  getASTContext().getSourceManager(),
3650                                  "Mangling declaration");
3651 
3652   msvc_hashing_ostream MHO(Out);
3653 
3654   if (auto *CD = dyn_cast<CXXConstructorDecl>(D)) {
3655     auto Type = GD.getCtorType();
3656     MicrosoftCXXNameMangler mangler(*this, MHO, CD, Type);
3657     return mangler.mangle(GD);
3658   }
3659 
3660   if (auto *DD = dyn_cast<CXXDestructorDecl>(D)) {
3661     auto Type = GD.getDtorType();
3662     MicrosoftCXXNameMangler mangler(*this, MHO, DD, Type);
3663     return mangler.mangle(GD);
3664   }
3665 
3666   MicrosoftCXXNameMangler Mangler(*this, MHO);
3667   return Mangler.mangle(GD);
3668 }
3669 
mangleType(const BitIntType * T,Qualifiers,SourceRange Range)3670 void MicrosoftCXXNameMangler::mangleType(const BitIntType *T, Qualifiers,
3671                                          SourceRange Range) {
3672   llvm::SmallString<64> TemplateMangling;
3673   llvm::raw_svector_ostream Stream(TemplateMangling);
3674   MicrosoftCXXNameMangler Extra(Context, Stream);
3675   Stream << "?$";
3676   if (T->isUnsigned())
3677     Extra.mangleSourceName("_UBitInt");
3678   else
3679     Extra.mangleSourceName("_BitInt");
3680   Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(T->getNumBits()));
3681 
3682   mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__clang"});
3683 }
3684 
mangleType(const DependentBitIntType * T,Qualifiers,SourceRange Range)3685 void MicrosoftCXXNameMangler::mangleType(const DependentBitIntType *T,
3686                                          Qualifiers, SourceRange Range) {
3687   DiagnosticsEngine &Diags = Context.getDiags();
3688   unsigned DiagID = Diags.getCustomDiagID(
3689       DiagnosticsEngine::Error, "cannot mangle this DependentBitInt type yet");
3690   Diags.Report(Range.getBegin(), DiagID) << Range;
3691 }
3692 
3693 // <this-adjustment> ::= <no-adjustment> | <static-adjustment> |
3694 //                       <virtual-adjustment>
3695 // <no-adjustment>      ::= A # private near
3696 //                      ::= B # private far
3697 //                      ::= I # protected near
3698 //                      ::= J # protected far
3699 //                      ::= Q # public near
3700 //                      ::= R # public far
3701 // <static-adjustment>  ::= G <static-offset> # private near
3702 //                      ::= H <static-offset> # private far
3703 //                      ::= O <static-offset> # protected near
3704 //                      ::= P <static-offset> # protected far
3705 //                      ::= W <static-offset> # public near
3706 //                      ::= X <static-offset> # public far
3707 // <virtual-adjustment> ::= $0 <virtual-shift> <static-offset> # private near
3708 //                      ::= $1 <virtual-shift> <static-offset> # private far
3709 //                      ::= $2 <virtual-shift> <static-offset> # protected near
3710 //                      ::= $3 <virtual-shift> <static-offset> # protected far
3711 //                      ::= $4 <virtual-shift> <static-offset> # public near
3712 //                      ::= $5 <virtual-shift> <static-offset> # public far
3713 // <virtual-shift>      ::= <vtordisp-shift> | <vtordispex-shift>
3714 // <vtordisp-shift>     ::= <offset-to-vtordisp>
3715 // <vtordispex-shift>   ::= <offset-to-vbptr> <vbase-offset-offset>
3716 //                          <offset-to-vtordisp>
mangleThunkThisAdjustment(AccessSpecifier AS,const ThisAdjustment & Adjustment,MicrosoftCXXNameMangler & Mangler,raw_ostream & Out)3717 static void mangleThunkThisAdjustment(AccessSpecifier AS,
3718                                       const ThisAdjustment &Adjustment,
3719                                       MicrosoftCXXNameMangler &Mangler,
3720                                       raw_ostream &Out) {
3721   if (!Adjustment.Virtual.isEmpty()) {
3722     Out << '$';
3723     char AccessSpec;
3724     switch (AS) {
3725     case AS_none:
3726       llvm_unreachable("Unsupported access specifier");
3727     case AS_private:
3728       AccessSpec = '0';
3729       break;
3730     case AS_protected:
3731       AccessSpec = '2';
3732       break;
3733     case AS_public:
3734       AccessSpec = '4';
3735     }
3736     if (Adjustment.Virtual.Microsoft.VBPtrOffset) {
3737       Out << 'R' << AccessSpec;
3738       Mangler.mangleNumber(
3739           static_cast<uint32_t>(Adjustment.Virtual.Microsoft.VBPtrOffset));
3740       Mangler.mangleNumber(
3741           static_cast<uint32_t>(Adjustment.Virtual.Microsoft.VBOffsetOffset));
3742       Mangler.mangleNumber(
3743           static_cast<uint32_t>(Adjustment.Virtual.Microsoft.VtordispOffset));
3744       Mangler.mangleNumber(static_cast<uint32_t>(Adjustment.NonVirtual));
3745     } else {
3746       Out << AccessSpec;
3747       Mangler.mangleNumber(
3748           static_cast<uint32_t>(Adjustment.Virtual.Microsoft.VtordispOffset));
3749       Mangler.mangleNumber(-static_cast<uint32_t>(Adjustment.NonVirtual));
3750     }
3751   } else if (Adjustment.NonVirtual != 0) {
3752     switch (AS) {
3753     case AS_none:
3754       llvm_unreachable("Unsupported access specifier");
3755     case AS_private:
3756       Out << 'G';
3757       break;
3758     case AS_protected:
3759       Out << 'O';
3760       break;
3761     case AS_public:
3762       Out << 'W';
3763     }
3764     Mangler.mangleNumber(-static_cast<uint32_t>(Adjustment.NonVirtual));
3765   } else {
3766     switch (AS) {
3767     case AS_none:
3768       llvm_unreachable("Unsupported access specifier");
3769     case AS_private:
3770       Out << 'A';
3771       break;
3772     case AS_protected:
3773       Out << 'I';
3774       break;
3775     case AS_public:
3776       Out << 'Q';
3777     }
3778   }
3779 }
3780 
mangleVirtualMemPtrThunk(const CXXMethodDecl * MD,const MethodVFTableLocation & ML,raw_ostream & Out)3781 void MicrosoftMangleContextImpl::mangleVirtualMemPtrThunk(
3782     const CXXMethodDecl *MD, const MethodVFTableLocation &ML,
3783     raw_ostream &Out) {
3784   msvc_hashing_ostream MHO(Out);
3785   MicrosoftCXXNameMangler Mangler(*this, MHO);
3786   Mangler.getStream() << '?';
3787   Mangler.mangleVirtualMemPtrThunk(MD, ML);
3788 }
3789 
mangleThunk(const CXXMethodDecl * MD,const ThunkInfo & Thunk,bool,raw_ostream & Out)3790 void MicrosoftMangleContextImpl::mangleThunk(const CXXMethodDecl *MD,
3791                                              const ThunkInfo &Thunk,
3792                                              bool /*ElideOverrideInfo*/,
3793                                              raw_ostream &Out) {
3794   msvc_hashing_ostream MHO(Out);
3795   MicrosoftCXXNameMangler Mangler(*this, MHO);
3796   Mangler.getStream() << '?';
3797   Mangler.mangleName(MD);
3798 
3799   // Usually the thunk uses the access specifier of the new method, but if this
3800   // is a covariant return thunk, then MSVC always uses the public access
3801   // specifier, and we do the same.
3802   AccessSpecifier AS = Thunk.Return.isEmpty() ? MD->getAccess() : AS_public;
3803   mangleThunkThisAdjustment(AS, Thunk.This, Mangler, MHO);
3804 
3805   if (!Thunk.Return.isEmpty())
3806     assert(Thunk.Method != nullptr &&
3807            "Thunk info should hold the overridee decl");
3808 
3809   const CXXMethodDecl *DeclForFPT = Thunk.Method ? Thunk.Method : MD;
3810   Mangler.mangleFunctionType(
3811       DeclForFPT->getType()->castAs<FunctionProtoType>(), MD);
3812 }
3813 
mangleCXXDtorThunk(const CXXDestructorDecl * DD,CXXDtorType Type,const ThunkInfo & Thunk,bool,raw_ostream & Out)3814 void MicrosoftMangleContextImpl::mangleCXXDtorThunk(const CXXDestructorDecl *DD,
3815                                                     CXXDtorType Type,
3816                                                     const ThunkInfo &Thunk,
3817                                                     bool /*ElideOverrideInfo*/,
3818                                                     raw_ostream &Out) {
3819   // FIXME: Actually, the dtor thunk should be emitted for vector deleting
3820   // dtors rather than scalar deleting dtors. Just use the vector deleting dtor
3821   // mangling manually until we support both deleting dtor types.
3822   assert(Type == Dtor_Deleting);
3823   msvc_hashing_ostream MHO(Out);
3824   MicrosoftCXXNameMangler Mangler(*this, MHO, DD, Type);
3825   Mangler.getStream() << "??_E";
3826   Mangler.mangleName(DD->getParent());
3827   auto &Adjustment = Thunk.This;
3828   mangleThunkThisAdjustment(DD->getAccess(), Adjustment, Mangler, MHO);
3829   Mangler.mangleFunctionType(DD->getType()->castAs<FunctionProtoType>(), DD);
3830 }
3831 
mangleCXXVFTable(const CXXRecordDecl * Derived,ArrayRef<const CXXRecordDecl * > BasePath,raw_ostream & Out)3832 void MicrosoftMangleContextImpl::mangleCXXVFTable(
3833     const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
3834     raw_ostream &Out) {
3835   // <mangled-name> ::= ?_7 <class-name> <storage-class>
3836   //                    <cvr-qualifiers> [<name>] @
3837   // NOTE: <cvr-qualifiers> here is always 'B' (const). <storage-class>
3838   // is always '6' for vftables.
3839   msvc_hashing_ostream MHO(Out);
3840   MicrosoftCXXNameMangler Mangler(*this, MHO);
3841   if (Derived->hasAttr<DLLImportAttr>())
3842     Mangler.getStream() << "??_S";
3843   else
3844     Mangler.getStream() << "??_7";
3845   Mangler.mangleName(Derived);
3846   Mangler.getStream() << "6B"; // '6' for vftable, 'B' for const.
3847   for (const CXXRecordDecl *RD : BasePath)
3848     Mangler.mangleName(RD);
3849   Mangler.getStream() << '@';
3850 }
3851 
mangleCXXVTable(const CXXRecordDecl * Derived,raw_ostream & Out)3852 void MicrosoftMangleContextImpl::mangleCXXVTable(const CXXRecordDecl *Derived,
3853                                                  raw_ostream &Out) {
3854   // TODO: Determine appropriate mangling for MSABI
3855   mangleCXXVFTable(Derived, {}, Out);
3856 }
3857 
mangleCXXVBTable(const CXXRecordDecl * Derived,ArrayRef<const CXXRecordDecl * > BasePath,raw_ostream & Out)3858 void MicrosoftMangleContextImpl::mangleCXXVBTable(
3859     const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
3860     raw_ostream &Out) {
3861   // <mangled-name> ::= ?_8 <class-name> <storage-class>
3862   //                    <cvr-qualifiers> [<name>] @
3863   // NOTE: <cvr-qualifiers> here is always 'B' (const). <storage-class>
3864   // is always '7' for vbtables.
3865   msvc_hashing_ostream MHO(Out);
3866   MicrosoftCXXNameMangler Mangler(*this, MHO);
3867   Mangler.getStream() << "??_8";
3868   Mangler.mangleName(Derived);
3869   Mangler.getStream() << "7B";  // '7' for vbtable, 'B' for const.
3870   for (const CXXRecordDecl *RD : BasePath)
3871     Mangler.mangleName(RD);
3872   Mangler.getStream() << '@';
3873 }
3874 
mangleCXXRTTI(QualType T,raw_ostream & Out)3875 void MicrosoftMangleContextImpl::mangleCXXRTTI(QualType T, raw_ostream &Out) {
3876   msvc_hashing_ostream MHO(Out);
3877   MicrosoftCXXNameMangler Mangler(*this, MHO);
3878   Mangler.getStream() << "??_R0";
3879   Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
3880   Mangler.getStream() << "@8";
3881 }
3882 
mangleCXXRTTIName(QualType T,raw_ostream & Out,bool NormalizeIntegers=false)3883 void MicrosoftMangleContextImpl::mangleCXXRTTIName(
3884     QualType T, raw_ostream &Out, bool NormalizeIntegers = false) {
3885   MicrosoftCXXNameMangler Mangler(*this, Out);
3886   Mangler.getStream() << '.';
3887   Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
3888 }
3889 
mangleCXXVirtualDisplacementMap(const CXXRecordDecl * SrcRD,const CXXRecordDecl * DstRD,raw_ostream & Out)3890 void MicrosoftMangleContextImpl::mangleCXXVirtualDisplacementMap(
3891     const CXXRecordDecl *SrcRD, const CXXRecordDecl *DstRD, raw_ostream &Out) {
3892   msvc_hashing_ostream MHO(Out);
3893   MicrosoftCXXNameMangler Mangler(*this, MHO);
3894   Mangler.getStream() << "??_K";
3895   Mangler.mangleName(SrcRD);
3896   Mangler.getStream() << "$C";
3897   Mangler.mangleName(DstRD);
3898 }
3899 
mangleCXXThrowInfo(QualType T,bool IsConst,bool IsVolatile,bool IsUnaligned,uint32_t NumEntries,raw_ostream & Out)3900 void MicrosoftMangleContextImpl::mangleCXXThrowInfo(QualType T, bool IsConst,
3901                                                     bool IsVolatile,
3902                                                     bool IsUnaligned,
3903                                                     uint32_t NumEntries,
3904                                                     raw_ostream &Out) {
3905   msvc_hashing_ostream MHO(Out);
3906   MicrosoftCXXNameMangler Mangler(*this, MHO);
3907   Mangler.getStream() << "_TI";
3908   if (IsConst)
3909     Mangler.getStream() << 'C';
3910   if (IsVolatile)
3911     Mangler.getStream() << 'V';
3912   if (IsUnaligned)
3913     Mangler.getStream() << 'U';
3914   Mangler.getStream() << NumEntries;
3915   Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
3916 }
3917 
mangleCXXCatchableTypeArray(QualType T,uint32_t NumEntries,raw_ostream & Out)3918 void MicrosoftMangleContextImpl::mangleCXXCatchableTypeArray(
3919     QualType T, uint32_t NumEntries, raw_ostream &Out) {
3920   msvc_hashing_ostream MHO(Out);
3921   MicrosoftCXXNameMangler Mangler(*this, MHO);
3922   Mangler.getStream() << "_CTA";
3923   Mangler.getStream() << NumEntries;
3924   Mangler.mangleType(T, SourceRange(), MicrosoftCXXNameMangler::QMM_Result);
3925 }
3926 
mangleCXXCatchableType(QualType T,const CXXConstructorDecl * CD,CXXCtorType CT,uint32_t Size,uint32_t NVOffset,int32_t VBPtrOffset,uint32_t VBIndex,raw_ostream & Out)3927 void MicrosoftMangleContextImpl::mangleCXXCatchableType(
3928     QualType T, const CXXConstructorDecl *CD, CXXCtorType CT, uint32_t Size,
3929     uint32_t NVOffset, int32_t VBPtrOffset, uint32_t VBIndex,
3930     raw_ostream &Out) {
3931   MicrosoftCXXNameMangler Mangler(*this, Out);
3932   Mangler.getStream() << "_CT";
3933 
3934   llvm::SmallString<64> RTTIMangling;
3935   {
3936     llvm::raw_svector_ostream Stream(RTTIMangling);
3937     msvc_hashing_ostream MHO(Stream);
3938     mangleCXXRTTI(T, MHO);
3939   }
3940   Mangler.getStream() << RTTIMangling;
3941 
3942   // VS2015 and VS2017.1 omit the copy-constructor in the mangled name but
3943   // both older and newer versions include it.
3944   // FIXME: It is known that the Ctor is present in 2013, and in 2017.7
3945   // (_MSC_VER 1914) and newer, and that it's omitted in 2015 and 2017.4
3946   // (_MSC_VER 1911), but it's unknown when exactly it reappeared (1914?
3947   // Or 1912, 1913 already?).
3948   bool OmitCopyCtor = getASTContext().getLangOpts().isCompatibleWithMSVC(
3949                           LangOptions::MSVC2015) &&
3950                       !getASTContext().getLangOpts().isCompatibleWithMSVC(
3951                           LangOptions::MSVC2017_7);
3952   llvm::SmallString<64> CopyCtorMangling;
3953   if (!OmitCopyCtor && CD) {
3954     llvm::raw_svector_ostream Stream(CopyCtorMangling);
3955     msvc_hashing_ostream MHO(Stream);
3956     mangleCXXName(GlobalDecl(CD, CT), MHO);
3957   }
3958   Mangler.getStream() << CopyCtorMangling;
3959 
3960   Mangler.getStream() << Size;
3961   if (VBPtrOffset == -1) {
3962     if (NVOffset) {
3963       Mangler.getStream() << NVOffset;
3964     }
3965   } else {
3966     Mangler.getStream() << NVOffset;
3967     Mangler.getStream() << VBPtrOffset;
3968     Mangler.getStream() << VBIndex;
3969   }
3970 }
3971 
mangleCXXRTTIBaseClassDescriptor(const CXXRecordDecl * Derived,uint32_t NVOffset,int32_t VBPtrOffset,uint32_t VBTableOffset,uint32_t Flags,raw_ostream & Out)3972 void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassDescriptor(
3973     const CXXRecordDecl *Derived, uint32_t NVOffset, int32_t VBPtrOffset,
3974     uint32_t VBTableOffset, uint32_t Flags, raw_ostream &Out) {
3975   msvc_hashing_ostream MHO(Out);
3976   MicrosoftCXXNameMangler Mangler(*this, MHO);
3977   Mangler.getStream() << "??_R1";
3978   Mangler.mangleNumber(NVOffset);
3979   Mangler.mangleNumber(VBPtrOffset);
3980   Mangler.mangleNumber(VBTableOffset);
3981   Mangler.mangleNumber(Flags);
3982   Mangler.mangleName(Derived);
3983   Mangler.getStream() << "8";
3984 }
3985 
mangleCXXRTTIBaseClassArray(const CXXRecordDecl * Derived,raw_ostream & Out)3986 void MicrosoftMangleContextImpl::mangleCXXRTTIBaseClassArray(
3987     const CXXRecordDecl *Derived, raw_ostream &Out) {
3988   msvc_hashing_ostream MHO(Out);
3989   MicrosoftCXXNameMangler Mangler(*this, MHO);
3990   Mangler.getStream() << "??_R2";
3991   Mangler.mangleName(Derived);
3992   Mangler.getStream() << "8";
3993 }
3994 
mangleCXXRTTIClassHierarchyDescriptor(const CXXRecordDecl * Derived,raw_ostream & Out)3995 void MicrosoftMangleContextImpl::mangleCXXRTTIClassHierarchyDescriptor(
3996     const CXXRecordDecl *Derived, raw_ostream &Out) {
3997   msvc_hashing_ostream MHO(Out);
3998   MicrosoftCXXNameMangler Mangler(*this, MHO);
3999   Mangler.getStream() << "??_R3";
4000   Mangler.mangleName(Derived);
4001   Mangler.getStream() << "8";
4002 }
4003 
mangleCXXRTTICompleteObjectLocator(const CXXRecordDecl * Derived,ArrayRef<const CXXRecordDecl * > BasePath,raw_ostream & Out)4004 void MicrosoftMangleContextImpl::mangleCXXRTTICompleteObjectLocator(
4005     const CXXRecordDecl *Derived, ArrayRef<const CXXRecordDecl *> BasePath,
4006     raw_ostream &Out) {
4007   // <mangled-name> ::= ?_R4 <class-name> <storage-class>
4008   //                    <cvr-qualifiers> [<name>] @
4009   // NOTE: <cvr-qualifiers> here is always 'B' (const). <storage-class>
4010   // is always '6' for vftables.
4011   llvm::SmallString<64> VFTableMangling;
4012   llvm::raw_svector_ostream Stream(VFTableMangling);
4013   mangleCXXVFTable(Derived, BasePath, Stream);
4014 
4015   if (VFTableMangling.starts_with("??@")) {
4016     assert(VFTableMangling.ends_with("@"));
4017     Out << VFTableMangling << "??_R4@";
4018     return;
4019   }
4020 
4021   assert(VFTableMangling.starts_with("??_7") ||
4022          VFTableMangling.starts_with("??_S"));
4023 
4024   Out << "??_R4" << VFTableMangling.str().drop_front(4);
4025 }
4026 
mangleSEHFilterExpression(GlobalDecl EnclosingDecl,raw_ostream & Out)4027 void MicrosoftMangleContextImpl::mangleSEHFilterExpression(
4028     GlobalDecl EnclosingDecl, raw_ostream &Out) {
4029   msvc_hashing_ostream MHO(Out);
4030   MicrosoftCXXNameMangler Mangler(*this, MHO);
4031   // The function body is in the same comdat as the function with the handler,
4032   // so the numbering here doesn't have to be the same across TUs.
4033   //
4034   // <mangled-name> ::= ?filt$ <filter-number> @0
4035   Mangler.getStream() << "?filt$" << SEHFilterIds[EnclosingDecl]++ << "@0@";
4036   Mangler.mangleName(EnclosingDecl);
4037 }
4038 
mangleSEHFinallyBlock(GlobalDecl EnclosingDecl,raw_ostream & Out)4039 void MicrosoftMangleContextImpl::mangleSEHFinallyBlock(
4040     GlobalDecl EnclosingDecl, raw_ostream &Out) {
4041   msvc_hashing_ostream MHO(Out);
4042   MicrosoftCXXNameMangler Mangler(*this, MHO);
4043   // The function body is in the same comdat as the function with the handler,
4044   // so the numbering here doesn't have to be the same across TUs.
4045   //
4046   // <mangled-name> ::= ?fin$ <filter-number> @0
4047   Mangler.getStream() << "?fin$" << SEHFinallyIds[EnclosingDecl]++ << "@0@";
4048   Mangler.mangleName(EnclosingDecl);
4049 }
4050 
mangleCanonicalTypeName(QualType T,raw_ostream & Out,bool NormalizeIntegers=false)4051 void MicrosoftMangleContextImpl::mangleCanonicalTypeName(
4052     QualType T, raw_ostream &Out, bool NormalizeIntegers = false) {
4053   // This is just a made up unique string for the purposes of tbaa.  undname
4054   // does *not* know how to demangle it.
4055   MicrosoftCXXNameMangler Mangler(*this, Out);
4056   Mangler.getStream() << '?';
4057   Mangler.mangleType(T.getCanonicalType(), SourceRange());
4058 }
4059 
mangleReferenceTemporary(const VarDecl * VD,unsigned ManglingNumber,raw_ostream & Out)4060 void MicrosoftMangleContextImpl::mangleReferenceTemporary(
4061     const VarDecl *VD, unsigned ManglingNumber, raw_ostream &Out) {
4062   msvc_hashing_ostream MHO(Out);
4063   MicrosoftCXXNameMangler Mangler(*this, MHO);
4064 
4065   Mangler.getStream() << "?";
4066   Mangler.mangleSourceName("$RT" + llvm::utostr(ManglingNumber));
4067   Mangler.mangle(VD, "");
4068 }
4069 
mangleThreadSafeStaticGuardVariable(const VarDecl * VD,unsigned GuardNum,raw_ostream & Out)4070 void MicrosoftMangleContextImpl::mangleThreadSafeStaticGuardVariable(
4071     const VarDecl *VD, unsigned GuardNum, raw_ostream &Out) {
4072   msvc_hashing_ostream MHO(Out);
4073   MicrosoftCXXNameMangler Mangler(*this, MHO);
4074 
4075   Mangler.getStream() << "?";
4076   Mangler.mangleSourceName("$TSS" + llvm::utostr(GuardNum));
4077   Mangler.mangleNestedName(VD);
4078   Mangler.getStream() << "@4HA";
4079 }
4080 
mangleStaticGuardVariable(const VarDecl * VD,raw_ostream & Out)4081 void MicrosoftMangleContextImpl::mangleStaticGuardVariable(const VarDecl *VD,
4082                                                            raw_ostream &Out) {
4083   // <guard-name> ::= ?_B <postfix> @5 <scope-depth>
4084   //              ::= ?__J <postfix> @5 <scope-depth>
4085   //              ::= ?$S <guard-num> @ <postfix> @4IA
4086 
4087   // The first mangling is what MSVC uses to guard static locals in inline
4088   // functions.  It uses a different mangling in external functions to support
4089   // guarding more than 32 variables.  MSVC rejects inline functions with more
4090   // than 32 static locals.  We don't fully implement the second mangling
4091   // because those guards are not externally visible, and instead use LLVM's
4092   // default renaming when creating a new guard variable.
4093   msvc_hashing_ostream MHO(Out);
4094   MicrosoftCXXNameMangler Mangler(*this, MHO);
4095 
4096   bool Visible = VD->isExternallyVisible();
4097   if (Visible) {
4098     Mangler.getStream() << (VD->getTLSKind() ? "??__J" : "??_B");
4099   } else {
4100     Mangler.getStream() << "?$S1@";
4101   }
4102   unsigned ScopeDepth = 0;
4103   if (Visible && !getNextDiscriminator(VD, ScopeDepth))
4104     // If we do not have a discriminator and are emitting a guard variable for
4105     // use at global scope, then mangling the nested name will not be enough to
4106     // remove ambiguities.
4107     Mangler.mangle(VD, "");
4108   else
4109     Mangler.mangleNestedName(VD);
4110   Mangler.getStream() << (Visible ? "@5" : "@4IA");
4111   if (ScopeDepth)
4112     Mangler.mangleNumber(ScopeDepth);
4113 }
4114 
mangleInitFiniStub(const VarDecl * D,char CharCode,raw_ostream & Out)4115 void MicrosoftMangleContextImpl::mangleInitFiniStub(const VarDecl *D,
4116                                                     char CharCode,
4117                                                     raw_ostream &Out) {
4118   msvc_hashing_ostream MHO(Out);
4119   MicrosoftCXXNameMangler Mangler(*this, MHO);
4120   Mangler.getStream() << "??__" << CharCode;
4121   if (D->isStaticDataMember()) {
4122     Mangler.getStream() << '?';
4123     Mangler.mangleName(D);
4124     Mangler.mangleVariableEncoding(D);
4125     Mangler.getStream() << "@@";
4126   } else {
4127     Mangler.mangleName(D);
4128   }
4129   // This is the function class mangling.  These stubs are global, non-variadic,
4130   // cdecl functions that return void and take no args.
4131   Mangler.getStream() << "YAXXZ";
4132 }
4133 
mangleDynamicInitializer(const VarDecl * D,raw_ostream & Out)4134 void MicrosoftMangleContextImpl::mangleDynamicInitializer(const VarDecl *D,
4135                                                           raw_ostream &Out) {
4136   // <initializer-name> ::= ?__E <name> YAXXZ
4137   mangleInitFiniStub(D, 'E', Out);
4138 }
4139 
4140 void
mangleDynamicAtExitDestructor(const VarDecl * D,raw_ostream & Out)4141 MicrosoftMangleContextImpl::mangleDynamicAtExitDestructor(const VarDecl *D,
4142                                                           raw_ostream &Out) {
4143   // <destructor-name> ::= ?__F <name> YAXXZ
4144   mangleInitFiniStub(D, 'F', Out);
4145 }
4146 
mangleStringLiteral(const StringLiteral * SL,raw_ostream & Out)4147 void MicrosoftMangleContextImpl::mangleStringLiteral(const StringLiteral *SL,
4148                                                      raw_ostream &Out) {
4149   // <char-type> ::= 0   # char, char16_t, char32_t
4150   //                     # (little endian char data in mangling)
4151   //             ::= 1   # wchar_t (big endian char data in mangling)
4152   //
4153   // <literal-length> ::= <non-negative integer>  # the length of the literal
4154   //
4155   // <encoded-crc>    ::= <hex digit>+ @          # crc of the literal including
4156   //                                              # trailing null bytes
4157   //
4158   // <encoded-string> ::= <simple character>           # uninteresting character
4159   //                  ::= '?$' <hex digit> <hex digit> # these two nibbles
4160   //                                                   # encode the byte for the
4161   //                                                   # character
4162   //                  ::= '?' [a-z]                    # \xe1 - \xfa
4163   //                  ::= '?' [A-Z]                    # \xc1 - \xda
4164   //                  ::= '?' [0-9]                    # [,/\:. \n\t'-]
4165   //
4166   // <literal> ::= '??_C@_' <char-type> <literal-length> <encoded-crc>
4167   //               <encoded-string> '@'
4168   MicrosoftCXXNameMangler Mangler(*this, Out);
4169   Mangler.getStream() << "??_C@_";
4170 
4171   // The actual string length might be different from that of the string literal
4172   // in cases like:
4173   // char foo[3] = "foobar";
4174   // char bar[42] = "foobar";
4175   // Where it is truncated or zero-padded to fit the array. This is the length
4176   // used for mangling, and any trailing null-bytes also need to be mangled.
4177   unsigned StringLength =
4178       getASTContext().getAsConstantArrayType(SL->getType())->getZExtSize();
4179   unsigned StringByteLength = StringLength * SL->getCharByteWidth();
4180 
4181   // <char-type>: The "kind" of string literal is encoded into the mangled name.
4182   if (SL->isWide())
4183     Mangler.getStream() << '1';
4184   else
4185     Mangler.getStream() << '0';
4186 
4187   // <literal-length>: The next part of the mangled name consists of the length
4188   // of the string in bytes.
4189   Mangler.mangleNumber(StringByteLength);
4190 
4191   auto GetLittleEndianByte = [&SL](unsigned Index) {
4192     unsigned CharByteWidth = SL->getCharByteWidth();
4193     if (Index / CharByteWidth >= SL->getLength())
4194       return static_cast<char>(0);
4195     uint32_t CodeUnit = SL->getCodeUnit(Index / CharByteWidth);
4196     unsigned OffsetInCodeUnit = Index % CharByteWidth;
4197     return static_cast<char>((CodeUnit >> (8 * OffsetInCodeUnit)) & 0xff);
4198   };
4199 
4200   auto GetBigEndianByte = [&SL](unsigned Index) {
4201     unsigned CharByteWidth = SL->getCharByteWidth();
4202     if (Index / CharByteWidth >= SL->getLength())
4203       return static_cast<char>(0);
4204     uint32_t CodeUnit = SL->getCodeUnit(Index / CharByteWidth);
4205     unsigned OffsetInCodeUnit = (CharByteWidth - 1) - (Index % CharByteWidth);
4206     return static_cast<char>((CodeUnit >> (8 * OffsetInCodeUnit)) & 0xff);
4207   };
4208 
4209   // CRC all the bytes of the StringLiteral.
4210   llvm::JamCRC JC;
4211   for (unsigned I = 0, E = StringByteLength; I != E; ++I)
4212     JC.update(GetLittleEndianByte(I));
4213 
4214   // <encoded-crc>: The CRC is encoded utilizing the standard number mangling
4215   // scheme.
4216   Mangler.mangleNumber(JC.getCRC());
4217 
4218   // <encoded-string>: The mangled name also contains the first 32 bytes
4219   // (including null-terminator bytes) of the encoded StringLiteral.
4220   // Each character is encoded by splitting them into bytes and then encoding
4221   // the constituent bytes.
4222   auto MangleByte = [&Mangler](char Byte) {
4223     // There are five different manglings for characters:
4224     // - [a-zA-Z0-9_$]: A one-to-one mapping.
4225     // - ?[a-z]: The range from \xe1 to \xfa.
4226     // - ?[A-Z]: The range from \xc1 to \xda.
4227     // - ?[0-9]: The set of [,/\:. \n\t'-].
4228     // - ?$XX: A fallback which maps nibbles.
4229     if (isAsciiIdentifierContinue(Byte, /*AllowDollar=*/true)) {
4230       Mangler.getStream() << Byte;
4231     } else if (isLetter(Byte & 0x7f)) {
4232       Mangler.getStream() << '?' << static_cast<char>(Byte & 0x7f);
4233     } else {
4234       const char SpecialChars[] = {',', '/',  '\\', ':',  '.',
4235                                    ' ', '\n', '\t', '\'', '-'};
4236       const char *Pos = llvm::find(SpecialChars, Byte);
4237       if (Pos != std::end(SpecialChars)) {
4238         Mangler.getStream() << '?' << (Pos - std::begin(SpecialChars));
4239       } else {
4240         Mangler.getStream() << "?$";
4241         Mangler.getStream() << static_cast<char>('A' + ((Byte >> 4) & 0xf));
4242         Mangler.getStream() << static_cast<char>('A' + (Byte & 0xf));
4243       }
4244     }
4245   };
4246 
4247   // Enforce our 32 bytes max, except wchar_t which gets 32 chars instead.
4248   unsigned MaxBytesToMangle = SL->isWide() ? 64U : 32U;
4249   unsigned NumBytesToMangle = std::min(MaxBytesToMangle, StringByteLength);
4250   for (unsigned I = 0; I != NumBytesToMangle; ++I) {
4251     if (SL->isWide())
4252       MangleByte(GetBigEndianByte(I));
4253     else
4254       MangleByte(GetLittleEndianByte(I));
4255   }
4256 
4257   Mangler.getStream() << '@';
4258 }
4259 
create(ASTContext & Context,DiagnosticsEngine & Diags,bool IsAux)4260 MicrosoftMangleContext *MicrosoftMangleContext::create(ASTContext &Context,
4261                                                        DiagnosticsEngine &Diags,
4262                                                        bool IsAux) {
4263   return new MicrosoftMangleContextImpl(Context, Diags, IsAux);
4264 }
4265