MicrosoftMangle.cpp revision 855243789cb44799c03f4c7216d3d6308805f549
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
2414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneusing namespace clang;
2514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
2614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournenamespace {
2714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
2814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// MicrosoftCXXNameMangler - Manage the mangling of a single name for the
2914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// Microsoft Visual C++ ABI.
3014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneclass MicrosoftCXXNameMangler {
3114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  MangleContext &Context;
325f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  raw_ostream &Out;
3314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
3414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  ASTContext &getASTContext() const { return Context.getASTContext(); }
3514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
3614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournepublic:
375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  MicrosoftCXXNameMangler(MangleContext &C, raw_ostream &Out_)
38c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola  : Context(C), Out(Out_) { }
3914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
405f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  void mangle(const NamedDecl *D, StringRef Prefix = "?");
4114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleName(const NamedDecl *ND);
4214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleFunctionEncoding(const FunctionDecl *FD);
4314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleVariableEncoding(const VarDecl *VD);
4414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleNumber(int64_t Number);
459fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleNumber(const llvm::APSInt &Value);
4614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(QualType T);
4714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
4814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneprivate:
4914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleUnqualifiedName(const NamedDecl *ND) {
5014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleUnqualifiedName(ND, ND->getDeclName());
5114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
5214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name);
5314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleSourceName(const IdentifierInfo *II);
5414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void manglePostfix(const DeclContext *DC, bool NoFunction=false);
5514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleOperatorName(OverloadedOperatorKind OO);
5614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleQualifiers(Qualifiers Quals, bool IsMember);
5714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
589fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleUnscopedTemplateName(const TemplateDecl *ND);
599fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleTemplateInstantiationName(const TemplateDecl *TD,
609fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                       const TemplateArgument *TemplateArgs,
619fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                       unsigned NumTemplateArgs,
629fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                       SourceLocation InstantiationLoc);
6314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleObjCMethodName(const ObjCMethodDecl *MD);
6414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
6514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Declare manglers for every type class.
6614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define ABSTRACT_TYPE(CLASS, PARENT)
6714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define NON_CANONICAL_TYPE(CLASS, PARENT)
6814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T);
6914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/TypeNodes.def"
7014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
7114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const TagType*);
7214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const FunctionType *T, const FunctionDecl *D,
7314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                  bool IsStructor, bool IsInstMethod);
7414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleType(const ArrayType *T, bool IsGlobal);
7514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleExtraDimensions(QualType T);
7614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleFunctionClass(const FunctionDecl *FD);
7714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleCallingConvention(const FunctionType *T, bool IsInstMethod = false);
789fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleIntegerLiteral(QualType T, const llvm::APSInt &Number);
7914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  void mangleThrowSpecification(const FunctionProtoType *T);
8014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
819fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  void mangleTemplateArgs(const TemplateArgument *TemplateArgs, unsigned NumTemplateArgs,
829fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                          SourceLocation InstantiationLoc);
839fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
8414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne};
8514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
8614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// MicrosoftMangleContext - Overrides the default MangleContext for the
8714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne/// Microsoft Visual C++ ABI.
8814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourneclass MicrosoftMangleContext : public MangleContext {
8914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournepublic:
9014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  MicrosoftMangleContext(ASTContext &Context,
91d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                   DiagnosticsEngine &Diags) : MangleContext(Context, Diags) { }
9214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual bool shouldMangleDeclName(const NamedDecl *D);
935f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleName(const NamedDecl *D, raw_ostream &Out);
9414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleThunk(const CXXMethodDecl *MD,
9514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                           const ThunkInfo &Thunk,
965f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                           raw_ostream &);
9714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
9814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                  const ThisAdjustment &ThisAdjustment,
995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                  raw_ostream &);
10014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXVTable(const CXXRecordDecl *RD,
1015f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                               raw_ostream &);
10214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXVTT(const CXXRecordDecl *RD,
1035f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                            raw_ostream &);
10414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset,
10514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                   const CXXRecordDecl *Type,
1065f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                   raw_ostream &);
1075f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleCXXRTTI(QualType T, raw_ostream &);
1085f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual void mangleCXXRTTIName(QualType T, raw_ostream &);
10914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
1105f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &);
11114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
1125f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                             raw_ostream &);
11314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  virtual void mangleReferenceTemporary(const clang::VarDecl *,
1145f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                        raw_ostream &);
11514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne};
11614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
11714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
11814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
11914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournestatic bool isInCLinkageSpecification(const Decl *D) {
12014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  D = D->getCanonicalDecl();
12114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  for (const DeclContext *DC = D->getDeclContext();
12214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne       !DC->isTranslationUnit(); DC = DC->getParent()) {
12314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))
12414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      return Linkage->getLanguage() == LinkageSpecDecl::lang_c;
12514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
12614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
12714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return false;
12814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
12914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
13014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournebool MicrosoftMangleContext::shouldMangleDeclName(const NamedDecl *D) {
13114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // In C, functions with no attributes never need to be mangled. Fastpath them.
1324e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getASTContext().getLangOpts().CPlusPlus && !D->hasAttrs())
13314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
13414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
13514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Any decl can be declared with __asm("foo") on it, and this takes precedence
13614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // over all other naming in the .o file.
13714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (D->hasAttr<AsmLabelAttr>())
13814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return true;
13914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
14014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Clang's "overloadable" attribute extension to C/C++ implies name mangling
14114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // (always) as does passing a C++ member function and a function
14214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // whose name is not a simple identifier.
14314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
14414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (FD && (FD->hasAttr<OverloadableAttr>() || isa<CXXMethodDecl>(FD) ||
14514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne             !FD->getDeclName().isIdentifier()))
14614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return true;
14714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
14814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Otherwise, no mangling is done outside C++ mode.
1494e4d08403ca5cfd4d558fa2936215d3a4e5a528dDavid Blaikie  if (!getASTContext().getLangOpts().CPlusPlus)
15014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
15114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
15214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Variables at global scope with internal linkage are not mangled.
15314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!FD) {
15414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    const DeclContext *DC = D->getDeclContext();
15514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (DC->isTranslationUnit() && D->getLinkage() == InternalLinkage)
15614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      return false;
15714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
15814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
15914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // C functions and "main" are not mangled.
16014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if ((FD && FD->isMain()) || isInCLinkageSpecification(D))
16114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return false;
16214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
16314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return true;
16414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
16514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
16614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangle(const NamedDecl *D,
1675f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                     StringRef Prefix) {
16814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // MSVC doesn't mangle C++ names the same way it mangles extern "C" names.
16914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Therefore it's really important that we don't decorate the
17014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // name with leading underscores or leading/trailing at signs. So, emit a
17114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // asm marker at the start so we get the name right.
17214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << '\01';  // LLVM IR Marker for __asm("foo")
17314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
17414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Any decl can be declared with __asm("foo") on it, and this takes precedence
17514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // over all other naming in the .o file.
17614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
17714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // If we have an asm name, then we use it as the mangling.
17814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << ALA->getLabel();
17914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
18014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
18114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
18214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <mangled-name> ::= ? <name> <type-encoding>
18314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << Prefix;
18414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(D);
18514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
18614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleFunctionEncoding(FD);
18714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (const VarDecl *VD = dyn_cast<VarDecl>(D))
18814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleVariableEncoding(VD);
18914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // TODO: Fields? Can MSVC even mangle them?
19014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
19114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
19214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) {
19314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <type-encoding> ::= <function-class> <function-type>
19414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
19514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Don't mangle in the type if this isn't a decl we should typically mangle.
19614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!Context.shouldMangleDeclName(FD))
19714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
19814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
19914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We should never ever see a FunctionNoProtoType at this point.
20014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We don't even know how to mangle their types anyway :).
201bd1d18ecc420838b7ba620c0a2c5d2a86cac371dRichard Smith  const FunctionProtoType *FT = FD->getType()->castAs<FunctionProtoType>();
20214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
20314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  bool InStructor = false, InInstMethod = false;
20414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
20514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (MD) {
20614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (MD->isInstance())
20714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      InInstMethod = true;
20814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD))
20914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      InStructor = true;
21014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
21114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
21214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // First, the function class.
21314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleFunctionClass(FD);
21414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
21514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(FT, FD, InStructor, InInstMethod);
21614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
21714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
21814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
21914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <type-encoding> ::= <storage-class> <variable-type>
22014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <storage-class> ::= 0  # private static member
22114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 1  # protected static member
22214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 2  # public static member
22314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 3  # global
22414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= 4  # static local
22514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
22614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // The first character in the encoding (after the name) is the storage class.
22714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (VD->isStaticDataMember()) {
22814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // If it's a static member, it also encodes the access level.
22914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    switch (VD->getAccess()) {
23014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      default:
23114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_private: Out << '0'; break;
23214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_protected: Out << '1'; break;
23314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_public: Out << '2'; break;
23414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
23514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
23614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (!VD->isStaticLocal())
23714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '3';
23814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else
23914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '4';
24014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Now mangle the type.
24114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <variable-type> ::= <type> <cvr-qualifiers>
24214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type> A # pointers, references, arrays
24314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Pointers and references are odd. The type of 'int * const foo;' gets
24414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // mangled as 'QAHA' instead of 'PAHB', for example.
24514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType Ty = VD->getType();
24614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Ty->isPointerType() || Ty->isReferenceType()) {
24714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(Ty);
24814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'A';
24914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else if (Ty->isArrayType()) {
25014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Global arrays are funny, too.
251f4c7371fb1d3cebcfb40abad4537bb82515704eaJohn McCall    mangleType(cast<ArrayType>(Ty.getTypePtr()), true);
25214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'A';
25314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
25414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(Ty.getLocalUnqualifiedType());
25514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(Ty.getLocalQualifiers(), false);
25614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
25714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
25814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
25914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleName(const NamedDecl *ND) {
26014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <name> ::= <unscoped-name> {[<named-scope>]+ | [<nested-name>]}? @
26114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const DeclContext *DC = ND->getDeclContext();
26214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
26314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Always start with the unqualified name.
26414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleUnqualifiedName(ND);
26514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
26614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If this is an extern variable declared locally, the relevant DeclContext
26714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // is that of the containing namespace, or the translation unit.
26814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (isa<FunctionDecl>(DC) && ND->hasLinkage())
26914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    while (!DC->isNamespace() && !DC->isTranslationUnit())
27014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      DC = DC->getParent();
27114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
27214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  manglePostfix(DC);
27314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
27414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Terminate the whole name with an '@'.
27514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << '@';
27614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
27714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
27814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleNumber(int64_t Number) {
2799fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <number> ::= [?] <decimal digit> # 1 <= Number <= 10
2809fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //          ::= [?] <hex digit>+ @ # 0 or > 9; A = 0, B = 1, etc...
2819fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //          ::= [?] @ # 0 (alternate mangling, not emitted by VC)
28214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Number < 0) {
28314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '?';
28414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Number = -Number;
28514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
2869fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Oddly enough, there's a special shorter mangling for 0, but Microsoft chose not
2879fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // to use it. Instead, 0 gets mangled as "A@". Oh well...
2889fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (Number >= 1 && Number <= 10)
28914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << Number-1;
2909fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  else {
29114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // We have to build up the encoding in reverse order, so it will come
29214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // out right when we write it out.
29314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char Encoding[16];
29414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char *EndPtr = Encoding+sizeof(Encoding);
29514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    char *CurPtr = EndPtr;
2969fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    do {
29714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      *--CurPtr = 'A' + (Number % 16);
29814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Number /= 16;
2999fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    } while (Number);
30014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out.write(CurPtr, EndPtr-CurPtr);
30114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '@';
30214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
30314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
30414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
3059fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid MicrosoftCXXNameMangler::mangleNumber(const llvm::APSInt &Value) {
3069fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (Value.isSigned() && Value.isNegative()) {
3079fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << '?';
3089fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    mangleNumber(llvm::APSInt(Value.abs()));
3099fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return;
3109fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
311c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  llvm::APSInt Temp(Value);
312c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  if (Value.uge(1) && Value.ule(10)) {
313c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis    --Temp;
314c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis    Temp.print(Out, false);
315c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis  } else {
3169fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    // We have to build up the encoding in reverse order, so it will come
3179fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    // out right when we write it out.
3189fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char Encoding[64];
3199fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char *EndPtr = Encoding+sizeof(Encoding);
3209fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    char *CurPtr = EndPtr;
321104e51f30fdf42b1f594a1be20de1c8673088c50Charles Davis    llvm::APSInt NibbleMask(Value.getBitWidth(), Value.isUnsigned());
322f17523b6d3d9ef1dbcb64b63d9bada7bdae194a7Lang Hames    NibbleMask = 0xf;
3239fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    for (int i = 0, e = Value.getActiveBits() / 4; i != e; ++i) {
324c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis      *--CurPtr = 'A' + Temp.And(NibbleMask).getLimitedValue(0xf);
325c4d7675ddd598e3d89237cd04eeba3be322e560cCharles Davis      Temp = Temp.lshr(4);
3269fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    };
3279fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out.write(CurPtr, EndPtr-CurPtr);
3289fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << '@';
3299fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3309fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
3319fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
3329fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisstatic const TemplateDecl *
3339fd2359ee3b140557b808e4b79bc73a3b9d62304Charles DavisisTemplate(const NamedDecl *ND, const TemplateArgumentList *&TemplateArgs) {
3349fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a function template.
3359fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)){
3369fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    if (const TemplateDecl *TD = FD->getPrimaryTemplate()) {
3379fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      TemplateArgs = FD->getTemplateSpecializationArgs();
3389fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      return TD;
3399fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
3409fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3419fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
3429fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a class template.
3439fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const ClassTemplateSpecializationDecl *Spec =
3449fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
3459fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    TemplateArgs = &Spec->getTemplateArgs();
3469fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return Spec->getSpecializedTemplate();
3479fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3489fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
3499fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  return 0;
3509fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
3519fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
35214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid
35314110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
35414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                               DeclarationName Name) {
35514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <unqualified-name> ::= <operator-name>
35614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ::= <ctor-dtor-name>
35714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ::= <source-name>
3589fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //                     ::= <template-name>
3599fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  const TemplateArgumentList *TemplateArgs;
3609fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Check if we have a template.
3619fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
3629fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    mangleTemplateInstantiationName(TD, TemplateArgs->data(), TemplateArgs->size(),
3639fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                    ND->getLocation());
3649fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    return;
3659fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
3669fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
36714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (Name.getNameKind()) {
36814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::Identifier: {
36914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
37014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        mangleSourceName(II);
37114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
37214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
37314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
37414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // Otherwise, an anonymous entity.  We must have a declaration.
37514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      assert(ND && "mangling empty name without declaration");
37614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
37714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
37814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (NS->isAnonymousNamespace()) {
37914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << "?A";
38014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          break;
38114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        }
38214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
38314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
38414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // We must have an anonymous struct.
38514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      const TagDecl *TD = cast<TagDecl>(ND);
386162e1c1b487352434552147967c3dd296ebee2f7Richard Smith      if (const TypedefNameDecl *D = TD->getTypedefNameForAnonDecl()) {
38714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        assert(TD->getDeclContext() == D->getDeclContext() &&
38814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne               "Typedef should not be in another decl context!");
38914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        assert(D->getDeclName().getAsIdentifierInfo() &&
39014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne               "Typedef was not named!");
39114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        mangleSourceName(D->getDeclName().getAsIdentifierInfo());
39214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
39314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
39414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
39514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // When VC encounters an anonymous type with no tag and no typedef,
39614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // it literally emits '<unnamed-tag>'.
39714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << "<unnamed-tag>";
39814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
39914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
40014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
40114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCZeroArgSelector:
40214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCOneArgSelector:
40314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::ObjCMultiArgSelector:
404b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Can't mangle Objective-C selector names here!");
40514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
40614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXConstructorName:
40750118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      Out << "?0";
40850118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      break;
40914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
41014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXDestructorName:
41150118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      Out << "?1";
41250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer      break;
41314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
41414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXConversionFunctionName:
41514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // <operator-name> ::= ?B # (cast)
41614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // The target type is encoded as the return type.
41714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << "?B";
41814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
41914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
42014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXOperatorName:
42114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      mangleOperatorName(Name.getCXXOverloadedOperator());
42214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
42314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
42414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXLiteralOperatorName:
42514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // FIXME: Was this added in VS2010? Does MS even know how to mangle this?
426b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Don't know how to mangle literal operators yet!");
42714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
42814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case DeclarationName::CXXUsingDirective:
429b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Can't mangle a using directive name!");
43014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
43114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
43214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
43314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::manglePostfix(const DeclContext *DC,
43414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                            bool NoFunction) {
43514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <postfix> ::= <unqualified-name> [<postfix>]
43614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //           ::= <template-param>
43714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //           ::= <substitution> [<postfix>]
43814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
43914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!DC) return;
44014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
44114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  while (isa<LinkageSpecDecl>(DC))
44214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    DC = DC->getParent();
44314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
44414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (DC->isTranslationUnit())
44514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
44614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
44714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
448c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola    Context.mangleBlock(BD, Out);
449c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola    Out << '@';
45014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return manglePostfix(DC->getParent(), NoFunction);
45114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
45214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
45314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (NoFunction && (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC)))
45414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    return;
45514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC))
45614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleObjCMethodName(Method);
45714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else {
45814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleUnqualifiedName(cast<NamedDecl>(DC));
45914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    manglePostfix(DC->getParent(), NoFunction);
46014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
46114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
46214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
46314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO) {
46414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (OO) {
46514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?0 # constructor
46614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?1 # destructor
46714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?2 # new
46814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_New: Out << "?2"; break;
46914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?3 # delete
47014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Delete: Out << "?3"; break;
47114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?4 # =
47214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Equal: Out << "?4"; break;
47314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?5 # >>
47414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterGreater: Out << "?5"; break;
47514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?6 # <<
47614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessLess: Out << "?6"; break;
47714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?7 # !
47814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Exclaim: Out << "?7"; break;
47914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?8 # ==
48014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_EqualEqual: Out << "?8"; break;
48114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?9 # !=
48214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_ExclaimEqual: Out << "?9"; break;
48314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?A # []
48414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Subscript: Out << "?A"; break;
48514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?B # conversion
48614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?C # ->
48714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Arrow: Out << "?C"; break;
48814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?D # *
48914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Star: Out << "?D"; break;
49014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?E # ++
49114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PlusPlus: Out << "?E"; break;
49214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?F # --
49314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_MinusMinus: Out << "?F"; break;
49414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?G # -
49514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Minus: Out << "?G"; break;
49614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?H # +
49714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Plus: Out << "?H"; break;
49814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?I # &
49914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Amp: Out << "?I"; break;
50014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?J # ->*
50114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_ArrowStar: Out << "?J"; break;
50214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?K # /
50314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Slash: Out << "?K"; break;
50414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?L # %
50514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Percent: Out << "?L"; break;
50614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?M # <
50714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Less: Out << "?M"; break;
50814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?N # <=
50914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessEqual: Out << "?N"; break;
51014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?O # >
51114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Greater: Out << "?O"; break;
51214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?P # >=
51314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterEqual: Out << "?P"; break;
51414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Q # ,
51514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Comma: Out << "?Q"; break;
51614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?R # ()
51714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Call: Out << "?R"; break;
51814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?S # ~
51914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Tilde: Out << "?S"; break;
52014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?T # ^
52114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Caret: Out << "?T"; break;
52214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?U # |
52314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Pipe: Out << "?U"; break;
52414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?V # &&
52514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_AmpAmp: Out << "?V"; break;
52614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?W # ||
52714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PipePipe: Out << "?W"; break;
52814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?X # *=
52914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_StarEqual: Out << "?X"; break;
53014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Y # +=
53114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PlusEqual: Out << "?Y"; break;
53214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?Z # -=
53314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_MinusEqual: Out << "?Z"; break;
53414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_0 # /=
53514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_SlashEqual: Out << "?_0"; break;
53614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_1 # %=
53714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PercentEqual: Out << "?_1"; break;
53814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_2 # >>=
53914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_GreaterGreaterEqual: Out << "?_2"; break;
54014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_3 # <<=
54114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_LessLessEqual: Out << "?_3"; break;
54214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_4 # &=
54314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_AmpEqual: Out << "?_4"; break;
54414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_5 # |=
54514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_PipeEqual: Out << "?_5"; break;
54614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_6 # ^=
54714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_CaretEqual: Out << "?_6"; break;
54814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_7 # vftable
54914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_8 # vbtable
55014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_9 # vcall
55114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_A # typeof
55214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_B # local static guard
55314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_C # string
55414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_D # vbase destructor
55514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_E # vector deleting destructor
55614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_F # default constructor closure
55714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_G # scalar deleting destructor
55814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_H # vector constructor iterator
55914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_I # vector destructor iterator
56014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_J # vector vbase constructor iterator
56114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_K # virtual displacement map
56214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_L # eh vector constructor iterator
56314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_M # eh vector destructor iterator
56414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_N # eh vector vbase constructor iterator
56514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_O # copy constructor closure
56614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_P<name> # udt returning <name>
56714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_Q # <unknown>
56814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R0 # RTTI Type Descriptor
56914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R1 # RTTI Base Class Descriptor at (a,b,c,d)
57014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R2 # RTTI Base Class Array
57114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R3 # RTTI Class Hierarchy Descriptor
57214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_R4 # RTTI Complete Object Locator
57314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_S # local vftable
57414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     ?_T # local vftable constructor closure
57514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_U # new[]
57614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Array_New: Out << "?_U"; break;
57714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <operator-name> ::= ?_V # delete[]
57814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Array_Delete: Out << "?_V"; break;
57914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
58014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_Conditional:
581b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Don't know how to mangle ?:");
58214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
58314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case OO_None:
58414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case NUM_OVERLOADED_OPERATORS:
585b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie    llvm_unreachable("Not an overloaded operator");
58614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
58714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
58814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
58914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
59014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <source name> ::= <identifier> @
59114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << II->getName() << '@';
59214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
59314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
5949fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid MicrosoftCXXNameMangler::mangleTemplateInstantiationName(const TemplateDecl *TD,
5959fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                                     const TemplateArgument *TemplateArgs,
5969fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                                              unsigned NumTemplateArgs,
5979fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                                        SourceLocation InstantiationLoc) {
5989fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <template-name> ::= <unscoped-template-name> <template-args>
5999fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  //                 ::= <substitution>
6009fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Always start with the unqualified name.
6019fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  mangleUnscopedTemplateName(TD);
6029fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  mangleTemplateArgs(TemplateArgs, NumTemplateArgs, InstantiationLoc);
6039fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
6049fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
60514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
606f0be979bddb8baa28e77693a3dc931e487b2a9f2Rafael Espindola  Context.mangleObjCMethodName(MD, Out);
60714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
60814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
6099fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
6109fd2359ee3b140557b808e4b79bc73a3b9d62304Charles DavisMicrosoftCXXNameMangler::mangleUnscopedTemplateName(const TemplateDecl *TD) {
6119fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <unscoped-template-name> ::= ?$ <unqualified-name>
6129fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << "?$";
6139fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  mangleUnqualifiedName(TD);
6149fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
6159fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
6169fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
6179fd2359ee3b140557b808e4b79bc73a3b9d62304Charles DavisMicrosoftCXXNameMangler::mangleIntegerLiteral(QualType T, const llvm::APSInt &Value) {
6189fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <integer-literal> ::= $0 <number>
6199fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << "$0";
6209fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // Make sure booleans are encoded as 0/1.
6219fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  if (T->isBooleanType())
6229fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    Out << (Value.getBoolValue() ? "0" : "A@");
6239fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  else
6249fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    mangleNumber(Value);
6259fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
6269fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
6279fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davisvoid
6289fd2359ee3b140557b808e4b79bc73a3b9d62304Charles DavisMicrosoftCXXNameMangler::mangleTemplateArgs(const TemplateArgument *TemplateArgs,
6299fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                            unsigned NumTemplateArgs,
6309fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis                                            SourceLocation InstantiationLoc) {
6319fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  // <template-args> ::= {<type> | <integer-literal>}+ @
6329fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  for (unsigned int i = 0; i < NumTemplateArgs; ++i) {
6339fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    const TemplateArgument &TA = TemplateArgs[i];
6349fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    switch (TA.getKind()) {
6359fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  	case TemplateArgument::Null:
6369fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  		llvm_unreachable("Can't mangle null template arguments!");
6379fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    case TemplateArgument::Type:
6389fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      mangleType(TA.getAsType());
6399fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      break;
6409fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    case TemplateArgument::Integral:
641855243789cb44799c03f4c7216d3d6308805f549Benjamin Kramer      mangleIntegerLiteral(TA.getIntegralType(), TA.getAsIntegral());
6429fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis      break;
6439fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    default: {
6449fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    	// Issue a diagnostic.
6459fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    	DiagnosticsEngine &Diags = Context.getDiags();
6469fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    	unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
6479fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    		"cannot yet mangle this %select{null|type|pointer/reference|integral|template|"
6489fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    		"template pack expansion|expression|parameter pack}0 template argument");
6499fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    	Diags.Report(InstantiationLoc, DiagID)
6509fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    		<< TA.getKind();
6519fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
6529fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis    }
6539fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  }
6549fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis  Out << '@';
6559fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis}
6569fd2359ee3b140557b808e4b79bc73a3b9d62304Charles Davis
65714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
65814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                               bool IsMember) {
65914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <cvr-qualifiers> ::= [E] [F] [I] <base-cvr-qualifiers>
66014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // 'E' means __ptr64 (32-bit only); 'F' means __unaligned (32/64-bit only);
66114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // 'I' means __restrict (32/64-bit).
66214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Note that the MSVC __restrict keyword isn't the same as the C99 restrict
66314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // keyword!
66414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <base-cvr-qualifiers> ::= A  # near
66514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= B  # near const
66614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= C  # near volatile
66714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= D  # near const volatile
66814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= E  # far (16-bit)
66914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= F  # far const (16-bit)
67014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= G  # far volatile (16-bit)
67114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= H  # far const volatile (16-bit)
67214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= I  # huge (16-bit)
67314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= J  # huge const (16-bit)
67414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= K  # huge volatile (16-bit)
67514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= L  # huge const volatile (16-bit)
67614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= M <basis> # based
67714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= N <basis> # based const
67814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= O <basis> # based volatile
67914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= P <basis> # based const volatile
68014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Q  # near member
68114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= R  # near const member
68214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= S  # near volatile member
68314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= T  # near const volatile member
68414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= U  # far member (16-bit)
68514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= V  # far const member (16-bit)
68614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= W  # far volatile member (16-bit)
68714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= X  # far const volatile member (16-bit)
68814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Y  # huge member (16-bit)
68914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= Z  # huge const member (16-bit)
69014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 0  # huge volatile member (16-bit)
69114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 1  # huge const volatile member (16-bit)
69214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 2 <basis> # based member
69314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 3 <basis> # based const member
69414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 4 <basis> # based volatile member
69514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 5 <basis> # based const volatile member
69614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 6  # near function (pointers only)
69714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 7  # far function (pointers only)
69814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 8  # near method (pointers only)
69914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= 9  # far method (pointers only)
70014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _A <basis> # based function (pointers only)
70114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _B <basis> # based function (far?) (pointers only)
70214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _C <basis> # based method (pointers only)
70314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _D <basis> # based method (far?) (pointers only)
70414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                       ::= _E # block (Clang)
70514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <basis> ::= 0 # __based(void)
70614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 1 # __based(segment)?
70714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 2 <name> # __based(name)
70814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 3 # ?
70914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 4 # ?
71014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //         ::= 5 # not really based
71114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!IsMember) {
71214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (!Quals.hasVolatile()) {
71314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
71414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'A';
71514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
71614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'B';
71714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
71814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
71914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'C';
72014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
72114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'D';
72214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
72314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
72414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (!Quals.hasVolatile()) {
72514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
72614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'Q';
72714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
72814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'R';
72914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
73014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasConst())
73114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'S';
73214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else
73314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'T';
73414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
73514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
73614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
73714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // FIXME: For now, just drop all extension qualifiers on the floor.
73814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
73914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
74014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(QualType T) {
74114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Only operate on the canonical type!
74214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  T = getASTContext().getCanonicalType(T);
74314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
74414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Qualifiers Quals = T.getLocalQualifiers();
74514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Quals) {
74614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // We have to mangle these now, while we still have enough information.
74714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <pointer-cvr-qualifiers> ::= P  # pointer
74814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    //                          ::= Q  # const pointer
74914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    //                          ::= R  # volatile pointer
75014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    //                          ::= S  # const volatile pointer
75114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (T->isAnyPointerType() || T->isMemberPointerType() ||
75214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        T->isBlockPointerType()) {
75314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      if (!Quals.hasVolatile())
75414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        Out << 'Q';
75514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      else {
75614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (!Quals.hasConst())
75714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'R';
75814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
75914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'S';
76014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      }
76114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else
76214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // Just emit qualifiers like normal.
76314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // NB: When we mangle a pointer/reference type, and the pointee
76414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // type has no qualifiers, the lack of qualifier gets mangled
76514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // in there.
76614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      mangleQualifiers(Quals, false);
76714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else if (T->isAnyPointerType() || T->isMemberPointerType() ||
76814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne             T->isBlockPointerType()) {
76914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'P';
77014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
77114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getTypeClass()) {
77214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define ABSTRACT_TYPE(CLASS, PARENT)
77314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define NON_CANONICAL_TYPE(CLASS, PARENT) \
77414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournecase Type::CLASS: \
77514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournellvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
77614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournereturn;
77714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#define TYPE(CLASS, PARENT) \
77814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournecase Type::CLASS: \
77914110477887e3dc168ffc6c191e72d705051f99ePeter CollingbournemangleType(static_cast<const CLASS##Type*>(T.getTypePtr())); \
78014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournebreak;
78114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne#include "clang/AST/TypeNodes.def"
78214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
78314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
78414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
78514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const BuiltinType *T) {
78614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <type>         ::= <builtin-type>
78714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //  <builtin-type> ::= X  # void
78814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= C  # signed char
78914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= D  # char
79014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= E  # unsigned char
79114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= F  # short
79214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= G  # unsigned short (or wchar_t if it's not a builtin)
79314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= H  # int
79414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= I  # unsigned int
79514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= J  # long
79614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= K  # unsigned long
79714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     L  # <none>
79814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= M  # float
79914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= N  # double
80014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= O  # long double (__float80 is mangled differently)
80114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _J # long long, __int64
80214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _K # unsigned long long, __int64
80314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _L # __int128
80414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _M # unsigned __int128
80514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _N # bool
80614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     _O # <array in parameter>
80714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _T # __float80 (Intel)
80814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _W # wchar_t
80914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= _Z # __float80 (Digital Mars)
81014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getKind()) {
81114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Void: Out << 'X'; break;
81214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::SChar: Out << 'C'; break;
81314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char_U: case BuiltinType::Char_S: Out << 'D'; break;
81414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UChar: Out << 'E'; break;
81514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Short: Out << 'F'; break;
81614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UShort: Out << 'G'; break;
81714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Int: Out << 'H'; break;
81814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UInt: Out << 'I'; break;
81914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Long: Out << 'J'; break;
82014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ULong: Out << 'K'; break;
82114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Float: Out << 'M'; break;
82214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Double: Out << 'N'; break;
82314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // TODO: Determine size and mangle accordingly
82414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::LongDouble: Out << 'O'; break;
82514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::LongLong: Out << "_J"; break;
82614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ULongLong: Out << "_K"; break;
82714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Int128: Out << "_L"; break;
82814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::UInt128: Out << "_M"; break;
82914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Bool: Out << "_N"; break;
83014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::WChar_S:
83114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::WChar_U: Out << "_W"; break;
83214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
833e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define BUILTIN_TYPE(Id, SingletonId)
834e0a22d06888c13989b3f72db319f1d498bf69153John McCall#define PLACEHOLDER_TYPE(Id, SingletonId) \
835e0a22d06888c13989b3f72db319f1d498bf69153John McCall  case BuiltinType::Id:
836e0a22d06888c13989b3f72db319f1d498bf69153John McCall#include "clang/AST/BuiltinTypes.def"
83714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Dependent:
838e0a22d06888c13989b3f72db319f1d498bf69153John McCall    llvm_unreachable("placeholder types shouldn't get to name mangling");
839e0a22d06888c13989b3f72db319f1d498bf69153John McCall
84014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCId: Out << "PAUobjc_object@@"; break;
84114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCClass: Out << "PAUobjc_class@@"; break;
84214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::ObjCSel: Out << "PAUobjc_selector@@"; break;
84314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
84414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char16:
84514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::Char32:
846aa4a99b4a62615db243f7a5c433169f2fc704420Anton Korobeynikov  case BuiltinType::Half:
84714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  case BuiltinType::NullPtr:
848e0a22d06888c13989b3f72db319f1d498bf69153John McCall    assert(0 && "Don't know how to mangle this type yet");
84914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
85014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
85114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
85214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>          ::= <function-type>
85314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T) {
85414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Structors only appear in decls, so at this point we know it's not a
85514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // structor type.
85614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // I'll probably have mangleType(MemberPointerType) call the mangleType()
85714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // method directly.
85814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(T, NULL, false, false);
85914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
86014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T) {
86114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("Can't mangle K&R function prototypes");
86214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
86314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
86414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const FunctionType *T,
86514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         const FunctionDecl *D,
86614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         bool IsStructor,
86714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         bool IsInstMethod) {
86814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <function-type> ::= <this-cvr-qualifiers> <calling-convention>
86914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                     <return-type> <argument-list> <throw-spec>
87014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  const FunctionProtoType *Proto = cast<FunctionProtoType>(T);
87114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
87214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If this is a C++ instance method, mangle the CVR qualifiers for the
87314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // this pointer.
87414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsInstMethod)
87514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(Qualifiers::fromCVRMask(Proto->getTypeQuals()), false);
87614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
87714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleCallingConvention(T, IsInstMethod);
87814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
87914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <return-type> ::= <type>
88014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //               ::= @ # structors (they have no declared return type)
88114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsStructor)
88214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '@';
88314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else
88414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(Proto->getResultType());
88514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
88614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <argument-list> ::= X # void
88714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type>+ @
88814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                 ::= <type>* Z # varargs
88914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Proto->getNumArgs() == 0 && !Proto->isVariadic()) {
89014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'X';
89114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
89214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (D) {
8933a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // If we got a decl, use the type-as-written to make sure arrays
8943a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // get mangled right.  Note that we can't rely on the TSI
8953a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      // existing if (for example) the parameter was synthesized.
89614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      for (FunctionDecl::param_const_iterator Parm = D->param_begin(),
8973a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall             ParmEnd = D->param_end(); Parm != ParmEnd; ++Parm) {
8983a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall        if (TypeSourceInfo *typeAsWritten = (*Parm)->getTypeSourceInfo())
8993a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall          mangleType(typeAsWritten->getType());
9003a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall        else
9013a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall          mangleType((*Parm)->getType());
9023a8ac07956ac63bd202cdd3b9e4a2c6cefa888daJohn McCall      }
90314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else {
90414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(),
90514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne           ArgEnd = Proto->arg_type_end();
90614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne           Arg != ArgEnd; ++Arg)
90714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        mangleType(*Arg);
90814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
90914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <builtin-type>      ::= Z  # ellipsis
91014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (Proto->isVariadic())
91114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'Z';
91214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    else
91314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << '@';
91414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
91514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
91614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleThrowSpecification(Proto);
91714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
91814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
91914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) {
92014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <function-class> ::= A # private: near
92114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= B # private: far
92214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= C # private: static near
92314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= D # private: static far
92414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= E # private: virtual near
92514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= F # private: virtual far
92614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= G # private: thunk near
92714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= H # private: thunk far
92814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= I # protected: near
92914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= J # protected: far
93014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= K # protected: static near
93114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= L # protected: static far
93214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= M # protected: virtual near
93314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= N # protected: virtual far
93414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= O # protected: thunk near
93514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= P # protected: thunk far
93614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Q # public: near
93714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= R # public: far
93814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= S # public: static near
93914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= T # public: static far
94014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= U # public: virtual near
94114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= V # public: virtual far
94214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= W # public: thunk near
94314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= X # public: thunk far
94414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Y # global near
94514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                  ::= Z # global far
94614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
94714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    switch (MD->getAccess()) {
94814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      default:
94914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_private:
95014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
95114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'C';
95214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
95314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'E';
95414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
95514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'A';
95614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
95714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_protected:
95814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
95914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'K';
96014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
96114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'M';
96214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
96314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'I';
96414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        break;
96514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      case AS_public:
96614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        if (MD->isStatic())
96714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'S';
96814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else if (MD->isVirtual())
96914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'U';
97014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne        else
97114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne          Out << 'Q';
97214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
97314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else
97414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Y';
97514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
97614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T,
97714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                      bool IsInstMethod) {
97814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <calling-convention> ::= A # __cdecl
97914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= B # __export __cdecl
98014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= C # __pascal
98114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= D # __export __pascal
98214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= E # __thiscall
98314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= F # __export __thiscall
98414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= G # __stdcall
98514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= H # __export __stdcall
98614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= I # __fastcall
98714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //                      ::= J # __export __fastcall
98814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // The 'export' calling conventions are from a bygone era
98914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // (*cough*Win16*cough*) when functions were declared for export with
99014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // that keyword. (It didn't actually export them, it just made them so
99114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // that they could be in a DLL and somebody from another module could call
99214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // them.)
99314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  CallingConv CC = T->getCallConv();
99414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (CC == CC_Default)
99514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    CC = IsInstMethod ? getASTContext().getDefaultMethodCallConv() : CC_C;
99614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (CC) {
997414d8967e1d760ea1e19a4aca96b13777a8cf8c5Anton Korobeynikov    default:
998b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Unsupported CC for mangling");
99914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_Default:
100014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_C: Out << 'A'; break;
100114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86Pascal: Out << 'C'; break;
100214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86ThisCall: Out << 'E'; break;
100314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86StdCall: Out << 'G'; break;
100414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case CC_X86FastCall: Out << 'I'; break;
100514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
100614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
100714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleThrowSpecification(
100814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                const FunctionProtoType *FT) {
100914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // <throw-spec> ::= Z # throw(...) (default)
101014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //              ::= @ # throw() or __declspec/__attribute__((nothrow))
101114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  //              ::= <type>+
101214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // NOTE: Since the Microsoft compiler ignores throw specifications, they are
101314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // all actually mangled as 'Z'. (They're ignored because their associated
101414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // functionality isn't implemented, and probably never will be.)
101514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'Z';
101614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
101714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
101814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const UnresolvedUsingType *T) {
1019b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle UnresolvedUsingTypes yet!");
102014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
102114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
102214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>        ::= <union-type> | <struct-type> | <class-type> | <enum-type>
102314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <union-type>  ::= T <name>
102414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <struct-type> ::= U <name>
102514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <class-type>  ::= V <name>
102614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <enum-type>   ::= W <size> <name>
102714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const EnumType *T) {
102814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const TagType*>(T));
102914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
103014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const RecordType *T) {
103114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const TagType*>(T));
103214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
103314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const TagType *T) {
103414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  switch (T->getDecl()->getTagKind()) {
103514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Union:
103614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'T';
103714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
103814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Struct:
103914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'U';
104014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
104114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Class:
104214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'V';
104314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
104414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    case TTK_Enum:
104514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'W';
104614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << getASTContext().getTypeSizeInChars(
104714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                cast<EnumDecl>(T->getDecl())->getIntegerType()).getQuantity();
104814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      break;
104914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
105014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(T->getDecl());
105114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
105214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
105314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>       ::= <array-type>
105414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <array-type> ::= P <cvr-qualifiers> [Y <dimension-count> <dimension>+]
105514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                                                  <element-type> # as global
105614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//              ::= Q <cvr-qualifiers> [Y <dimension-count> <dimension>+]
105714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                                                  <element-type> # as param
105814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// It's supposed to be the other way around, but for some strange reason, it
105914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// isn't. Today this behavior is retained for the sole purpose of backwards
106014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// compatibility.
106114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ArrayType *T, bool IsGlobal) {
106214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // This isn't a recursive mangling, so now we have to do it all in this
106314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // one call.
106414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (IsGlobal)
106514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'P';
106614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  else
106714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Q';
106814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleExtraDimensions(T->getElementType());
106914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
107014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ConstantArrayType *T) {
107114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
107214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
107314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const VariableArrayType *T) {
107414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
107514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
107614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const DependentSizedArrayType *T) {
107714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
107814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
107914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const IncompleteArrayType *T) {
108014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(static_cast<const ArrayType *>(T), false);
108114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
108214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleExtraDimensions(QualType ElementTy) {
10835f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  SmallVector<llvm::APInt, 3> Dimensions;
108414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  for (;;) {
108514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (ElementTy->isConstantArrayType()) {
108614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      const ConstantArrayType *CAT =
108714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      static_cast<const ConstantArrayType *>(ElementTy.getTypePtr());
108814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Dimensions.push_back(CAT->getSize());
108914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      ElementTy = CAT->getElementType();
109014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isVariableArrayType()) {
1091b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Don't know how to mangle VLAs!");
109214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isDependentSizedArrayType()) {
109314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // The dependent expression has to be folded into a constant (TODO).
1094b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie      llvm_unreachable("Don't know how to mangle dependent-sized arrays!");
109514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    } else if (ElementTy->isIncompleteArrayType()) continue;
109614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    else break;
109714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
109814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleQualifiers(ElementTy.getQualifiers(), false);
109914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // If there are any additional dimensions, mangle them now.
110014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (Dimensions.size() > 0) {
110114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'Y';
110214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // <dimension-count> ::= <number> # number of extra dimensions
110314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleNumber(Dimensions.size());
110414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    for (unsigned Dim = 0; Dim < Dimensions.size(); ++Dim) {
110514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      mangleNumber(Dimensions[Dim].getLimitedValue());
110614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    }
110714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
110814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(ElementTy.getLocalUnqualifiedType());
110914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
111014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
111114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type>                   ::= <pointer-to-member-type>
111214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <pointer-to-member-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers>
111314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne//                                                          <class name> <type>
111414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const MemberPointerType *T) {
111514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeType = T->getPointeeType();
111614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) {
111714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '8';
111814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleName(cast<RecordType>(T->getClass())->getDecl());
111914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(FPT, NULL, false, true);
112014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
112114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleQualifiers(PointeeType.getQualifiers(), true);
112214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleName(cast<RecordType>(T->getClass())->getDecl());
112314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(PointeeType.getLocalUnqualifiedType());
112414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
112514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
112614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
112714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const TemplateTypeParmType *T) {
1128b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle TemplateTypeParmTypes yet!");
112914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
113014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1131c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregorvoid MicrosoftCXXNameMangler::mangleType(
1132c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor                                       const SubstTemplateTypeParmPackType *T) {
1133b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable(
1134c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor         "Don't know how to mangle SubstTemplateTypeParmPackTypes yet!");
1135c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor}
1136c3069d618f4661d923cb1b5c4525b082fce73b04Douglas Gregor
113714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type> ::= <pointer-type>
113814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <pointer-type> ::= <pointer-cvr-qualifiers> <cvr-qualifiers> <type>
113914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const PointerType *T) {
114014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeTy = T->getPointeeType();
114114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (PointeeTy->isArrayType()) {
114214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Pointers to arrays are mangled like arrays.
114314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleExtraDimensions(T->getPointeeType());
114414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else if (PointeeTy->isFunctionType()) {
114514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Function pointers are special.
114614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << '6';
114714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(static_cast<const FunctionType *>(PointeeTy.getTypePtr()),
114814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne               NULL, false, false);
114914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  } else {
115014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    if (!PointeeTy.hasQualifiers())
115114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      // Lack of qualifiers is mangled as 'A'.
115214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne      Out << 'A';
115314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    mangleType(PointeeTy);
115414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  }
115514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
115614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ObjCObjectPointerType *T) {
115714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // Object pointers never have qualifiers.
115814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'A';
115914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(T->getPointeeType());
116014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
116114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
116214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <type> ::= <reference-type>
116314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne// <reference-type> ::= A <cvr-qualifiers> <type>
116414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const LValueReferenceType *T) {
116514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'A';
116614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  QualType PointeeTy = T->getPointeeType();
116714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  if (!PointeeTy.hasQualifiers())
116814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    // Lack of qualifiers is mangled as 'A'.
116914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne    Out << 'A';
117014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(PointeeTy);
117114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
117214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
117314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const RValueReferenceType *T) {
1174b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle RValueReferenceTypes yet!");
117514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
117614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
117714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ComplexType *T) {
1178b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle ComplexTypes yet!");
117914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
118014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
118114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const VectorType *T) {
1182b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle VectorTypes yet!");
118314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
118414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ExtVectorType *T) {
1185b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle ExtVectorTypes yet!");
118614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
118714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const DependentSizedExtVectorType *T) {
1188b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable(
1189b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie                  "Don't know how to mangle DependentSizedExtVectorTypes yet!");
119014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
119114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
119214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ObjCInterfaceType *T) {
119314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // ObjC interfaces have structs underlying them.
119414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << 'U';
119514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleName(T->getDecl());
119614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
119714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
119814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const ObjCObjectType *T) {
119914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // We don't allow overloading by different protocol qualification,
120014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  // so mangling them isn't necessary.
120114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(T->getBaseType());
120214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
120314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
120414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const BlockPointerType *T) {
120514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  Out << "_E";
120614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  mangleType(T->getPointeeType());
120714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
120814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
120914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const InjectedClassNameType *T) {
1210b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle InjectedClassNameTypes yet!");
121114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
121214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
121314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const TemplateSpecializationType *T) {
1214b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle TemplateSpecializationTypes yet!");
121514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
121614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
121714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const DependentNameType *T) {
1218b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle DependentNameTypes yet!");
121914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
122014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
122114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(
122214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                 const DependentTemplateSpecializationType *T) {
1223b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable(
122414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne         "Don't know how to mangle DependentTemplateSpecializationTypes yet!");
122514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
122614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
122714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const PackExpansionType *T) {
1228b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle PackExpansionTypes yet!");
122914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
123014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
123114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const TypeOfType *T) {
1232b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle TypeOfTypes yet!");
123314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
123414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
123514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const TypeOfExprType *T) {
1236b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle TypeOfExprTypes yet!");
123714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
123814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
123914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftCXXNameMangler::mangleType(const DecltypeType *T) {
1240b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle DecltypeTypes yet!");
124114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
124214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1243ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Huntvoid MicrosoftCXXNameMangler::mangleType(const UnaryTransformType *T) {
1244b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle UnaryTransformationTypes yet!");
1245ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt}
1246ca63c200346c0ca9e00194ec6e34a5a7b0ed9321Sean Hunt
124734b41d939a1328f484511c6002ba2456db879a29Richard Smithvoid MicrosoftCXXNameMangler::mangleType(const AutoType *T) {
1248b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Don't know how to mangle AutoTypes yet!");
124934b41d939a1328f484511c6002ba2456db879a29Richard Smith}
125034b41d939a1328f484511c6002ba2456db879a29Richard Smith
1251b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedmanvoid MicrosoftCXXNameMangler::mangleType(const AtomicType *T) {
1252b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman  llvm_unreachable("Don't know how to mangle AtomicTypes yet!");
1253b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman}
1254b001de7458d17c17e6d8b8034c7cfcefd3b70c00Eli Friedman
125514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleName(const NamedDecl *D,
12565f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                        raw_ostream &Out) {
125714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) &&
125814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne         "Invalid mangleName() call, argument is not a variable or function!");
125914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  assert(!isa<CXXConstructorDecl>(D) && !isa<CXXDestructorDecl>(D) &&
126014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne         "Invalid mangleName() call on 'structor decl!");
126114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
126214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
126314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                 getASTContext().getSourceManager(),
126414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                 "Mangling declaration");
126514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
1266c4850c2aa4c281a352e228aafc51fb1e30dcad02Rafael Espindola  MicrosoftCXXNameMangler Mangler(*this, Out);
126714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return Mangler.mangle(D);
126814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
126914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleThunk(const CXXMethodDecl *MD,
127014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                         const ThunkInfo &Thunk,
12715f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                         raw_ostream &) {
1272b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Can't yet mangle thunks!");
127314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
127414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *DD,
127514110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                CXXDtorType Type,
127614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                const ThisAdjustment &,
12775f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                raw_ostream &) {
1278b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Can't yet mangle destructor thunks!");
127914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
128014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXVTable(const CXXRecordDecl *RD,
12815f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                             raw_ostream &) {
1282b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Can't yet mangle virtual tables!");
128314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
128414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXVTT(const CXXRecordDecl *RD,
12855f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                          raw_ostream &) {
128614110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("The MS C++ ABI does not have virtual table tables!");
128714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
128814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXCtorVTable(const CXXRecordDecl *RD,
128914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                 int64_t Offset,
129014110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                                 const CXXRecordDecl *Type,
12915f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                 raw_ostream &) {
129214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  llvm_unreachable("The MS C++ ABI does not have constructor vtables!");
129314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
129414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXRTTI(QualType T,
12955f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                           raw_ostream &) {
1296b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Can't yet mangle RTTI!");
129714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
129814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXRTTIName(QualType T,
12995f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                               raw_ostream &) {
1300b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Can't yet mangle RTTI names!");
130114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
130214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXCtor(const CXXConstructorDecl *D,
130314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                           CXXCtorType Type,
130450118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer                                           raw_ostream & Out) {
130550118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  MicrosoftCXXNameMangler mangler(*this, Out);
130650118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  mangler.mangle(D);
130714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
130814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleCXXDtor(const CXXDestructorDecl *D,
130914110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne                                           CXXDtorType Type,
131050118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer                                           raw_ostream & Out) {
131150118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  MicrosoftCXXNameMangler mangler(*this, Out);
131250118da99d3c04eb14747cfdc44a9e1d56432aeaMichael J. Spencer  mangler.mangle(D);
131314110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
131414110477887e3dc168ffc6c191e72d705051f99ePeter Collingbournevoid MicrosoftMangleContext::mangleReferenceTemporary(const clang::VarDecl *,
13155f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner                                                      raw_ostream &) {
1316b219cfc4d75f0a03630b7c4509ef791b7e97b2c8David Blaikie  llvm_unreachable("Can't yet mangle reference temporaries!");
131714110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
131814110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne
131914110477887e3dc168ffc6c191e72d705051f99ePeter CollingbourneMangleContext *clang::createMicrosoftMangleContext(ASTContext &Context,
1320d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie                                                   DiagnosticsEngine &Diags) {
132114110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne  return new MicrosoftMangleContext(Context, Diags);
132214110477887e3dc168ffc6c191e72d705051f99ePeter Collingbourne}
1323