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