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