114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//===--- MicrosoftMangle.cpp - Microsoft Visual C++ Name Mangling ---------===//
214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//
314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                     The LLVM Compiler Infrastructure
414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//
514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// This file is distributed under the University of Illinois Open Source
614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// License. See LICENSE.TXT for details.
714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//
814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//===----------------------------------------------------------------------===//
914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//
10fc8f0e14ad142ed811e90fbd9a30e419e301c717Chris Lattner// This provides C++ name mangling targeting the Microsoft Visual C++ ABI.
1114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//
1214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//===----------------------------------------------------------------------===//
1314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/Mangle.h"
1514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/ASTContext.h"
1614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/CharUnits.h"
1714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/Decl.h"
1814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/DeclCXX.h"
1914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/DeclObjC.h"
2014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/DeclTemplate.h"
2114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/ExprCXX.h"
2214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/Basic/ABI.h"
2314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
24f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov#include <map>
25f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
2614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneusing namespace clang;
2714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
2814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournenamespace {
2914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
3014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// MicrosoftCXXNameMangler - Manage the mangling of a single name for the
3114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// Microsoft Visual C++ ABI.
3214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneclass MicrosoftCXXNameMangler {
3314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  MangleContext &Context;
345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  raw_ostream &Out;
3514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
36d93c5ff2b1a83f73c64ee6b8e4eff521865e92d2Timur Iskhodzhanov  // FIXME: audit the performance of BackRefMap as it might do way too many
37d93c5ff2b1a83f73c64ee6b8e4eff521865e92d2Timur Iskhodzhanov  // copying of strings.
38f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  typedef std::map<std::string, unsigned> BackRefMap;
39f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  BackRefMap NameBackReferences;
40f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  bool UseNameBackReferences;
41f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
42f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  typedef llvm::DenseMap<void*, unsigned> ArgBackRefMap;
43f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  ArgBackRefMap TypeBackReferences;
4406e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith
4514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  ASTContext &getASTContext() const { return Context.getASTContext(); }
4614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
4714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournepublic:
485f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  MicrosoftCXXNameMangler(MangleContext &C, raw_ostream &Out_)
49f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  : Context(C), Out(Out_), UseNameBackReferences(true) { }
5014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
51e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  raw_ostream &getStream() const { return Out; }
52e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
53e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangle(const NamedDecl *D, StringRef Prefix = "\01?");
5414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleName(const NamedDecl *ND);
5514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleFunctionEncoding(const FunctionDecl *FD);
5614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleVariableEncoding(const VarDecl *VD);
5714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleNumber(int64_t Number);
589fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleNumber(const llvm::APSInt &Value);
59a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  void mangleType(QualType T, SourceRange Range, bool MangleQualifiers = true);
6014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
6114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneprivate:
62f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  void disableBackReferences() { UseNameBackReferences = false; }
6314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleUnqualifiedName(const NamedDecl *ND) {
6414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleUnqualifiedName(ND, ND->getDeclName());
6514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
6614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name);
6714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleSourceName(const IdentifierInfo *II);
6814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void manglePostfix(const DeclContext *DC, bool NoFunction=false);
69e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangleOperatorName(OverloadedOperatorKind OO, SourceLocation Loc);
7014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleQualifiers(Qualifiers Quals, bool IsMember);
71a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  void manglePointerQualifiers(Qualifiers Quals);
7214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
739fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleUnscopedTemplateName(const TemplateDecl *ND);
749fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleTemplateInstantiationName(const TemplateDecl *TD,
75e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                      const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs);
7614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleObjCMethodName(const ObjCMethodDecl *MD);
77e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangleLocalName(const FunctionDecl *FD);
7814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
79a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  void mangleArgumentType(QualType T, SourceRange Range);
803f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
8114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Declare manglers for every type class.
8214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define ABSTRACT_TYPE(CLASS, PARENT)
8314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define NON_CANONICAL_TYPE(CLASS, PARENT)
84e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T, \
85e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                            SourceRange Range);
8614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/TypeNodes.def"
87e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef ABSTRACT_TYPE
88e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef NON_CANONICAL_TYPE
89e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef TYPE
9014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
9114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const TagType*);
9214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const FunctionType *T, const FunctionDecl *D,
9314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                  bool IsStructor, bool IsInstMethod);
9414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const ArrayType *T, bool IsGlobal);
9514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleExtraDimensions(QualType T);
9614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleFunctionClass(const FunctionDecl *FD);
9714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleCallingConvention(const FunctionType *T, bool IsInstMethod = false);
989fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleIntegerLiteral(QualType T, const llvm::APSInt &Number);
9914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleThrowSpecification(const FunctionProtoType *T);
10014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
101e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangleTemplateArgs(
102e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                      const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs);
1039fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
10414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne};
10514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
10614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// MicrosoftMangleContext - Overrides the default MangleContext for the
10714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// Microsoft Visual C++ ABI.
10814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneclass MicrosoftMangleContext : public MangleContext {
10914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournepublic:
11014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  MicrosoftMangleContext(ASTContext &Context,
111d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                   DiagnosticsEngine &Diags) : MangleContext(Context, Diags) { }
11214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual bool shouldMangleDeclName(const NamedDecl *D);
1135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleName(const NamedDecl *D, raw_ostream &Out);
11414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleThunk(const CXXMethodDecl *MD,
11514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                           const ThunkInfo &Thunk,
1165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                           raw_ostream &);
11714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
11814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                  const ThisAdjustment &ThisAdjustment,
1195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                  raw_ostream &);
12014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXVTable(const CXXRecordDecl *RD,
1215f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                               raw_ostream &);
12214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXVTT(const CXXRecordDecl *RD,
1235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                            raw_ostream &);
12414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset,
12514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                   const CXXRecordDecl *Type,
1265f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                   raw_ostream &);
1275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleCXXRTTI(QualType T, raw_ostream &);
1285f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleCXXRTTIName(QualType T, raw_ostream &);
12914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
1305f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &);
13114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
1325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &);
13314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleReferenceTemporary(const clang::VarDecl *,
1345f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                        raw_ostream &);
13514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne};
13614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
13714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
13814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
13914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournestatic bool isInCLinkageSpecification(const Decl *D) {
14014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  D = D->getCanonicalDecl();
14114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  for (const DeclContext *DC = D->getDeclContext();
14214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne       !DC->isTranslationUnit(); DC = DC->getParent()) {
14314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))
14414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      return Linkage->getLanguage() == LinkageSpecDecl::lang_c;
14514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
14614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
14714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return false;
14814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
14914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
15014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournebool MicrosoftMangleContext::shouldMangleDeclName(const NamedDecl *D) {
15114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // In C, functions with no attributes never need to be mangled. Fastpath them.
1524e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getASTContext().getLangOpts().CPlusPlus && !D->hasAttrs())
15314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
15414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
15514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Any decl can be declared with __asm("foo") on it, and this takes precedence
15614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // over all other naming in the .o file.
15714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (D->hasAttr<AsmLabelAttr>())
15814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return true;
15914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
16014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Clang's "overloadable" attribute extension to C/C++ implies name mangling
16114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // (always) as does passing a C++ member function and a function
16214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // whose name is not a simple identifier.
16314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
16414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (FD && (FD->hasAttr<OverloadableAttr>() || isa<CXXMethodDecl>(FD) ||
16514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne             !FD->getDeclName().isIdentifier()))
16614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return true;
16714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
16814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Otherwise, no mangling is done outside C++ mode.
1694e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getASTContext().getLangOpts().CPlusPlus)
17014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
17114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
17214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Variables at global scope with internal linkage are not mangled.
17314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!FD) {
17414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    const DeclContext *DC = D->getDeclContext();
17514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (DC->isTranslationUnit() && D->getLinkage() == InternalLinkage)
17614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      return false;
17714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
17814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
17914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // C functions and "main" are not mangled.
18014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if ((FD && FD->isMain()) || isInCLinkageSpecification(D))
18114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
18214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
18314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return true;
18414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
18514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
18614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangle(const NamedDecl *D,
1875f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                     StringRef Prefix) {
18814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // MSVC doesn't mangle C++ names the same way it mangles extern "C" names.
18914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Therefore it's really important that we don't decorate the
190e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // name with leading underscores or leading/trailing at signs. So, by
191e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // default, we emit an asm marker at the start so we get the name right.
192e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // Callers can override this with a custom prefix.
19314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
19414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Any decl can be declared with __asm("foo") on it, and this takes precedence
19514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // over all other naming in the .o file.
19614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
19714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // If we have an asm name, then we use it as the mangling.
198e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Out << '\01' << ALA->getLabel();
19914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
20014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
20114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
20214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <mangled-name> ::= ? <name> <type-encoding>
20314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << Prefix;
20414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(D);
20514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
20614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleFunctionEncoding(FD);
20714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (const VarDecl *VD = dyn_cast<VarDecl>(D))
20814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleVariableEncoding(VD);
209e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  else {
210e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // TODO: Fields? Can MSVC even mangle them?
211e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // Issue a diagnostic for now.
212e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DiagnosticsEngine &Diags = Context.getDiags();
213e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
214e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      "cannot mangle this declaration yet");
215e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Diags.Report(D->getLocation(), DiagID)
216e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      << D->getSourceRange();
217e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
21814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
21914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
22014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) {
22114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <type-encoding> ::= <function-class> <function-type>
22214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
22314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Don't mangle in the type if this isn't a decl we should typically mangle.
22414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!Context.shouldMangleDeclName(FD))
22514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
22614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
22714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We should never ever see a FunctionNoProtoType at this point.
22814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We don't even know how to mangle their types anyway :).
229bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smith  const FunctionProtoType *FT = FD->getType()->castAs<FunctionProtoType>();
23014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
23114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  bool InStructor = false, InInstMethod = false;
23214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
23314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (MD) {
23414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (MD->isInstance())
23514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      InInstMethod = true;
23614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD))
23714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      InStructor = true;
23814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
23914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
24014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // First, the function class.
24114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleFunctionClass(FD);
24214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
24314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(FT, FD, InStructor, InInstMethod);
24414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
24514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
24614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
24714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <type-encoding> ::= <storage-class> <variable-type>
24814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <storage-class> ::= 0  # private static member
24914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 1  # protected static member
25014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 2  # public static member
25114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 3  # global
25214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 4  # static local
25314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
25414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // The first character in the encoding (after the name) is the storage class.
25514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (VD->isStaticDataMember()) {
25614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // If it's a static member, it also encodes the access level.
25714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    switch (VD->getAccess()) {
25814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      default:
25914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_private: Out << '0'; break;
26014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_protected: Out << '1'; break;
26114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_public: Out << '2'; break;
26214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
26314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
26414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (!VD->isStaticLocal())
26514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '3';
26614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else
26714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '4';
26814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Now mangle the type.
26914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <variable-type> ::= <type> <cvr-qualifiers>
270a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  //                 ::= <type> <pointee-cvr-qualifiers> # pointers, references
27114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Pointers and references are odd. The type of 'int * const foo;' gets
27214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // mangled as 'QAHA' instead of 'PAHB', for example.
273e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  TypeLoc TL = VD->getTypeSourceInfo()->getTypeLoc();
274e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  QualType Ty = TL.getType();
27514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Ty->isPointerType() || Ty->isReferenceType()) {
276e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(Ty, TL.getSourceRange());
277a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    mangleQualifiers(Ty->getPointeeType().getQualifiers(), false);
278c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith  } else if (const ArrayType *AT = getASTContext().getAsArrayType(Ty)) {
27914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Global arrays are funny, too.
280c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleType(AT, true);
281a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    mangleQualifiers(Ty.getQualifiers(), false);
28214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
283e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(Ty.getLocalUnqualifiedType(), TL.getSourceRange());
28414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(Ty.getLocalQualifiers(), false);
28514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
28614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
28714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
28814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleName(const NamedDecl *ND) {
28914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <name> ::= <unscoped-name> {[<named-scope>]+ | [<nested-name>]}? @
29014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const DeclContext *DC = ND->getDeclContext();
29114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
29214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Always start with the unqualified name.
29314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleUnqualifiedName(ND);
29414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
29514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If this is an extern variable declared locally, the relevant DeclContext
29614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // is that of the containing namespace, or the translation unit.
29714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (isa<FunctionDecl>(DC) && ND->hasLinkage())
29814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    while (!DC->isNamespace() && !DC->isTranslationUnit())
29914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      DC = DC->getParent();
30014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
30114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  manglePostfix(DC);
30214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
30314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Terminate the whole name with an '@'.
30414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << '@';
30514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
30614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
30714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleNumber(int64_t Number) {
3089fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <number> ::= [?] <decimal digit> # 1 <= Number <= 10
3099fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //          ::= [?] <hex digit>+ @ # 0 or > 9; A = 0, B = 1, etc...
3109fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //          ::= [?] @ # 0 (alternate mangling, not emitted by VC)
31114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Number < 0) {
31214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '?';
31314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Number = -Number;
31414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
315e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // There's a special shorter mangling for 0, but Microsoft
316e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // chose not to use it. Instead, 0 gets mangled as "A@". Oh well...
3179fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (Number >= 1 && Number <= 10)
31814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << Number-1;
3199fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  else {
32014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // We have to build up the encoding in reverse order, so it will come
32114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // out right when we write it out.
32214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char Encoding[16];
32314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char *EndPtr = Encoding+sizeof(Encoding);
32414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char *CurPtr = EndPtr;
3259fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    do {
32614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      *--CurPtr = 'A' + (Number % 16);
32714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Number /= 16;
3289fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    } while (Number);
32914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out.write(CurPtr, EndPtr-CurPtr);
33014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '@';
33114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
33214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
33314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
3349fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid MicrosoftCXXNameMangler::mangleNumber(const llvm::APSInt &Value) {
3359fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (Value.isSigned() && Value.isNegative()) {
3369fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << '?';
3379fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    mangleNumber(llvm::APSInt(Value.abs()));
3389fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return;
3399fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
340c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  llvm::APSInt Temp(Value);
341c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  if (Value.uge(1) && Value.ule(10)) {
342c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis    --Temp;
343c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis    Temp.print(Out, false);
344c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  } else {
3459fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    // We have to build up the encoding in reverse order, so it will come
3469fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    // out right when we write it out.
3479fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char Encoding[64];
3489fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char *EndPtr = Encoding+sizeof(Encoding);
3499fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char *CurPtr = EndPtr;
350104e51f30fdf42b1f594a1be20de1c8673088c50Charles Davis    llvm::APSInt NibbleMask(Value.getBitWidth(), Value.isUnsigned());
351f17523b6d3d9ef1dbcb64b63d9bada7bdae194a7Lang Hames    NibbleMask = 0xf;
3529fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    for (int i = 0, e = Value.getActiveBits() / 4; i != e; ++i) {
353c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis      *--CurPtr = 'A' + Temp.And(NibbleMask).getLimitedValue(0xf);
354c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis      Temp = Temp.lshr(4);
355e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    }
3569fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out.write(CurPtr, EndPtr-CurPtr);
3579fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << '@';
3589fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3599fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
3609fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
3619fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisstatic const TemplateDecl *
362e0deb035b3e2d07b41ea55db84b110abcb65b753Charles DavisisTemplate(const NamedDecl *ND,
363e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis           SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs) {
3649fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a function template.
3659fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)){
3669fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    if (const TemplateDecl *TD = FD->getPrimaryTemplate()) {
367e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      if (FD->getTemplateSpecializationArgsAsWritten()) {
368e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        const ASTTemplateArgumentListInfo *ArgList =
369e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis          FD->getTemplateSpecializationArgsAsWritten();
370e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgs.append(ArgList->getTemplateArgs(),
371e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                            ArgList->getTemplateArgs() +
372e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                              ArgList->NumTemplateArgs);
373e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      } else {
374e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        const TemplateArgumentList *ArgList =
375e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis          FD->getTemplateSpecializationArgs();
376e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgumentListInfo LI;
377e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        for (unsigned i = 0, e = ArgList->size(); i != e; ++i)
378e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis          TemplateArgs.push_back(TemplateArgumentLoc(ArgList->get(i),
379e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                     FD->getTypeSourceInfo()));
380e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      }
3819fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      return TD;
3829fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
3839fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3849fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
3859fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a class template.
3869fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const ClassTemplateSpecializationDecl *Spec =
3879fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
388e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    TypeSourceInfo *TSI = Spec->getTypeAsWritten();
389e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    if (TSI) {
390e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      TemplateSpecializationTypeLoc &TSTL =
391e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        cast<TemplateSpecializationTypeLoc>(TSI->getTypeLoc());
392e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      TemplateArgumentListInfo LI(TSTL.getLAngleLoc(), TSTL.getRAngleLoc());
393e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      for (unsigned i = 0, e = TSTL.getNumArgs(); i != e; ++i)
394e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgs.push_back(TSTL.getArgLoc(i));
395e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    } else {
396e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      TemplateArgumentListInfo LI;
397e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      const TemplateArgumentList &ArgList =
398e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        Spec->getTemplateArgs();
399e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      for (unsigned i = 0, e = ArgList.size(); i != e; ++i)
400e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgs.push_back(TemplateArgumentLoc(ArgList[i],
401e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                   TemplateArgumentLocInfo()));
402e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    }
4039fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return Spec->getSpecializedTemplate();
4049fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
4059fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
4069fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  return 0;
4079fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
4089fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
40914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid
41014110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
41114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                               DeclarationName Name) {
41214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <unqualified-name> ::= <operator-name>
41314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ::= <ctor-dtor-name>
41414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ::= <source-name>
4159fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //                     ::= <template-name>
416e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  SmallVector<TemplateArgumentLoc, 2> TemplateArgs;
4179fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a template.
4189fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
419f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // We have a template.
420f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // Here comes the tricky thing: if we need to mangle something like
421f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   void foo(A::X<Y>, B::X<Y>),
422f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // the X<Y> part is aliased. However, if you need to mangle
423f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   void foo(A::X<A::Y>, A::X<B::Y>),
424f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // the A::X<> part is not aliased.
425f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // That said, from the mangler's perspective we have a structure like this:
426f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   namespace[s] -> type[ -> template-parameters]
427f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // but from the Clang perspective we have
428f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   type [ -> template-parameters]
429f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //      \-> namespace[s]
430f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // What we do is we create a new mangler, mangle the same type (without
431f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // a namespace suffix) using the extra mangler with back references
432f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // disabled (to avoid infinite recursion) and then use the mangled type
433f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // name as a key to check the mangling of different types for aliasing.
434f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
435f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    std::string BackReferenceKey;
436f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    BackRefMap::iterator Found;
437f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    if (UseNameBackReferences) {
438f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      llvm::raw_string_ostream Stream(BackReferenceKey);
439f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      MicrosoftCXXNameMangler Extra(Context, Stream);
440f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Extra.disableBackReferences();
441f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Extra.mangleUnqualifiedName(ND, Name);
442f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Stream.flush();
443f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
444f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Found = NameBackReferences.find(BackReferenceKey);
445f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    }
446f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    if (!UseNameBackReferences || Found == NameBackReferences.end()) {
447f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      mangleTemplateInstantiationName(TD, TemplateArgs);
448f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      if (UseNameBackReferences && NameBackReferences.size() < 10) {
449f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov        size_t Size = NameBackReferences.size();
450f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov        NameBackReferences[BackReferenceKey] = Size;
451f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      }
452f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    } else {
453f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Out << Found->second;
454f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    }
4559fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return;
4569fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
4579fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
45814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (Name.getNameKind()) {
45914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::Identifier: {
46014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
46114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        mangleSourceName(II);
46214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
46314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
46414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
46514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // Otherwise, an anonymous entity.  We must have a declaration.
46614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      assert(ND && "mangling empty name without declaration");
46714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
46814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
46914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (NS->isAnonymousNamespace()) {
47014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << "?A";
47114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          break;
47214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        }
47314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
47414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
47514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // We must have an anonymous struct.
47614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      const TagDecl *TD = cast<TagDecl>(ND);
477162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if (const TypedefNameDecl *D = TD->getTypedefNameForAnonDecl()) {
47814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        assert(TD->getDeclContext() == D->getDeclContext() &&
47914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne               "Typedef should not be in another decl context!");
48014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        assert(D->getDeclName().getAsIdentifierInfo() &&
48114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne               "Typedef was not named!");
48214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        mangleSourceName(D->getDeclName().getAsIdentifierInfo());
48314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
48414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
48514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
48614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // When VC encounters an anonymous type with no tag and no typedef,
48714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // it literally emits '<unnamed-tag>'.
48814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << "<unnamed-tag>";
48914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
49014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
49114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
49214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCZeroArgSelector:
49314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCOneArgSelector:
49414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCMultiArgSelector:
495b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Can't mangle Objective-C selector names here!");
49614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
49714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXConstructorName:
49850118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      Out << "?0";
49950118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      break;
50014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
50114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXDestructorName:
50250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      Out << "?1";
50350118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      break;
50414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
50514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXConversionFunctionName:
50614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // <operator-name> ::= ?B # (cast)
50714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // The target type is encoded as the return type.
50814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << "?B";
50914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
51014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
51114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXOperatorName:
512e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      mangleOperatorName(Name.getCXXOverloadedOperator(), ND->getLocation());
51314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
51414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
515e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    case DeclarationName::CXXLiteralOperatorName: {
51614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // FIXME: Was this added in VS2010? Does MS even know how to mangle this?
517e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine Diags = Context.getDiags();
518e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
519e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this literal operator yet");
520e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(ND->getLocation(), DiagID);
521e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      break;
522e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    }
52314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
52414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXUsingDirective:
525b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Can't mangle a using directive name!");
52614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
52714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
52814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
52914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::manglePostfix(const DeclContext *DC,
53014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                            bool NoFunction) {
53114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <postfix> ::= <unqualified-name> [<postfix>]
53214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //           ::= <substitution> [<postfix>]
53314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
53414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!DC) return;
53514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
53614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  while (isa<LinkageSpecDecl>(DC))
53714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    DC = DC->getParent();
53814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
53914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (DC->isTranslationUnit())
54014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
54114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
54214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
543c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola    Context.mangleBlock(BD, Out);
544c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola    Out << '@';
54514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return manglePostfix(DC->getParent(), NoFunction);
54614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
54714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
54814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (NoFunction && (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC)))
54914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
55014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC))
55114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleObjCMethodName(Method);
552e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  else if (const FunctionDecl *Func = dyn_cast<FunctionDecl>(DC))
553e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleLocalName(Func);
55414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else {
55514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleUnqualifiedName(cast<NamedDecl>(DC));
55614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    manglePostfix(DC->getParent(), NoFunction);
55714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
55814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
55914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
560e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO,
561e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                 SourceLocation Loc) {
56214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (OO) {
56314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?0 # constructor
56414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?1 # destructor
56514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?2 # new
56614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_New: Out << "?2"; break;
56714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?3 # delete
56814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Delete: Out << "?3"; break;
56914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?4 # =
57014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Equal: Out << "?4"; break;
57114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?5 # >>
57214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterGreater: Out << "?5"; break;
57314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?6 # <<
57414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessLess: Out << "?6"; break;
57514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?7 # !
57614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Exclaim: Out << "?7"; break;
57714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?8 # ==
57814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_EqualEqual: Out << "?8"; break;
57914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?9 # !=
58014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_ExclaimEqual: Out << "?9"; break;
58114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?A # []
58214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Subscript: Out << "?A"; break;
58314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?B # conversion
58414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?C # ->
58514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Arrow: Out << "?C"; break;
58614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?D # *
58714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Star: Out << "?D"; break;
58814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?E # ++
58914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PlusPlus: Out << "?E"; break;
59014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?F # --
59114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_MinusMinus: Out << "?F"; break;
59214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?G # -
59314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Minus: Out << "?G"; break;
59414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?H # +
59514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Plus: Out << "?H"; break;
59614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?I # &
59714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Amp: Out << "?I"; break;
59814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?J # ->*
59914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_ArrowStar: Out << "?J"; break;
60014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?K # /
60114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Slash: Out << "?K"; break;
60214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?L # %
60314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Percent: Out << "?L"; break;
60414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?M # <
60514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Less: Out << "?M"; break;
60614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?N # <=
60714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessEqual: Out << "?N"; break;
60814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?O # >
60914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Greater: Out << "?O"; break;
61014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?P # >=
61114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterEqual: Out << "?P"; break;
61214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Q # ,
61314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Comma: Out << "?Q"; break;
61414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?R # ()
61514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Call: Out << "?R"; break;
61614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?S # ~
61714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Tilde: Out << "?S"; break;
61814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?T # ^
61914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Caret: Out << "?T"; break;
62014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?U # |
62114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Pipe: Out << "?U"; break;
62214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?V # &&
62314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_AmpAmp: Out << "?V"; break;
62414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?W # ||
62514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PipePipe: Out << "?W"; break;
62614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?X # *=
62714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_StarEqual: Out << "?X"; break;
62814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Y # +=
62914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PlusEqual: Out << "?Y"; break;
63014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Z # -=
63114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_MinusEqual: Out << "?Z"; break;
63214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_0 # /=
63314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_SlashEqual: Out << "?_0"; break;
63414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_1 # %=
63514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PercentEqual: Out << "?_1"; break;
63614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_2 # >>=
63714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterGreaterEqual: Out << "?_2"; break;
63814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_3 # <<=
63914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessLessEqual: Out << "?_3"; break;
64014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_4 # &=
64114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_AmpEqual: Out << "?_4"; break;
64214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_5 # |=
64314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PipeEqual: Out << "?_5"; break;
64414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_6 # ^=
64514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_CaretEqual: Out << "?_6"; break;
64614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_7 # vftable
64714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_8 # vbtable
64814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_9 # vcall
64914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_A # typeof
65014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_B # local static guard
65114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_C # string
65214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_D # vbase destructor
65314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_E # vector deleting destructor
65414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_F # default constructor closure
65514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_G # scalar deleting destructor
65614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_H # vector constructor iterator
65714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_I # vector destructor iterator
65814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_J # vector vbase constructor iterator
65914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_K # virtual displacement map
66014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_L # eh vector constructor iterator
66114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_M # eh vector destructor iterator
66214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_N # eh vector vbase constructor iterator
66314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_O # copy constructor closure
66414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_P<name> # udt returning <name>
66514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_Q # <unknown>
66614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R0 # RTTI Type Descriptor
66714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R1 # RTTI Base Class Descriptor at (a,b,c,d)
66814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R2 # RTTI Base Class Array
66914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R3 # RTTI Class Hierarchy Descriptor
67014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R4 # RTTI Complete Object Locator
67114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_S # local vftable
67214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_T # local vftable constructor closure
67314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_U # new[]
67414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Array_New: Out << "?_U"; break;
67514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_V # delete[]
67614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Array_Delete: Out << "?_V"; break;
67714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
678e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  case OO_Conditional: {
679e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DiagnosticsEngine &Diags = Context.getDiags();
680e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
681e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      "cannot mangle this conditional operator yet");
682e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Diags.Report(Loc, DiagID);
683e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    break;
684e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
68514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
68614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_None:
68714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case NUM_OVERLOADED_OPERATORS:
688b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Not an overloaded operator");
68914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
69014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
69114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
69214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
69314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <source name> ::= <identifier> @
694f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  std::string key = II->getNameStart();
695f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  BackRefMap::iterator Found;
696f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  if (UseNameBackReferences)
697f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    Found = NameBackReferences.find(key);
698f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  if (!UseNameBackReferences || Found == NameBackReferences.end()) {
69906e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    Out << II->getName() << '@';
700f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    if (UseNameBackReferences && NameBackReferences.size() < 10) {
7013f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      size_t Size = NameBackReferences.size();
702f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      NameBackReferences[key] = Size;
70306e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    }
70406e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  } else {
70506e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    Out << Found->second;
70606e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  }
70714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
70814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
709e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
710e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Context.mangleObjCMethodName(MD, Out);
711e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
712e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
713e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis// Find out how many function decls live above this one and return an integer
714e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis// suitable for use as the number in a numbered anonymous scope.
715e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis// TODO: Memoize.
716e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisstatic unsigned getLocalNestingLevel(const FunctionDecl *FD) {
717e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  const DeclContext *DC = FD->getParent();
718e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  int level = 1;
719e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
720e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  while (DC && !DC->isTranslationUnit()) {
721e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    if (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC)) level++;
722e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DC = DC->getParent();
723e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
724e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
725e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  return 2*level;
726e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
727e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
728e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleLocalName(const FunctionDecl *FD) {
729e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // <nested-name> ::= <numbered-anonymous-scope> ? <mangled-name>
730e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // <numbered-anonymous-scope> ::= ? <number>
731e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // Even though the name is rendered in reverse order (e.g.
732e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // A::B::C is rendered as C@B@A), VC numbers the scopes from outermost to
733e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // innermost. So a method bar in class C local to function foo gets mangled
734e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // as something like:
735e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // ?bar@C@?1??foo@@YAXXZ@QAEXXZ
736e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // This is more apparent when you have a type nested inside a method of a
737e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // type nested inside a function. A method baz in class D local to method
738e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // bar of class C local to function foo gets mangled as:
739e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // ?baz@D@?3??bar@C@?1??foo@@YAXXZ@QAEXXZ@QAEXXZ
740e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // This scheme is general enough to support GCC-style nested
741e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // functions. You could have a method baz of class C inside a function bar
742e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // inside a function foo, like so:
743e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // ?baz@C@?3??bar@?1??foo@@YAXXZ@YAXXZ@QAEXXZ
744e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  int NestLevel = getLocalNestingLevel(FD);
745e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Out << '?';
746e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleNumber(NestLevel);
747e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Out << '?';
748e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangle(FD, "?");
749e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
750e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
751e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleTemplateInstantiationName(
752e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                         const TemplateDecl *TD,
753e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                     const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs) {
7549fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <template-name> ::= <unscoped-template-name> <template-args>
7559fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //                 ::= <substitution>
7569fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Always start with the unqualified name.
7574285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov
7584285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  // Templates have their own context for back references.
7594285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  BackRefMap TemplateContext;
7604285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  NameBackReferences.swap(TemplateContext);
7614285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov
7629fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  mangleUnscopedTemplateName(TD);
763e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleTemplateArgs(TemplateArgs);
764f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
7654285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  NameBackReferences.swap(TemplateContext);
76614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
76714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
7689fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
7699fd2359ee3b140557b808e4b79bc73a3b9d62304Charles DavisMicrosoftCXXNameMangler::mangleUnscopedTemplateName(const TemplateDecl *TD) {
7709fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <unscoped-template-name> ::= ?$ <unqualified-name>
7719fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << "?$";
7729fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  mangleUnqualifiedName(TD);
7739fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
7749fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
7759fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
776e0deb035b3e2d07b41ea55db84b110abcb65b753Charles DavisMicrosoftCXXNameMangler::mangleIntegerLiteral(QualType T,
777e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                              const llvm::APSInt &Value) {
7789fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <integer-literal> ::= $0 <number>
7799fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << "$0";
7809fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Make sure booleans are encoded as 0/1.
7819fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (T->isBooleanType())
7829fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << (Value.getBoolValue() ? "0" : "A@");
7839fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  else
7849fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    mangleNumber(Value);
7859fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
7869fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
7879fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
788e0deb035b3e2d07b41ea55db84b110abcb65b753Charles DavisMicrosoftCXXNameMangler::mangleTemplateArgs(
789e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                     const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs) {
7909fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <template-args> ::= {<type> | <integer-literal>}+ @
791e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned NumTemplateArgs = TemplateArgs.size();
792e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  for (unsigned i = 0; i < NumTemplateArgs; ++i) {
793e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    const TemplateArgumentLoc &TAL = TemplateArgs[i];
794e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    const TemplateArgument &TA = TAL.getArgument();
7959fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    switch (TA.getKind()) {
796e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    case TemplateArgument::Null:
797e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      llvm_unreachable("Can't mangle null template arguments!");
7989fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    case TemplateArgument::Type:
799e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      mangleType(TA.getAsType(), TAL.getSourceRange());
8009fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      break;
8019fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    case TemplateArgument::Integral:
802855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      mangleIntegerLiteral(TA.getIntegralType(), TA.getAsIntegral());
8039fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      break;
8043facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis    case TemplateArgument::Expression: {
8053facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      // See if this is a constant expression.
8063facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      Expr *TAE = TA.getAsExpr();
8073facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      llvm::APSInt Value;
8083facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      if (TAE->isIntegerConstantExpr(Value, Context.getASTContext())) {
8093facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis        mangleIntegerLiteral(TAE->getType(), Value);
8103facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis        break;
8113facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      }
8123facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      /* fallthrough */
8133facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis    } default: {
814e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      // Issue a diagnostic.
815e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine &Diags = Context.getDiags();
816e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
817e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this %select{ERROR|ERROR|pointer/reference|ERROR|"
818e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "template|template pack expansion|expression|parameter pack}0 "
819e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "template argument yet");
820e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(TAL.getLocation(), DiagID)
821e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << TA.getKind()
822e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << TAL.getSourceRange();
8239fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
8249fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
8259fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
8269fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << '@';
8279fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
8289fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
82914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
83014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                               bool IsMember) {
83114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <cvr-qualifiers> ::= [E] [F] [I] <base-cvr-qualifiers>
83214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // 'E' means __ptr64 (32-bit only); 'F' means __unaligned (32/64-bit only);
83314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // 'I' means __restrict (32/64-bit).
83414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Note that the MSVC __restrict keyword isn't the same as the C99 restrict
83514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // keyword!
83614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <base-cvr-qualifiers> ::= A  # near
83714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= B  # near const
83814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= C  # near volatile
83914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= D  # near const volatile
84014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= E  # far (16-bit)
84114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= F  # far const (16-bit)
84214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= G  # far volatile (16-bit)
84314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= H  # far const volatile (16-bit)
84414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= I  # huge (16-bit)
84514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= J  # huge const (16-bit)
84614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= K  # huge volatile (16-bit)
84714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= L  # huge const volatile (16-bit)
84814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= M <basis> # based
84914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= N <basis> # based const
85014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= O <basis> # based volatile
85114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= P <basis> # based const volatile
85214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Q  # near member
85314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= R  # near const member
85414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= S  # near volatile member
85514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= T  # near const volatile member
85614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= U  # far member (16-bit)
85714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= V  # far const member (16-bit)
85814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= W  # far volatile member (16-bit)
85914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= X  # far const volatile member (16-bit)
86014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Y  # huge member (16-bit)
86114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Z  # huge const member (16-bit)
86214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 0  # huge volatile member (16-bit)
86314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 1  # huge const volatile member (16-bit)
86414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 2 <basis> # based member
86514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 3 <basis> # based const member
86614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 4 <basis> # based volatile member
86714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 5 <basis> # based const volatile member
86814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 6  # near function (pointers only)
86914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 7  # far function (pointers only)
87014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 8  # near method (pointers only)
87114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 9  # far method (pointers only)
87214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _A <basis> # based function (pointers only)
87314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _B <basis> # based function (far?) (pointers only)
87414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _C <basis> # based method (pointers only)
87514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _D <basis> # based method (far?) (pointers only)
87614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _E # block (Clang)
87714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <basis> ::= 0 # __based(void)
87814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 1 # __based(segment)?
87914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 2 <name> # __based(name)
88014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 3 # ?
88114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 4 # ?
88214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 5 # not really based
883a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  bool HasConst = Quals.hasConst(),
884a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov       HasVolatile = Quals.hasVolatile();
88514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!IsMember) {
886a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    if (HasConst && HasVolatile) {
887a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'D';
888a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    } else if (HasVolatile) {
889a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'C';
890a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    } else if (HasConst) {
891a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'B';
89214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
893a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'A';
89414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
89514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
896a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    if (HasConst && HasVolatile) {
897a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'T';
898a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    } else if (HasVolatile) {
899a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'S';
900a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    } else if (HasConst) {
901a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'R';
90214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
903a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      Out << 'Q';
90414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
90514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
90614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
90714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // FIXME: For now, just drop all extension qualifiers on the floor.
90814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
90914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
910a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanovvoid MicrosoftCXXNameMangler::manglePointerQualifiers(Qualifiers Quals) {
911a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  // <pointer-cvr-qualifiers> ::= P  # no qualifiers
912a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  //                          ::= Q  # const
913a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  //                          ::= R  # volatile
914a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  //                          ::= S  # const volatile
915a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  bool HasConst = Quals.hasConst(),
916a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov       HasVolatile = Quals.hasVolatile();
917a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  if (HasConst && HasVolatile) {
918a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    Out << 'S';
919a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  } else if (HasVolatile) {
920a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    Out << 'R';
921a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  } else if (HasConst) {
922a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    Out << 'Q';
923a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  } else {
924a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    Out << 'P';
925a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  }
926a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov}
927a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov
928a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanovvoid MicrosoftCXXNameMangler::mangleArgumentType(QualType T,
929a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov                                                 SourceRange Range) {
9303f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  void *TypePtr = getASTContext().getCanonicalType(T).getAsOpaquePtr();
931f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  ArgBackRefMap::iterator Found = TypeBackReferences.find(TypePtr);
9323f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
9333f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  if (Found == TypeBackReferences.end()) {
9343f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    size_t OutSizeBefore = Out.GetNumBytesInBuffer();
9353f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
936a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    mangleType(T, Range, false);
9373f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
9383f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    // See if it's worth creating a back reference.
9393f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    // Only types longer than 1 character are considered
9403f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    // and only 10 back references slots are available:
9413f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    bool LongerThanOneChar = (Out.GetNumBytesInBuffer() - OutSizeBefore > 1);
9423f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    if (LongerThanOneChar && TypeBackReferences.size() < 10) {
9433f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      size_t Size = TypeBackReferences.size();
9443f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      TypeBackReferences[TypePtr] = Size;
9453f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    }
9463f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  } else {
9473f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    Out << Found->second;
9483f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  }
9493f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov}
9503f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
951a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanovvoid MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range,
952a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov                                         bool MangleQualifiers) {
95314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Only operate on the canonical type!
95414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  T = getASTContext().getCanonicalType(T);
955a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov
95614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Qualifiers Quals = T.getLocalQualifiers();
957a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  // We have to mangle these now, while we still have enough information.
958a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  if (T->isAnyPointerType() || T->isMemberPointerType() ||
959a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov      T->isBlockPointerType()) {
960a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    manglePointerQualifiers(Quals);
961a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  } else if (Quals && MangleQualifiers) {
962a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    mangleQualifiers(Quals, false);
963a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  }
964a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov
965a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  SplitQualType split = T.split();
966a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  const Type *ty = split.Ty;
967a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov
968a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  // If we're mangling a qualified array type, push the qualifiers to
969a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  // the element type.
970a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  if (split.Quals && isa<ArrayType>(T)) {
971a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    ty = Context.getASTContext().getAsArrayType(T);
97214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
973a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov
974a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  switch (ty->getTypeClass()) {
97514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define ABSTRACT_TYPE(CLASS, PARENT)
97614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define NON_CANONICAL_TYPE(CLASS, PARENT) \
977e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  case Type::CLASS: \
978e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
979e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    return;
98014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define TYPE(CLASS, PARENT) \
981e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  case Type::CLASS: \
982a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    mangleType(cast<CLASS##Type>(ty), Range); \
983e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    break;
98414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/TypeNodes.def"
985e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef ABSTRACT_TYPE
986e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef NON_CANONICAL_TYPE
987e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef TYPE
98814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
98914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
99014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
991e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const BuiltinType *T,
992e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
99314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <type>         ::= <builtin-type>
99414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <builtin-type> ::= X  # void
99514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= C  # signed char
99614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= D  # char
99714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= E  # unsigned char
99814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= F  # short
99914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= G  # unsigned short (or wchar_t if it's not a builtin)
100014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= H  # int
100114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= I  # unsigned int
100214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= J  # long
100314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= K  # unsigned long
100414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     L  # <none>
100514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= M  # float
100614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= N  # double
100714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= O  # long double (__float80 is mangled differently)
100814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _J # long long, __int64
100914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _K # unsigned long long, __int64
101014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _L # __int128
101114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _M # unsigned __int128
101214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _N # bool
101314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     _O # <array in parameter>
101414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _T # __float80 (Intel)
101514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _W # wchar_t
101614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _Z # __float80 (Digital Mars)
101714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getKind()) {
101814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Void: Out << 'X'; break;
101914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::SChar: Out << 'C'; break;
102014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char_U: case BuiltinType::Char_S: Out << 'D'; break;
102114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UChar: Out << 'E'; break;
102214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Short: Out << 'F'; break;
102314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UShort: Out << 'G'; break;
102414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Int: Out << 'H'; break;
102514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UInt: Out << 'I'; break;
102614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Long: Out << 'J'; break;
102714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ULong: Out << 'K'; break;
102814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Float: Out << 'M'; break;
102914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Double: Out << 'N'; break;
103014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // TODO: Determine size and mangle accordingly
103114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::LongDouble: Out << 'O'; break;
103214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::LongLong: Out << "_J"; break;
103314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ULongLong: Out << "_K"; break;
103414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Int128: Out << "_L"; break;
103514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UInt128: Out << "_M"; break;
103614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Bool: Out << "_N"; break;
103714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::WChar_S:
103814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::WChar_U: Out << "_W"; break;
103914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1040e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define BUILTIN_TYPE(Id, SingletonId)
1041e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define PLACEHOLDER_TYPE(Id, SingletonId) \
1042e0a22d06888c13989b3f72db319f1d498bf69153John McCall  case BuiltinType::Id:
1043e0a22d06888c13989b3f72db319f1d498bf69153John McCall#include "clang/AST/BuiltinTypes.def"
104414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Dependent:
1045e0a22d06888c13989b3f72db319f1d498bf69153John McCall    llvm_unreachable("placeholder types shouldn't get to name mangling");
1046e0a22d06888c13989b3f72db319f1d498bf69153John McCall
104714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCId: Out << "PAUobjc_object@@"; break;
104814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCClass: Out << "PAUobjc_class@@"; break;
104914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCSel: Out << "PAUobjc_selector@@"; break;
105006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith
105106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  case BuiltinType::NullPtr: Out << "$$T"; break;
105214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
105314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char16:
105414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char32:
105506e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  case BuiltinType::Half: {
1056e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DiagnosticsEngine &Diags = Context.getDiags();
1057e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1058e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      "cannot mangle this built-in %0 type yet");
1059e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Diags.Report(Range.getBegin(), DiagID)
1060e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      << T->getName(Context.getASTContext().getPrintingPolicy())
1061e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      << Range;
106206e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    break;
1063e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
106414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
106514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
106614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
106714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>          ::= <function-type>
1068e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T,
1069e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
107014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Structors only appear in decls, so at this point we know it's not a
107114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // structor type.
10722612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall  // FIXME: This may not be lambda-friendly.
10732612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall  Out << "$$A6";
107414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(T, NULL, false, false);
107514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1076e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T,
1077e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
107814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("Can't mangle K&R function prototypes");
107914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
108014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
108114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const FunctionType *T,
108214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         const FunctionDecl *D,
108314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         bool IsStructor,
108414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         bool IsInstMethod) {
108514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <function-type> ::= <this-cvr-qualifiers> <calling-convention>
108614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     <return-type> <argument-list> <throw-spec>
108714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const FunctionProtoType *Proto = cast<FunctionProtoType>(T);
108814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
108914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If this is a C++ instance method, mangle the CVR qualifiers for the
109014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // this pointer.
109114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsInstMethod)
109214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(Qualifiers::fromCVRMask(Proto->getTypeQuals()), false);
109314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
109414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleCallingConvention(T, IsInstMethod);
109514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
109614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <return-type> ::= <type>
109714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //               ::= @ # structors (they have no declared return type)
109814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsStructor)
109914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '@';
110006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  else {
110106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    QualType Result = Proto->getResultType();
110206e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    const Type* RT = Result.getTypePtr();
1103dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov    if (!RT->isAnyPointerType() && !RT->isReferenceType()) {
1104dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov      if (Result.hasQualifiers() || !RT->isBuiltinType())
1105dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov        Out << '?';
1106dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov      if (!RT->isBuiltinType() && !Result.hasQualifiers()) {
1107dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov        // Lack of qualifiers for user types is mangled as 'A'.
1108dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov        Out << 'A';
1109dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov      }
1110dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov    }
1111dc6dabcabd36d61d1ad7f5069080b2aade79b1f0Timur Iskhodzhanov
1112e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // FIXME: Get the source range for the result type. Or, better yet,
1113e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // implement the unimplemented stuff so we don't need accurate source
1114e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // location info anymore :).
111506e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    mangleType(Result, SourceRange());
111606e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  }
111714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
111814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <argument-list> ::= X # void
111914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type>+ @
112014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type>* Z # varargs
112114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Proto->getNumArgs() == 0 && !Proto->isVariadic()) {
112214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'X';
112314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
112414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (D) {
11253a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // If we got a decl, use the type-as-written to make sure arrays
11263a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // get mangled right.  Note that we can't rely on the TSI
11273a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // existing if (for example) the parameter was synthesized.
112814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      for (FunctionDecl::param_const_iterator Parm = D->param_begin(),
11293a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall             ParmEnd = D->param_end(); Parm != ParmEnd; ++Parm) {
113006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith        TypeSourceInfo *TSI = (*Parm)->getTypeSourceInfo();
113106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith        QualType Type = TSI ? TSI->getType() : (*Parm)->getType();
1132a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov        mangleArgumentType(Type, (*Parm)->getSourceRange());
11333a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      }
113414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
11353f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      // Happens for function pointer type arguments for example.
113614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(),
113714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne           ArgEnd = Proto->arg_type_end();
113814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne           Arg != ArgEnd; ++Arg)
1139a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov        mangleArgumentType(*Arg, SourceRange());
114014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
114114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <builtin-type>      ::= Z  # ellipsis
114214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (Proto->isVariadic())
114314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'Z';
114414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    else
114514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << '@';
114614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
114714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
114814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleThrowSpecification(Proto);
114914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
115014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
115114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) {
115214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <function-class> ::= A # private: near
115314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= B # private: far
115414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= C # private: static near
115514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= D # private: static far
115614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= E # private: virtual near
115714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= F # private: virtual far
115814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= G # private: thunk near
115914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= H # private: thunk far
116014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= I # protected: near
116114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= J # protected: far
116214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= K # protected: static near
116314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= L # protected: static far
116414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= M # protected: virtual near
116514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= N # protected: virtual far
116614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= O # protected: thunk near
116714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= P # protected: thunk far
116814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Q # public: near
116914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= R # public: far
117014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= S # public: static near
117114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= T # public: static far
117214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= U # public: virtual near
117314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= V # public: virtual far
117414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= W # public: thunk near
117514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= X # public: thunk far
117614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Y # global near
117714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Z # global far
117814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
117914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    switch (MD->getAccess()) {
118014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      default:
118114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_private:
118214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
118314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'C';
118414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
118514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'E';
118614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
118714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'A';
118814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
118914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_protected:
119014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
119114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'K';
119214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
119314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'M';
119414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
119514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'I';
119614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
119714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_public:
119814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
119914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'S';
120014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
120114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'U';
120214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
120314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'Q';
120414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
120514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else
120614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Y';
120714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
120814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T,
120914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                      bool IsInstMethod) {
121014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <calling-convention> ::= A # __cdecl
121114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= B # __export __cdecl
121214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= C # __pascal
121314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= D # __export __pascal
121414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= E # __thiscall
121514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= F # __export __thiscall
121614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= G # __stdcall
121714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= H # __export __stdcall
121814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= I # __fastcall
121914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= J # __export __fastcall
122014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // The 'export' calling conventions are from a bygone era
122114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // (*cough*Win16*cough*) when functions were declared for export with
122214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // that keyword. (It didn't actually export them, it just made them so
122314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // that they could be in a DLL and somebody from another module could call
122414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // them.)
122514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  CallingConv CC = T->getCallConv();
12268f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  if (CC == CC_Default) {
12278f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    if (IsInstMethod) {
12288f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      const FunctionProtoType *FPT =
12292612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall        T->getCanonicalTypeUnqualified().castAs<FunctionProtoType>();
12308f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      bool isVariadic = FPT->isVariadic();
12318f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      CC = getASTContext().getDefaultCXXMethodCallConv(isVariadic);
12328f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    } else {
12338f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      CC = CC_C;
12348f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    }
12358f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  }
123614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (CC) {
1237414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov    default:
1238b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Unsupported CC for mangling");
123914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_Default:
124014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_C: Out << 'A'; break;
124114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86Pascal: Out << 'C'; break;
124214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86ThisCall: Out << 'E'; break;
124314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86StdCall: Out << 'G'; break;
124414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86FastCall: Out << 'I'; break;
124514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
124614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
124714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleThrowSpecification(
124814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                const FunctionProtoType *FT) {
124914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <throw-spec> ::= Z # throw(...) (default)
125014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //              ::= @ # throw() or __declspec/__attribute__((nothrow))
125114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //              ::= <type>+
125214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // NOTE: Since the Microsoft compiler ignores throw specifications, they are
125314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // all actually mangled as 'Z'. (They're ignored because their associated
125414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // functionality isn't implemented, and probably never will be.)
125514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'Z';
125614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
125714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1258e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const UnresolvedUsingType *T,
1259e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1260e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // Probably should be mangled as a template instantiation; need to see what
1261e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // VC does first.
1262e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1263e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1264e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this unresolved dependent type yet");
1265e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1266e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
126714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
126814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
126914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>        ::= <union-type> | <struct-type> | <class-type> | <enum-type>
127014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <union-type>  ::= T <name>
127114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <struct-type> ::= U <name>
127214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <class-type>  ::= V <name>
127314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <enum-type>   ::= W <size> <name>
1274e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const EnumType *T, SourceRange) {
1275efe97d67399a3fd616dd249743d1f848d6ad6636John McCall  mangleType(cast<TagType>(T));
127614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1277e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const RecordType *T, SourceRange) {
1278efe97d67399a3fd616dd249743d1f848d6ad6636John McCall  mangleType(cast<TagType>(T));
127914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
128014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const TagType *T) {
128114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getDecl()->getTagKind()) {
128214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Union:
128317d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      Out << 'T';
128417d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      break;
128517d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    case TTK_Struct:
128617d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    case TTK_Interface:
128717d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      Out << 'U';
128817d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos      break;
128917d35c36fbae764fcd68fa8b31624078a033aabcJoao Matos    case TTK_Class:
129014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'V';
129114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
129214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Enum:
129314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'W';
129414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << getASTContext().getTypeSizeInChars(
129514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                cast<EnumDecl>(T->getDecl())->getIntegerType()).getQuantity();
129614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
129714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
129814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(T->getDecl());
129914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
130014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
130114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>       ::= <array-type>
1302a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov// <array-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers>
1303a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov//                  [Y <dimension-count> <dimension>+]
1304a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov//                  <element-type> # as global
130514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//              ::= Q <cvr-qualifiers> [Y <dimension-count> <dimension>+]
1306a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov//                  <element-type> # as param
130714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// It's supposed to be the other way around, but for some strange reason, it
130814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// isn't. Today this behavior is retained for the sole purpose of backwards
130914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// compatibility.
131014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ArrayType *T, bool IsGlobal) {
131114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // This isn't a recursive mangling, so now we have to do it all in this
131214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // one call.
1313a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  if (IsGlobal) {
1314a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    manglePointerQualifiers(T->getElementType().getQualifiers());
1315a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  } else {
131614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Q';
1317a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov  }
131814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleExtraDimensions(T->getElementType());
131914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1320e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T,
1321e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
1322efe97d67399a3fd616dd249743d1f848d6ad6636John McCall  mangleType(cast<ArrayType>(T), false);
132314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1324e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const VariableArrayType *T,
1325e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
1326efe97d67399a3fd616dd249743d1f848d6ad6636John McCall  mangleType(cast<ArrayType>(T), false);
132714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1328e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DependentSizedArrayType *T,
1329e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
1330efe97d67399a3fd616dd249743d1f848d6ad6636John McCall  mangleType(cast<ArrayType>(T), false);
133114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1332e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const IncompleteArrayType *T,
1333e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
1334efe97d67399a3fd616dd249743d1f848d6ad6636John McCall  mangleType(cast<ArrayType>(T), false);
133514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
133614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleExtraDimensions(QualType ElementTy) {
13375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<llvm::APInt, 3> Dimensions;
133814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  for (;;) {
1339c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    if (const ConstantArrayType *CAT =
1340c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith          getASTContext().getAsConstantArrayType(ElementTy)) {
134114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Dimensions.push_back(CAT->getSize());
134214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      ElementTy = CAT->getElementType();
134314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isVariableArrayType()) {
1344e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      const VariableArrayType *VAT =
1345e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        getASTContext().getAsVariableArrayType(ElementTy);
1346e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine &Diags = Context.getDiags();
1347e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1348e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this variable-length array yet");
1349e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(VAT->getSizeExpr()->getExprLoc(), DiagID)
1350e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << VAT->getBracketsRange();
1351e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      return;
135214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isDependentSizedArrayType()) {
135314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // The dependent expression has to be folded into a constant (TODO).
1354e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      const DependentSizedArrayType *DSAT =
1355e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        getASTContext().getAsDependentSizedArrayType(ElementTy);
1356e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine &Diags = Context.getDiags();
1357e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1358e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this dependent-length array yet");
1359e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(DSAT->getSizeExpr()->getExprLoc(), DiagID)
1360e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << DSAT->getBracketsRange();
1361e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      return;
136214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isIncompleteArrayType()) continue;
136314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    else break;
136414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
136514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleQualifiers(ElementTy.getQualifiers(), false);
136614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If there are any additional dimensions, mangle them now.
136714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Dimensions.size() > 0) {
136814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Y';
136914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <dimension-count> ::= <number> # number of extra dimensions
137014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleNumber(Dimensions.size());
137114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    for (unsigned Dim = 0; Dim < Dimensions.size(); ++Dim) {
137214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      mangleNumber(Dimensions[Dim].getLimitedValue());
137314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
137414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
1375e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(ElementTy.getLocalUnqualifiedType(), SourceRange());
137614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
137714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
137814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>                   ::= <pointer-to-member-type>
137914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <pointer-to-member-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers>
138014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                                                          <class name> <type>
1381e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T,
1382e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
138314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeType = T->getPointeeType();
1384c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith  if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
138514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '8';
1386c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleName(T->getClass()->castAs<RecordType>()->getDecl());
138714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(FPT, NULL, false, true);
138814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
138914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(PointeeType.getQualifiers(), true);
1390c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleName(T->getClass()->castAs<RecordType>()->getDecl());
1391e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(PointeeType.getLocalUnqualifiedType(), Range);
139214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
139314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
139414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1395e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T,
1396e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1397e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1398e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1399e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this template type parameter type yet");
1400e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1401e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
140214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
140314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1404c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorvoid MicrosoftCXXNameMangler::mangleType(
1405e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                       const SubstTemplateTypeParmPackType *T,
1406e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                       SourceRange Range) {
1407e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1408e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1409e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this substituted parameter pack yet");
1410e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1411e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1412c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
1413c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
141414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type> ::= <pointer-type>
141514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <pointer-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> <type>
1416e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const PointerType *T,
1417e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
141814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeTy = T->getPointeeType();
141914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (PointeeTy->isArrayType()) {
142014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Pointers to arrays are mangled like arrays.
1421c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleExtraDimensions(PointeeTy);
1422c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith  } else if (const FunctionType *FT = PointeeTy->getAs<FunctionType>()) {
142314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Function pointers are special.
142414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '6';
1425c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleType(FT, NULL, false, false);
142614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
1427a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    mangleQualifiers(PointeeTy.getQualifiers(), false);
1428a04ca5c4e091f567230fc95c6b2715576ad0893bTimur Iskhodzhanov    mangleType(PointeeTy, Range, false);
142914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
143014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1431e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,
1432e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
143314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Object pointers never have qualifiers.
143414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'A';
1435e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(T->getPointeeType(), Range);
143614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
143714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
143814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type> ::= <reference-type>
143914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <reference-type> ::= A <cvr-qualifiers> <type>
1440e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,
1441e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
144214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'A';
144314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeTy = T->getPointeeType();
144414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!PointeeTy.hasQualifiers())
144514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Lack of qualifiers is mangled as 'A'.
144614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'A';
1447e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(PointeeTy, Range);
1448e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1449e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
145006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith// <type> ::= <r-value-reference-type>
145106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith// <r-value-reference-type> ::= $$Q <cvr-qualifiers> <type>
1452e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,
1453e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
145406e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  Out << "$$Q";
145506e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  QualType PointeeTy = T->getPointeeType();
145606e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  if (!PointeeTy.hasQualifiers())
145706e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    // Lack of qualifiers is mangled as 'A'.
145806e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    Out << 'A';
145906e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  mangleType(PointeeTy, Range);
1460e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1461e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1462e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ComplexType *T,
1463e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1464e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1465e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1466e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this complex number type yet");
1467e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1468e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1469e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1470e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1471e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const VectorType *T,
1472e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1473e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1474e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1475e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this vector type yet");
1476e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1477e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1478e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1479e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ExtVectorType *T,
1480e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1481e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1482e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1483e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this extended vector type yet");
1484e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1485e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1486e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1487e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DependentSizedExtVectorType *T,
1488e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1489e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1490e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1491e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this dependent-sized extended vector type yet");
1492e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1493e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1494e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1495e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1496e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ObjCInterfaceType *T,
1497e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
149814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // ObjC interfaces have structs underlying them.
149914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'U';
150014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(T->getDecl());
150114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
150214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1503e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T,
1504e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
150514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We don't allow overloading by different protocol qualification,
150614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // so mangling them isn't necessary.
1507e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(T->getBaseType(), Range);
150814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
150914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1510e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T,
1511e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
151214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << "_E";
15132612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall
15142612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall  QualType pointee = T->getPointeeType();
15152612e9f1d0a356a303097bea9faf53fdb213c50cJohn McCall  mangleType(pointee->castAs<FunctionProtoType>(), NULL, false, false);
151614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
151714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1518e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const InjectedClassNameType *T,
1519e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1520e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1521e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1522e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this injected class name type yet");
1523e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1524e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
152514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
152614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1527e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TemplateSpecializationType *T,
1528e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1529e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1530e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1531e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this template specialization type yet");
1532e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1533e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
153414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
153514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1536e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DependentNameType *T,
1537e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1538e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1539e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1540e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this dependent name type yet");
1541e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1542e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
154314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
154414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
154514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(
1546e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                 const DependentTemplateSpecializationType *T,
1547e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                 SourceRange Range) {
1548e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1549e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1550e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this dependent template specialization type yet");
1551e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1552e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1553e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1554e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1555e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const PackExpansionType *T,
1556e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1557e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1558e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1559e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this pack expansion yet");
1560e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1561e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1562e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1563e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1564e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TypeOfType *T,
1565e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1566e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1567e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1568e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this typeof(type) yet");
1569e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1570e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1571e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1572e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1573e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TypeOfExprType *T,
1574e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1575e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1576e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1577e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this typeof(expression) yet");
1578e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1579e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1580e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1581e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1582e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DecltypeType *T,
1583e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1584e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1585e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1586e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this decltype() yet");
1587e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1588e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1589e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1590e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1591e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const UnaryTransformType *T,
1592e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1593e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1594e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1595e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this unary transform type yet");
1596e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1597e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1598e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1599e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1600e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const AutoType *T, SourceRange Range) {
1601e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1602e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1603e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this 'auto' type yet");
1604e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1605e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1606e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1607e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1608e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const AtomicType *T,
1609e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1610e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1611e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1612e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this C11 atomic type yet");
1613e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1614e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1615b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman}
1616b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
161714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleName(const NamedDecl *D,
16185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                        raw_ostream &Out) {
161914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) &&
162014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne         "Invalid mangleName() call, argument is not a variable or function!");
162114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  assert(!isa<CXXConstructorDecl>(D) && !isa<CXXDestructorDecl>(D) &&
162214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne         "Invalid mangleName() call on 'structor decl!");
162314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
162414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
162514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                 getASTContext().getSourceManager(),
162614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                 "Mangling declaration");
162714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1628c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola  MicrosoftCXXNameMangler Mangler(*this, Out);
162914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return Mangler.mangle(D);
163014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
163114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleThunk(const CXXMethodDecl *MD,
163214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         const ThunkInfo &Thunk,
16335f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         raw_ostream &) {
1634e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1635e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle thunk for this method yet");
1636e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(MD->getLocation(), DiagID);
163714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
163814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *DD,
163914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                CXXDtorType Type,
164014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                const ThisAdjustment &,
16415f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                raw_ostream &) {
1642e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1643e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle thunk for this destructor yet");
1644e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(DD->getLocation(), DiagID);
164514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
164614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXVTable(const CXXRecordDecl *RD,
1647e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                             raw_ostream &Out) {
164828e862a4fbb9ed4060d1db25d45b1ed7a42f1b75Kaelyn Uhrain  // <mangled-name> ::= ? <operator-name> <class-name> <storage-class>
1649e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  //                      <cvr-qualifiers> [<name>] @
1650e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // <operator-name> ::= _7 # vftable
1651e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  //                 ::= _8 # vbtable
1652e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // NOTE: <cvr-qualifiers> here is always 'B' (const). <storage-class>
1653e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // is always '6' for vftables and '7' for vbtables. (The difference is
1654e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // beyond me.)
1655e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // TODO: vbtables.
1656e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  MicrosoftCXXNameMangler Mangler(*this, Out);
1657e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.getStream() << "\01??_7";
1658e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.mangleName(RD);
1659e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.getStream() << "6B";
1660e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // TODO: If the class has more than one vtable, mangle in the class it came
1661e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // from.
1662e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.getStream() << '@';
166314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
166414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXVTT(const CXXRecordDecl *RD,
16655f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                          raw_ostream &) {
166614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("The MS C++ ABI does not have virtual table tables!");
166714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
166814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXCtorVTable(const CXXRecordDecl *RD,
166914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                 int64_t Offset,
167014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                 const CXXRecordDecl *Type,
16715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                 raw_ostream &) {
167214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("The MS C++ ABI does not have constructor vtables!");
167314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
167414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXRTTI(QualType T,
16755f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                           raw_ostream &) {
1676e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // FIXME: Give a location...
1677e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1678e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle RTTI descriptors for type %0 yet");
1679e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(DiagID)
1680e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << T.getBaseTypeIdentifier();
168114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
168214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXRTTIName(QualType T,
16835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                               raw_ostream &) {
1684e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // FIXME: Give a location...
1685e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1686e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle the name of type %0 into RTTI descriptors yet");
1687e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(DiagID)
1688e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << T.getBaseTypeIdentifier();
168914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
169014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXCtor(const CXXConstructorDecl *D,
169114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                           CXXCtorType Type,
169250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer                                           raw_ostream & Out) {
169350118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  MicrosoftCXXNameMangler mangler(*this, Out);
169450118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  mangler.mangle(D);
169514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
169614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXDtor(const CXXDestructorDecl *D,
169714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                           CXXDtorType Type,
169850118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer                                           raw_ostream & Out) {
169950118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  MicrosoftCXXNameMangler mangler(*this, Out);
170050118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  mangler.mangle(D);
170114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1702e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftMangleContext::mangleReferenceTemporary(const clang::VarDecl *VD,
17035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                      raw_ostream &) {
1704e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1705e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this reference temporary yet");
1706e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(VD->getLocation(), DiagID);
170714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
170814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
170914110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *clang::createMicrosoftMangleContext(ASTContext &Context,
1710d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                                                   DiagnosticsEngine &Diags) {
171114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return new MicrosoftMangleContext(Context, Diags);
171214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1713