17f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===--- ItaniumMangle.cpp - Itanium C++ Name Mangling ----------*- C++ -*-===// 27f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 37f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// The LLVM Compiler Infrastructure 47f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 57f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// This file is distributed under the University of Illinois Open Source 67f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// License. See LICENSE.TXT for details. 77f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 87f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 97f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// Implements C++ name mangling according to the Itanium C++ ABI, 117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// which is used in GCC 3.2 and newer (and many compilers that are 127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ABI-compatible with GCC): 137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 14651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines// http://mentorembedded.github.io/cxx-abi/abi.html#mangling 157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei//===----------------------------------------------------------------------===// 177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Mangle.h" 187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ASTContext.h" 197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Attr.h" 207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/Decl.h" 217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclCXX.h" 227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclObjC.h" 237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/DeclTemplate.h" 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/AST/Expr.h" 257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ExprCXX.h" 267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/ExprObjC.h" 277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeLoc.h" 287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/ABI.h" 297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/SourceManager.h" 307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/Basic/TargetInfo.h" 317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/ADT/StringExtras.h" 327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/ErrorHandling.h" 337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "llvm/Support/raw_ostream.h" 347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define MANGLE_CHECKER 0 367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if MANGLE_CHECKER 387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include <cxxabi.h> 397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif 407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiusing namespace clang; 427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeinamespace { 447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Retrieve the declaration context that should be used when mangling 467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// the given declaration. 477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const DeclContext *getEffectiveDeclContext(const Decl *D) { 487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The ABI assumes that lambda closure types that occur within 497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // default arguments live in the context of the function. However, due to 507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the way in which Clang parses and creates function declarations, this is 517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // not the case: the lambda closure type ends up living in the context 527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // where the function itself resides, because the function declaration itself 537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // had not yet been created. Fix the context here. 547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(D)) { 557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (RD->isLambda()) 567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ParmVarDecl *ContextParam 577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast_or_null<ParmVarDecl>(RD->getLambdaContextDecl())) 587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ContextParam->getDeclContext(); 597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 60e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman 61e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman // Perform the same check for block literals. 62e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { 63e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman if (ParmVarDecl *ContextParam 64e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) 65e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman return ContextParam->getDeclContext(); 66e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman } 677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 688443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman const DeclContext *DC = D->getDeclContext(); 698443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (const CapturedDecl *CD = dyn_cast<CapturedDecl>(DC)) 708443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman return getEffectiveDeclContext(CD); 718443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 728443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman return DC; 737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const DeclContext *getEffectiveParentContext(const DeclContext *DC) { 767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return getEffectiveDeclContext(cast<Decl>(DC)); 777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 788443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 798443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedmanstatic bool isLocalContainerContext(const DeclContext *DC) { 808443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman return isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC) || isa<BlockDecl>(DC); 818443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman} 828443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 831847c718fe61f8e99d77c60ab77c9bf2ad4d77aaEli Friedmanstatic const RecordDecl *GetLocalClassDecl(const Decl *D) { 841cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman const DeclContext *DC = getEffectiveDeclContext(D); 857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!DC->isNamespace() && !DC->isTranslationUnit()) { 868443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (isLocalContainerContext(DC)) 871847c718fe61f8e99d77c60ab77c9bf2ad4d77aaEli Friedman return dyn_cast<RecordDecl>(D); 881cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman D = cast<Decl>(DC); 891cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman DC = getEffectiveDeclContext(D); 907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const FunctionDecl *getStructor(const FunctionDecl *fn) { 957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FunctionTemplateDecl *ftd = fn->getPrimaryTemplate()) 967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return ftd->getTemplatedDecl(); 977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return fn; 997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 1007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const NamedDecl *getStructor(const NamedDecl *decl) { 1027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *fn = dyn_cast_or_null<FunctionDecl>(decl); 1037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return (fn ? getStructor(fn) : decl); 1047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic bool isLambda(const NamedDecl *ND) { 107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(ND); 108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (!Record) 109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return Record->isLambda(); 112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 1147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const unsigned UnknownArity = ~0U; 1157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11611f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovclass ItaniumMangleContextImpl : public ItaniumMangleContext { 1175e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman typedef std::pair<const DeclContext*, IdentifierInfo*> DiscriminatorKeyTy; 1185e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman llvm::DenseMap<DiscriminatorKeyTy, unsigned> Discriminator; 1197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<const NamedDecl*, unsigned> Uniquifier; 1207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic: 12211f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov explicit ItaniumMangleContextImpl(ASTContext &Context, 12311f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov DiagnosticsEngine &Diags) 12411f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov : ItaniumMangleContext(Context, Diags) {} 1257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// @name Mangler Entry Points 1277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// @{ 1287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 129651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool shouldMangleCXXName(const NamedDecl *D) override; 130651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool shouldMangleStringLiteral(const StringLiteral *) override { 131651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 132651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 133651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleCXXName(const NamedDecl *D, raw_ostream &) override; 134651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk, 135651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_ostream &) override; 1367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type, 1377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ThisAdjustment &ThisAdjustment, 138651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_ostream &) override; 1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void mangleReferenceTemporary(const VarDecl *D, unsigned ManglingNumber, 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines raw_ostream &) override; 141651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleCXXVTable(const CXXRecordDecl *RD, raw_ostream &) override; 142651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleCXXVTT(const CXXRecordDecl *RD, raw_ostream &) override; 1437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset, 144651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines const CXXRecordDecl *Type, raw_ostream &) override; 145651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleCXXRTTI(QualType T, raw_ostream &) override; 146651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleCXXRTTIName(QualType T, raw_ostream &) override; 147651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleTypeName(QualType T, raw_ostream &) override; 1487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type, 149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_ostream &) override; 1507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type, 151651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_ostream &) override; 1527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 153651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleStaticGuardVariable(const VarDecl *D, raw_ostream &) override; 154651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleDynamicInitializer(const VarDecl *D, raw_ostream &Out) override; 155651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleDynamicAtExitDestructor(const VarDecl *D, 156651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_ostream &Out) override; 157651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleItaniumThreadLocalInit(const VarDecl *D, raw_ostream &) override; 158651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleItaniumThreadLocalWrapper(const VarDecl *D, 159651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_ostream &) override; 160651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 161651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void mangleStringLiteral(const StringLiteral *, raw_ostream &) override; 1627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool getNextDiscriminator(const NamedDecl *ND, unsigned &disc) { 1645e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman // Lambda closure types are already numbered. 165651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (isLambda(ND)) 166651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return false; 1675e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman 1685e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman // Anonymous tags are already numbered. 1695e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (const TagDecl *Tag = dyn_cast<TagDecl>(ND)) { 1705e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (Tag->getName().empty() && !Tag->getTypedefNameForAnonDecl()) 1715e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman return false; 1725e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman } 1735e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman 1745e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman // Use the canonical number for externally visible decls. 1755e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (ND->isExternallyVisible()) { 1765e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman unsigned discriminator = getASTContext().getManglingNumber(ND); 1775e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (discriminator == 1) 1785e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman return false; 1795e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman disc = discriminator - 2; 1805e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman return true; 1815e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman } 1825e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman 1835e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman // Make up a reasonable number for internal decls. 1847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned &discriminator = Uniquifier[ND]; 1855e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (!discriminator) { 1865e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman const DeclContext *DC = getEffectiveDeclContext(ND); 1875e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman discriminator = ++Discriminator[std::make_pair(DC, ND->getIdentifier())]; 1885e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman } 1897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (discriminator == 1) 1907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 1917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei disc = discriminator-2; 1927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 1937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 1947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// @} 1957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 1967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// CXXNameMangler - Manage the mangling of a single name. 1987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiclass CXXNameMangler { 19911f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov ItaniumMangleContextImpl &Context; 2007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei raw_ostream &Out; 2017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// The "structor" is the top-level declaration being mangled, if 2037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// that's not a template specialization; otherwise it's the pattern 2047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// for that specialization. 2057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const NamedDecl *Structor; 2067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned StructorType; 2077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// SeqID - The next subsitution sequence number. 2097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned SeqID; 2107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei class FunctionTypeDepthState { 2127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Bits; 2137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei enum { InResultTypeMask = 1 }; 2157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei public: 2177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepthState() : Bits(0) {} 2187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// The number of function types we're inside. 2207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned getDepth() const { 2217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Bits >> 1; 2227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /// True if we're in the return type of the innermost function type. 2257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isInResultType() const { 2267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Bits & InResultTypeMask; 2277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepthState push() { 2307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepthState tmp = *this; 2317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits = (Bits & ~InResultTypeMask) + 2; 2327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return tmp; 2337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void enterResultType() { 2367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits |= InResultTypeMask; 2377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void leaveResultType() { 2407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits &= ~InResultTypeMask; 2417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void pop(FunctionTypeDepthState saved) { 2447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(getDepth() == saved.getDepth() + 1); 2457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Bits = saved.Bits; 2467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } FunctionTypeDepth; 2497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<uintptr_t, unsigned> Substitutions; 2517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ASTContext &getASTContext() const { return Context.getASTContext(); } 2537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeipublic: 25511f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_, 2566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const NamedDecl *D = nullptr) 2577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(0), 2587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SeqID(0) { 2597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // These can't be mangled without a ctor type or dtor type. 2607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!D || (!isa<CXXDestructorDecl>(D) && 2617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !isa<CXXConstructorDecl>(D))); 2627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26311f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_, 2647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXConstructorDecl *D, CXXCtorType Type) 2657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type), 2667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SeqID(0) { } 26711f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov CXXNameMangler(ItaniumMangleContextImpl &C, raw_ostream &Out_, 2687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXDestructorDecl *D, CXXDtorType Type) 2697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : Context(C), Out(Out_), Structor(getStructor(D)), StructorType(Type), 2707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SeqID(0) { } 2717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#if MANGLE_CHECKER 2737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ~CXXNameMangler() { 2747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Out.str()[0] == '\01') 2757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 2767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei int status = 0; 2787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei char *result = abi::__cxa_demangle(Out.str().str().c_str(), 0, 0, &status); 2797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(status == 0 && "Could not demangle mangled name!"); 2807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei free(result); 2817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 2827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#endif 2837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei raw_ostream &getStream() { return Out; } 2847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangle(const NamedDecl *D, StringRef Prefix = "_Z"); 2867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleCallOffset(int64_t NonVirtual, int64_t Virtual); 2877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleNumber(const llvm::APSInt &I); 2887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleNumber(int64_t Number); 2897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleFloat(const llvm::APFloat &F); 2907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleFunctionEncoding(const FunctionDecl *FD); 2916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void mangleSeqID(unsigned SeqID); 2927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleName(const NamedDecl *ND); 2937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleType(QualType T); 2947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleNameOrStandardSubstitution(const NamedDecl *ND); 2957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeiprivate: 2976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 2987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool mangleSubstitution(const NamedDecl *ND); 2997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool mangleSubstitution(QualType T); 3007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool mangleSubstitution(TemplateName Template); 3017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool mangleSubstitution(uintptr_t Ptr); 3027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleExistingSubstitution(QualType type); 3047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleExistingSubstitution(TemplateName name); 3057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool mangleStandardSubstitution(const NamedDecl *ND); 3077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void addSubstitution(const NamedDecl *ND) { 3097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ND = cast<NamedDecl>(ND->getCanonicalDecl()); 3107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(reinterpret_cast<uintptr_t>(ND)); 3127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void addSubstitution(QualType T); 3147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void addSubstitution(TemplateName Template); 3157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void addSubstitution(uintptr_t Ptr); 3167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleUnresolvedPrefix(NestedNameSpecifier *qualifier, 3187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *firstQualifierLookup, 3197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool recursive = false); 3207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleUnresolvedName(NestedNameSpecifier *qualifier, 3217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *firstQualifierLookup, 3227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName name, 3237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned KnownArity = UnknownArity); 3247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleName(const TemplateDecl *TD, 3267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *TemplateArgs, 3277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs); 3287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleUnqualifiedName(const NamedDecl *ND) { 3297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnqualifiedName(ND, ND->getDeclName(), UnknownArity); 3307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 3317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name, 3327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned KnownArity); 3337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleUnscopedName(const NamedDecl *ND); 3347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleUnscopedTemplateName(const TemplateDecl *ND); 3357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleUnscopedTemplateName(TemplateName); 3367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleSourceName(const IdentifierInfo *II); 3378443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman void mangleLocalName(const Decl *D); 3388443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman void mangleBlockForPrefix(const BlockDecl *Block); 3398443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman void mangleUnqualifiedBlock(const BlockDecl *Block); 3407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleLambda(const CXXRecordDecl *Lambda); 3417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleNestedName(const NamedDecl *ND, const DeclContext *DC, 3427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool NoFunction=false); 3437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleNestedName(const TemplateDecl *TD, 3447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *TemplateArgs, 3457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs); 3467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void manglePrefix(NestedNameSpecifier *qualifier); 3477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void manglePrefix(const DeclContext *DC, bool NoFunction=false); 3487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void manglePrefix(QualType type); 349889221076f50fe7df37e2e61c967e941b8df383aEli Friedman void mangleTemplatePrefix(const TemplateDecl *ND, bool NoFunction=false); 3507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleTemplatePrefix(TemplateName Template); 3517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity); 3527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleQualifiers(Qualifiers Quals); 3537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleRefQualifier(RefQualifierKind RefQualifier); 3547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleObjCMethodName(const ObjCMethodDecl *MD); 3567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Declare manglers for every type class. 3587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(CLASS, PARENT) 3597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(CLASS, PARENT) 3607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T); 3617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 3627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleType(const TagType*); 3647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleType(TemplateName); 3657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleBareFunctionType(const FunctionType *T, 3667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool MangleReturnType); 3677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleNeonVectorType(const VectorType *T); 368b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover void mangleAArch64NeonVectorType(const VectorType *T); 3697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleIntegerLiteral(QualType T, const llvm::APSInt &Value); 3717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleMemberExpr(const Expr *base, bool isArrow, 3727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *qualifier, 3737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *firstQualifierLookup, 3747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName name, 3757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned knownArity); 3767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleExpression(const Expr *E, unsigned Arity = UnknownArity); 3777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleCXXCtorType(CXXCtorType T); 3787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleCXXDtorType(CXXDtorType T); 3797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleTemplateArgs(const ASTTemplateArgumentListInfo &TemplateArgs); 3817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleTemplateArgs(const TemplateArgument *TemplateArgs, 3827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs); 3837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleTemplateArgs(const TemplateArgumentList &AL); 3847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleTemplateArg(TemplateArgument A); 3857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleTemplateParameter(unsigned Index); 3877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei void mangleFunctionParam(const ParmVarDecl *parm); 3897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei}; 3907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 3917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 393d6be277ba4bf271c6de8ffcc8c46f060c8cbd4d5Rafael Espindolabool ItaniumMangleContextImpl::shouldMangleCXXName(const NamedDecl *D) { 3947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionDecl *FD = dyn_cast<FunctionDecl>(D); 395d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola if (FD) { 396d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola LanguageLinkage L = FD->getLanguageLinkage(); 397d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola // Overloadable functions need mangling. 398d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola if (FD->hasAttr<OverloadableAttr>()) 399d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola return true; 400d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola 40183dece57e3e3fd84dfd4299a89751e266e87c79dRafael Espindola // "main" is not mangled. 40283dece57e3e3fd84dfd4299a89751e266e87c79dRafael Espindola if (FD->isMain()) 403d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola return false; 404d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola 405d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola // C++ functions and those whose names are not a simple identifier need 406d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola // mangling. 407d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola if (!FD->getDeclName().isIdentifier() || L == CXXLanguageLinkage) 408d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola return true; 409747836e5c79b5e12fe9cfb9b724dc4edeb115419Rafael Espindola 41083dece57e3e3fd84dfd4299a89751e266e87c79dRafael Espindola // C functions are not mangled. 41183dece57e3e3fd84dfd4299a89751e266e87c79dRafael Espindola if (L == CLanguageLinkage) 412747836e5c79b5e12fe9cfb9b724dc4edeb115419Rafael Espindola return false; 413d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola } 4147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, no mangling is done outside C++ mode. 4167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!getASTContext().getLangOpts().CPlusPlus) 4177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 4187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 419d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola const VarDecl *VD = dyn_cast<VarDecl>(D); 420d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola if (VD) { 421d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola // C variables are not mangled. 422d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola if (VD->isExternC()) 423d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola return false; 424d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola 425d2fdd4256a2efc41365ccdd27a210d1d99a1fe3aRafael Espindola // Variables at global scope with non-internal linkage are not mangled 4267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = getEffectiveDeclContext(D); 4277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check for extern variable declared locally. 4287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isFunctionOrMethod() && D->hasLinkage()) 4297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!DC->isNamespace() && !DC->isTranslationUnit()) 4307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DC = getEffectiveParentContext(DC); 431ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (DC->isTranslationUnit() && D->getFormalLinkage() != InternalLinkage && 432ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo !isa<VarTemplateSpecializationDecl>(D)) 4337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 4347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 4357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 4377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangle(const NamedDecl *D, StringRef Prefix) { 4407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <mangled-name> ::= _Z <encoding> 4417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <data name> 4427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <special-name> 4437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << Prefix; 4447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D)) 4457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleFunctionEncoding(FD); 4467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const VarDecl *VD = dyn_cast<VarDecl>(D)) 4477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(VD); 448885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer else if (const IndirectFieldDecl *IFD = dyn_cast<IndirectFieldDecl>(D)) 449885d8bf8d06ddaf79ffe45a96aaa42621db44241David Majnemer mangleName(IFD->getAnonField()); 4507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 4517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(cast<FieldDecl>(D)); 4527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 4537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) { 4557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <encoding> ::= <function name> <bare-function-type> 4567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(FD); 4577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't mangle in the type if this isn't a decl we should typically mangle. 4597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Context.shouldMangleDeclName(FD)) 4607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 4617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 4626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (FD->hasAttr<EnableIfAttr>()) { 4636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FunctionTypeDepthState Saved = FunctionTypeDepth.push(); 4646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << "Ua9enable_ifI"; 4656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // FIXME: specific_attr_iterator iterates in reverse order. Fix that and use 4666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // it here. 4676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (AttrVec::const_reverse_iterator I = FD->getAttrs().rbegin(), 4686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines E = FD->getAttrs().rend(); 4696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines I != E; ++I) { 4706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines EnableIfAttr *EIA = dyn_cast<EnableIfAttr>(*I); 4716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (!EIA) 4726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines continue; 4736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << 'X'; 4746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleExpression(EIA->getCond()); 4756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << 'E'; 4766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 4776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << 'E'; 4786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines FunctionTypeDepth.pop(Saved); 4796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 4806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 4817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Whether the mangling of a function type includes the return type depends on 4827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the context and the nature of the function. The rules for deciding whether 4837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the return type is included are: 4847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 4857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 1. Template functions (names or types) have return types encoded, with 4867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the exceptions listed below. 4877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 2. Function types not appearing as part of a function name mangling, 4887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // e.g. parameters, pointer types, etc., have return type encoded, with the 4897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // exceptions listed below. 4907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 3. Non-template function names do not have return types encoded. 4917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 4927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The exceptions mentioned in (1) and (2) above, for which the return type is 4937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // never included, are 4947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 1. Constructors. 4957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 2. Destructors. 4967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 3. Conversion operator functions, e.g. operator int. 4977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool MangleReturnType = false; 4987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FunctionTemplateDecl *PrimaryTemplate = FD->getPrimaryTemplate()) { 4997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!(isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD) || 5007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<CXXConversionDecl>(FD))) 5017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MangleReturnType = true; 5027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the type of the primary template. 5047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FD = PrimaryTemplate->getTemplatedDecl(); 5057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleBareFunctionType(FD->getType()->getAs<FunctionType>(), 5087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei MangleReturnType); 5097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const DeclContext *IgnoreLinkageSpecDecls(const DeclContext *DC) { 5127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (isa<LinkageSpecDecl>(DC)) { 5137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DC = getEffectiveParentContext(DC); 5147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return DC; 5177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// isStd - Return whether a given namespace is the 'std' namespace. 5207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isStd(const NamespaceDecl *NS) { 5217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!IgnoreLinkageSpecDecls(getEffectiveParentContext(NS)) 5227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->isTranslationUnit()) 5237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 5247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const IdentifierInfo *II = NS->getOriginalNamespace()->getIdentifier(); 5267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return II && II->isStr("std"); 5277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// isStdNamespace - Return whether a given decl context is a toplevel 'std' 5307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// namespace. 5317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isStdNamespace(const DeclContext *DC) { 5327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!DC->isNamespace()) 5337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 5347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return isStd(cast<NamespaceDecl>(DC)); 5367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const TemplateDecl * 5397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiisTemplate(const NamedDecl *ND, const TemplateArgumentList *&TemplateArgs) { 5407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if we have a function template. 5417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)){ 5427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateDecl *TD = FD->getPrimaryTemplate()) { 5437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgs = FD->getTemplateSpecializationArgs(); 5447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return TD; 5457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if we have a class template. 5497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ClassTemplateSpecializationDecl *Spec = 5507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<ClassTemplateSpecializationDecl>(ND)) { 5517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateArgs = &Spec->getTemplateArgs(); 5527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Spec->getSpecializedTemplate(); 5537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 555ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo // Check if we have a variable template. 556ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo if (const VarTemplateSpecializationDecl *Spec = 557ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo dyn_cast<VarTemplateSpecializationDecl>(ND)) { 558ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo TemplateArgs = &Spec->getTemplateArgs(); 559ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo return Spec->getSpecializedTemplate(); 560ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo } 561ef4579cda09b73e3d4d98af48201da25adc29326Larisse Voufo 5626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 5637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 5647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleName(const NamedDecl *ND) { 5667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <name> ::= <nested-name> 5677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <unscoped-name> 5687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <unscoped-template-name> <template-args> 5697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <local-name> 5707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 5717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = getEffectiveDeclContext(ND); 5727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is an extern variable declared locally, the relevant DeclContext 5747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // is that of the containing namespace, or the translation unit. 5757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This is a hack; extern variables declared locally should have 5767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a proper semantic declaration context! 5778443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (isLocalContainerContext(DC) && ND->hasLinkage() && !isLambda(ND)) 5787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei while (!DC->isNamespace() && !DC->isTranslationUnit()) 5797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DC = getEffectiveParentContext(DC); 5807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (GetLocalClassDecl(ND)) { 5817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleLocalName(ND); 5827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 5837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DC = IgnoreLinkageSpecDecls(DC); 5867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isTranslationUnit() || isStdNamespace(DC)) { 5887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if we have a template. 5896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const TemplateArgumentList *TemplateArgs = nullptr; 5907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { 5917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnscopedTemplateName(TD); 5927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(*TemplateArgs); 5937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 5947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 5967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnscopedName(ND); 5977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 5987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 5997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6008443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (isLocalContainerContext(DC)) { 6017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleLocalName(ND); 6027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 6037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNestedName(ND, DC); 6067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleName(const TemplateDecl *TD, 6087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *TemplateArgs, 6097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs) { 6107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC = IgnoreLinkageSpecDecls(getEffectiveDeclContext(TD)); 6117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isTranslationUnit() || isStdNamespace(DC)) { 6137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnscopedTemplateName(TD); 6147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(TemplateArgs, NumTemplateArgs); 6157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 6167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNestedName(TD, TemplateArgs, NumTemplateArgs); 6177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleUnscopedName(const NamedDecl *ND) { 6217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unscoped-name> ::= <unqualified-name> 6227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= St <unqualified-name> # ::std:: 6237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isStdNamespace(IgnoreLinkageSpecDecls(getEffectiveDeclContext(ND)))) 6257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "St"; 6267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnqualifiedName(ND); 6287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleUnscopedTemplateName(const TemplateDecl *ND) { 6317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unscoped-template-name> ::= <unscoped-name> 6327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <substitution> 6337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (mangleSubstitution(ND)) 6347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 6357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-template-param> ::= <template-param> 6377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateTemplateParmDecl *TTP 6387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<TemplateTemplateParmDecl>(ND)) { 6397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(TTP->getIndex()); 6407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 6417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 6427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnscopedName(ND->getTemplatedDecl()); 6447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(ND); 6457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleUnscopedTemplateName(TemplateName Template) { 6487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unscoped-template-name> ::= <unscoped-name> 6497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <substitution> 6507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateDecl *TD = Template.getAsTemplateDecl()) 6517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return mangleUnscopedTemplateName(TD); 6527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (mangleSubstitution(Template)) 6547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 6557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentTemplateName *Dependent = Template.getAsDependentTemplateName(); 6577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Dependent && "Not a dependent template name?"); 6587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const IdentifierInfo *Id = Dependent->getIdentifier()) 6597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(Id); 6607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 6617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleOperatorName(Dependent->getOperator(), UnknownArity); 6627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(Template); 6647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 6657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleFloat(const llvm::APFloat &f) { 6677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ABI: 6687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Floating-point literals are encoded using a fixed-length 6697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // lowercase hexadecimal string corresponding to the internal 6707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // representation (IEEE on Itanium), high-order bytes first, 6717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // without leading zeroes. For example: "Lf bf800000 E" is -1.0f 6727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // on Itanium. 6737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The 'without leading zeroes' thing seems to be an editorial 6747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // mistake; see the discussion on cxx-abi-dev beginning on 6757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 2012-01-16. 6767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Our requirements here are just barely weird enough to justify 6787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // using a custom algorithm instead of post-processing APInt::toString(). 6797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APInt valueBits = f.bitcastToAPInt(); 6817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned numCharacters = (valueBits.getBitWidth() + 3) / 4; 6827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(numCharacters != 0); 6837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Allocate a buffer of the right number of characters. 685cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko SmallVector<char, 20> buffer; 6867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei buffer.set_size(numCharacters); 6877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Fill the buffer left-to-right. 6897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned stringIndex = 0; stringIndex != numCharacters; ++stringIndex) { 6907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The bit-index of the next hex digit. 6917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned digitBitIndex = 4 * (numCharacters - stringIndex - 1); 6927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Project out 4 bits starting at 'digitIndex'. 6947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::integerPart hexDigit 6957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = valueBits.getRawData()[digitBitIndex / llvm::integerPartWidth]; 6967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei hexDigit >>= (digitBitIndex % llvm::integerPartWidth); 6977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei hexDigit &= 0xF; 6987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 6997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Map that over to a lowercase hex digit. 7007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei static const char charForHex[16] = { 7017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei '0', '1', '2', '3', '4', '5', '6', '7', 7027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' 7037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei }; 7047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei buffer[stringIndex] = charForHex[hexDigit]; 7057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out.write(buffer.data(), numCharacters); 7087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleNumber(const llvm::APSInt &Value) { 7117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Value.isSigned() && Value.isNegative()) { 7127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'n'; 7137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Value.abs().print(Out, /*signed*/ false); 7147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 7157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Value.print(Out, /*signed*/ false); 7167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleNumber(int64_t Number) { 7207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <number> ::= [n] <non-negative decimal integer> 7217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Number < 0) { 7227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'n'; 7237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Number = -Number; 7247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << Number; 7277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleCallOffset(int64_t NonVirtual, int64_t Virtual) { 7307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <call-offset> ::= h <nv-offset> _ 7317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= v <v-offset> _ 7327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <nv-offset> ::= <offset number> # non-virtual base override 7337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <v-offset> ::= <offset number> _ <virtual offset number> 7347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # virtual base override, with vcall offset 7357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Virtual) { 7367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'h'; 7377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNumber(NonVirtual); 7387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 7397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 7407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'v'; 7437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNumber(NonVirtual); 7447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 7457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNumber(Virtual); 7467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 7477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::manglePrefix(QualType type) { 7507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateSpecializationType *TST = 7517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type->getAs<TemplateSpecializationType>()) { 7527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!mangleSubstitution(QualType(TST, 0))) { 7537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplatePrefix(TST->getTemplateName()); 7547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: GCC does not appear to mangle the template arguments when 7567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the template in question is a dependent template name. Should we 7577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // emulate that badness? 7587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(TST->getArgs(), TST->getNumArgs()); 7597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(QualType(TST, 0)); 7607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const DependentTemplateSpecializationType *DTST 7627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = type->getAs<DependentTemplateSpecializationType>()) { 7637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName Template 7647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = getASTContext().getDependentTemplateName(DTST->getQualifier(), 7657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DTST->getIdentifier()); 7667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplatePrefix(Template); 7677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: GCC does not appear to mangle the template arguments when 7697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the template in question is a dependent template name. Should we 7707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // emulate that badness? 7717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(DTST->getArgs(), DTST->getNumArgs()); 7727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 7737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We use the QualType mangle type variant here because it handles 7747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // substitutions. 7757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(type); 7767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 7777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 7787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Mangle everything prior to the base-unresolved-name in an unresolved-name. 7807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 7817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param firstQualifierLookup - the entity found by unqualified lookup 7827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// for the first name in the qualifier, if this is for a member expression 7837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \param recursive - true if this is being called recursively, 7847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// i.e. if there is more prefix "to the right". 7857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier, 7867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *firstQualifierLookup, 7877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool recursive) { 7887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // x, ::x 7907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unresolved-name> ::= [gs] <base-unresolved-name> 7917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // T::x / decltype(p)::x 7937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unresolved-name> ::= sr <unresolved-type> <base-unresolved-name> 7947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // T::N::x /decltype(p)::N::x 7967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unresolved-name> ::= srN <unresolved-type> <unresolved-qualifier-level>+ E 7977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <base-unresolved-name> 7987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 7997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // A::x, N::y, A<T>::z; "gs" means leading "::" 8007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unresolved-name> ::= [gs] sr <unresolved-qualifier-level>+ E 8017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <base-unresolved-name> 8027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (qualifier->getKind()) { 8047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Global: 8057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "gs"; 8067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We want an 'sr' unless this is the entire NNS. 8087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (recursive) 8097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "sr"; 8107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We never want an 'E' here. 8127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 8137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Namespace: 8157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (qualifier->getPrefix()) 8167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup, 8177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*recursive*/ true); 8187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 8197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "sr"; 8207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(qualifier->getAsNamespace()->getIdentifier()); 8217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::NamespaceAlias: 8237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (qualifier->getPrefix()) 8247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup, 8257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*recursive*/ true); 8267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 8277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "sr"; 8287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(qualifier->getAsNamespaceAlias()->getIdentifier()); 8297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpec: 8327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpecWithTemplate: { 8337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *type = qualifier->getAsType(); 8347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We only want to use an unresolved-type encoding if this is one of: 8367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // - a decltype 8377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // - a template type parameter 8387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // - a template template parameter with arguments 8397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // In all of these cases, we should have no prefix. 8407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (qualifier->getPrefix()) { 8417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup, 8427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*recursive*/ true); 8437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 8447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, all the cases want this. 8457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "sr"; 8467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 8477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Only certain other types are valid as prefixes; enumerate them. 8497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (type->getTypeClass()) { 8507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Builtin: 8517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Complex: 852651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case Type::Adjusted: 85312df246d6dea2ee1f92c186f922f1afcf499647aReid Kleckner case Type::Decayed: 8547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Pointer: 8557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::BlockPointer: 8567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::LValueReference: 8577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::RValueReference: 8587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::MemberPointer: 8597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ConstantArray: 8607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::IncompleteArray: 8617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::VariableArray: 8627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::DependentSizedArray: 8637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::DependentSizedExtVector: 8647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Vector: 8657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ExtVector: 8667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionProto: 8677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::FunctionNoProto: 8687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Enum: 8697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Paren: 8707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Elaborated: 8717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Attributed: 8727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Auto: 8737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::PackExpansion: 8747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObject: 8757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCInterface: 8767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::ObjCObjectPointer: 8777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Atomic: 8787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("type is illegal as a nested name specifier"); 8797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParmPack: 8817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: not clear how to mangle this! 8827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <class T...> class A { 8837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <class U...> void foo(decltype(T::foo(U())) x...); 8847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 8857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "_SUBSTPACK_"; 8867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 8877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 8887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unresolved-type> ::= <template-param> 8897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <decltype> 8907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <template-template-param> <template-args> 8917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // (this last is not official yet) 8927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOfExpr: 8937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TypeOf: 8947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Decltype: 8957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateTypeParm: 8967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnaryTransform: 8977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::SubstTemplateTypeParm: 8987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unresolvedType: 8997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!qualifier->getPrefix()); 9007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We only get here recursively if we're followed by identifiers. 9027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (recursive) Out << 'N'; 9037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This seems to do everything we want. It's not really 9057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // sanctioned for a substituted template parameter, though. 9067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(QualType(type, 0)); 9077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We never want to print 'E' directly after an unresolved-type, 9097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // so we return directly. 9107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 9117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Typedef: 9137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(cast<TypedefType>(type)->getDecl()->getIdentifier()); 9147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::UnresolvedUsing: 9177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(cast<UnresolvedUsingType>(type)->getDecl() 9187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getIdentifier()); 9197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::Record: 9227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(cast<RecordType>(type)->getDecl()->getIdentifier()); 9237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::TemplateSpecialization: { 9267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateSpecializationType *tst 9277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = cast<TemplateSpecializationType>(type); 9287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName name = tst->getTemplateName(); 9297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (name.getKind()) { 9307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::Template: 9317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::QualifiedTemplate: { 9327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateDecl *temp = name.getAsTemplateDecl(); 9337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the base is a template template parameter, this is an 9357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // unresolved type. 9367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(temp && "no template for template specialization type"); 9377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<TemplateTemplateParmDecl>(temp)) goto unresolvedType; 9387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(temp->getIdentifier()); 9407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::OverloadedTemplate: 9447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::DependentTemplate: 9457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("invalid base for a template specialization type"); 9467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParm: { 9487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubstTemplateTemplateParmStorage *subst 9497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = name.getAsSubstTemplateTemplateParm(); 9507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExistingSubstitution(subst->getReplacement()); 9517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParmPack: { 9557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: not clear how to mangle this! 9567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <template <class U> class T...> class A { 9577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <class U...> void foo(decltype(T<U>::foo) x...); 9587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 9597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "_SUBSTPACK_"; 9607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(tst->getArgs(), tst->getNumArgs()); 9657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::InjectedClassName: 9697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(cast<InjectedClassNameType>(type)->getDecl() 9707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ->getIdentifier()); 9717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::DependentName: 9747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(cast<DependentNameType>(type)->getIdentifier()); 9757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::DependentTemplateSpecialization: { 9787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DependentTemplateSpecializationType *tst 9797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = cast<DependentTemplateSpecializationType>(type); 9807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(tst->getIdentifier()); 9817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(tst->getArgs(), tst->getNumArgs()); 9827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 9867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 9877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Identifier: 9897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Member expressions can have these without prefixes. 9907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (qualifier->getPrefix()) { 9917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup, 9927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*recursive*/ true); 9937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (firstQualifierLookup) { 9947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 9957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Try to make a proper qualifier out of the lookup result, and 9967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // then just recurse on that. 9977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *newQualifier; 9987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TypeDecl *typeDecl = dyn_cast<TypeDecl>(firstQualifierLookup)) { 9997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType type = getASTContext().getTypeDeclType(typeDecl); 10007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Pretend we had a different nested name specifier. 10027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei newQualifier = NestedNameSpecifier::Create(getASTContext(), 10036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*prefix*/ nullptr, 10047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*template*/ false, 10057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei type.getTypePtr()); 10067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (NamespaceDecl *nspace = 10077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<NamespaceDecl>(firstQualifierLookup)) { 10087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei newQualifier = NestedNameSpecifier::Create(getASTContext(), 10096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*prefix*/ nullptr, 10107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei nspace); 10117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (NamespaceAliasDecl *alias = 10127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<NamespaceAliasDecl>(firstQualifierLookup)) { 10137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei newQualifier = NestedNameSpecifier::Create(getASTContext(), 10146bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines /*prefix*/ nullptr, 10157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei alias); 10167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 10177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // No sensible mangling to do here. 10186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines newQualifier = nullptr; 10197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (newQualifier) 10226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return mangleUnresolvedPrefix(newQualifier, /*lookup*/ nullptr, 10236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines recursive); 10247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 10267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "sr"; 10277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(qualifier->getAsIdentifier()); 10307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 10317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this was the innermost part of the NNS, and we fell out to 10347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // here, append an 'E'. 10357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!recursive) 10367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 10377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Mangle an unresolved-name, which is generally used for names which 10407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// weren't resolved to specific entities. 10417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleUnresolvedName(NestedNameSpecifier *qualifier, 10427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *firstQualifierLookup, 10437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName name, 10447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned knownArity) { 10457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (qualifier) mangleUnresolvedPrefix(qualifier, firstQualifierLookup); 10466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleUnqualifiedName(nullptr, name, knownArity); 10477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic const FieldDecl *FindFirstNamedDataMember(const RecordDecl *RD) { 10507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(RD->isAnonymousStructOrUnion() && 10517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Expected anonymous struct or union!"); 10527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1053651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : RD->fields()) { 10547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I->getIdentifier()) 1055651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return I; 10567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *RT = I->getType()->getAs<RecordType>()) 10587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FieldDecl *NamedDataMember = 10597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FindFirstNamedDataMember(RT->getDecl())) 10607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return NamedDataMember; 10616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 10627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We didn't find a named data member. 10646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return nullptr; 10657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 10667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, 10687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName Name, 10697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned KnownArity) { 10707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unqualified-name> ::= <operator-name> 10717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <ctor-dtor-name> 10727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <source-name> 10737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Name.getNameKind()) { 10747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::Identifier: { 10757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) { 10767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We must avoid conflicts between internally- and externally- 10777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // linked variable and function declaration names in the same TU: 10787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // void test() { extern void foo(); } 10797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // static void foo(); 10807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This naming convention is the same as that followed by GCC, 10817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // though it shouldn't actually matter. 1082181e3ecc0907ae0103586a9f4db52241995a8267Rafael Espindola if (ND && ND->getFormalLinkage() == InternalLinkage && 10837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getEffectiveDeclContext(ND)->isFileContext()) 10847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 10857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(II); 10877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 10887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, an anonymous entity. We must have a declaration. 10917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(ND && "mangling empty name without declaration"); 10927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 10937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) { 10947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (NS->isAnonymousNamespace()) { 10957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This is how gcc mangles these names. 10967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "12_GLOBAL__N_1"; 10977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 10987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 10997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const VarDecl *VD = dyn_cast<VarDecl>(ND)) { 11027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We must have an anonymous union or struct declaration. 11037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordDecl *RD = 11047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei cast<RecordDecl>(VD->getType()->getAs<RecordType>()->getDecl()); 11057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 5.1.2: 11077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 11087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // For the purposes of mangling, the name of an anonymous union is 11097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // considered to be the name of the first named data member found by a 11107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // pre-order, depth-first, declaration-order walk of the data members of 11117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the anonymous union. If there is no such data member (i.e., if all of 11127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the data members in the union are unnamed), then there is no way for 11137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // a program to refer to the anonymous union, and there is therefore no 11147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // need to mangle its name. 11157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FieldDecl *FD = FindFirstNamedDataMember(RD); 11167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It's actually possible for various reasons for us to get here 11187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // with an empty anonymous struct / union. Fortunately, it 11197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // doesn't really matter what name we generate. 11207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!FD) break; 11217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(FD->getIdentifier() && "Data member name isn't an identifier!"); 11227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(FD->getIdentifier()); 11247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 11257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11260baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall 11270baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall // Class extensions have no name as a category, and it's possible 11280baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall // for them to be the semantic parent of certain declarations 11290baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall // (primarily, tag decls defined within declarations). Such 11300baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall // declarations will always have internal linkage, so the name 11310baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall // doesn't really matter, but we shouldn't crash on them. For 11320baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall // safety, just handle all ObjC containers here. 11330baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall if (isa<ObjCContainerDecl>(ND)) 11340baaabb7174c8e512ea52bc36687dc31ff68b09fJohn McCall break; 11357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We must have an anonymous struct. 11377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TagDecl *TD = cast<TagDecl>(ND); 11387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TypedefNameDecl *D = TD->getTypedefNameForAnonDecl()) { 11397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(TD->getDeclContext() == D->getDeclContext() && 11407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Typedef should not be in another decl context!"); 11417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(D->getDeclName().getAsIdentifierInfo() && 11427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Typedef was not named!"); 11437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(D->getDeclName().getAsIdentifierInfo()); 11447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 11457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <unnamed-type-name> ::= <closure-type-name> 11487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 11497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <closure-type-name> ::= Ul <lambda-sig> E [ <nonnegative number> ] _ 11507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <lambda-sig> ::= <parameter-type>+ # Parameter types or 'v' for 'void'. 11517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXRecordDecl *Record = dyn_cast<CXXRecordDecl>(TD)) { 11527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Record->isLambda() && Record->getLambdaManglingNumber()) { 11537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleLambda(Record); 11547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 11557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11585e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (TD->isExternallyVisible()) { 11595e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman unsigned UnnamedMangle = getASTContext().getManglingNumber(TD); 11607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Ut"; 11615e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (UnnamedMangle > 1) 11625e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman Out << llvm::utostr(UnnamedMangle - 2); 11637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 11647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 11657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Get a unique id for the anonymous struct. 1168651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines unsigned AnonStructId = Context.getAnonymousStructId(TD); 11697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle it as a source name in the form 11717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // [n] $_<id> 11727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // where n is the length of the string. 11737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<8> Str; 11747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Str += "$_"; 11757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Str += llvm::utostr(AnonStructId); 11767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << Str.size(); 11787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << Str.str(); 11797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 11807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 11817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCZeroArgSelector: 11837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCOneArgSelector: 11847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::ObjCMultiArgSelector: 11857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Can't mangle Objective-C selector names here!"); 11867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConstructorName: 11887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ND == Structor) 11897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the named decl is the C++ constructor we're mangling, use the type 11907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // we were given. 11917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleCXXCtorType(static_cast<CXXCtorType>(StructorType)); 11927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 11937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, use the complete constructor name. This is relevant if a 11947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // class with a constructor is declared within a constructor. 11957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleCXXCtorType(Ctor_Complete); 11967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 11977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 11987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXDestructorName: 11997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ND == Structor) 12007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the named decl is the C++ destructor we're mangling, use the type we 12017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // were given. 12027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleCXXDtorType(static_cast<CXXDtorType>(StructorType)); 12037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 12047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, use the complete destructor name. This is relevant if a 12057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // class with a destructor is declared within a destructor. 12067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleCXXDtorType(Dtor_Complete); 12077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXConversionFunctionName: 12107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <operator-name> ::= cv <type> # (cast) 12117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "cv"; 12127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(Name.getCXXNameType()); 12137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXOperatorName: { 12167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Arity; 12177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ND) { 12187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Arity = cast<FunctionDecl>(ND)->getNumParams(); 12197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we have a C++ member function, we need to include the 'this' pointer. 12217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This does not make sense for operators that are static, but their 12227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // names stay the same regardless of the arity (operator new for instance). 12237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<CXXMethodDecl>(ND)) 12247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Arity++; 12257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 12267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Arity = KnownArity; 12277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleOperatorName(Name.getCXXOverloadedOperator(), Arity); 12297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXLiteralOperatorName: 12337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This mangling is not yet official. 12347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "li"; 12357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(Name.getCXXLiteralIdentifier()); 12367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 12377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case DeclarationName::CXXUsingDirective: 12397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Can't mangle a using directive name!"); 12407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleSourceName(const IdentifierInfo *II) { 12447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <source-name> ::= <positive length number> <identifier> 12457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <number> ::= [n] <non-negative decimal integer> 12467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <identifier> ::= <unqualified source code identifier> 12477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << II->getLength() << II->getName(); 12487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleNestedName(const NamedDecl *ND, 12517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DeclContext *DC, 12527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool NoFunction) { 12537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <nested-name> 12547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= N [<CV-qualifiers>] [<ref-qualifier>] <prefix> <unqualified-name> E 12557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= N [<CV-qualifiers>] [<ref-qualifier>] <template-prefix> 12567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-args> E 12577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'N'; 12597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND)) { 126062e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer Qualifiers MethodQuals = 126162e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer Qualifiers::fromCVRMask(Method->getTypeQualifiers()); 126262e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer // We do not consider restrict a distinguishing attribute for overloading 126362e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer // purposes so we must not mangle it. 126462e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer MethodQuals.removeRestrict(); 126562e9370d9da9ee4f675da52d559a79c93c30642eDavid Majnemer mangleQualifiers(MethodQuals); 12667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleRefQualifier(Method->getRefQualifier()); 12677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if we have a template. 12706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const TemplateArgumentList *TemplateArgs = nullptr; 12717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { 1272889221076f50fe7df37e2e61c967e941b8df383aEli Friedman mangleTemplatePrefix(TD, NoFunction); 12737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(*TemplateArgs); 12747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 12767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei manglePrefix(DC, NoFunction); 12777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnqualifiedName(ND); 12787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 12797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 12817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleNestedName(const TemplateDecl *TD, 12837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgument *TemplateArgs, 12847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs) { 12857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <nested-name> ::= N [<CV-qualifiers>] <template-prefix> <template-args> E 12867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'N'; 12887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplatePrefix(TD); 12907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(TemplateArgs, NumTemplateArgs); 12917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 12937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 12947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 12958443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedmanvoid CXXNameMangler::mangleLocalName(const Decl *D) { 12967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <local-name> := Z <function encoding> E <entity name> [<discriminator>] 12977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // := Z <function encoding> E s [<discriminator>] 12987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <local-name> := Z <function encoding> E d [ <parameter number> ] 12997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // _ <entity name> 13007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <discriminator> := _ <non-negative number> 13018443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman assert(isa<NamedDecl>(D) || isa<BlockDecl>(D)); 13021847c718fe61f8e99d77c60ab77c9bf2ad4d77aaEli Friedman const RecordDecl *RD = GetLocalClassDecl(D); 13038443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman const DeclContext *DC = getEffectiveDeclContext(RD ? RD : D); 13047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'Z'; 13067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13071cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(DC)) 13081cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman mangleObjCMethodName(MD); 13091cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman else if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) 13108443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman mangleBlockForPrefix(BD); 13111cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman else 13121cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman mangleFunctionEncoding(cast<FunctionDecl>(DC)); 13137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13141cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman Out << 'E'; 13151cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman 13161cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman if (RD) { 13177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The parameter number is omitted for the last parameter, 0 for the 13187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // second-to-last parameter, 1 for the third-to-last parameter, etc. The 13197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <entity name> will of course contain a <closure-type-name>: Its 13207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // numbering will be local to the particular argument in which it appears 13217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // -- other default arguments do not affect its encoding. 13221847c718fe61f8e99d77c60ab77c9bf2ad4d77aaEli Friedman const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(RD); 13231847c718fe61f8e99d77c60ab77c9bf2ad4d77aaEli Friedman if (CXXRD->isLambda()) { 13247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ParmVarDecl *Parm 13251847c718fe61f8e99d77c60ab77c9bf2ad4d77aaEli Friedman = dyn_cast_or_null<ParmVarDecl>(CXXRD->getLambdaContextDecl())) { 13267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FunctionDecl *Func 13277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<FunctionDecl>(Parm->getDeclContext())) { 13287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'd'; 13297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Num = Func->getNumParams() - Parm->getFunctionScopeIndex(); 13307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Num > 1) 13317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNumber(Num - 2); 13327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 13337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 13377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the name relative to the closest enclosing function. 13388443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman // equality ok because RD derived from ND above 13398443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (D == RD) { 13408443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman mangleUnqualifiedName(RD); 13418443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { 13428443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman manglePrefix(getEffectiveDeclContext(BD), true /*NoFunction*/); 13438443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman mangleUnqualifiedBlock(BD); 13448443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } else { 13458443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman const NamedDecl *ND = cast<NamedDecl>(D); 13461cf7c3f8948b26395bc3293a657afb9f98878db7Eli Friedman mangleNestedName(ND, getEffectiveDeclContext(ND), true /*NoFunction*/); 13478443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } 1348e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman } else if (const BlockDecl *BD = dyn_cast<BlockDecl>(D)) { 1349e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman // Mangle a block in a default parameter; see above explanation for 1350e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman // lambdas. 1351e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman if (const ParmVarDecl *Parm 1352e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman = dyn_cast_or_null<ParmVarDecl>(BD->getBlockManglingContextDecl())) { 1353e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman if (const FunctionDecl *Func 1354e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman = dyn_cast<FunctionDecl>(Parm->getDeclContext())) { 1355e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman Out << 'd'; 1356e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman unsigned Num = Func->getNumParams() - Parm->getFunctionScopeIndex(); 1357e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman if (Num > 1) 1358e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman mangleNumber(Num - 2); 1359e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman Out << '_'; 1360e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman } 1361e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman } 1362e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman 1363e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman mangleUnqualifiedBlock(BD); 13645e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman } else { 1365e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman mangleUnqualifiedName(cast<NamedDecl>(D)); 13665e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman } 1367e79c9876aac0d933c9f97e8a36c97698b368dabaEli Friedman 13685e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (const NamedDecl *ND = dyn_cast<NamedDecl>(RD ? RD : D)) { 13695e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman unsigned disc; 13705e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (Context.getNextDiscriminator(ND, disc)) { 13715e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman if (disc < 10) 13725e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman Out << '_' << disc; 13735e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman else 13745e867c8a07d82da0d3b0a43402ee4f1c6ba416e9Eli Friedman Out << "__" << disc << '_'; 13757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 13778443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman} 13788443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 13798443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedmanvoid CXXNameMangler::mangleBlockForPrefix(const BlockDecl *Block) { 13808443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (GetLocalClassDecl(Block)) { 13818443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman mangleLocalName(Block); 13828443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman return; 13838443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } 13848443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman const DeclContext *DC = getEffectiveDeclContext(Block); 13858443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (isLocalContainerContext(DC)) { 13868443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman mangleLocalName(Block); 13878443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman return; 13888443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } 13898443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman manglePrefix(getEffectiveDeclContext(Block)); 13908443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman mangleUnqualifiedBlock(Block); 13918443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman} 13928443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 13938443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedmanvoid CXXNameMangler::mangleUnqualifiedBlock(const BlockDecl *Block) { 13948443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (Decl *Context = Block->getBlockManglingContextDecl()) { 13958443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if ((isa<VarDecl>(Context) || isa<FieldDecl>(Context)) && 13968443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman Context->getDeclContext()->isRecord()) { 13978443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (const IdentifierInfo *Name 13988443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman = cast<NamedDecl>(Context)->getIdentifier()) { 13998443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman mangleSourceName(Name); 14008443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman Out << 'M'; 14018443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } 14028443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } 14038443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } 14048443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 14058443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman // If we have a block mangling number, use it. 14068443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman unsigned Number = Block->getBlockManglingNumber(); 14078443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman // Otherwise, just make up a number. It doesn't matter what it is because 14088443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman // the symbol in question isn't externally visible. 14098443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (!Number) 14108443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman Number = Context.getBlockId(Block, false); 14118443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman Out << "Ub"; 14128443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (Number > 1) 14138443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman Out << Number - 2; 14148443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman Out << '_'; 14157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleLambda(const CXXRecordDecl *Lambda) { 14187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the context of a closure type is an initializer for a class member 14197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // (static or nonstatic), it is encoded in a qualified name with a final 14207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <prefix> of the form: 14217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 14227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <data-member-prefix> := <member source-name> M 14237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 14247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Technically, the data-member-prefix is part of the <prefix>. However, 14257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // since a closure type will always be mangled with a prefix, it's easier 14267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // to emit that last part of the prefix here. 14277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Decl *Context = Lambda->getLambdaContextDecl()) { 14287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((isa<VarDecl>(Context) || isa<FieldDecl>(Context)) && 14297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context->getDeclContext()->isRecord()) { 14307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const IdentifierInfo *Name 14317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = cast<NamedDecl>(Context)->getIdentifier()) { 14327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(Name); 14337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'M'; 14347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Ul"; 14397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionProtoType *Proto = Lambda->getLambdaTypeInfo()->getType()-> 14407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getAs<FunctionProtoType>(); 14417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleBareFunctionType(Proto, /*MangleReturnType=*/false); 14427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "E"; 14437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The number is omitted for the first closure type with a given 14457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <lambda-sig> in a given context; it is n-2 for the nth closure type 14467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // (in lexical order) with that same <lambda-sig> and context. 14477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 14487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The AST keeps track of the number for us. 14497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned Number = Lambda->getLambdaManglingNumber(); 14507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Number > 0 && "Lambda should be mangled as an unnamed class"); 14517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Number > 1) 14527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNumber(Number - 2); 14537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 14547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::manglePrefix(NestedNameSpecifier *qualifier) { 14577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (qualifier->getKind()) { 14587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Global: 14597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // nothing 14607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Namespace: 14637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(qualifier->getAsNamespace()); 14647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::NamespaceAlias: 14677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(qualifier->getAsNamespaceAlias()->getNamespace()); 14687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpec: 14717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::TypeSpecWithTemplate: 14727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei manglePrefix(QualType(qualifier->getAsType(), 0)); 14737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NestedNameSpecifier::Identifier: 14767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Member expressions can have these without prefixes, but that 14777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // should end up in mangleUnresolvedPrefix instead. 14787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(qualifier->getPrefix()); 14797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei manglePrefix(qualifier->getPrefix()); 14807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(qualifier->getAsIdentifier()); 14827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 14847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("unexpected nested name specifier"); 14867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 14877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::manglePrefix(const DeclContext *DC, bool NoFunction) { 14897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <prefix> ::= <prefix> <unqualified-name> 14907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <template-prefix> <template-args> 14917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <template-param> 14927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= # empty 14937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <substitution> 14947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DC = IgnoreLinkageSpecDecls(DC); 14967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 14977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DC->isTranslationUnit()) 14987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 14997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15008443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman if (NoFunction && isLocalContainerContext(DC)) 1501524387ae3dfc0c4cf2b095f83f9e47aa549b7e55Ben Langmuir return; 15028443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 15038443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman assert(!isLocalContainerContext(DC)); 15048443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman 15057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const NamedDecl *ND = cast<NamedDecl>(DC); 15067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (mangleSubstitution(ND)) 15077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 15087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Check if we have a template. 15106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const TemplateArgumentList *TemplateArgs = nullptr; 15117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) { 15127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplatePrefix(TD); 15137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(*TemplateArgs); 15148443188a8f9cbd27612b7058cdcfc53356f024a3Eli Friedman } else { 15157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei manglePrefix(getEffectiveDeclContext(ND), NoFunction); 15167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnqualifiedName(ND); 15177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(ND); 15207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleTemplatePrefix(TemplateName Template) { 15237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-prefix> ::= <prefix> <template unqualified-name> 15247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <template-param> 15257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <substitution> 15267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateDecl *TD = Template.getAsTemplateDecl()) 15277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return mangleTemplatePrefix(TD); 15287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (QualifiedTemplateName *Qualified = Template.getAsQualifiedTemplateName()) 15307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei manglePrefix(Qualified->getQualifier()); 15317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (OverloadedTemplateStorage *Overloaded 15337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = Template.getAsOverloadedTemplate()) { 15346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleUnqualifiedName(nullptr, (*Overloaded->begin())->getDeclName(), 15357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei UnknownArity); 15367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 15377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DependentTemplateName *Dependent = Template.getAsDependentTemplateName(); 15407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Dependent && "Unknown template name kind?"); 15417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei manglePrefix(Dependent->getQualifier()); 15427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnscopedTemplateName(Template); 15437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1545889221076f50fe7df37e2e61c967e941b8df383aEli Friedmanvoid CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND, 1546889221076f50fe7df37e2e61c967e941b8df383aEli Friedman bool NoFunction) { 15477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-prefix> ::= <prefix> <template unqualified-name> 15487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <template-param> 15497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <substitution> 15507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-template-param> ::= <template-param> 15517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <substitution> 15527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (mangleSubstitution(ND)) 15547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 15557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-template-param> ::= <template-param> 15577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateTemplateParmDecl *TTP 15587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<TemplateTemplateParmDecl>(ND)) { 15597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(TTP->getIndex()); 15607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 15617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 15627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 1563889221076f50fe7df37e2e61c967e941b8df383aEli Friedman manglePrefix(getEffectiveDeclContext(ND), NoFunction); 15647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnqualifiedName(ND->getTemplatedDecl()); 15657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(ND); 15667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 15677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Mangles a template name under the production <type>. Required for 15697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// template template arguments. 15707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <type> ::= <class-enum-type> 15717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ::= <template-param> 15727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// ::= <substitution> 15737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(TemplateName TN) { 15747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (mangleSubstitution(TN)) 15757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 15766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 15776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TemplateDecl *TD = nullptr; 15787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (TN.getKind()) { 15807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::QualifiedTemplate: 15817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TD = TN.getAsQualifiedTemplateName()->getTemplateDecl(); 15827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei goto HaveDecl; 15837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::Template: 15857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TD = TN.getAsTemplateDecl(); 15867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei goto HaveDecl; 15877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei HaveDecl: 15897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<TemplateTemplateParmDecl>(TD)) 15907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(cast<TemplateTemplateParmDecl>(TD)->getIndex()); 15917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 15927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(TD); 15937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 15947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::OverloadedTemplate: 15967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("can't mangle an overloaded template name as a <type>"); 15977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 15987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::DependentTemplate: { 15997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DependentTemplateName *Dependent = TN.getAsDependentTemplateName(); 16007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(Dependent->isIdentifier()); 16017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <class-enum-type> ::= <name> 16037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <name> ::= <nested-name> 16046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleUnresolvedPrefix(Dependent->getQualifier(), nullptr); 16057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(Dependent->getIdentifier()); 16067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 16077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParm: { 16107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Substituted template parameters are mangled as the substituted 16117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template. This will check for the substitution twice, which is 16127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // fine, but we have to return early so that we don't try to *add* 16137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the substitution twice. 16147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SubstTemplateTemplateParmStorage *subst 16157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = TN.getAsSubstTemplateTemplateParm(); 16167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(subst->getReplacement()); 16177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 16187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateName::SubstTemplateTemplateParmPack: { 16217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: not clear how to mangle this! 16227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <template <class> class T...> class A { 16237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <template <class> class U...> void foo(B<T,U> x...); 16247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 16257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "_SUBSTPACK_"; 16267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 16277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 16297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(TN); 16317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 16327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 16337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid 16347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy BenyeiCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity) { 16357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (OO) { 16367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <operator-name> ::= nw # new 16377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_New: Out << "nw"; break; 16387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= na # new[] 16397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Array_New: Out << "na"; break; 16407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= dl # delete 16417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Delete: Out << "dl"; break; 16427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= da # delete[] 16437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Array_Delete: Out << "da"; break; 16447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ps # + (unary) 16457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= pl # + (binary or unknown) 16467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Plus: 16477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (Arity == 1? "ps" : "pl"); break; 16487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ng # - (unary) 16497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= mi # - (binary or unknown) 16507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Minus: 16517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (Arity == 1? "ng" : "mi"); break; 16527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ad # & (unary) 16537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= an # & (binary or unknown) 16547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Amp: 16557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (Arity == 1? "ad" : "an"); break; 16567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= de # * (unary) 16577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ml # * (binary or unknown) 16587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Star: 16597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Use binary when unknown. 16607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (Arity == 1? "de" : "ml"); break; 16617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= co # ~ 16627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Tilde: Out << "co"; break; 16637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= dv # / 16647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Slash: Out << "dv"; break; 16657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= rm # % 16667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Percent: Out << "rm"; break; 16677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= or # | 16687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Pipe: Out << "or"; break; 16697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= eo # ^ 16707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Caret: Out << "eo"; break; 16717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= aS # = 16727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Equal: Out << "aS"; break; 16737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= pL # += 16747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_PlusEqual: Out << "pL"; break; 16757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= mI # -= 16767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_MinusEqual: Out << "mI"; break; 16777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= mL # *= 16787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_StarEqual: Out << "mL"; break; 16797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= dV # /= 16807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_SlashEqual: Out << "dV"; break; 16817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= rM # %= 16827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_PercentEqual: Out << "rM"; break; 16837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= aN # &= 16847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_AmpEqual: Out << "aN"; break; 16857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= oR # |= 16867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_PipeEqual: Out << "oR"; break; 16877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= eO # ^= 16887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_CaretEqual: Out << "eO"; break; 16897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ls # << 16907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_LessLess: Out << "ls"; break; 16917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= rs # >> 16927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_GreaterGreater: Out << "rs"; break; 16937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= lS # <<= 16947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_LessLessEqual: Out << "lS"; break; 16957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= rS # >>= 16967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_GreaterGreaterEqual: Out << "rS"; break; 16977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= eq # == 16987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_EqualEqual: Out << "eq"; break; 16997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ne # != 17007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_ExclaimEqual: Out << "ne"; break; 17017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= lt # < 17027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Less: Out << "lt"; break; 17037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= gt # > 17047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Greater: Out << "gt"; break; 17057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= le # <= 17067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_LessEqual: Out << "le"; break; 17077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ge # >= 17087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_GreaterEqual: Out << "ge"; break; 17097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= nt # ! 17107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Exclaim: Out << "nt"; break; 17117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= aa # && 17127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_AmpAmp: Out << "aa"; break; 17137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= oo # || 17147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_PipePipe: Out << "oo"; break; 17157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= pp # ++ 17167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_PlusPlus: Out << "pp"; break; 17177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= mm # -- 17187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_MinusMinus: Out << "mm"; break; 17197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= cm # , 17207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Comma: Out << "cm"; break; 17217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= pm # ->* 17227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_ArrowStar: Out << "pm"; break; 17237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= pt # -> 17247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Arrow: Out << "pt"; break; 17257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= cl # () 17267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Call: Out << "cl"; break; 17277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ix # [] 17287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Subscript: Out << "ix"; break; 17297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= qu # ? 17317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The conditional operator can't be overloaded, but we still handle it when 17327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // mangling expressions. 17337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_Conditional: Out << "qu"; break; 17347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case OO_None: 17367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case NUM_OVERLOADED_OPERATORS: 17377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Not an overloaded operator"); 17387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 17407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleQualifiers(Qualifiers Quals) { 17427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const 17437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Quals.hasRestrict()) 17447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'r'; 17457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Quals.hasVolatile()) 17467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'V'; 17477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Quals.hasConst()) 17487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'K'; 17497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Quals.hasAddressSpace()) { 17511eef85246b411b55c493098266746d0d83c241eaDavid Tweed // Address space extension: 17527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 17531eef85246b411b55c493098266746d0d83c241eaDavid Tweed // <type> ::= U <target-addrspace> 17541eef85246b411b55c493098266746d0d83c241eaDavid Tweed // <type> ::= U <OpenCL-addrspace> 17551eef85246b411b55c493098266746d0d83c241eaDavid Tweed // <type> ::= U <CUDA-addrspace> 17561eef85246b411b55c493098266746d0d83c241eaDavid Tweed 17577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SmallString<64> ASString; 17581eef85246b411b55c493098266746d0d83c241eaDavid Tweed unsigned AS = Quals.getAddressSpace(); 17591eef85246b411b55c493098266746d0d83c241eaDavid Tweed 17601eef85246b411b55c493098266746d0d83c241eaDavid Tweed if (Context.getASTContext().addressSpaceMapManglingFor(AS)) { 17611eef85246b411b55c493098266746d0d83c241eaDavid Tweed // <target-addrspace> ::= "AS" <address-space-number> 17621eef85246b411b55c493098266746d0d83c241eaDavid Tweed unsigned TargetAS = Context.getASTContext().getTargetAddressSpace(AS); 17631eef85246b411b55c493098266746d0d83c241eaDavid Tweed ASString = "AS" + llvm::utostr_32(TargetAS); 17641eef85246b411b55c493098266746d0d83c241eaDavid Tweed } else { 17651eef85246b411b55c493098266746d0d83c241eaDavid Tweed switch (AS) { 17661eef85246b411b55c493098266746d0d83c241eaDavid Tweed default: llvm_unreachable("Not a language specific address space"); 17671eef85246b411b55c493098266746d0d83c241eaDavid Tweed // <OpenCL-addrspace> ::= "CL" [ "global" | "local" | "constant" ] 17681eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangAS::opencl_global: ASString = "CLglobal"; break; 17691eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangAS::opencl_local: ASString = "CLlocal"; break; 17701eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangAS::opencl_constant: ASString = "CLconstant"; break; 17711eef85246b411b55c493098266746d0d83c241eaDavid Tweed // <CUDA-addrspace> ::= "CU" [ "device" | "constant" | "shared" ] 17721eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangAS::cuda_device: ASString = "CUdevice"; break; 17731eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangAS::cuda_constant: ASString = "CUconstant"; break; 17741eef85246b411b55c493098266746d0d83c241eaDavid Tweed case LangAS::cuda_shared: ASString = "CUshared"; break; 17751eef85246b411b55c493098266746d0d83c241eaDavid Tweed } 17761eef85246b411b55c493098266746d0d83c241eaDavid Tweed } 17777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'U' << ASString.size() << ASString; 17787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 17797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef LifetimeName; 17817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (Quals.getObjCLifetime()) { 17827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Objective-C ARC Extension: 17837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 17847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <type> ::= U "__strong" 17857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <type> ::= U "__weak" 17867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <type> ::= U "__autoreleasing" 17877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Qualifiers::OCL_None: 17887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Qualifiers::OCL_Weak: 17917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LifetimeName = "__weak"; 17927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Qualifiers::OCL_Strong: 17957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LifetimeName = "__strong"; 17967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 17977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 17987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Qualifiers::OCL_Autoreleasing: 17997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei LifetimeName = "__autoreleasing"; 18007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Qualifiers::OCL_ExplicitNone: 18037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The __unsafe_unretained qualifier is *not* mangled, so that 18047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __unsafe_unretained types in ARC produce the same manglings as the 18057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // equivalent (but, naturally, unqualified) types in non-ARC, providing 18067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // better ABI compatibility. 18077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 18087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It's safe to do this because unqualified 'id' won't show up 18097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // in any type signatures that need to be mangled. 18107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!LifetimeName.empty()) 18137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'U' << LifetimeName.size() << LifetimeName; 18147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleRefQualifier(RefQualifierKind RefQualifier) { 18177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <ref-qualifier> ::= R # lvalue reference 18187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= O # rvalue-reference 18197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (RefQualifier) { 18207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case RQ_None: 18217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case RQ_LValue: 18247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'R'; 18257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case RQ_RValue: 18287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'O'; 18297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) { 18347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Context.mangleObjCMethodName(MD, Out); 18357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 18367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(QualType T) { 18387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If our type is instantiation-dependent but not dependent, we mangle 18397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // it as it was written in the source, removing any top-level sugar. 18407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, use the canonical type. 18417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 18427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: This is an approximation of the instantiation-dependent name 18437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // mangling rules, since we should really be using the type as written and 18447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // augmented via semantic analysis (i.e., with implicit conversions and 18457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // default template arguments) for any instantiation-dependent type. 18467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Unfortunately, that requires several changes to our AST: 18477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // - Instantiation-dependent TemplateSpecializationTypes will need to be 18487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // uniqued, so that we can handle substitutions properly 18497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // - Default template arguments will need to be represented in the 18507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // TemplateSpecializationType, since they need to be mangled even though 18517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // they aren't written. 18527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // - Conversions on non-type template arguments need to be expressed, since 18537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // they can affect the mangling of sizeof/alignof. 18547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!T->isInstantiationDependentType() || T->isDependentType()) 18557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = T.getCanonicalType(); 18567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 18577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Desugar any types that are purely sugar. 18587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei do { 18597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Don't desugar through template specialization types that aren't 18607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // type aliases. We need to mangle the template arguments as written. 18617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateSpecializationType *TST 18627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<TemplateSpecializationType>(T)) 18637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!TST->isTypeAlias()) 18647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType Desugared 18677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = T.getSingleStepDesugaredType(Context.getASTContext()); 18687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Desugared == T) 18697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 18707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T = Desugared; 18727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } while (true); 18737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei SplitQualType split = T.split(); 18757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers quals = split.Quals; 18767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Type *ty = split.Ty; 18777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isSubstitutable = quals || !isa<BuiltinType>(T); 18797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isSubstitutable && mangleSubstitution(T)) 18807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 18817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If we're mangling a qualified array type, push the qualifiers to 18837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the element type. 18847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (quals && isa<ArrayType>(T)) { 18857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ty = Context.getASTContext().getAsArrayType(T); 18867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei quals = Qualifiers(); 18877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note that we don't update T: we want to add the 18897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // substitution at the original type. 18907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 18917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 18927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (quals) { 18937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleQualifiers(quals); 18947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Recurse: even if the qualified type isn't yet substitutable, 18957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the unqualified type might be. 18967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(QualType(ty, 0)); 18977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 18987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (ty->getTypeClass()) { 18997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_TYPE(CLASS, PARENT) 19007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define NON_CANONICAL_TYPE(CLASS, PARENT) \ 19017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::CLASS: \ 19027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \ 19037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 19047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define TYPE(CLASS, PARENT) \ 19057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Type::CLASS: \ 19067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(static_cast<const CLASS##Type*>(ty)); \ 19077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 19087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/TypeNodes.def" 19097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Add the substitution. 19137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isSubstitutable) 19147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(T); 19157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleNameOrStandardSubstitution(const NamedDecl *ND) { 19187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!mangleStandardSubstitution(ND)) 19197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(ND); 19207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const BuiltinType *T) { 19237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <type> ::= <builtin-type> 19247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <builtin-type> ::= v # void 19257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= w # wchar_t 19267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= b # bool 19277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= c # char 19287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= a # signed char 19297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= h # unsigned char 19307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= s # short 19317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= t # unsigned short 19327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= i # int 19337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= j # unsigned int 19347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= l # long 19357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= m # unsigned long 19367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= x # long long, __int64 19377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= y # unsigned long long, __int64 19387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= n # __int128 1939651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // ::= o # unsigned __int128 19407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= f # float 19417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= d # double 19427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= e # long double, __float80 19437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // UNSUPPORTED: ::= g # __float128 19447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // UNSUPPORTED: ::= Dd # IEEE 754r decimal floating point (64 bits) 19457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // UNSUPPORTED: ::= De # IEEE 754r decimal floating point (128 bits) 19467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // UNSUPPORTED: ::= Df # IEEE 754r decimal floating point (32 bits) 19477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= Dh # IEEE 754r half-precision floating point (16 bits) 19487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= Di # char32_t 19497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= Ds # char16_t 19507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= Dn # std::nullptr_t (i.e., decltype(nullptr)) 19517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= u <source-name> # vendor extended type 19527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getKind()) { 19537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Void: Out << 'v'; break; 19547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Bool: Out << 'b'; break; 19557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char_U: case BuiltinType::Char_S: Out << 'c'; break; 19567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: Out << 'h'; break; 19577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: Out << 't'; break; 19587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: Out << 'j'; break; 19597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULong: Out << 'm'; break; 19607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: Out << 'y'; break; 19617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt128: Out << 'o'; break; 19627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::SChar: Out << 'a'; break; 19637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_S: 19647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::WChar_U: Out << 'w'; break; 19657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char16: Out << "Ds"; break; 19667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Char32: Out << "Di"; break; 19677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: Out << 's'; break; 19687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: Out << 'i'; break; 19697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Long: Out << 'l'; break; 19707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: Out << 'x'; break; 19717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int128: Out << 'n'; break; 19727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Half: Out << "Dh"; break; 19737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: Out << 'f'; break; 19747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Double: Out << 'd'; break; 19757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongDouble: Out << 'e'; break; 19767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::NullPtr: Out << "Dn"; break; 19777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define BUILTIN_TYPE(Id, SingletonId) 19797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define PLACEHOLDER_TYPE(Id, SingletonId) \ 19807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Id: 19817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/BuiltinTypes.def" 19827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Dependent: 19837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("mangling a placeholder type"); 19847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCId: Out << "11objc_object"; break; 19857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCClass: Out << "10objc_class"; break; 19867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ObjCSel: Out << "13objc_selector"; break; 1987b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1d: Out << "11ocl_image1d"; break; 1988b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dArray: Out << "16ocl_image1darray"; break; 1989b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage1dBuffer: Out << "17ocl_image1dbuffer"; break; 1990b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2d: Out << "11ocl_image2d"; break; 1991b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage2dArray: Out << "16ocl_image2darray"; break; 1992b13621d08e20ac7aa550e05896de8a57ee99c1e8Guy Benyei case BuiltinType::OCLImage3d: Out << "11ocl_image3d"; break; 199321f18c4fda167dc5f72feddbd6a7ac1b63200a0dGuy Benyei case BuiltinType::OCLSampler: Out << "11ocl_sampler"; break; 1994e6b9d802fb7b16d93474c4f1c179ab36202e8a8bGuy Benyei case BuiltinType::OCLEvent: Out << "9ocl_event"; break; 19957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 19967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 19977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 19987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <function-type> 19997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <function-type> ::= [<CV-qualifiers>] F [Y] 20007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <bare-function-type> [<ref-qualifier>] E 20017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const FunctionProtoType *T) { 20027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle CV-qualifiers, if present. These are 'this' qualifiers, 20037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // e.g. "const" in "int (A::*)() const". 20047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleQualifiers(Qualifiers::fromCVRMask(T->getTypeQuals())); 20057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'F'; 20077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: We don't have enough information in the AST to produce the 'Y' 20097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // encoding for extern "C" function types. 20107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleBareFunctionType(T, /*MangleReturnType=*/true); 20117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the ref-qualifier, if present. 20137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleRefQualifier(T->getRefQualifier()); 20147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 20167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const FunctionNoProtoType *T) { 20187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Can't mangle K&R function prototypes"); 20197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleBareFunctionType(const FunctionType *T, 20217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool MangleReturnType) { 20227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We should never be mangling something without a prototype. 20237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionProtoType *Proto = cast<FunctionProtoType>(T); 20247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Record that we're in a function type. See mangleFunctionParam 20267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for details on what we're trying to achieve here. 20277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepthState saved = FunctionTypeDepth.push(); 20287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <bare-function-type> ::= <signature type>+ 20307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (MangleReturnType) { 20317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepth.enterResultType(); 2032651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mangleType(Proto->getReturnType()); 20337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepth.leaveResultType(); 20347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2036651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines if (Proto->getNumParams() == 0 && !Proto->isVariadic()) { 20377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <builtin-type> ::= v # void 20387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'v'; 20397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepth.pop(saved); 20417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 20427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 20437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2044651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto &Arg : Proto->param_types()) 2045651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines mangleType(Context.getASTContext().getSignatureParameterType(Arg)); 20467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei FunctionTypeDepth.pop(saved); 20487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <builtin-type> ::= z # ellipsis 20507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Proto->isVariadic()) 20517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'z'; 20527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <class-enum-type> 20557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <class-enum-type> ::= <name> 20567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const UnresolvedUsingType *T) { 20577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(T->getDecl()); 20587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <class-enum-type> 20617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <class-enum-type> ::= <name> 20627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const EnumType *T) { 20637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(static_cast<const TagType*>(T)); 20647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const RecordType *T) { 20667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(static_cast<const TagType*>(T)); 20677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const TagType *T) { 20697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(T->getDecl()); 20707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <array-type> 20737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <array-type> ::= A <positive dimension number> _ <element type> 20747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ::= A [<dimension expression>] _ <element type> 20757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const ConstantArrayType *T) { 20767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'A' << T->getSize() << '_'; 20777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getElementType()); 20787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const VariableArrayType *T) { 20807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'A'; 20817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // decayed vla types (size 0) will just be skipped. 20827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->getSizeExpr()) 20837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(T->getSizeExpr()); 20847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 20857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getElementType()); 20867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const DependentSizedArrayType *T) { 20887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'A'; 20897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(T->getSizeExpr()); 20907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 20917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getElementType()); 20927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const IncompleteArrayType *T) { 20947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "A_"; 20957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getElementType()); 20967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 20977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 20987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <pointer-to-member-type> 20997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <pointer-to-member-type> ::= M <class type> <member type> 21007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const MemberPointerType *T) { 21017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'M'; 21027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(QualType(T->getClass(), 0)); 21037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType PointeeType = T->getPointeeType(); 21047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) { 21057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(FPT); 21067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI 5.1.8: 21087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 21097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The type of a non-static member function is considered to be different, 21107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for the purposes of substitution, from the type of a namespace-scope or 21117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // static member function whose type appears similar. The types of two 21127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // non-static member functions are considered to be different, for the 21137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // purposes of substitution, if the functions are members of different 21147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // classes. In other words, for the purposes of substitution, the class of 21157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // which the function is a member is considered part of the type of 21167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // function. 21177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Given that we already substitute member function pointers as a 21197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // whole, the net effect of this rule is just to unconditionally 21207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // suppress substitution on the function type in a member pointer. 21217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We increment the SeqID here to emulate adding an entry to the 21227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // substitution table. 21237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ++SeqID; 21247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 21257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(PointeeType); 21267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <template-param> 21297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const TemplateTypeParmType *T) { 21307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(T->getIndex()); 21317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <template-param> 21347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const SubstTemplateTypeParmPackType *T) { 21357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: not clear how to mangle this! 21367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <class T...> class A { 21377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <class U...> void foo(T(*)(U) x...); 21387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 21397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "_SUBSTPACK_"; 21407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= P <type> # pointer-to 21437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const PointerType *T) { 21447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'P'; 21457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getPointeeType()); 21467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const ObjCObjectPointerType *T) { 21487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'P'; 21497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getPointeeType()); 21507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= R <type> # reference-to 21537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const LValueReferenceType *T) { 21547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'R'; 21557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getPointeeType()); 21567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= O <type> # rvalue reference-to (C++0x) 21597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const RValueReferenceType *T) { 21607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'O'; 21617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getPointeeType()); 21627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= C <type> # complex pair (C 2000) 21657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const ComplexType *T) { 21667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'C'; 21677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getElementType()); 21687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 21697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 21707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ARM's ABI for Neon vector types specifies that they should be mangled as 21717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// if they are structs (to match ARM's initial implementation). The 21727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// vector type must be one of the special types predefined by ARM. 21737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleNeonVectorType(const VectorType *T) { 21747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType EltType = T->getElementType(); 21757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(EltType->isBuiltinType() && "Neon vector element not a BuiltinType"); 21766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *EltName = nullptr; 21777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->getVectorKind() == VectorType::NeonPolyVector) { 21787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (cast<BuiltinType>(EltType)->getKind()) { 2179651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::SChar: 2180651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::UChar: 2181651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltName = "poly8_t"; 2182651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2183651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::Short: 2184651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::UShort: 2185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltName = "poly16_t"; 2186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 2187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::ULongLong: 2188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines EltName = "poly64_t"; 2189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 21907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: llvm_unreachable("unexpected Neon polynomial vector element type"); 21917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 21927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 21937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (cast<BuiltinType>(EltType)->getKind()) { 21947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::SChar: EltName = "int8_t"; break; 21957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UChar: EltName = "uint8_t"; break; 21967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Short: EltName = "int16_t"; break; 21977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UShort: EltName = "uint16_t"; break; 21987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Int: EltName = "int32_t"; break; 21997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::UInt: EltName = "uint32_t"; break; 22007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::LongLong: EltName = "int64_t"; break; 22017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::ULongLong: EltName = "uint64_t"; break; 2202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::Double: EltName = "float64_t"; break; 22037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case BuiltinType::Float: EltName = "float32_t"; break; 2204b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::Half: EltName = "float16_t";break; 2205b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover default: 2206b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover llvm_unreachable("unexpected Neon vector element type"); 22077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines const char *BaseName = nullptr; 22107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned BitSize = (T->getNumElements() * 22117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getASTContext().getTypeSize(EltType)); 22127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BitSize == 64) 22137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseName = "__simd64_"; 22147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else { 22157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(BitSize == 128 && "Neon vector type not 64 or 128 bits"); 22167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei BaseName = "__simd128_"; 22177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 22187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << strlen(BaseName) + strlen(EltName); 22197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << BaseName << EltName; 22207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 22217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2222b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northoverstatic StringRef mangleAArch64VectorBase(const BuiltinType *EltType) { 2223b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover switch (EltType->getKind()) { 2224b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::SChar: 2225b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Int8"; 2226b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::Short: 2227b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Int16"; 2228b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::Int: 2229b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Int32"; 2230651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::Long: 2231b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::LongLong: 2232b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Int64"; 2233b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::UChar: 2234b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Uint8"; 2235b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::UShort: 2236b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Uint16"; 2237b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::UInt: 2238b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Uint32"; 2239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::ULong: 2240b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::ULongLong: 2241b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Uint64"; 2242b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::Half: 2243b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Float16"; 2244b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::Float: 2245b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Float32"; 2246b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::Double: 2247b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover return "Float64"; 2248b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover default: 2249b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover llvm_unreachable("Unexpected vector element base type"); 2250b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover } 2251b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover} 2252b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover 2253b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover// AArch64's ABI for Neon vector types specifies that they should be mangled as 2254b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover// the equivalent internal name. The vector type must be one of the special 2255b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover// types predefined by ARM. 2256b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northovervoid CXXNameMangler::mangleAArch64NeonVectorType(const VectorType *T) { 2257b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover QualType EltType = T->getElementType(); 2258b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover assert(EltType->isBuiltinType() && "Neon vector element not a BuiltinType"); 2259b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover unsigned BitSize = 2260b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover (T->getNumElements() * getASTContext().getTypeSize(EltType)); 2261800de7ee43ab2dce2a281d4fa3c965b5424a4237Daniel Jasper (void)BitSize; // Silence warning. 2262b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover 2263b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover assert((BitSize == 64 || BitSize == 128) && 2264b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover "Neon vector type not 64 or 128 bits"); 2265b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover 2266b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover StringRef EltName; 2267b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover if (T->getVectorKind() == VectorType::NeonPolyVector) { 2268b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover switch (cast<BuiltinType>(EltType)->getKind()) { 2269b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::UChar: 2270b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover EltName = "Poly8"; 2271b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover break; 2272b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover case BuiltinType::UShort: 2273b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover EltName = "Poly16"; 2274b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover break; 2275651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case BuiltinType::ULong: 227699cbf42292c59c6833d6ec4e69235ac5309e20d0Hao Liu EltName = "Poly64"; 227799cbf42292c59c6833d6ec4e69235ac5309e20d0Hao Liu break; 2278b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover default: 2279b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover llvm_unreachable("unexpected Neon polynomial vector element type"); 2280b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover } 2281b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover } else 2282b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover EltName = mangleAArch64VectorBase(cast<BuiltinType>(EltType)); 2283b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover 2284b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover std::string TypeName = 2285b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover ("__" + EltName + "x" + llvm::utostr(T->getNumElements()) + "_t").str(); 2286b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover Out << TypeName.length() << TypeName; 2287b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover} 2288b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover 22897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// GNU extension: vector types 22907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <type> ::= <vector-type> 22917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <vector-type> ::= Dv <positive dimension number> _ 22927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <extended element type> 22937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ::= Dv [<dimension expression>] _ <element type> 22947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <extended element type> ::= <element type> 22957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ::= p # AltiVec vector pixel 22967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ::= b # Altivec vector bool 22977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const VectorType *T) { 22987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if ((T->getVectorKind() == VectorType::NeonVector || 22997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T->getVectorKind() == VectorType::NeonPolyVector)) { 2300651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Triple Target = getASTContext().getTargetInfo().getTriple(); 2301651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::Triple::ArchType Arch = 2302651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines getASTContext().getTargetInfo().getTriple().getArch(); 23036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if ((Arch == llvm::Triple::aarch64 || 23046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Arch == llvm::Triple::aarch64_be || 23056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Arch == llvm::Triple::arm64_be || 23066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Arch == llvm::Triple::arm64) && !Target.isOSDarwin()) 2307b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover mangleAArch64NeonVectorType(T); 2308b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover else 2309b793f0d3448a15277cd6b6cc4ba558ded39a8084Tim Northover mangleNeonVectorType(T); 23107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 23117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Dv" << T->getNumElements() << '_'; 23137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->getVectorKind() == VectorType::AltiVecPixel) 23147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'p'; 23157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (T->getVectorKind() == VectorType::AltiVecBool) 23167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'b'; 23177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 23187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getElementType()); 23197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const ExtVectorType *T) { 23217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(static_cast<const VectorType*>(T)); 23227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const DependentSizedExtVectorType *T) { 23247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Dv"; 23257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(T->getSizeExpr()); 23267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 23277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getElementType()); 23287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const PackExpansionType *T) { 23317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <type> ::= Dp <type> # pack expansion (C++0x) 23327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Dp"; 23337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getPattern()); 23347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const ObjCInterfaceType *T) { 23377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleSourceName(T->getDecl()->getIdentifier()); 23387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const ObjCObjectType *T) { 23410601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman if (!T->qual_empty()) { 23420601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman // Mangle protocol qualifiers. 23430601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman SmallString<64> QualStr; 23440601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman llvm::raw_svector_ostream QualOS(QualStr); 23450601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman QualOS << "objcproto"; 2346651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines for (const auto *I : T->quals()) { 2347651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef name = I->getName(); 23480601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman QualOS << name.size() << name; 23490601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman } 23500601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman QualOS.flush(); 23510601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman Out << 'U' << QualStr.size() << QualStr; 23520601700e8d8e8d0f42bea1c0137c04e8c8ae5ac3Eli Friedman } 23537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getBaseType()); 23547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const BlockPointerType *T) { 23577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "U13block_pointer"; 23587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getPointeeType()); 23597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const InjectedClassNameType *T) { 23627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle injected class name types as if the user had written the 23637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // specialization out fully. It may not actually be possible to see 23647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // this mangling, though. 23657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getInjectedSpecializationType()); 23667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const TemplateSpecializationType *T) { 23697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl()) { 23707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleName(TD, T->getArgs(), T->getNumArgs()); 23717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 23727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (mangleSubstitution(QualType(T, 0))) 23737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 23747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplatePrefix(T->getTemplateName()); 23767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: GCC does not appear to mangle the template arguments when 23787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the template in question is a dependent template name. Should we 23797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // emulate that badness? 23807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(T->getArgs(), T->getNumArgs()); 23817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(QualType(T, 0)); 23827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 23837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 23847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 23857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const DependentNameType *T) { 23866bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // Proposal by cxx-abi-dev, 2014-03-26 23876bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // <class-enum-type> ::= <name> # non-dependent or dependent type name or 23886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // # dependent elaborated type specifier using 23896bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // # 'typename' 23906bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // ::= Ts <name> # dependent elaborated type specifier using 23916bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // # 'struct' or 'class' 23926bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // ::= Tu <name> # dependent elaborated type specifier using 23936bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // # 'union' 23946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // ::= Te <name> # dependent elaborated type specifier using 23956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // # 'enum' 23966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines switch (T->getKeyword()) { 23976bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case ETK_Typename: 23986bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 23996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case ETK_Struct: 24006bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case ETK_Class: 24016bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case ETK_Interface: 24026bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << "Ts"; 24036bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 24046bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case ETK_Union: 24056bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << "Tu"; 24066bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 24076bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines case ETK_Enum: 24086bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << "Te"; 24096bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines break; 24106bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines default: 24116bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines llvm_unreachable("unexpected keyword for dependent type name"); 24126bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 24137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Typename types are always nested 24147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'N'; 24157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei manglePrefix(T->getQualifier()); 24166bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleSourceName(T->getIdentifier()); 24177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 24187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const DependentTemplateSpecializationType *T) { 24217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Dependently-scoped template types are nested if they have a prefix. 24227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'N'; 24237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // TODO: avoid making this TemplateName. 24257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei TemplateName Prefix = 24267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getASTContext().getDependentTemplateName(T->getQualifier(), 24277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T->getIdentifier()); 24287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplatePrefix(Prefix); 24297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: GCC does not appear to mangle the template arguments when 24317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // the template in question is a dependent template name. Should we 24327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // emulate that badness? 24337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(T->getArgs(), T->getNumArgs()); 24347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 24357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const TypeOfType *T) { 24387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this is pretty unsatisfactory, but there isn't an obvious 24397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "extension with parameters" mangling. 24407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "u6typeof"; 24417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const TypeOfExprType *T) { 24447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: this is pretty unsatisfactory, but there isn't an obvious 24457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // "extension with parameters" mangling. 24467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "u6typeof"; 24477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const DecltypeType *T) { 24507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Expr *E = T->getUnderlyingExpr(); 24517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // type ::= Dt <expression> E # decltype of an id-expression 24537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # or class member access 24547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= DT <expression> E # decltype of an expression 24557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This purports to be an exhaustive list of id-expressions and 24577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // class member accesses. Note that we do not ignore parentheses; 24587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // parentheses change the semantics of decltype for these 24597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // expressions (and cause the mangler to use the other form). 24607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<DeclRefExpr>(E) || 24617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<MemberExpr>(E) || 24627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<UnresolvedLookupExpr>(E) || 24637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<DependentScopeDeclRefExpr>(E) || 24647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<CXXDependentScopeMemberExpr>(E) || 24657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<UnresolvedMemberExpr>(E)) 24667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Dt"; 24677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 24687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "DT"; 24697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(E); 24707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 24717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const UnaryTransformType *T) { 24747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If this is dependent, we need to record that. If not, we simply 24757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // mangle it as the underlying type since they are equivalent. 24767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isDependentType()) { 24777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'U'; 24787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T->getUTTKind()) { 24807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UnaryTransformType::EnumUnderlyingType: 24817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "3eut"; 24827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 24837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 24857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getUnderlyingType()); 24877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const AutoType *T) { 24907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType D = T->getDeducedType(); 24917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <builtin-type> ::= Da # dependent auto 24927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (D.isNull()) 2493a2c3646c35dd09d21b74826240aa916545b1873fRichard Smith Out << (T->isDecltypeAuto() ? "Dc" : "Da"); 24947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 24957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(D); 24967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 24977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 24987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleType(const AtomicType *T) { 2499651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines // <type> ::= U <source-name> <type> # vendor extended type qualifier 25007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // (Until there's a standardized mangling...) 25017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "U7_Atomic"; 25027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T->getValueType()); 25037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleIntegerLiteral(QualType T, 25067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const llvm::APSInt &Value) { 25077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expr-primary> ::= L <type> <value number> E # integer literal 25087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 25097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(T); 25117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T->isBooleanType()) { 25127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Boolean values are encoded as 0/1. 25137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (Value.getBoolValue() ? '1' : '0'); 25147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 25157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNumber(Value); 25167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 25187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Mangles a member expression. 25227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleMemberExpr(const Expr *base, 25237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool isArrow, 25247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NestedNameSpecifier *qualifier, 25257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei NamedDecl *firstQualifierLookup, 25267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DeclarationName member, 25277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned arity) { 25287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expression> ::= dt <expression> <unresolved-name> 25297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= pt <expression> <unresolved-name> 25307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (base) { 25317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (base->isImplicitCXXThis()) { 25327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Note: GCC mangles member expressions to the implicit 'this' as 25337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // *this., whereas we represent them as this->. The Itanium C++ ABI 25347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // does not specify anything here, so we follow GCC. 25357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "dtdefpT"; 25367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 25377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (isArrow ? "pt" : "dt"); 25387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(base); 25397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 25417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleUnresolvedName(qualifier, firstQualifierLookup, member, arity); 25427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Look at the callee of the given call expression and determine if 25457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// it's a parenthesized id-expression which would have triggered ADL 25467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// otherwise. 25477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isParenthesizedADLCallee(const CallExpr *call) { 25487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Expr *callee = call->getCallee(); 25497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Expr *fn = callee->IgnoreParens(); 25507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Must be parenthesized. IgnoreParens() skips __extension__ nodes, 25527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // too, but for those to appear in the callee, it would have to be 25537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // parenthesized. 25547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (callee == fn) return false; 25557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Must be an unresolved lookup. 25577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const UnresolvedLookupExpr *lookup = dyn_cast<UnresolvedLookupExpr>(fn); 25587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!lookup) return false; 25597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!lookup->requiresADL()); 25617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Must be an unqualified lookup. 25637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (lookup->getQualifier()) return false; 25647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Must not have found a class member. Note that if one is a class 25667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // member, they're all class members. 25677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (lookup->getNumDecls() > 0 && 25687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (*lookup->decls_begin())->isCXXClassMember()) 25697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 25707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Otherwise, ADL would have been triggered. 25727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 25737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 25747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity) { 25767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expression> ::= <unary operator-name> <expression> 25777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <binary operator-name> <expression> <expression> 25787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <trinary operator-name> <expression> <expression> <expression> 25797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= cv <type> expression # conversion with one argument 25807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= cv <type> _ <expression>* E # conversion with a different number of arguments 25817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= st <type> # sizeof (a type) 25827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= at <type> # alignof (a type) 25837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <template-param> 25847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <function-param> 25857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= sr <type> <unqualified-name> # dependent name 25867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= sr <type> <unqualified-name> <template-args> # dependent template-id 25877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= ds <expression> <expression> # expr.*expr 25887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= sZ <template-param> # size of a parameter pack 25897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= sZ <function-param> # size of a function parameter pack 25907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <expr-primary> 25917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expr-primary> ::= L <type> <value number> E # integer literal 25927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= L <type <value float> E # floating literal 25937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= L <mangled-name> E # external name 25947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= fpT # 'this' expression 25957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType ImplicitlyConvertedToType; 25967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 25977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeirecurse: 25987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (E->getStmtClass()) { 25997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::NoStmtClass: 26007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define ABSTRACT_STMT(Type) 26017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define EXPR(Type, Base) 26027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#define STMT(Type, Base) \ 26037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::Type##Class: 26047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei#include "clang/AST/StmtNodes.inc" 26057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // fallthrough 26067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // These all can only appear in local or variable-initialization 26087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // contexts and so should never appear in a mangling. 26097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::AddrLabelExprClass: 26107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::DesignatedInitExprClass: 26117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ImplicitValueInitExprClass: 26127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ParenListExprClass: 26137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::LambdaExprClass: 261476da55d3a49e1805f51b1ced7c5da5bcd7f759d8John McCall case Expr::MSPropertyRefExprClass: 26157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("unexpected statement kind"); 26167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: invent manglings for all these. 26187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::BlockExprClass: 26197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXPseudoDestructorExprClass: 26207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ChooseExprClass: 26217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CompoundLiteralExprClass: 26227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ExtVectorElementExprClass: 26237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::GenericSelectionExprClass: 26247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCEncodeExprClass: 26257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCIsaExprClass: 26267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCIvarRefExprClass: 26277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCMessageExprClass: 26287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCPropertyRefExprClass: 26297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCProtocolExprClass: 26307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCSelectorExprClass: 26317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCStringLiteralClass: 26327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCBoxedExprClass: 26337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCArrayLiteralClass: 26347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCDictionaryLiteralClass: 26357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCSubscriptRefExprClass: 26367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCIndirectCopyRestoreExprClass: 26377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::OffsetOfExprClass: 26387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::PredefinedExprClass: 26397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ShuffleVectorExprClass: 2640414a1bdbdaf250e0488589f12865c8961831b65dHal Finkel case Expr::ConvertVectorExprClass: 26417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::StmtExprClass: 26427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::TypeTraitExprClass: 26437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ArrayTypeTraitExprClass: 26447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ExpressionTraitExprClass: 26457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::VAArgExprClass: 26467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXUuidofExprClass: 26477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CUDAKernelCallExprClass: 26487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::AsTypeExprClass: 26497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::PseudoObjectExprClass: 26507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::AtomicExprClass: 26517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei { 26527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // As bad as this diagnostic is, it's better than crashing. 26537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine &Diags = Context.getDiags(); 26547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, 26557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "cannot yet mangle expression type %0"); 26567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.Report(E->getExprLoc(), DiagID) 26577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << E->getStmtClassName() << E->getSourceRange(); 26587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Even gcc-4.5 doesn't mangle this. 26627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::BinaryConditionalOperatorClass: { 26637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine &Diags = Context.getDiags(); 26647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = 26657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.getCustomDiagID(DiagnosticsEngine::Error, 26667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "?: operator with omitted middle operand cannot be mangled"); 26677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.Report(E->getExprLoc(), DiagID) 26687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei << E->getStmtClassName() << E->getSourceRange(); 26697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // These are used for internal purposes and cannot be meaningfully mangled. 26737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::OpaqueValueExprClass: 26747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("cannot mangle opaque value; mangling wrong thing?"); 26757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::InitListExprClass: { 26777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "il"; 26787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const InitListExpr *InitList = cast<InitListExpr>(E); 26797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = InitList->getNumInits(); i != e; ++i) 26807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(InitList->getInit(i)); 26817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "E"; 26827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 26847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 26857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXDefaultArgExprClass: 26867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<CXXDefaultArgExpr>(E)->getExpr(), Arity); 26877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 26887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 2689c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith case Expr::CXXDefaultInitExprClass: 2690c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith mangleExpression(cast<CXXDefaultInitExpr>(E)->getExpr(), Arity); 2691c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith break; 2692c3bf52ced9652f555aa0767bb822ec4c64546212Richard Smith 26937c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith case Expr::CXXStdInitializerListExprClass: 26947c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith mangleExpression(cast<CXXStdInitializerListExpr>(E)->getSubExpr(), Arity); 26957c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith break; 26967c3e615f01e8f9f587315800fdaf2305ed824568Richard Smith 26977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::SubstNonTypeTemplateParmExprClass: 26987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<SubstNonTypeTemplateParmExpr>(E)->getReplacement(), 26997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Arity); 27007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::UserDefinedLiteralClass: 27037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We follow g++'s approach of mangling a UDL as a call to the literal 27047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // operator. 27057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXMemberCallExprClass: // fallthrough 27067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CallExprClass: { 27077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CallExpr *CE = cast<CallExpr>(E); 27087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expression> ::= cp <simple-id> <expression>* E 27107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We use this mangling only when the call would use ADL except 27117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // for being parenthesized. Per discussion with David 27127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Vandervoorde, 2011.04.25. 27137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isParenthesizedADLCallee(CE)) { 27147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "cp"; 27157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // The callee here is a parenthesized UnresolvedLookupExpr with 27167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // no qualifier and should always get mangled as a <simple-id> 27177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // anyway. 27187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expression> ::= cl <expression>* E 27207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 27217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "cl"; 27227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(CE->getCallee(), CE->getNumArgs()); 27257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0, N = CE->getNumArgs(); I != N; ++I) 27267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(CE->getArg(I)); 27277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 27287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXNewExprClass: { 27327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXNewExpr *New = cast<CXXNewExpr>(E); 27337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (New->isGlobalNew()) Out << "gs"; 27347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (New->isArray() ? "na" : "nw"); 27357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXNewExpr::const_arg_iterator I = New->placement_arg_begin(), 27367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = New->placement_arg_end(); I != E; ++I) 27377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(*I); 27387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 27397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(New->getAllocatedType()); 27407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (New->hasInitializer()) { 27417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (New->getInitializationStyle() == CXXNewExpr::ListInit) 27427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "il"; 27437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 27447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "pi"; 27457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Expr *Init = New->getInitializer(); 27467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const CXXConstructExpr *CCE = dyn_cast<CXXConstructExpr>(Init)) { 27477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Directly inline the initializers. 27487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (CXXConstructExpr::const_arg_iterator I = CCE->arg_begin(), 27497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = CCE->arg_end(); 27507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei I != E; ++I) 27517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(*I); 27527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (const ParenListExpr *PLE = dyn_cast<ParenListExpr>(Init)) { 27537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = PLE->getNumExprs(); i != e; ++i) 27547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(PLE->getExpr(i)); 27557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else if (New->getInitializationStyle() == CXXNewExpr::ListInit && 27567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei isa<InitListExpr>(Init)) { 27577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Only take InitListExprs apart for list-initialization. 27587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const InitListExpr *InitList = cast<InitListExpr>(Init); 27597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = InitList->getNumInits(); i != e; ++i) 27607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(InitList->getInit(i)); 27617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else 27627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(Init); 27637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 27657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::MemberExprClass: { 27697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const MemberExpr *ME = cast<MemberExpr>(E); 27707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleMemberExpr(ME->getBase(), ME->isArrow(), 27716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ME->getQualifier(), nullptr, 27726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ME->getMemberDecl()->getDeclName(), Arity); 27737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::UnresolvedMemberExprClass: { 27777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const UnresolvedMemberExpr *ME = cast<UnresolvedMemberExpr>(E); 27787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleMemberExpr(ME->getBase(), ME->isArrow(), 27796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ME->getQualifier(), nullptr, ME->getMemberName(), 27807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Arity); 27817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ME->hasExplicitTemplateArgs()) 27827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(ME->getExplicitTemplateArgs()); 27837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXDependentScopeMemberExprClass: { 27877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXDependentScopeMemberExpr *ME 27887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = cast<CXXDependentScopeMemberExpr>(E); 27897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleMemberExpr(ME->getBase(), ME->isArrow(), 27907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ME->getQualifier(), ME->getFirstQualifierFoundInScope(), 27917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ME->getMember(), Arity); 27927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ME->hasExplicitTemplateArgs()) 27937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(ME->getExplicitTemplateArgs()); 27947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 27957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 27967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 27977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::UnresolvedLookupExprClass: { 27987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(E); 27996bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleUnresolvedName(ULE->getQualifier(), nullptr, ULE->getName(), Arity); 28007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // All the <unresolved-name> productions end in a 28027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // base-unresolved-name, where <template-args> are just tacked 28037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // onto the end. 28047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (ULE->hasExplicitTemplateArgs()) 28057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(ULE->getExplicitTemplateArgs()); 28067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXUnresolvedConstructExprClass: { 28107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXUnresolvedConstructExpr *CE = cast<CXXUnresolvedConstructExpr>(E); 28117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = CE->arg_size(); 28127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "cv"; 28147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(CE->getType()); 28157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (N != 1) Out << '_'; 28167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I)); 28177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (N != 1) Out << 'E'; 28187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXTemporaryObjectExprClass: 28227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXConstructExprClass: { 28237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXConstructExpr *CE = cast<CXXConstructExpr>(E); 28247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned N = CE->getNumArgs(); 28257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (CE->isListInitialization()) 28277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "tl"; 28287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 28297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "cv"; 28307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(CE->getType()); 28317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (N != 1) Out << '_'; 28327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I)); 28337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (N != 1) Out << 'E'; 28347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXScalarValueInitExprClass: 28387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out <<"cv"; 28397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(E->getType()); 28407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out <<"_E"; 28417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXNoexceptExprClass: 28447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "nx"; 28457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<CXXNoexceptExpr>(E)->getOperand()); 28467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::UnaryExprOrTypeTraitExprClass: { 28497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const UnaryExprOrTypeTraitExpr *SAE = cast<UnaryExprOrTypeTraitExpr>(E); 28507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SAE->isInstantiationDependent()) { 28527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Itanium C++ ABI: 28537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the operand of a sizeof or alignof operator is not 28547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // instantiation-dependent it is encoded as an integer literal 28557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // reflecting the result of the operator. 28567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 28577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // If the result of the operator is implicitly converted to a known 28587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // integer type, that type is used for the literal; otherwise, the type 28597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // of std::size_t or std::ptrdiff_t is used. 28607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei QualType T = (ImplicitlyConvertedToType.isNull() || 28617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei !ImplicitlyConvertedToType->isIntegerType())? SAE->getType() 28627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei : ImplicitlyConvertedToType; 28637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APSInt V = SAE->EvaluateKnownConstInt(Context.getASTContext()); 28647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleIntegerLiteral(T, V); 28657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch(SAE->getKind()) { 28697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UETT_SizeOf: 28707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 's'; 28717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UETT_AlignOf: 28737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'a'; 28747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case UETT_VecStep: 28767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei DiagnosticsEngine &Diags = Context.getDiags(); 28777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, 28787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "cannot yet mangle vec_step expression"); 28797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Diags.Report(DiagID); 28807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 28817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SAE->isArgumentType()) { 28837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 't'; 28847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(SAE->getArgumentType()); 28857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 28867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'z'; 28877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(SAE->getArgumentExpr()); 28887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 28907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 28917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 28927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXThrowExprClass: { 28937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXThrowExpr *TE = cast<CXXThrowExpr>(E); 2894ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith // <expression> ::= tw <expression> # throw expression 2895ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith // ::= tr # rethrow 28967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TE->getSubExpr()) { 28977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "tw"; 28987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(TE->getSubExpr()); 28997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 29007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "tr"; 29017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXTypeidExprClass: { 29067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXTypeidExpr *TIE = cast<CXXTypeidExpr>(E); 2907ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith // <expression> ::= ti <type> # typeid (type) 2908ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith // ::= te <expression> # typeid (expression) 29097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TIE->isTypeOperand()) { 29107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "ti"; 2911fe16aa31fdfaad4c38aed443d853af293714f1c4David Majnemer mangleType(TIE->getTypeOperand(Context.getASTContext())); 29127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 29137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "te"; 29147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(TIE->getExprOperand()); 29157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXDeleteExprClass: { 29207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXDeleteExpr *DE = cast<CXXDeleteExpr>(E); 2921ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith // <expression> ::= [gs] dl <expression> # [::] delete expr 2922ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith // ::= [gs] da <expression> # [::] delete [] expr 29237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DE->isGlobalDelete()) Out << "gs"; 29247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (DE->isArrayForm() ? "da" : "dl"); 29257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(DE->getArgument()); 29267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::UnaryOperatorClass: { 29307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const UnaryOperator *UO = cast<UnaryOperator>(E); 29317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleOperatorName(UnaryOperator::getOverloadedOperator(UO->getOpcode()), 29327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*Arity=*/1); 29337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(UO->getSubExpr()); 29347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ArraySubscriptExprClass: { 29387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ArraySubscriptExpr *AE = cast<ArraySubscriptExpr>(E); 29397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Array subscript is treated as a syntactically weird form of 29417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // binary operator. 29427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "ix"; 29437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(AE->getLHS()); 29447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(AE->getRHS()); 29457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CompoundAssignOperatorClass: // fallthrough 29497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::BinaryOperatorClass: { 29507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const BinaryOperator *BO = cast<BinaryOperator>(E); 29517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (BO->getOpcode() == BO_PtrMemD) 29527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "ds"; 29537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 29547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleOperatorName(BinaryOperator::getOverloadedOperator(BO->getOpcode()), 29557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei /*Arity=*/2); 29567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(BO->getLHS()); 29577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(BO->getRHS()); 29587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ConditionalOperatorClass: { 29627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ConditionalOperator *CO = cast<ConditionalOperator>(E); 29637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleOperatorName(OO_Conditional, /*Arity=*/3); 29647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(CO->getCond()); 29657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(CO->getLHS(), Arity); 29667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(CO->getRHS(), Arity); 29677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ImplicitCastExprClass: { 29717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ImplicitlyConvertedToType = E->getType(); 29727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei E = cast<ImplicitCastExpr>(E)->getSubExpr(); 29737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei goto recurse; 29747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCBridgedCastExprClass: { 29777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle ownership casts as a vendor extended operator __bridge, 29787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // __bridge_transfer, or __bridge_retain. 29797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei StringRef Kind = cast<ObjCBridgedCastExpr>(E)->getBridgeKindName(); 29807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "v1U" << Kind.size() << Kind; 29817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Fall through to mangle the cast itself. 29837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CStyleCastExprClass: 29857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXStaticCastExprClass: 29867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXDynamicCastExprClass: 29877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXReinterpretCastExprClass: 29887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXConstCastExprClass: 29897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXFunctionalCastExprClass: { 29907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ExplicitCastExpr *ECE = cast<ExplicitCastExpr>(E); 29917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "cv"; 29927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(ECE->getType()); 29937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(ECE->getSubExpr()); 29947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 29957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 29967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 29977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXOperatorCallExprClass: { 29987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(E); 29997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumArgs = CE->getNumArgs(); 30007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleOperatorName(CE->getOperator(), /*Arity=*/NumArgs); 30017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the arguments. 30027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0; i != NumArgs; ++i) 30037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(CE->getArg(i)); 30047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ParenExprClass: 30087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<ParenExpr>(E)->getSubExpr(), Arity); 30097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::DeclRefExprClass: { 30127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const NamedDecl *D = cast<DeclRefExpr>(E)->getDecl(); 30137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (D->getKind()) { 30157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei default: 30167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expr-primary> ::= L <mangled-name> E # external name 30177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 30187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangle(D, "_Z"); 30197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 30207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Decl::ParmVar: 30237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleFunctionParam(cast<ParmVarDecl>(D)); 30247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Decl::EnumConstant: { 30277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const EnumConstantDecl *ED = cast<EnumConstantDecl>(D); 30287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleIntegerLiteral(ED->getType(), ED->getInitVal()); 30297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Decl::NonTypeTemplateParm: { 30337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D); 30347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(PD->getIndex()); 30357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::SubstNonTypeTemplateParmPackExprClass: 30447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: not clear how to mangle this! 30457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <unsigned N...> class A { 30467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // template <class U...> void foo(U (&x)[N]...); 30477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // }; 30487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "_SUBSTPACK_"; 30497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::FunctionParmPackExprClass: { 30527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: not clear how to mangle this! 30537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FunctionParmPackExpr *FPPE = cast<FunctionParmPackExpr>(E); 30547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "v110_SUBSTPACK"; 30557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleFunctionParam(FPPE->getParameterPack()); 30567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::DependentScopeDeclRefExprClass: { 30607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E); 30616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleUnresolvedName(DRE->getQualifier(), nullptr, DRE->getDeclName(), 30626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Arity); 30637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // All the <unresolved-name> productions end in a 30657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // base-unresolved-name, where <template-args> are just tacked 30667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // onto the end. 30677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (DRE->hasExplicitTemplateArgs()) 30687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArgs(DRE->getExplicitTemplateArgs()); 30697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXBindTemporaryExprClass: 30737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<CXXBindTemporaryExpr>(E)->getSubExpr()); 30747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ExprWithCleanupsClass: 30777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<ExprWithCleanups>(E)->getSubExpr(), Arity); 30787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::FloatingLiteralClass: { 30817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const FloatingLiteral *FL = cast<FloatingLiteral>(E); 30827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 30837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(FL->getType()); 30847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleFloat(FL->getValue()); 30857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 30867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 30887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CharacterLiteralClass: 30907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 30917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(E->getType()); 30927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << cast<CharacterLiteral>(E)->getValue(); 30937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 30947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 30957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 30967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME. __objc_yes/__objc_no are mangled same as true/false 30977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ObjCBoolLiteralExprClass: 30987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Lb"; 30997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (cast<ObjCBoolLiteralExpr>(E)->getValue() ? '1' : '0'); 31007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 31017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXBoolLiteralExprClass: 31047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Lb"; 31057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (cast<CXXBoolLiteralExpr>(E)->getValue() ? '1' : '0'); 31067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 31077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::IntegerLiteralClass: { 31107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APSInt Value(cast<IntegerLiteral>(E)->getValue()); 31117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (E->getType()->isSignedIntegerType()) 31127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Value.setIsSigned(true); 31137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleIntegerLiteral(E->getType(), Value); 31147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::ImaginaryLiteralClass: { 31187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ImaginaryLiteral *IE = cast<ImaginaryLiteral>(E); 31197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle as if a complex literal. 31207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Proposal from David Vandevoorde, 2010.06.30. 31217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 31227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(E->getType()); 31237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const FloatingLiteral *Imag = 31247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<FloatingLiteral>(IE->getSubExpr())) { 31257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle a floating-point zero of the appropriate type. 31267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleFloat(llvm::APFloat(Imag->getValue().getSemantics())); 31277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 31287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleFloat(Imag->getValue()); 31297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 31307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "0_"; 31317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::APSInt Value(cast<IntegerLiteral>(IE->getSubExpr())->getValue()); 31327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (IE->getSubExpr()->getType()->isSignedIntegerType()) 31337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Value.setIsSigned(true); 31347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleNumber(Value); 31357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 31377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::StringLiteralClass: { 31417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Revised proposal from David Vandervoorde, 2010.07.15. 31427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 31437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(isa<ConstantArrayType>(E->getType())); 31447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(E->getType()); 31457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 31467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::GNUNullExprClass: 31507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: should this really be mangled the same as nullptr? 31517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // fallthrough 31527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXNullPtrLiteralExprClass: { 31547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "LDnE"; 31557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::PackExpansionExprClass: 31597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "sp"; 31607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<PackExpansionExpr>(E)->getPattern()); 31617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::SizeOfPackExprClass: { 31647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "sZ"; 31657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const NamedDecl *Pack = cast<SizeOfPackExpr>(E)->getPack(); 31667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const TemplateTypeParmDecl *TTP = dyn_cast<TemplateTypeParmDecl>(Pack)) 31677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(TTP->getIndex()); 31687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const NonTypeTemplateParmDecl *NTTP 31697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<NonTypeTemplateParmDecl>(Pack)) 31707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(NTTP->getIndex()); 31717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else if (const TemplateTemplateParmDecl *TempTP 31727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei = dyn_cast<TemplateTemplateParmDecl>(Pack)) 31737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateParameter(TempTP->getIndex()); 31747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 31757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleFunctionParam(cast<ParmVarDecl>(Pack)); 31767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::MaterializeTemporaryExprClass: { 31807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(cast<MaterializeTemporaryExpr>(E)->GetTemporaryExpr()); 31817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Expr::CXXThisExprClass: 31857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "fpT"; 31867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 31877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 31887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 31897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 31907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// Mangle an expression which refers to a parameter variable. 31917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 31927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <expression> ::= <function-param> 31937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <function-param> ::= fp <top-level CV-qualifiers> _ # L == 0, I == 0 31947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <function-param> ::= fp <top-level CV-qualifiers> 31957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <parameter-2 non-negative number> _ # L == 0, I > 0 31967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <function-param> ::= fL <L-1 non-negative number> 31977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// p <top-level CV-qualifiers> _ # L > 0, I == 0 31987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <function-param> ::= fL <L-1 non-negative number> 31997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// p <top-level CV-qualifiers> 32007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// <I-1 non-negative number> _ # L > 0, I > 0 32017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 32027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// L is the nesting depth of the parameter, defined as 1 if the 32037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// parameter comes from the innermost function prototype scope 32047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// enclosing the current context, 2 if from the next enclosing 32057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// function prototype scope, and so on, with one special case: if 32067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// we've processed the full parameter clause for the innermost 32077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// function type, then L is one less. This definition conveniently 32087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// makes it irrelevant whether a function's result type was written 32097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// trailing or leading, but is otherwise overly complicated; the 32107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// numbering was first designed without considering references to 32117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// parameter in locations other than return types, and then the 32127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// mangling had to be generalized without changing the existing 32137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// manglings. 32147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 32157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// I is the zero-based index of the parameter within its parameter 32167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// declaration clause. Note that the original ABI document describes 32177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// this using 1-based ordinals. 32187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleFunctionParam(const ParmVarDecl *parm) { 32197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned parmDepth = parm->getFunctionScopeDepth(); 32207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned parmIndex = parm->getFunctionScopeIndex(); 32217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Compute 'L'. 32237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // parmDepth does not include the declaring function prototype. 32247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FunctionTypeDepth does account for that. 32257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(parmDepth < FunctionTypeDepth.getDepth()); 32267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned nestingDepth = FunctionTypeDepth.getDepth() - parmDepth; 32277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (FunctionTypeDepth.isInResultType()) 32287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei nestingDepth--; 32297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (nestingDepth == 0) { 32317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "fp"; 32327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } else { 32337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "fL" << (nestingDepth - 1) << 'p'; 32347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Top-level qualifiers. We don't have to worry about arrays here, 32377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // because parameters declared as arrays should already have been 32387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // transformed to have pointer type. FIXME: apparently these don't 32397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // get mangled if used as an rvalue of a known non-class type? 32407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!parm->getType()->isArrayType() 32417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei && "parameter's type is still an array type?"); 32427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleQualifiers(parm->getType().getQualifiers()); 32437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Parameter index. 32457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (parmIndex != 0) { 32467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << (parmIndex - 1); 32477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << '_'; 32497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleCXXCtorType(CXXCtorType T) { 32527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <ctor-dtor-name> ::= C1 # complete object constructor 32537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= C2 # base object constructor 32547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= C3 # complete object allocating constructor 32557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 32567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T) { 32577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Ctor_Complete: 32587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "C1"; 32597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Ctor_Base: 32617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "C2"; 32627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Ctor_CompleteAllocating: 32647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "C3"; 32657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleCXXDtorType(CXXDtorType T) { 32707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <ctor-dtor-name> ::= D0 # deleting destructor 32717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= D1 # complete object destructor 32727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= D2 # base object destructor 32737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 32747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (T) { 32757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Dtor_Deleting: 32767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "D0"; 32777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Dtor_Complete: 32797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "D1"; 32807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case Dtor_Base: 32827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "D2"; 32837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 32847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 32857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleTemplateArgs( 32887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ASTTemplateArgumentListInfo &TemplateArgs) { 32897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-args> ::= I <template-arg>+ E 32907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'I'; 32917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = TemplateArgs.NumTemplateArgs; i != e; ++i) 32927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArg(TemplateArgs.getTemplateArgs()[i].getArgument()); 32937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 32947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 32957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 32967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleTemplateArgs(const TemplateArgumentList &AL) { 32977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-args> ::= I <template-arg>+ E 32987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'I'; 32997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0, e = AL.size(); i != e; ++i) 33007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArg(AL[i]); 33017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 33027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleTemplateArgs(const TemplateArgument *TemplateArgs, 33057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned NumTemplateArgs) { 33067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-args> ::= I <template-arg>+ E 33077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'I'; 33087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei for (unsigned i = 0; i != NumTemplateArgs; ++i) 33097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArg(TemplateArgs[i]); 33107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 33117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 33127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleTemplateArg(TemplateArgument A) { 33147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-arg> ::= <type> # type or template 33157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= X <expression> E # expression 33167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= <expr-primary> # simple expressions 33177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= J <template-arg>* E # argument pack 33187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!A.isInstantiationDependent() || A.isDependent()) 33197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei A = Context.getASTContext().getCanonicalTemplateArgument(A); 33207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei switch (A.getKind()) { 33227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Null: 33237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm_unreachable("Cannot mangle NULL template argument"); 33247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Type: 33267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(A.getAsType()); 33277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Template: 33297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // This is mangled as <type>. 33307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(A.getAsTemplate()); 33317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::TemplateExpansion: 33337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <type> ::= Dp <type> # pack expansion (C++0x) 33347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Dp"; 33357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(A.getAsTemplateOrTemplatePattern()); 33367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Expression: { 33387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // It's possible to end up with a DeclRefExpr here in certain 33397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // dependent cases, in which case we should mangle as a 33407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // declaration. 33417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const Expr *E = A.getAsExpr()->IgnoreParens(); 33427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const DeclRefExpr *DRE = dyn_cast<DeclRefExpr>(E)) { 33437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ValueDecl *D = DRE->getDecl(); 33447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isa<VarDecl>(D) || isa<FunctionDecl>(D)) { 33457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "L"; 33467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangle(D, "_Z"); 33477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 33487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'X'; 33537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleExpression(E); 33547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 33557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Integral: 33587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleIntegerLiteral(A.getIntegralType(), A.getAsIntegral()); 33597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Declaration: { 33617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expr-primary> ::= L <mangled-name> E # external name 33627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Clang produces AST's where pointer-to-member-function expressions 33637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // and pointer-to-function expressions are represented as a declaration not 33647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // an expression. We compensate for it here to produce the correct mangling. 33657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ValueDecl *D = A.getAsDecl(); 33667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool compensateMangling = !A.isDeclForReferenceParam(); 33677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (compensateMangling) { 33687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'X'; 33697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleOperatorName(OO_Amp, 1); 33707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 33737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // References to external entities use the mangled name; if the name would 33747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // not normally be manged then mangle it as unqualified. 33757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // 33767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // FIXME: The ABI specifies that external names here should have _Z, but 33777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // gcc leaves this off. 33787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (compensateMangling) 33797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangle(D, "_Z"); 33807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 33817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangle(D, "Z"); 33827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 33837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (compensateMangling) 33857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 33867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 33877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::NullPtr: { 33907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <expr-primary> ::= L <type> 0 E 33917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'L'; 33927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleType(A.getNullPtrType()); 33937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "0E"; 33947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei break; 33957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 33967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei case TemplateArgument::Pack: { 3397ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith // <template-arg> ::= J <template-arg>* E 33987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'J'; 3399ec1f905faa3d55dd8760061275ff37d7c0820c06Richard Smith for (TemplateArgument::pack_iterator PA = A.pack_begin(), 34007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PAEnd = A.pack_end(); 34017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PA != PAEnd; ++PA) 34027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei mangleTemplateArg(*PA); 34037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'E'; 34047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleTemplateParameter(unsigned Index) { 34097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <template-param> ::= T_ # first template parameter 34107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::= T <parameter-2 non-negative number> _ 34117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (Index == 0) 34127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "T_"; 34137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei else 34147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << 'T' << (Index - 1) << '_'; 34157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34176bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesvoid CXXNameMangler::mangleSeqID(unsigned SeqID) { 34186bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines if (SeqID == 1) 34196bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << '0'; 34206bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines else if (SeqID > 1) { 34216bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SeqID--; 34226bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34236bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines // <seq-id> is encoded in base-36, using digits and upper case letters. 34246bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines char Buffer[7]; // log(2**32) / log(36) ~= 7 3425ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MutableArrayRef<char> BufferRef(Buffer); 3426ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MutableArrayRef<char>::reverse_iterator I = BufferRef.rbegin(); 34276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines for (; SeqID != 0; SeqID /= 36) { 34296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned C = SeqID % 36; 34306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines *I++ = (C < 10 ? '0' + C : 'A' + C - 10); 34316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 34326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out.write(I.base(), I - BufferRef.rbegin()); 34346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 34356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << '_'; 34366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 34376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 34387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleExistingSubstitution(QualType type) { 34397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool result = mangleSubstitution(type); 34407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(result && "no existing substitution for type"); 34417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void) result; 34427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::mangleExistingSubstitution(TemplateName tname) { 34457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei bool result = mangleSubstitution(tname); 34467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(result && "no existing substitution for template name"); 34477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei (void) result; 34487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// <substitution> ::= S <seq-id> _ 34517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// ::= S_ 34527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) { 34537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Try one of the standard substitutions first. 34547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (mangleStandardSubstitution(ND)) 34557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 34567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei ND = cast<NamedDecl>(ND->getCanonicalDecl()); 34587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return mangleSubstitution(reinterpret_cast<uintptr_t>(ND)); 34597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Determine whether the given type has any qualifiers that are 34627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// relevant for substitutions. 34637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool hasMangledSubstitutionQualifiers(QualType T) { 34647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Qualifiers Qs = T.getQualifiers(); 34657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Qs.getCVRQualifiers() || Qs.hasAddressSpace(); 34667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CXXNameMangler::mangleSubstitution(QualType T) { 34697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!hasMangledSubstitutionQualifiers(T)) { 34707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *RT = T->getAs<RecordType>()) 34717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return mangleSubstitution(RT->getDecl()); 34727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 34737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr()); 34757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return mangleSubstitution(TypePtr); 34777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CXXNameMangler::mangleSubstitution(TemplateName Template) { 34807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateDecl *TD = Template.getAsTemplateDecl()) 34817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return mangleSubstitution(TD); 34827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Template = Context.getASTContext().getCanonicalTemplateName(Template); 34847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return mangleSubstitution( 34857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei reinterpret_cast<uintptr_t>(Template.getAsVoidPointer())); 34867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { 34897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei llvm::DenseMap<uintptr_t, unsigned>::iterator I = Substitutions.find(Ptr); 34907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (I == Substitutions.end()) 34917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 34927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei unsigned SeqID = I->second; 34946bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Out << 'S'; 34956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines mangleSeqID(SeqID); 34967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 34977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 34987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 34997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isCharType(QualType T) { 35017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T.isNull()) 35027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return T->isSpecificBuiltinType(BuiltinType::Char_S) || 35057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei T->isSpecificBuiltinType(BuiltinType::Char_U); 35067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 35077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// isCharSpecialization - Returns whether a given type is a template 35097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// specialization of a given name with a single argument of type char. 35107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isCharSpecialization(QualType T, const char *Name) { 35117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (T.isNull()) 35127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const RecordType *RT = T->getAs<RecordType>(); 35157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!RT) 35167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const ClassTemplateSpecializationDecl *SD = 35197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl()); 35207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SD) 35217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isStdNamespace(getEffectiveDeclContext(SD))) 35247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); 35277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateArgs.size() != 1) 35287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isCharType(TemplateArgs[0].getAsType())) 35317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return SD->getIdentifier()->getName() == Name; 35347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 35357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeitemplate <std::size_t StrLen> 35377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeistatic bool isStreamCharSpecialization(const ClassTemplateSpecializationDecl*SD, 35387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const char (&Str)[StrLen]) { 35397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!SD->getIdentifier()->isStr(Str)) 35407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); 35437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateArgs.size() != 2) 35447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isCharType(TemplateArgs[0].getAsType())) 35477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isCharSpecialization(TemplateArgs[1].getAsType(), "char_traits")) 35507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 35547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeibool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) { 35567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <substitution> ::= St # ::std:: 35577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) { 35587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isStd(NS)) { 35597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "St"; 35607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ClassTemplateDecl *TD = dyn_cast<ClassTemplateDecl>(ND)) { 35657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isStdNamespace(getEffectiveDeclContext(TD))) 35667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35677f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35687f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <substitution> ::= Sa # ::std::allocator 35697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TD->getIdentifier()->isStr("allocator")) { 35707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Sa"; 35717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <<substitution> ::= Sb # ::std::basic_string 35757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TD->getIdentifier()->isStr("basic_string")) { 35767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Sb"; 35777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 35787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 35807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const ClassTemplateSpecializationDecl *SD = 35827f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei dyn_cast<ClassTemplateSpecializationDecl>(ND)) { 35837f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isStdNamespace(getEffectiveDeclContext(SD))) 35847f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <substitution> ::= Ss # ::std::basic_string<char, 35877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::std::char_traits<char>, 35887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::std::allocator<char> > 35897f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (SD->getIdentifier()->isStr("basic_string")) { 35907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs(); 35917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateArgs.size() != 3) 35937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isCharType(TemplateArgs[0].getAsType())) 35967f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 35977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 35987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isCharSpecialization(TemplateArgs[1].getAsType(), "char_traits")) 35997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 36007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!isCharSpecialization(TemplateArgs[2].getAsType(), "allocator")) 36027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 36037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Ss"; 36057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 36067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <substitution> ::= Si # ::std::basic_istream<char, 36097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::std::char_traits<char> > 36107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isStreamCharSpecialization(SD, "basic_istream")) { 36117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Si"; 36127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 36137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36157f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <substitution> ::= So # ::std::basic_ostream<char, 36167f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::std::char_traits<char> > 36177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isStreamCharSpecialization(SD, "basic_ostream")) { 36187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "So"; 36197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 36207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <substitution> ::= Sd # ::std::basic_iostream<char, 36237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // ::std::char_traits<char> > 36247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (isStreamCharSpecialization(SD, "basic_iostream")) { 36257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Out << "Sd"; 36267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return true; 36277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return false; 36307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::addSubstitution(QualType T) { 36337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!hasMangledSubstitutionQualifiers(T)) { 36347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (const RecordType *RT = T->getAs<RecordType>()) { 36357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(RT->getDecl()); 36367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return; 36377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei } 36397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr()); 36417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(TypePtr); 36427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::addSubstitution(TemplateName Template) { 36457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (TemplateDecl *TD = Template.getAsTemplateDecl()) 36467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return addSubstitution(TD); 36477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Template = Context.getASTContext().getCanonicalTemplateName(Template); 36497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei addSubstitution(reinterpret_cast<uintptr_t>(Template.getAsVoidPointer())); 36507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36517f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36527f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyeivoid CXXNameMangler::addSubstitution(uintptr_t Ptr) { 36537f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!Substitutions.count(Ptr) && "Substitution already exists!"); 36547f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Substitutions[Ptr] = SeqID++; 36557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36567f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36577f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei// 36587f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36597f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// \brief Mangles the name of the declaration D and emits that name to the 36607f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// given output stream. 36617f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// 36627f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// If the declaration D requires a mangled name, this routine will emit that 36637f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// mangled name to \p os and return true. Otherwise, \p os will be unchanged 36647f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// and this routine will return false. In this case, the caller should just 36657f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// emit the identifier of the declaration (\c D->getIdentifier()) as its 36667f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// name. 3667d6be277ba4bf271c6de8ffcc8c46f060c8cbd4d5Rafael Espindolavoid ItaniumMangleContextImpl::mangleCXXName(const NamedDecl *D, 3668d6be277ba4bf271c6de8ffcc8c46f060c8cbd4d5Rafael Espindola raw_ostream &Out) { 36697f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) && 36707f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Invalid mangleName() call, argument is not a variable or function!"); 36717f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!isa<CXXConstructorDecl>(D) && !isa<CXXDestructorDecl>(D) && 36727f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Invalid mangleName() call on 'structor decl!"); 36737f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36747f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei PrettyStackTraceDecl CrashInfo(D, SourceLocation(), 36757f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei getASTContext().getSourceManager(), 36767f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Mangling declaration"); 36777f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 36787f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out, D); 36797f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei return Mangler.mangle(D); 36807f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36817f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 368211f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXCtor(const CXXConstructorDecl *D, 368311f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov CXXCtorType Type, 368411f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 36857f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out, D, Type); 36867f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangle(D); 36877f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36887f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 368911f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXDtor(const CXXDestructorDecl *D, 369011f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov CXXDtorType Type, 369111f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 36927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out, D, Type); 36937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangle(D); 36947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 36957f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 369611f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleThunk(const CXXMethodDecl *MD, 369711f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov const ThunkInfo &Thunk, 369811f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 36997f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= T <call-offset> <base encoding> 37007f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # base is the nominal target function of thunk 37017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= Tc <call-offset> <call-offset> <base encoding> 37027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # base is the nominal target function of thunk 37037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # first call-offset is 'this' adjustment 37047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # second call-offset is result adjustment 37057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!isa<CXXDestructorDecl>(MD) && 37077f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei "Use mangleCXXDtor for destructor decls!"); 37087f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 37097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZT"; 37107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Thunk.Return.isEmpty()) 37117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << 'c'; 37127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the 'this' pointer adjustment. 371458b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov Mangler.mangleCallOffset(Thunk.This.NonVirtual, 371558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov Thunk.This.Virtual.Itanium.VCallOffsetOffset); 371658b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov 37177f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the return pointer adjustment if there is one. 37187f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei if (!Thunk.Return.isEmpty()) 37197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleCallOffset(Thunk.Return.NonVirtual, 3720c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov Thunk.Return.Virtual.Itanium.VBaseOffsetOffset); 3721c70cc5d90403f99ccce5cab3a6c022ad9cdcb66cTimur Iskhodzhanov 37227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleFunctionEncoding(MD); 37237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 372511f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXDtorThunk( 372611f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov const CXXDestructorDecl *DD, CXXDtorType Type, 372711f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov const ThisAdjustment &ThisAdjustment, raw_ostream &Out) { 37287f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= T <call-offset> <base encoding> 37297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # base is the nominal target function of thunk 37307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out, DD, Type); 37317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZT"; 37327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // Mangle the 'this' pointer adjustment. 37347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleCallOffset(ThisAdjustment.NonVirtual, 373558b6db76adab8dee2e64fbc300360f9b46c561baTimur Iskhodzhanov ThisAdjustment.Virtual.Itanium.VCallOffsetOffset); 37367f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37377f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleFunctionEncoding(DD); 37387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 37407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// mangleGuardVariable - Returns the mangled name for a guard variable 37417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei/// for the passed in VarDecl. 374211f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleStaticGuardVariable(const VarDecl *D, 374311f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 37447f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= GV <object name> # Guard variable for one-time 37457f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // # initialization 37467f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 37477f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZGV"; 37487f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleName(D); 37497f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37507f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 375111f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleDynamicInitializer(const VarDecl *MD, 375211f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 3753c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner // These symbols are internal in the Itanium ABI, so the names don't matter. 3754c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner // Clang has traditionally used this symbol and allowed LLVM to adjust it to 3755c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner // avoid duplicate symbols. 3756c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner Out << "__cxx_global_var_init"; 3757c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner} 3758c5c6fa78fd0e6a15c5611e8a059359054cfbf9d5Reid Kleckner 375911f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleDynamicAtExitDestructor(const VarDecl *D, 376011f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 3761942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner // Prefix the mangling of D with __dtor_. 3762942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner CXXNameMangler Mangler(*this, Out); 3763942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner Mangler.getStream() << "__dtor_"; 3764942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner if (shouldMangleDeclName(D)) 3765942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner Mangler.mangle(D); 3766942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner else 3767942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner Mangler.getStream() << D->getName(); 3768942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner} 3769942f9fe11d3a9583eef6bc4ca2549b1f0d1694daReid Kleckner 377011f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleItaniumThreadLocalInit(const VarDecl *D, 377111f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 3772b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith // <special-name> ::= TH <object name> 3773b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith CXXNameMangler Mangler(*this, Out); 3774b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith Mangler.getStream() << "_ZTH"; 3775b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith Mangler.mangleName(D); 3776b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith} 3777b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith 377811f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid 377911f22a35b7f08a8d017f6ab26e440edffc930f96Timur IskhodzhanovItaniumMangleContextImpl::mangleItaniumThreadLocalWrapper(const VarDecl *D, 378011f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 3781b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith // <special-name> ::= TW <object name> 3782b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith CXXNameMangler Mangler(*this, Out); 3783b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith Mangler.getStream() << "_ZTW"; 3784b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith Mangler.mangleName(D); 3785b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith} 3786b80a16eadd0dacabfc1c32412e243ccb99dd664dRichard Smith 378711f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleReferenceTemporary(const VarDecl *D, 37886bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines unsigned ManglingNumber, 378911f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 37907f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // We match the GCC mangling here. 37917f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= GR <object name> 37927f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 37937f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZGR"; 37947f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleName(D); 37956bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(ManglingNumber > 0 && "Reference temporary mangling number is zero!"); 37966bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Mangler.mangleSeqID(ManglingNumber - 1); 37977f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 37987f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 379911f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXVTable(const CXXRecordDecl *RD, 380011f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 38017f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= TV <type> # virtual table 38027f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 38037f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZTV"; 38047f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleNameOrStandardSubstitution(RD); 38057f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38067f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 380711f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXVTT(const CXXRecordDecl *RD, 380811f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 38097f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= TT <type> # VTT structure 38107f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 38117f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZTT"; 38127f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleNameOrStandardSubstitution(RD); 38137f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38147f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 381511f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXCtorVTable(const CXXRecordDecl *RD, 381611f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov int64_t Offset, 381711f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov const CXXRecordDecl *Type, 381811f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 38197f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= TC <type> <offset number> _ <base type> 38207f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 38217f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZTC"; 38227f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleNameOrStandardSubstitution(RD); 38237f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << Offset; 38247f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << '_'; 38257f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleNameOrStandardSubstitution(Type); 38267f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38277f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 382811f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXRTTI(QualType Ty, raw_ostream &Out) { 38297f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= TI <type> # typeinfo structure 38307f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei assert(!Ty.hasQualifiers() && "RTTI info cannot have top-level qualifiers"); 38317f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 38327f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZTI"; 38337f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleType(Ty); 38347f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38357f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 383611f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanovvoid ItaniumMangleContextImpl::mangleCXXRTTIName(QualType Ty, 383711f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov raw_ostream &Out) { 38387f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei // <special-name> ::= TS <type> # typeinfo name (null terminated byte string) 38397f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei CXXNameMangler Mangler(*this, Out); 38407f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.getStream() << "_ZTS"; 38417f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei Mangler.mangleType(Ty); 38427f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 38437f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei 38447b0fe5d62cc31a61188a20b243794b800baa3e7eBill Wendlingvoid ItaniumMangleContextImpl::mangleTypeName(QualType Ty, raw_ostream &Out) { 38457b0fe5d62cc31a61188a20b243794b800baa3e7eBill Wendling mangleCXXRTTIName(Ty, Out); 38467b0fe5d62cc31a61188a20b243794b800baa3e7eBill Wendling} 38477b0fe5d62cc31a61188a20b243794b800baa3e7eBill Wendling 3848651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid ItaniumMangleContextImpl::mangleStringLiteral(const StringLiteral *, raw_ostream &) { 3849651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm_unreachable("Can't mangle string literals"); 3850651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 3851651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 385211f22a35b7f08a8d017f6ab26e440edffc930f96Timur IskhodzhanovItaniumMangleContext * 385311f22a35b7f08a8d017f6ab26e440edffc930f96Timur IskhodzhanovItaniumMangleContext::create(ASTContext &Context, DiagnosticsEngine &Diags) { 385411f22a35b7f08a8d017f6ab26e440edffc930f96Timur Iskhodzhanov return new ItaniumMangleContextImpl(Context, Diags); 38557f92f2d8d9b7a07900c030183bc13a9ff60057ccGuy Benyei} 3856