MicrosoftMangle.cpp revision f5e0b225b4d8027edab993ad4ac87510fcd6f991
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
36f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  typedef std::map<std::string, unsigned> BackRefMap;
37f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  BackRefMap NameBackReferences;
38f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  bool UseNameBackReferences;
39f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
40f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  typedef llvm::DenseMap<void*, unsigned> ArgBackRefMap;
41f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  ArgBackRefMap TypeBackReferences;
4206e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith
4314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  ASTContext &getASTContext() const { return Context.getASTContext(); }
4414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
4514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournepublic:
465f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  MicrosoftCXXNameMangler(MangleContext &C, raw_ostream &Out_)
47f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  : Context(C), Out(Out_), UseNameBackReferences(true) { }
4814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
49e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  raw_ostream &getStream() const { return Out; }
50e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
51e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangle(const NamedDecl *D, StringRef Prefix = "\01?");
5214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleName(const NamedDecl *ND);
5314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleFunctionEncoding(const FunctionDecl *FD);
5414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleVariableEncoding(const VarDecl *VD);
5514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleNumber(int64_t Number);
569fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleNumber(const llvm::APSInt &Value);
57e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangleType(QualType T, SourceRange Range);
5814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
5914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneprivate:
60f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  void disableBackReferences() { UseNameBackReferences = false; }
6114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleUnqualifiedName(const NamedDecl *ND) {
6214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleUnqualifiedName(ND, ND->getDeclName());
6314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
6414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name);
6514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleSourceName(const IdentifierInfo *II);
6614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void manglePostfix(const DeclContext *DC, bool NoFunction=false);
67e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangleOperatorName(OverloadedOperatorKind OO, SourceLocation Loc);
6814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleQualifiers(Qualifiers Quals, bool IsMember);
6914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
709fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleUnscopedTemplateName(const TemplateDecl *ND);
719fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleTemplateInstantiationName(const TemplateDecl *TD,
72e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                      const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs);
7314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleObjCMethodName(const ObjCMethodDecl *MD);
74e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangleLocalName(const FunctionDecl *FD);
7514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
763f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  void mangleTypeRepeated(QualType T, SourceRange Range);
773f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
7814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Declare manglers for every type class.
7914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define ABSTRACT_TYPE(CLASS, PARENT)
8014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define NON_CANONICAL_TYPE(CLASS, PARENT)
81e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T, \
82e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                            SourceRange Range);
8314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/TypeNodes.def"
84e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef ABSTRACT_TYPE
85e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef NON_CANONICAL_TYPE
86e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef TYPE
8714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
8814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const TagType*);
8914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const FunctionType *T, const FunctionDecl *D,
9014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                  bool IsStructor, bool IsInstMethod);
9114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const ArrayType *T, bool IsGlobal);
9214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleExtraDimensions(QualType T);
9314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleFunctionClass(const FunctionDecl *FD);
9414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleCallingConvention(const FunctionType *T, bool IsInstMethod = false);
959fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleIntegerLiteral(QualType T, const llvm::APSInt &Number);
9614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleThrowSpecification(const FunctionProtoType *T);
9714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
98e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  void mangleTemplateArgs(
99e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                      const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs);
1009fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
10114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne};
10214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
10314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// MicrosoftMangleContext - Overrides the default MangleContext for the
10414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// Microsoft Visual C++ ABI.
10514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneclass MicrosoftMangleContext : public MangleContext {
10614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournepublic:
10714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  MicrosoftMangleContext(ASTContext &Context,
108d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                   DiagnosticsEngine &Diags) : MangleContext(Context, Diags) { }
10914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual bool shouldMangleDeclName(const NamedDecl *D);
1105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleName(const NamedDecl *D, raw_ostream &Out);
11114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleThunk(const CXXMethodDecl *MD,
11214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                           const ThunkInfo &Thunk,
1135f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                           raw_ostream &);
11414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
11514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                  const ThisAdjustment &ThisAdjustment,
1165f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                  raw_ostream &);
11714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXVTable(const CXXRecordDecl *RD,
1185f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                               raw_ostream &);
11914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXVTT(const CXXRecordDecl *RD,
1205f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                            raw_ostream &);
12114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset,
12214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                   const CXXRecordDecl *Type,
1235f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                   raw_ostream &);
1245f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleCXXRTTI(QualType T, raw_ostream &);
1255f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleCXXRTTIName(QualType T, raw_ostream &);
12614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
1275f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &);
12814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
1295f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &);
13014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleReferenceTemporary(const clang::VarDecl *,
1315f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                        raw_ostream &);
13214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne};
13314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
13414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
13514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
13614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournestatic bool isInCLinkageSpecification(const Decl *D) {
13714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  D = D->getCanonicalDecl();
13814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  for (const DeclContext *DC = D->getDeclContext();
13914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne       !DC->isTranslationUnit(); DC = DC->getParent()) {
14014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))
14114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      return Linkage->getLanguage() == LinkageSpecDecl::lang_c;
14214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
14314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
14414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return false;
14514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
14614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
14714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournebool MicrosoftMangleContext::shouldMangleDeclName(const NamedDecl *D) {
14814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // In C, functions with no attributes never need to be mangled. Fastpath them.
1494e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getASTContext().getLangOpts().CPlusPlus && !D->hasAttrs())
15014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
15114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
15214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Any decl can be declared with __asm("foo") on it, and this takes precedence
15314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // over all other naming in the .o file.
15414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (D->hasAttr<AsmLabelAttr>())
15514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return true;
15614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
15714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Clang's "overloadable" attribute extension to C/C++ implies name mangling
15814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // (always) as does passing a C++ member function and a function
15914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // whose name is not a simple identifier.
16014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
16114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (FD && (FD->hasAttr<OverloadableAttr>() || isa<CXXMethodDecl>(FD) ||
16214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne             !FD->getDeclName().isIdentifier()))
16314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return true;
16414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
16514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Otherwise, no mangling is done outside C++ mode.
1664e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getASTContext().getLangOpts().CPlusPlus)
16714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
16814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
16914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Variables at global scope with internal linkage are not mangled.
17014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!FD) {
17114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    const DeclContext *DC = D->getDeclContext();
17214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (DC->isTranslationUnit() && D->getLinkage() == InternalLinkage)
17314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      return false;
17414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
17514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
17614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // C functions and "main" are not mangled.
17714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if ((FD && FD->isMain()) || isInCLinkageSpecification(D))
17814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
17914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
18014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return true;
18114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
18214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
18314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangle(const NamedDecl *D,
1845f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                     StringRef Prefix) {
18514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // MSVC doesn't mangle C++ names the same way it mangles extern "C" names.
18614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Therefore it's really important that we don't decorate the
187e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // name with leading underscores or leading/trailing at signs. So, by
188e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // default, we emit an asm marker at the start so we get the name right.
189e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // Callers can override this with a custom prefix.
19014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
19114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Any decl can be declared with __asm("foo") on it, and this takes precedence
19214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // over all other naming in the .o file.
19314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
19414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // If we have an asm name, then we use it as the mangling.
195e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Out << '\01' << ALA->getLabel();
19614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
19714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
19814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
19914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <mangled-name> ::= ? <name> <type-encoding>
20014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << Prefix;
20114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(D);
20214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
20314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleFunctionEncoding(FD);
20414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (const VarDecl *VD = dyn_cast<VarDecl>(D))
20514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleVariableEncoding(VD);
206e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  else {
207e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // TODO: Fields? Can MSVC even mangle them?
208e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // Issue a diagnostic for now.
209e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DiagnosticsEngine &Diags = Context.getDiags();
210e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
211e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      "cannot mangle this declaration yet");
212e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Diags.Report(D->getLocation(), DiagID)
213e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      << D->getSourceRange();
214e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
21514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
21614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
21714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) {
21814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <type-encoding> ::= <function-class> <function-type>
21914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
22014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Don't mangle in the type if this isn't a decl we should typically mangle.
22114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!Context.shouldMangleDeclName(FD))
22214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
22314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
22414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We should never ever see a FunctionNoProtoType at this point.
22514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We don't even know how to mangle their types anyway :).
226bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smith  const FunctionProtoType *FT = FD->getType()->castAs<FunctionProtoType>();
22714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
22814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  bool InStructor = false, InInstMethod = false;
22914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
23014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (MD) {
23114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (MD->isInstance())
23214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      InInstMethod = true;
23314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD))
23414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      InStructor = true;
23514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
23614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
23714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // First, the function class.
23814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleFunctionClass(FD);
23914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
24014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(FT, FD, InStructor, InInstMethod);
24114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
24214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
24314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
24414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <type-encoding> ::= <storage-class> <variable-type>
24514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <storage-class> ::= 0  # private static member
24614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 1  # protected static member
24714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 2  # public static member
24814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 3  # global
24914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 4  # static local
25014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
25114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // The first character in the encoding (after the name) is the storage class.
25214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (VD->isStaticDataMember()) {
25314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // If it's a static member, it also encodes the access level.
25414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    switch (VD->getAccess()) {
25514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      default:
25614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_private: Out << '0'; break;
25714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_protected: Out << '1'; break;
25814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_public: Out << '2'; break;
25914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
26014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
26114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (!VD->isStaticLocal())
26214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '3';
26314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else
26414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '4';
26514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Now mangle the type.
26614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <variable-type> ::= <type> <cvr-qualifiers>
26714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type> A # pointers, references, arrays
26814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Pointers and references are odd. The type of 'int * const foo;' gets
26914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // mangled as 'QAHA' instead of 'PAHB', for example.
270e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  TypeLoc TL = VD->getTypeSourceInfo()->getTypeLoc();
271e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  QualType Ty = TL.getType();
27214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Ty->isPointerType() || Ty->isReferenceType()) {
273e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(Ty, TL.getSourceRange());
27414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'A';
275c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith  } else if (const ArrayType *AT = getASTContext().getAsArrayType(Ty)) {
27614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Global arrays are funny, too.
277c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleType(AT, true);
27814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'A';
27914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
280e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(Ty.getLocalUnqualifiedType(), TL.getSourceRange());
28114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(Ty.getLocalQualifiers(), false);
28214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
28314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
28414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
28514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleName(const NamedDecl *ND) {
28614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <name> ::= <unscoped-name> {[<named-scope>]+ | [<nested-name>]}? @
28714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const DeclContext *DC = ND->getDeclContext();
28814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
28914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Always start with the unqualified name.
29014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleUnqualifiedName(ND);
29114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
29214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If this is an extern variable declared locally, the relevant DeclContext
29314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // is that of the containing namespace, or the translation unit.
29414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (isa<FunctionDecl>(DC) && ND->hasLinkage())
29514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    while (!DC->isNamespace() && !DC->isTranslationUnit())
29614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      DC = DC->getParent();
29714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
29814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  manglePostfix(DC);
29914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
30014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Terminate the whole name with an '@'.
30114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << '@';
30214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
30314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
30414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleNumber(int64_t Number) {
3059fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <number> ::= [?] <decimal digit> # 1 <= Number <= 10
3069fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //          ::= [?] <hex digit>+ @ # 0 or > 9; A = 0, B = 1, etc...
3079fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //          ::= [?] @ # 0 (alternate mangling, not emitted by VC)
30814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Number < 0) {
30914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '?';
31014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Number = -Number;
31114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
312e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // There's a special shorter mangling for 0, but Microsoft
313e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // chose not to use it. Instead, 0 gets mangled as "A@". Oh well...
3149fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (Number >= 1 && Number <= 10)
31514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << Number-1;
3169fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  else {
31714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // We have to build up the encoding in reverse order, so it will come
31814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // out right when we write it out.
31914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char Encoding[16];
32014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char *EndPtr = Encoding+sizeof(Encoding);
32114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char *CurPtr = EndPtr;
3229fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    do {
32314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      *--CurPtr = 'A' + (Number % 16);
32414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Number /= 16;
3259fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    } while (Number);
32614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out.write(CurPtr, EndPtr-CurPtr);
32714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '@';
32814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
32914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
33014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
3319fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid MicrosoftCXXNameMangler::mangleNumber(const llvm::APSInt &Value) {
3329fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (Value.isSigned() && Value.isNegative()) {
3339fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << '?';
3349fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    mangleNumber(llvm::APSInt(Value.abs()));
3359fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return;
3369fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
337c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  llvm::APSInt Temp(Value);
338c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  if (Value.uge(1) && Value.ule(10)) {
339c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis    --Temp;
340c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis    Temp.print(Out, false);
341c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  } else {
3429fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    // We have to build up the encoding in reverse order, so it will come
3439fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    // out right when we write it out.
3449fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char Encoding[64];
3459fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char *EndPtr = Encoding+sizeof(Encoding);
3469fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char *CurPtr = EndPtr;
347104e51f30fdf42b1f594a1be20de1c8673088c50Charles Davis    llvm::APSInt NibbleMask(Value.getBitWidth(), Value.isUnsigned());
348f17523b6d3d9ef1dbcb64b63d9bada7bdae194a7Lang Hames    NibbleMask = 0xf;
3499fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    for (int i = 0, e = Value.getActiveBits() / 4; i != e; ++i) {
350c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis      *--CurPtr = 'A' + Temp.And(NibbleMask).getLimitedValue(0xf);
351c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis      Temp = Temp.lshr(4);
352e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    }
3539fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out.write(CurPtr, EndPtr-CurPtr);
3549fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << '@';
3559fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3569fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
3579fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
3589fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisstatic const TemplateDecl *
359e0deb035b3e2d07b41ea55db84b110abcb65b753Charles DavisisTemplate(const NamedDecl *ND,
360e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis           SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs) {
3619fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a function template.
3629fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)){
3639fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    if (const TemplateDecl *TD = FD->getPrimaryTemplate()) {
364e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      if (FD->getTemplateSpecializationArgsAsWritten()) {
365e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        const ASTTemplateArgumentListInfo *ArgList =
366e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis          FD->getTemplateSpecializationArgsAsWritten();
367e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgs.append(ArgList->getTemplateArgs(),
368e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                            ArgList->getTemplateArgs() +
369e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                              ArgList->NumTemplateArgs);
370e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      } else {
371e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        const TemplateArgumentList *ArgList =
372e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis          FD->getTemplateSpecializationArgs();
373e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgumentListInfo LI;
374e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        for (unsigned i = 0, e = ArgList->size(); i != e; ++i)
375e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis          TemplateArgs.push_back(TemplateArgumentLoc(ArgList->get(i),
376e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                     FD->getTypeSourceInfo()));
377e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      }
3789fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      return TD;
3799fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
3809fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3819fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
3829fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a class template.
3839fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const ClassTemplateSpecializationDecl *Spec =
3849fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
385e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    TypeSourceInfo *TSI = Spec->getTypeAsWritten();
386e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    if (TSI) {
387e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      TemplateSpecializationTypeLoc &TSTL =
388e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        cast<TemplateSpecializationTypeLoc>(TSI->getTypeLoc());
389e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      TemplateArgumentListInfo LI(TSTL.getLAngleLoc(), TSTL.getRAngleLoc());
390e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      for (unsigned i = 0, e = TSTL.getNumArgs(); i != e; ++i)
391e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgs.push_back(TSTL.getArgLoc(i));
392e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    } else {
393e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      TemplateArgumentListInfo LI;
394e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      const TemplateArgumentList &ArgList =
395e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        Spec->getTemplateArgs();
396e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      for (unsigned i = 0, e = ArgList.size(); i != e; ++i)
397e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        TemplateArgs.push_back(TemplateArgumentLoc(ArgList[i],
398e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                   TemplateArgumentLocInfo()));
399e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    }
4009fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return Spec->getSpecializedTemplate();
4019fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
4029fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
4039fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  return 0;
4049fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
4059fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
40614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid
40714110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
40814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                               DeclarationName Name) {
40914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <unqualified-name> ::= <operator-name>
41014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ::= <ctor-dtor-name>
41114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ::= <source-name>
4129fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //                     ::= <template-name>
413e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  SmallVector<TemplateArgumentLoc, 2> TemplateArgs;
4149fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a template.
4159fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
416f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // We have a template.
417f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // Here comes the tricky thing: if we need to mangle something like
418f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   void foo(A::X<Y>, B::X<Y>),
419f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // the X<Y> part is aliased. However, if you need to mangle
420f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   void foo(A::X<A::Y>, A::X<B::Y>),
421f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // the A::X<> part is not aliased.
422f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // That said, from the mangler's perspective we have a structure like this:
423f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   namespace[s] -> type[ -> template-parameters]
424f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // but from the Clang perspective we have
425f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //   type [ -> template-parameters]
426f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    //      \-> namespace[s]
427f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // What we do is we create a new mangler, mangle the same type (without
428f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // a namespace suffix) using the extra mangler with back references
429f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // disabled (to avoid infinite recursion) and then use the mangled type
430f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    // name as a key to check the mangling of different types for aliasing.
431f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
432f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    std::string BackReferenceKey;
433f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    BackRefMap::iterator Found;
434f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    if (UseNameBackReferences) {
435f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      llvm::raw_string_ostream Stream(BackReferenceKey);
436f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      MicrosoftCXXNameMangler Extra(Context, Stream);
437f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Extra.disableBackReferences();
438f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Extra.mangleUnqualifiedName(ND, Name);
439f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Stream.flush();
440f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
441f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Found = NameBackReferences.find(BackReferenceKey);
442f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    }
443f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    if (!UseNameBackReferences || Found == NameBackReferences.end()) {
444f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      mangleTemplateInstantiationName(TD, TemplateArgs);
445f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      if (UseNameBackReferences && NameBackReferences.size() < 10) {
446f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov        size_t Size = NameBackReferences.size();
447f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov        NameBackReferences[BackReferenceKey] = Size;
448f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      }
449f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    } else {
450f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      Out << Found->second;
451f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    }
4529fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return;
4539fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
4549fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
45514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (Name.getNameKind()) {
45614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::Identifier: {
45714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
45814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        mangleSourceName(II);
45914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
46014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
46114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
46214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // Otherwise, an anonymous entity.  We must have a declaration.
46314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      assert(ND && "mangling empty name without declaration");
46414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
46514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
46614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (NS->isAnonymousNamespace()) {
46714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << "?A";
46814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          break;
46914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        }
47014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
47114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
47214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // We must have an anonymous struct.
47314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      const TagDecl *TD = cast<TagDecl>(ND);
474162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if (const TypedefNameDecl *D = TD->getTypedefNameForAnonDecl()) {
47514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        assert(TD->getDeclContext() == D->getDeclContext() &&
47614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne               "Typedef should not be in another decl context!");
47714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        assert(D->getDeclName().getAsIdentifierInfo() &&
47814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne               "Typedef was not named!");
47914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        mangleSourceName(D->getDeclName().getAsIdentifierInfo());
48014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
48114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
48214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
48314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // When VC encounters an anonymous type with no tag and no typedef,
48414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // it literally emits '<unnamed-tag>'.
48514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << "<unnamed-tag>";
48614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
48714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
48814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
48914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCZeroArgSelector:
49014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCOneArgSelector:
49114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCMultiArgSelector:
492b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Can't mangle Objective-C selector names here!");
49314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
49414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXConstructorName:
49550118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      Out << "?0";
49650118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      break;
49714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
49814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXDestructorName:
49950118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      Out << "?1";
50050118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      break;
50114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
50214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXConversionFunctionName:
50314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // <operator-name> ::= ?B # (cast)
50414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // The target type is encoded as the return type.
50514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << "?B";
50614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
50714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
50814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXOperatorName:
509e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      mangleOperatorName(Name.getCXXOverloadedOperator(), ND->getLocation());
51014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
51114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
512e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    case DeclarationName::CXXLiteralOperatorName: {
51314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // FIXME: Was this added in VS2010? Does MS even know how to mangle this?
514e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine Diags = Context.getDiags();
515e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
516e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this literal operator yet");
517e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(ND->getLocation(), DiagID);
518e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      break;
519e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    }
52014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
52114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXUsingDirective:
522b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Can't mangle a using directive name!");
52314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
52414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
52514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
52614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::manglePostfix(const DeclContext *DC,
52714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                            bool NoFunction) {
52814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <postfix> ::= <unqualified-name> [<postfix>]
52914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //           ::= <substitution> [<postfix>]
53014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
53114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!DC) return;
53214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
53314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  while (isa<LinkageSpecDecl>(DC))
53414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    DC = DC->getParent();
53514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
53614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (DC->isTranslationUnit())
53714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
53814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
53914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
540c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola    Context.mangleBlock(BD, Out);
541c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola    Out << '@';
54214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return manglePostfix(DC->getParent(), NoFunction);
54314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
54414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
54514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (NoFunction && (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC)))
54614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
54714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC))
54814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleObjCMethodName(Method);
549e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  else if (const FunctionDecl *Func = dyn_cast<FunctionDecl>(DC))
550e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleLocalName(Func);
55114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else {
55214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleUnqualifiedName(cast<NamedDecl>(DC));
55314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    manglePostfix(DC->getParent(), NoFunction);
55414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
55514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
55614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
557e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO,
558e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                 SourceLocation Loc) {
55914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (OO) {
56014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?0 # constructor
56114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?1 # destructor
56214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?2 # new
56314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_New: Out << "?2"; break;
56414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?3 # delete
56514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Delete: Out << "?3"; break;
56614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?4 # =
56714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Equal: Out << "?4"; break;
56814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?5 # >>
56914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterGreater: Out << "?5"; break;
57014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?6 # <<
57114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessLess: Out << "?6"; break;
57214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?7 # !
57314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Exclaim: Out << "?7"; break;
57414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?8 # ==
57514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_EqualEqual: Out << "?8"; break;
57614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?9 # !=
57714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_ExclaimEqual: Out << "?9"; break;
57814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?A # []
57914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Subscript: Out << "?A"; break;
58014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?B # conversion
58114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?C # ->
58214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Arrow: Out << "?C"; break;
58314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?D # *
58414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Star: Out << "?D"; break;
58514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?E # ++
58614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PlusPlus: Out << "?E"; break;
58714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?F # --
58814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_MinusMinus: Out << "?F"; break;
58914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?G # -
59014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Minus: Out << "?G"; break;
59114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?H # +
59214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Plus: Out << "?H"; break;
59314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?I # &
59414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Amp: Out << "?I"; break;
59514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?J # ->*
59614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_ArrowStar: Out << "?J"; break;
59714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?K # /
59814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Slash: Out << "?K"; break;
59914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?L # %
60014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Percent: Out << "?L"; break;
60114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?M # <
60214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Less: Out << "?M"; break;
60314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?N # <=
60414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessEqual: Out << "?N"; break;
60514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?O # >
60614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Greater: Out << "?O"; break;
60714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?P # >=
60814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterEqual: Out << "?P"; break;
60914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Q # ,
61014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Comma: Out << "?Q"; break;
61114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?R # ()
61214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Call: Out << "?R"; break;
61314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?S # ~
61414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Tilde: Out << "?S"; break;
61514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?T # ^
61614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Caret: Out << "?T"; break;
61714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?U # |
61814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Pipe: Out << "?U"; break;
61914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?V # &&
62014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_AmpAmp: Out << "?V"; break;
62114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?W # ||
62214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PipePipe: Out << "?W"; break;
62314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?X # *=
62414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_StarEqual: Out << "?X"; break;
62514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Y # +=
62614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PlusEqual: Out << "?Y"; break;
62714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Z # -=
62814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_MinusEqual: Out << "?Z"; break;
62914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_0 # /=
63014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_SlashEqual: Out << "?_0"; break;
63114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_1 # %=
63214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PercentEqual: Out << "?_1"; break;
63314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_2 # >>=
63414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterGreaterEqual: Out << "?_2"; break;
63514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_3 # <<=
63614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessLessEqual: Out << "?_3"; break;
63714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_4 # &=
63814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_AmpEqual: Out << "?_4"; break;
63914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_5 # |=
64014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PipeEqual: Out << "?_5"; break;
64114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_6 # ^=
64214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_CaretEqual: Out << "?_6"; break;
64314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_7 # vftable
64414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_8 # vbtable
64514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_9 # vcall
64614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_A # typeof
64714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_B # local static guard
64814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_C # string
64914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_D # vbase destructor
65014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_E # vector deleting destructor
65114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_F # default constructor closure
65214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_G # scalar deleting destructor
65314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_H # vector constructor iterator
65414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_I # vector destructor iterator
65514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_J # vector vbase constructor iterator
65614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_K # virtual displacement map
65714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_L # eh vector constructor iterator
65814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_M # eh vector destructor iterator
65914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_N # eh vector vbase constructor iterator
66014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_O # copy constructor closure
66114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_P<name> # udt returning <name>
66214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_Q # <unknown>
66314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R0 # RTTI Type Descriptor
66414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R1 # RTTI Base Class Descriptor at (a,b,c,d)
66514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R2 # RTTI Base Class Array
66614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R3 # RTTI Class Hierarchy Descriptor
66714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R4 # RTTI Complete Object Locator
66814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_S # local vftable
66914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_T # local vftable constructor closure
67014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_U # new[]
67114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Array_New: Out << "?_U"; break;
67214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_V # delete[]
67314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Array_Delete: Out << "?_V"; break;
67414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
675e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  case OO_Conditional: {
676e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DiagnosticsEngine &Diags = Context.getDiags();
677e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
678e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      "cannot mangle this conditional operator yet");
679e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Diags.Report(Loc, DiagID);
680e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    break;
681e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
68214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
68314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_None:
68414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case NUM_OVERLOADED_OPERATORS:
685b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Not an overloaded operator");
68614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
68714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
68814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
68914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
69014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <source name> ::= <identifier> @
691f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  std::string key = II->getNameStart();
692f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  BackRefMap::iterator Found;
693f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  if (UseNameBackReferences)
694f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    Found = NameBackReferences.find(key);
695f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  if (!UseNameBackReferences || Found == NameBackReferences.end()) {
69606e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    Out << II->getName() << '@';
697f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov    if (UseNameBackReferences && NameBackReferences.size() < 10) {
6983f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      size_t Size = NameBackReferences.size();
699f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov      NameBackReferences[key] = Size;
70006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    }
70106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  } else {
70206e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    Out << Found->second;
70306e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  }
70414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
70514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
706e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
707e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Context.mangleObjCMethodName(MD, Out);
708e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
709e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
710e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis// Find out how many function decls live above this one and return an integer
711e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis// suitable for use as the number in a numbered anonymous scope.
712e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis// TODO: Memoize.
713e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisstatic unsigned getLocalNestingLevel(const FunctionDecl *FD) {
714e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  const DeclContext *DC = FD->getParent();
715e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  int level = 1;
716e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
717e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  while (DC && !DC->isTranslationUnit()) {
718e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    if (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC)) level++;
719e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DC = DC->getParent();
720e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
721e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
722e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  return 2*level;
723e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
724e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
725e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleLocalName(const FunctionDecl *FD) {
726e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // <nested-name> ::= <numbered-anonymous-scope> ? <mangled-name>
727e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // <numbered-anonymous-scope> ::= ? <number>
728e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // Even though the name is rendered in reverse order (e.g.
729e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // A::B::C is rendered as C@B@A), VC numbers the scopes from outermost to
730e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // innermost. So a method bar in class C local to function foo gets mangled
731e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // as something like:
732e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // ?bar@C@?1??foo@@YAXXZ@QAEXXZ
733e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // This is more apparent when you have a type nested inside a method of a
734e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // type nested inside a function. A method baz in class D local to method
735e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // bar of class C local to function foo gets mangled as:
736e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // ?baz@D@?3??bar@C@?1??foo@@YAXXZ@QAEXXZ@QAEXXZ
737e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // This scheme is general enough to support GCC-style nested
738e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // functions. You could have a method baz of class C inside a function bar
739e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // inside a function foo, like so:
740e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // ?baz@C@?3??bar@?1??foo@@YAXXZ@YAXXZ@QAEXXZ
741e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  int NestLevel = getLocalNestingLevel(FD);
742e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Out << '?';
743e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleNumber(NestLevel);
744e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Out << '?';
745e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangle(FD, "?");
746e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
747e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
748e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleTemplateInstantiationName(
749e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                                         const TemplateDecl *TD,
750e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                     const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs) {
7519fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <template-name> ::= <unscoped-template-name> <template-args>
7529fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //                 ::= <substitution>
7539fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Always start with the unqualified name.
7544285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov
7554285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  // Templates have their own context for back references.
7564285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  BackRefMap TemplateContext;
7574285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  NameBackReferences.swap(TemplateContext);
7584285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov
7599fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  mangleUnscopedTemplateName(TD);
760e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleTemplateArgs(TemplateArgs);
761f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov
7624285f84a5c3725210b4f12551af6c5d467d0763dTimur Iskhodzhanov  NameBackReferences.swap(TemplateContext);
76314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
76414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
7659fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
7669fd2359ee3b140557b808e4b79bc73a3b9d62304Charles DavisMicrosoftCXXNameMangler::mangleUnscopedTemplateName(const TemplateDecl *TD) {
7679fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <unscoped-template-name> ::= ?$ <unqualified-name>
7689fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << "?$";
7699fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  mangleUnqualifiedName(TD);
7709fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
7719fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
7729fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
773e0deb035b3e2d07b41ea55db84b110abcb65b753Charles DavisMicrosoftCXXNameMangler::mangleIntegerLiteral(QualType T,
774e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                              const llvm::APSInt &Value) {
7759fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <integer-literal> ::= $0 <number>
7769fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << "$0";
7779fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Make sure booleans are encoded as 0/1.
7789fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (T->isBooleanType())
7799fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << (Value.getBoolValue() ? "0" : "A@");
7809fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  else
7819fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    mangleNumber(Value);
7829fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
7839fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
7849fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
785e0deb035b3e2d07b41ea55db84b110abcb65b753Charles DavisMicrosoftCXXNameMangler::mangleTemplateArgs(
786e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                     const SmallVectorImpl<TemplateArgumentLoc> &TemplateArgs) {
7879fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <template-args> ::= {<type> | <integer-literal>}+ @
788e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned NumTemplateArgs = TemplateArgs.size();
789e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  for (unsigned i = 0; i < NumTemplateArgs; ++i) {
790e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    const TemplateArgumentLoc &TAL = TemplateArgs[i];
791e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    const TemplateArgument &TA = TAL.getArgument();
7929fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    switch (TA.getKind()) {
793e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    case TemplateArgument::Null:
794e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      llvm_unreachable("Can't mangle null template arguments!");
7959fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    case TemplateArgument::Type:
796e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      mangleType(TA.getAsType(), TAL.getSourceRange());
7979fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      break;
7989fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    case TemplateArgument::Integral:
799855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      mangleIntegerLiteral(TA.getIntegralType(), TA.getAsIntegral());
8009fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      break;
8013facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis    case TemplateArgument::Expression: {
8023facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      // See if this is a constant expression.
8033facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      Expr *TAE = TA.getAsExpr();
8043facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      llvm::APSInt Value;
8053facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      if (TAE->isIntegerConstantExpr(Value, Context.getASTContext())) {
8063facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis        mangleIntegerLiteral(TAE->getType(), Value);
8073facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis        break;
8083facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      }
8093facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis      /* fallthrough */
8103facb626608c99f497cb5b8bfc60d3ed3ba304b6Charles Davis    } default: {
811e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      // Issue a diagnostic.
812e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine &Diags = Context.getDiags();
813e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
814e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this %select{ERROR|ERROR|pointer/reference|ERROR|"
815e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "template|template pack expansion|expression|parameter pack}0 "
816e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "template argument yet");
817e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(TAL.getLocation(), DiagID)
818e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << TA.getKind()
819e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << TAL.getSourceRange();
8209fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
8219fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
8229fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
8239fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << '@';
8249fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
8259fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
82614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
82714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                               bool IsMember) {
82814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <cvr-qualifiers> ::= [E] [F] [I] <base-cvr-qualifiers>
82914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // 'E' means __ptr64 (32-bit only); 'F' means __unaligned (32/64-bit only);
83014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // 'I' means __restrict (32/64-bit).
83114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Note that the MSVC __restrict keyword isn't the same as the C99 restrict
83214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // keyword!
83314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <base-cvr-qualifiers> ::= A  # near
83414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= B  # near const
83514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= C  # near volatile
83614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= D  # near const volatile
83714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= E  # far (16-bit)
83814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= F  # far const (16-bit)
83914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= G  # far volatile (16-bit)
84014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= H  # far const volatile (16-bit)
84114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= I  # huge (16-bit)
84214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= J  # huge const (16-bit)
84314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= K  # huge volatile (16-bit)
84414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= L  # huge const volatile (16-bit)
84514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= M <basis> # based
84614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= N <basis> # based const
84714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= O <basis> # based volatile
84814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= P <basis> # based const volatile
84914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Q  # near member
85014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= R  # near const member
85114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= S  # near volatile member
85214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= T  # near const volatile member
85314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= U  # far member (16-bit)
85414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= V  # far const member (16-bit)
85514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= W  # far volatile member (16-bit)
85614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= X  # far const volatile member (16-bit)
85714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Y  # huge member (16-bit)
85814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Z  # huge const member (16-bit)
85914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 0  # huge volatile member (16-bit)
86014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 1  # huge const volatile member (16-bit)
86114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 2 <basis> # based member
86214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 3 <basis> # based const member
86314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 4 <basis> # based volatile member
86414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 5 <basis> # based const volatile member
86514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 6  # near function (pointers only)
86614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 7  # far function (pointers only)
86714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 8  # near method (pointers only)
86814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 9  # far method (pointers only)
86914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _A <basis> # based function (pointers only)
87014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _B <basis> # based function (far?) (pointers only)
87114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _C <basis> # based method (pointers only)
87214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _D <basis> # based method (far?) (pointers only)
87314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _E # block (Clang)
87414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <basis> ::= 0 # __based(void)
87514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 1 # __based(segment)?
87614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 2 <name> # __based(name)
87714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 3 # ?
87814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 4 # ?
87914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 5 # not really based
88014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!IsMember) {
88114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (!Quals.hasVolatile()) {
88214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
88314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'A';
88414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
88514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'B';
88614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
88714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
88814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'C';
88914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
89014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'D';
89114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
89214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
89314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (!Quals.hasVolatile()) {
89414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
89514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'Q';
89614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
89714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'R';
89814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
89914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
90014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'S';
90114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
90214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'T';
90314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
90414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
90514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
90614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // FIXME: For now, just drop all extension qualifiers on the floor.
90714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
90814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
9093f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanovvoid MicrosoftCXXNameMangler::mangleTypeRepeated(QualType T, SourceRange Range) {
9103f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  void *TypePtr = getASTContext().getCanonicalType(T).getAsOpaquePtr();
911f5e0b225b4d8027edab993ad4ac87510fcd6f991Timur Iskhodzhanov  ArgBackRefMap::iterator Found = TypeBackReferences.find(TypePtr);
9123f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
9133f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  if (Found == TypeBackReferences.end()) {
9143f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    size_t OutSizeBefore = Out.GetNumBytesInBuffer();
9153f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
9163f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    mangleType(T,Range);
9173f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
9183f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    // See if it's worth creating a back reference.
9193f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    // Only types longer than 1 character are considered
9203f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    // and only 10 back references slots are available:
9213f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    bool LongerThanOneChar = (Out.GetNumBytesInBuffer() - OutSizeBefore > 1);
9223f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    if (LongerThanOneChar && TypeBackReferences.size() < 10) {
9233f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      size_t Size = TypeBackReferences.size();
9243f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      TypeBackReferences[TypePtr] = Size;
9253f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    }
9263f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  } else {
9273f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov    Out << Found->second;
9283f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov  }
9293f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov}
9303f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov
931e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(QualType T, SourceRange Range) {
93214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Only operate on the canonical type!
93314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  T = getASTContext().getCanonicalType(T);
93414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
93514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Qualifiers Quals = T.getLocalQualifiers();
93614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Quals) {
93714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // We have to mangle these now, while we still have enough information.
93814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <pointer-cvr-qualifiers> ::= P  # pointer
93914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    //                          ::= Q  # const pointer
94014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    //                          ::= R  # volatile pointer
94114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    //                          ::= S  # const volatile pointer
94214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (T->isAnyPointerType() || T->isMemberPointerType() ||
94314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        T->isBlockPointerType()) {
94414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasVolatile())
94514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'Q';
94614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else {
94714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (!Quals.hasConst())
94814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'R';
94914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
95014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'S';
95114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
95214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else
95314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // Just emit qualifiers like normal.
95414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // NB: When we mangle a pointer/reference type, and the pointee
95514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // type has no qualifiers, the lack of qualifier gets mangled
95614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // in there.
95714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      mangleQualifiers(Quals, false);
95814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else if (T->isAnyPointerType() || T->isMemberPointerType() ||
95914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne             T->isBlockPointerType()) {
96014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'P';
96114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
96214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getTypeClass()) {
96314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define ABSTRACT_TYPE(CLASS, PARENT)
96414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define NON_CANONICAL_TYPE(CLASS, PARENT) \
965e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  case Type::CLASS: \
966e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
967e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    return;
96814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define TYPE(CLASS, PARENT) \
969e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  case Type::CLASS: \
970e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(static_cast<const CLASS##Type*>(T.getTypePtr()), Range); \
971e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    break;
97214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/TypeNodes.def"
973e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef ABSTRACT_TYPE
974e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef NON_CANONICAL_TYPE
975e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis#undef TYPE
97614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
97714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
97814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
979e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const BuiltinType *T,
980e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
98114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <type>         ::= <builtin-type>
98214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <builtin-type> ::= X  # void
98314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= C  # signed char
98414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= D  # char
98514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= E  # unsigned char
98614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= F  # short
98714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= G  # unsigned short (or wchar_t if it's not a builtin)
98814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= H  # int
98914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= I  # unsigned int
99014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= J  # long
99114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= K  # unsigned long
99214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     L  # <none>
99314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= M  # float
99414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= N  # double
99514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= O  # long double (__float80 is mangled differently)
99614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _J # long long, __int64
99714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _K # unsigned long long, __int64
99814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _L # __int128
99914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _M # unsigned __int128
100014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _N # bool
100114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     _O # <array in parameter>
100214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _T # __float80 (Intel)
100314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _W # wchar_t
100414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _Z # __float80 (Digital Mars)
100514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getKind()) {
100614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Void: Out << 'X'; break;
100714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::SChar: Out << 'C'; break;
100814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char_U: case BuiltinType::Char_S: Out << 'D'; break;
100914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UChar: Out << 'E'; break;
101014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Short: Out << 'F'; break;
101114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UShort: Out << 'G'; break;
101214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Int: Out << 'H'; break;
101314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UInt: Out << 'I'; break;
101414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Long: Out << 'J'; break;
101514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ULong: Out << 'K'; break;
101614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Float: Out << 'M'; break;
101714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Double: Out << 'N'; break;
101814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // TODO: Determine size and mangle accordingly
101914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::LongDouble: Out << 'O'; break;
102014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::LongLong: Out << "_J"; break;
102114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ULongLong: Out << "_K"; break;
102214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Int128: Out << "_L"; break;
102314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UInt128: Out << "_M"; break;
102414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Bool: Out << "_N"; break;
102514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::WChar_S:
102614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::WChar_U: Out << "_W"; break;
102714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1028e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define BUILTIN_TYPE(Id, SingletonId)
1029e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define PLACEHOLDER_TYPE(Id, SingletonId) \
1030e0a22d06888c13989b3f72db319f1d498bf69153John McCall  case BuiltinType::Id:
1031e0a22d06888c13989b3f72db319f1d498bf69153John McCall#include "clang/AST/BuiltinTypes.def"
103214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Dependent:
1033e0a22d06888c13989b3f72db319f1d498bf69153John McCall    llvm_unreachable("placeholder types shouldn't get to name mangling");
1034e0a22d06888c13989b3f72db319f1d498bf69153John McCall
103514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCId: Out << "PAUobjc_object@@"; break;
103614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCClass: Out << "PAUobjc_class@@"; break;
103714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCSel: Out << "PAUobjc_selector@@"; break;
103806e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith
103906e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  case BuiltinType::NullPtr: Out << "$$T"; break;
104014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
104114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char16:
104214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char32:
104306e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  case BuiltinType::Half: {
1044e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    DiagnosticsEngine &Diags = Context.getDiags();
1045e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1046e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      "cannot mangle this built-in %0 type yet");
1047e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    Diags.Report(Range.getBegin(), DiagID)
1048e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      << T->getName(Context.getASTContext().getPrintingPolicy())
1049e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      << Range;
105006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    break;
1051e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  }
105214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
105314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
105414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
105514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>          ::= <function-type>
1056e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T,
1057e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
105814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Structors only appear in decls, so at this point we know it's not a
105914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // structor type.
106014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // I'll probably have mangleType(MemberPointerType) call the mangleType()
106114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // method directly.
106214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(T, NULL, false, false);
106314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1064e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T,
1065e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
106614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("Can't mangle K&R function prototypes");
106714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
106814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
106914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const FunctionType *T,
107014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         const FunctionDecl *D,
107114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         bool IsStructor,
107214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         bool IsInstMethod) {
107314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <function-type> ::= <this-cvr-qualifiers> <calling-convention>
107414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     <return-type> <argument-list> <throw-spec>
107514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const FunctionProtoType *Proto = cast<FunctionProtoType>(T);
107614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
107714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If this is a C++ instance method, mangle the CVR qualifiers for the
107814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // this pointer.
107914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsInstMethod)
108014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(Qualifiers::fromCVRMask(Proto->getTypeQuals()), false);
108114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
108214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleCallingConvention(T, IsInstMethod);
108314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
108414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <return-type> ::= <type>
108514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //               ::= @ # structors (they have no declared return type)
108614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsStructor)
108714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '@';
108806e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  else {
108906e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    QualType Result = Proto->getResultType();
109006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    const Type* RT = Result.getTypePtr();
109106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    if(isa<TagType>(RT) && !RT->isAnyPointerType() && !RT->isReferenceType())
109206e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith        Out << "?A";
1093e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // FIXME: Get the source range for the result type. Or, better yet,
1094e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // implement the unimplemented stuff so we don't need accurate source
1095e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    // location info anymore :).
109606e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    mangleType(Result, SourceRange());
109706e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  }
109814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
109914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <argument-list> ::= X # void
110014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type>+ @
110114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type>* Z # varargs
110214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Proto->getNumArgs() == 0 && !Proto->isVariadic()) {
110314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'X';
110414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
110514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (D) {
11063a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // If we got a decl, use the type-as-written to make sure arrays
11073a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // get mangled right.  Note that we can't rely on the TSI
11083a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // existing if (for example) the parameter was synthesized.
110914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      for (FunctionDecl::param_const_iterator Parm = D->param_begin(),
11103a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall             ParmEnd = D->param_end(); Parm != ParmEnd; ++Parm) {
111106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith        TypeSourceInfo *TSI = (*Parm)->getTypeSourceInfo();
111206e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith        QualType Type = TSI ? TSI->getType() : (*Parm)->getType();
11133f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov        mangleTypeRepeated(Type, (*Parm)->getSourceRange());
11143a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      }
111514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
11163f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov      // Happens for function pointer type arguments for example.
111714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(),
111814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne           ArgEnd = Proto->arg_type_end();
111914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne           Arg != ArgEnd; ++Arg)
11203f835687b8f7ad3060fe4c462727b212ed714b30Timur Iskhodzhanov        mangleTypeRepeated(*Arg, SourceRange());
112114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
112214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <builtin-type>      ::= Z  # ellipsis
112314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (Proto->isVariadic())
112414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'Z';
112514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    else
112614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << '@';
112714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
112814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
112914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleThrowSpecification(Proto);
113014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
113114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
113214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) {
113314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <function-class> ::= A # private: near
113414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= B # private: far
113514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= C # private: static near
113614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= D # private: static far
113714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= E # private: virtual near
113814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= F # private: virtual far
113914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= G # private: thunk near
114014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= H # private: thunk far
114114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= I # protected: near
114214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= J # protected: far
114314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= K # protected: static near
114414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= L # protected: static far
114514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= M # protected: virtual near
114614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= N # protected: virtual far
114714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= O # protected: thunk near
114814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= P # protected: thunk far
114914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Q # public: near
115014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= R # public: far
115114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= S # public: static near
115214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= T # public: static far
115314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= U # public: virtual near
115414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= V # public: virtual far
115514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= W # public: thunk near
115614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= X # public: thunk far
115714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Y # global near
115814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Z # global far
115914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
116014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    switch (MD->getAccess()) {
116114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      default:
116214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_private:
116314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
116414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'C';
116514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
116614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'E';
116714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
116814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'A';
116914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
117014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_protected:
117114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
117214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'K';
117314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
117414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'M';
117514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
117614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'I';
117714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
117814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_public:
117914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
118014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'S';
118114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
118214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'U';
118314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
118414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'Q';
118514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
118614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else
118714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Y';
118814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
118914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T,
119014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                      bool IsInstMethod) {
119114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <calling-convention> ::= A # __cdecl
119214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= B # __export __cdecl
119314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= C # __pascal
119414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= D # __export __pascal
119514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= E # __thiscall
119614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= F # __export __thiscall
119714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= G # __stdcall
119814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= H # __export __stdcall
119914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= I # __fastcall
120014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= J # __export __fastcall
120114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // The 'export' calling conventions are from a bygone era
120214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // (*cough*Win16*cough*) when functions were declared for export with
120314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // that keyword. (It didn't actually export them, it just made them so
120414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // that they could be in a DLL and somebody from another module could call
120514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // them.)
120614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  CallingConv CC = T->getCallConv();
12078f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  if (CC == CC_Default) {
12088f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    if (IsInstMethod) {
12098f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      const FunctionProtoType *FPT =
12108f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov        T->getCanonicalTypeUnqualified().getAs<FunctionProtoType>();
12118f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      bool isVariadic = FPT->isVariadic();
12128f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      CC = getASTContext().getDefaultCXXMethodCallConv(isVariadic);
12138f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    } else {
12148f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov      CC = CC_C;
12158f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov    }
12168f88a1dcc57cfe8580eb1558a783ad8499bfe8e0Timur Iskhodzhanov  }
121714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (CC) {
1218414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov    default:
1219b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Unsupported CC for mangling");
122014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_Default:
122114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_C: Out << 'A'; break;
122214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86Pascal: Out << 'C'; break;
122314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86ThisCall: Out << 'E'; break;
122414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86StdCall: Out << 'G'; break;
122514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86FastCall: Out << 'I'; break;
122614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
122714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
122814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleThrowSpecification(
122914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                const FunctionProtoType *FT) {
123014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <throw-spec> ::= Z # throw(...) (default)
123114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //              ::= @ # throw() or __declspec/__attribute__((nothrow))
123214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //              ::= <type>+
123314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // NOTE: Since the Microsoft compiler ignores throw specifications, they are
123414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // all actually mangled as 'Z'. (They're ignored because their associated
123514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // functionality isn't implemented, and probably never will be.)
123614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'Z';
123714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
123814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1239e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const UnresolvedUsingType *T,
1240e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1241e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // Probably should be mangled as a template instantiation; need to see what
1242e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // VC does first.
1243e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1244e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1245e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this unresolved dependent type yet");
1246e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1247e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
124814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
124914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
125014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>        ::= <union-type> | <struct-type> | <class-type> | <enum-type>
125114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <union-type>  ::= T <name>
125214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <struct-type> ::= U <name>
125314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <class-type>  ::= V <name>
125414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <enum-type>   ::= W <size> <name>
1255e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const EnumType *T, SourceRange) {
125614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const TagType*>(T));
125714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1258e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const RecordType *T, SourceRange) {
125914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const TagType*>(T));
126014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
126114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const TagType *T) {
126214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getDecl()->getTagKind()) {
126314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Union:
126414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'T';
126514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
126614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Struct:
126714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'U';
126814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
126914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Class:
127014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'V';
127114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
127214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Enum:
127314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'W';
127414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << getASTContext().getTypeSizeInChars(
127514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                cast<EnumDecl>(T->getDecl())->getIntegerType()).getQuantity();
127614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
127714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
127814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(T->getDecl());
127914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
128014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
128114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>       ::= <array-type>
128214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <array-type> ::= P <cvr-qualifiers> [Y <dimension-count> <dimension>+]
128314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                                                  <element-type> # as global
128414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//              ::= Q <cvr-qualifiers> [Y <dimension-count> <dimension>+]
128514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                                                  <element-type> # as param
128614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// It's supposed to be the other way around, but for some strange reason, it
128714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// isn't. Today this behavior is retained for the sole purpose of backwards
128814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// compatibility.
128914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ArrayType *T, bool IsGlobal) {
129014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // This isn't a recursive mangling, so now we have to do it all in this
129114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // one call.
129214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsGlobal)
129314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'P';
129414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else
129514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Q';
129614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleExtraDimensions(T->getElementType());
129714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1298e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T,
1299e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
130014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
130114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1302e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const VariableArrayType *T,
1303e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
130414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
130514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1306e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DependentSizedArrayType *T,
1307e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
130814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
130914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1310e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const IncompleteArrayType *T,
1311e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
131214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
131314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
131414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleExtraDimensions(QualType ElementTy) {
13155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<llvm::APInt, 3> Dimensions;
131614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  for (;;) {
1317c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    if (const ConstantArrayType *CAT =
1318c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith          getASTContext().getAsConstantArrayType(ElementTy)) {
131914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Dimensions.push_back(CAT->getSize());
132014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      ElementTy = CAT->getElementType();
132114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isVariableArrayType()) {
1322e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      const VariableArrayType *VAT =
1323e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        getASTContext().getAsVariableArrayType(ElementTy);
1324e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine &Diags = Context.getDiags();
1325e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1326e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this variable-length array yet");
1327e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(VAT->getSizeExpr()->getExprLoc(), DiagID)
1328e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << VAT->getBracketsRange();
1329e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      return;
133014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isDependentSizedArrayType()) {
133114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // The dependent expression has to be folded into a constant (TODO).
1332e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      const DependentSizedArrayType *DSAT =
1333e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        getASTContext().getAsDependentSizedArrayType(ElementTy);
1334e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      DiagnosticsEngine &Diags = Context.getDiags();
1335e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1336e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        "cannot mangle this dependent-length array yet");
1337e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      Diags.Report(DSAT->getSizeExpr()->getExprLoc(), DiagID)
1338e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis        << DSAT->getBracketsRange();
1339e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis      return;
134014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isIncompleteArrayType()) continue;
134114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    else break;
134214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
134314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleQualifiers(ElementTy.getQualifiers(), false);
134414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If there are any additional dimensions, mangle them now.
134514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Dimensions.size() > 0) {
134614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Y';
134714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <dimension-count> ::= <number> # number of extra dimensions
134814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleNumber(Dimensions.size());
134914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    for (unsigned Dim = 0; Dim < Dimensions.size(); ++Dim) {
135014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      mangleNumber(Dimensions[Dim].getLimitedValue());
135114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
135214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
1353e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(ElementTy.getLocalUnqualifiedType(), SourceRange());
135414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
135514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
135614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>                   ::= <pointer-to-member-type>
135714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <pointer-to-member-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers>
135814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                                                          <class name> <type>
1359e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T,
1360e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
136114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeType = T->getPointeeType();
1362c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith  if (const FunctionProtoType *FPT = PointeeType->getAs<FunctionProtoType>()) {
136314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '8';
1364c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleName(T->getClass()->castAs<RecordType>()->getDecl());
136514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(FPT, NULL, false, true);
136614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
136714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(PointeeType.getQualifiers(), true);
1368c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleName(T->getClass()->castAs<RecordType>()->getDecl());
1369e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(PointeeType.getLocalUnqualifiedType(), Range);
137014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
137114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
137214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1373e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T,
1374e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1375e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1376e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1377e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this template type parameter type yet");
1378e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1379e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
138014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
138114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1382c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorvoid MicrosoftCXXNameMangler::mangleType(
1383e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                       const SubstTemplateTypeParmPackType *T,
1384e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                       SourceRange Range) {
1385e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1386e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1387e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this substituted parameter pack yet");
1388e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1389e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1390c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
1391c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
139214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type> ::= <pointer-type>
139314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <pointer-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> <type>
1394e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const PointerType *T,
1395e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
139614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeTy = T->getPointeeType();
139714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (PointeeTy->isArrayType()) {
139814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Pointers to arrays are mangled like arrays.
1399c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleExtraDimensions(PointeeTy);
1400c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith  } else if (const FunctionType *FT = PointeeTy->getAs<FunctionType>()) {
140114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Function pointers are special.
140214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '6';
1403c0838d2acb498b0491908d3693514dfec5befe6fRichard Smith    mangleType(FT, NULL, false, false);
140414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
140514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (!PointeeTy.hasQualifiers())
140614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // Lack of qualifiers is mangled as 'A'.
140714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'A';
1408e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    mangleType(PointeeTy, Range);
140914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
141014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1411e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T,
1412e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
141314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Object pointers never have qualifiers.
141414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'A';
1415e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(T->getPointeeType(), Range);
141614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
141714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
141814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type> ::= <reference-type>
141914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <reference-type> ::= A <cvr-qualifiers> <type>
1420e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T,
1421e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
142214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'A';
142314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeTy = T->getPointeeType();
142414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!PointeeTy.hasQualifiers())
142514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Lack of qualifiers is mangled as 'A'.
142614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'A';
1427e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(PointeeTy, Range);
1428e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1429e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
143006e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith// <type> ::= <r-value-reference-type>
143106e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith// <r-value-reference-type> ::= $$Q <cvr-qualifiers> <type>
1432e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T,
1433e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
143406e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  Out << "$$Q";
143506e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  QualType PointeeTy = T->getPointeeType();
143606e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  if (!PointeeTy.hasQualifiers())
143706e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    // Lack of qualifiers is mangled as 'A'.
143806e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith    Out << 'A';
143906e767d6703fdae9cda21c6c96c79a0135e2567aRichard Smith  mangleType(PointeeTy, Range);
1440e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1441e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1442e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ComplexType *T,
1443e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1444e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1445e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1446e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this complex number type yet");
1447e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1448e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1449e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1450e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1451e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const VectorType *T,
1452e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1453e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1454e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1455e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this vector type yet");
1456e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1457e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1458e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1459e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ExtVectorType *T,
1460e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1461e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1462e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1463e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this extended vector type yet");
1464e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1465e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1466e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1467e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DependentSizedExtVectorType *T,
1468e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1469e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1470e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1471e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this dependent-sized extended vector type yet");
1472e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1473e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1474e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1475e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1476e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ObjCInterfaceType *T,
1477e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange) {
147814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // ObjC interfaces have structs underlying them.
147914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'U';
148014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(T->getDecl());
148114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
148214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1483e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T,
1484e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
148514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We don't allow overloading by different protocol qualification,
148614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // so mangling them isn't necessary.
1487e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(T->getBaseType(), Range);
148814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
148914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1490e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T,
1491e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
149214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << "_E";
1493e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  mangleType(T->getPointeeType(), Range);
149414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
149514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1496e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const InjectedClassNameType *T,
1497e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1498e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1499e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1500e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this injected class name type yet");
1501e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1502e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
150314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
150414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1505e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TemplateSpecializationType *T,
1506e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1507e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1508e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1509e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this template specialization type yet");
1510e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1511e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
151214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
151314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1514e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DependentNameType *T,
1515e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1516e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1517e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1518e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this dependent name type yet");
1519e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1520e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
152114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
152214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
152314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(
1524e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                 const DependentTemplateSpecializationType *T,
1525e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                 SourceRange Range) {
1526e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1527e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1528e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this dependent template specialization type yet");
1529e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1530e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1531e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1532e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1533e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const PackExpansionType *T,
1534e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1535e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1536e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1537e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this pack expansion yet");
1538e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1539e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1540e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1541e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1542e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TypeOfType *T,
1543e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1544e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1545e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1546e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this typeof(type) yet");
1547e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1548e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1549e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1550e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1551e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const TypeOfExprType *T,
1552e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1553e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1554e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1555e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this typeof(expression) yet");
1556e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1557e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1558e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1559e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1560e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const DecltypeType *T,
1561e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1562e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1563e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1564e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this decltype() yet");
1565e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1566e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1567e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1568e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1569e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const UnaryTransformType *T,
1570e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1571e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1572e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1573e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this unary transform type yet");
1574e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1575e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1576e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1577e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1578e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const AutoType *T, SourceRange Range) {
1579e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1580e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1581e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this 'auto' type yet");
1582e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1583e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1584e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis}
1585e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis
1586e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftCXXNameMangler::mangleType(const AtomicType *T,
1587e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                         SourceRange Range) {
1588e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  DiagnosticsEngine &Diags = Context.getDiags();
1589e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
1590e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this C11 atomic type yet");
1591e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Diags.Report(Range.getBegin(), DiagID)
1592e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << Range;
1593b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman}
1594b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
159514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleName(const NamedDecl *D,
15965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                        raw_ostream &Out) {
159714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) &&
159814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne         "Invalid mangleName() call, argument is not a variable or function!");
159914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  assert(!isa<CXXConstructorDecl>(D) && !isa<CXXDestructorDecl>(D) &&
160014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne         "Invalid mangleName() call on 'structor decl!");
160114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
160214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
160314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                 getASTContext().getSourceManager(),
160414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                 "Mangling declaration");
160514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1606c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola  MicrosoftCXXNameMangler Mangler(*this, Out);
160714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return Mangler.mangle(D);
160814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
160914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleThunk(const CXXMethodDecl *MD,
161014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         const ThunkInfo &Thunk,
16115f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         raw_ostream &) {
1612e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1613e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle thunk for this method yet");
1614e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(MD->getLocation(), DiagID);
161514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
161614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *DD,
161714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                CXXDtorType Type,
161814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                const ThisAdjustment &,
16195f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                raw_ostream &) {
1620e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1621e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle thunk for this destructor yet");
1622e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(DD->getLocation(), DiagID);
162314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
162414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXVTable(const CXXRecordDecl *RD,
1625e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis                                             raw_ostream &Out) {
162628e862a4fbb9ed4060d1db25d45b1ed7a42f1b75Kaelyn Uhrain  // <mangled-name> ::= ? <operator-name> <class-name> <storage-class>
1627e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  //                      <cvr-qualifiers> [<name>] @
1628e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // <operator-name> ::= _7 # vftable
1629e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  //                 ::= _8 # vbtable
1630e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // NOTE: <cvr-qualifiers> here is always 'B' (const). <storage-class>
1631e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // is always '6' for vftables and '7' for vbtables. (The difference is
1632e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // beyond me.)
1633e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // TODO: vbtables.
1634e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  MicrosoftCXXNameMangler Mangler(*this, Out);
1635e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.getStream() << "\01??_7";
1636e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.mangleName(RD);
1637e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.getStream() << "6B";
1638e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // TODO: If the class has more than one vtable, mangle in the class it came
1639e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // from.
1640e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  Mangler.getStream() << '@';
164114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
164214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXVTT(const CXXRecordDecl *RD,
16435f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                          raw_ostream &) {
164414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("The MS C++ ABI does not have virtual table tables!");
164514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
164614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXCtorVTable(const CXXRecordDecl *RD,
164714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                 int64_t Offset,
164814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                 const CXXRecordDecl *Type,
16495f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                 raw_ostream &) {
165014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("The MS C++ ABI does not have constructor vtables!");
165114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
165214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXRTTI(QualType T,
16535f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                           raw_ostream &) {
1654e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // FIXME: Give a location...
1655e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1656e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle RTTI descriptors for type %0 yet");
1657e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(DiagID)
1658e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << T.getBaseTypeIdentifier();
165914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
166014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXRTTIName(QualType T,
16615f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                               raw_ostream &) {
1662e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  // FIXME: Give a location...
1663e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1664e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle the name of type %0 into RTTI descriptors yet");
1665e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(DiagID)
1666e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    << T.getBaseTypeIdentifier();
166714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
166814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXCtor(const CXXConstructorDecl *D,
166914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                           CXXCtorType Type,
167050118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer                                           raw_ostream & Out) {
167150118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  MicrosoftCXXNameMangler mangler(*this, Out);
167250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  mangler.mangle(D);
167314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
167414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXDtor(const CXXDestructorDecl *D,
167514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                           CXXDtorType Type,
167650118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer                                           raw_ostream & Out) {
167750118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  MicrosoftCXXNameMangler mangler(*this, Out);
167850118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  mangler.mangle(D);
167914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1680e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davisvoid MicrosoftMangleContext::mangleReferenceTemporary(const clang::VarDecl *VD,
16815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                      raw_ostream &) {
1682e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  unsigned DiagID = getDiags().getCustomDiagID(DiagnosticsEngine::Error,
1683e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis    "cannot mangle this reference temporary yet");
1684e0deb035b3e2d07b41ea55db84b110abcb65b753Charles Davis  getDiags().Report(VD->getLocation(), DiagID);
168514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
168614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
168714110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *clang::createMicrosoftMangleContext(ASTContext &Context,
1688d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                                                   DiagnosticsEngine &Diags) {
168914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return new MicrosoftMangleContext(Context, Diags);
169014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1691