blob: 69752b923e0062d64ce8ac0796087329f052d17e [file] [log] [blame]
Douglas Gregor6ec36682009-02-18 23:53:56 +00001//===--- Mangle.cpp - Mangle C++ Names --------------------------*- C++ -*-===//
Douglas Gregor5f2bfd42009-02-13 00:10:09 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// Implements C++ name mangling according to the Itanium C++ ABI,
11// which is used in GCC 3.2 and newer (and many compilers that are
12// ABI-compatible with GCC):
13//
14// http://www.codesourcery.com/public/cxx-abi/abi.html
15//
16//===----------------------------------------------------------------------===//
17#include "Mangle.h"
18#include "clang/AST/ASTContext.h"
19#include "clang/AST/Decl.h"
20#include "clang/AST/DeclCXX.h"
Anders Carlssona40c5e42009-03-07 22:03:21 +000021#include "clang/AST/DeclObjC.h"
Anders Carlsson7a0ba872009-05-15 16:09:15 +000022#include "clang/AST/DeclTemplate.h"
Anders Carlsson50755b02009-09-27 20:11:34 +000023#include "clang/AST/ExprCXX.h"
Douglas Gregor6ec36682009-02-18 23:53:56 +000024#include "clang/Basic/SourceManager.h"
Anders Carlssonc4355b62009-10-07 01:45:02 +000025#include "llvm/ADT/StringExtras.h"
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000026#include "llvm/Support/raw_ostream.h"
John McCallefe6aee2009-09-05 07:56:18 +000027#include "llvm/Support/ErrorHandling.h"
Anders Carlssonb73a5be2009-11-26 02:49:32 +000028#include "CGVtable.h"
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000029using namespace clang;
Anders Carlssonb73a5be2009-11-26 02:49:32 +000030using namespace CodeGen;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000031
32namespace {
Anders Carlsson7e120032009-11-24 05:36:32 +000033
34static const CXXMethodDecl *getStructor(const CXXMethodDecl *MD) {
35 assert((isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)) &&
36 "Passed in decl is not a ctor or dtor!");
37
38 if (const TemplateDecl *TD = MD->getPrimaryTemplate()) {
39 MD = cast<CXXMethodDecl>(TD->getTemplatedDecl());
40
41 assert((isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)) &&
42 "Templated decl is not a ctor or dtor!");
43 }
44
45 return MD;
46}
John McCall1dd73832010-02-04 01:42:13 +000047
48static const unsigned UnknownArity = ~0U;
Anders Carlsson7e120032009-11-24 05:36:32 +000049
Daniel Dunbar1b077112009-11-21 09:06:10 +000050/// CXXNameMangler - Manage the mangling of a single name.
Daniel Dunbarc0747712009-11-21 09:12:13 +000051class CXXNameMangler {
Daniel Dunbar1b077112009-11-21 09:06:10 +000052 MangleContext &Context;
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000053 llvm::raw_svector_ostream Out;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000054
Daniel Dunbar1b077112009-11-21 09:06:10 +000055 const CXXMethodDecl *Structor;
56 unsigned StructorType;
Mike Stump1eb44332009-09-09 15:08:12 +000057
Daniel Dunbar1b077112009-11-21 09:06:10 +000058 llvm::DenseMap<uintptr_t, unsigned> Substitutions;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +000059
John McCall1dd73832010-02-04 01:42:13 +000060 ASTContext &getASTContext() const { return Context.getASTContext(); }
61
Daniel Dunbarc0747712009-11-21 09:12:13 +000062public:
Daniel Dunbar94fd26d2009-11-21 09:06:22 +000063 CXXNameMangler(MangleContext &C, llvm::SmallVectorImpl<char> &Res)
64 : Context(C), Out(Res), Structor(0), StructorType(0) { }
Daniel Dunbar77939c92009-11-21 09:06:31 +000065 CXXNameMangler(MangleContext &C, llvm::SmallVectorImpl<char> &Res,
66 const CXXConstructorDecl *D, CXXCtorType Type)
Anders Carlsson7e120032009-11-24 05:36:32 +000067 : Context(C), Out(Res), Structor(getStructor(D)), StructorType(Type) { }
Daniel Dunbar77939c92009-11-21 09:06:31 +000068 CXXNameMangler(MangleContext &C, llvm::SmallVectorImpl<char> &Res,
69 const CXXDestructorDecl *D, CXXDtorType Type)
Anders Carlsson7e120032009-11-24 05:36:32 +000070 : Context(C), Out(Res), Structor(getStructor(D)), StructorType(Type) { }
Douglas Gregor5f2bfd42009-02-13 00:10:09 +000071
Daniel Dunbarc0747712009-11-21 09:12:13 +000072 llvm::raw_svector_ostream &getStream() { return Out; }
73
Daniel Dunbar7e0c1952009-11-21 09:17:15 +000074 void mangle(const NamedDecl *D, llvm::StringRef Prefix = "_Z");
Anders Carlssonb73a5be2009-11-26 02:49:32 +000075 void mangleCallOffset(const ThunkAdjustment &Adjustment);
Anders Carlssona94822e2009-11-26 02:32:05 +000076 void mangleNumber(int64_t Number);
Daniel Dunbarc0747712009-11-21 09:12:13 +000077 void mangleFunctionEncoding(const FunctionDecl *FD);
78 void mangleName(const NamedDecl *ND);
79 void mangleType(QualType T);
Mike Stump1eb44332009-09-09 15:08:12 +000080
Daniel Dunbarc0747712009-11-21 09:12:13 +000081private:
Daniel Dunbar1b077112009-11-21 09:06:10 +000082 bool mangleSubstitution(const NamedDecl *ND);
83 bool mangleSubstitution(QualType T);
84 bool mangleSubstitution(uintptr_t Ptr);
Daniel Dunbar3c9e4632009-11-21 09:05:47 +000085
Daniel Dunbar1b077112009-11-21 09:06:10 +000086 bool mangleStandardSubstitution(const NamedDecl *ND);
Daniel Dunbar3c9e4632009-11-21 09:05:47 +000087
Daniel Dunbar1b077112009-11-21 09:06:10 +000088 void addSubstitution(const NamedDecl *ND) {
89 ND = cast<NamedDecl>(ND->getCanonicalDecl());
Anders Carlsson433d1372009-11-07 04:26:04 +000090
Daniel Dunbar1b077112009-11-21 09:06:10 +000091 addSubstitution(reinterpret_cast<uintptr_t>(ND));
92 }
93 void addSubstitution(QualType T);
94 void addSubstitution(uintptr_t Ptr);
Daniel Dunbar3c9e4632009-11-21 09:05:47 +000095
John McCall1dd73832010-02-04 01:42:13 +000096 void mangleUnresolvedScope(NestedNameSpecifier *Qualifier);
97 void mangleUnresolvedName(NestedNameSpecifier *Qualifier,
98 DeclarationName Name,
99 unsigned KnownArity = UnknownArity);
100
Daniel Dunbar1b077112009-11-21 09:06:10 +0000101 void mangleName(const TemplateDecl *TD,
102 const TemplateArgument *TemplateArgs,
103 unsigned NumTemplateArgs);
John McCall1dd73832010-02-04 01:42:13 +0000104 void mangleUnqualifiedName(const NamedDecl *ND) {
105 mangleUnqualifiedName(ND, ND->getDeclName(), UnknownArity);
106 }
107 void mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name,
108 unsigned KnownArity);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000109 void mangleUnscopedName(const NamedDecl *ND);
110 void mangleUnscopedTemplateName(const TemplateDecl *ND);
111 void mangleSourceName(const IdentifierInfo *II);
112 void mangleLocalName(const NamedDecl *ND);
Eli Friedman7facf842009-12-02 20:32:49 +0000113 void mangleNestedName(const NamedDecl *ND, const DeclContext *DC);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000114 void mangleNestedName(const TemplateDecl *TD,
115 const TemplateArgument *TemplateArgs,
116 unsigned NumTemplateArgs);
117 void manglePrefix(const DeclContext *DC);
118 void mangleTemplatePrefix(const TemplateDecl *ND);
119 void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity);
120 void mangleQualifiers(Qualifiers Quals);
John McCallefe6aee2009-09-05 07:56:18 +0000121
Anders Carlsson7b06f6c2009-12-10 03:14:39 +0000122 void mangleObjCMethodName(const ObjCMethodDecl *MD);
123
Daniel Dunbar1b077112009-11-21 09:06:10 +0000124 // Declare manglers for every type class.
John McCallefe6aee2009-09-05 07:56:18 +0000125#define ABSTRACT_TYPE(CLASS, PARENT)
126#define NON_CANONICAL_TYPE(CLASS, PARENT)
127#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T);
128#include "clang/AST/TypeNodes.def"
129
Daniel Dunbar1b077112009-11-21 09:06:10 +0000130 void mangleType(const TagType*);
131 void mangleBareFunctionType(const FunctionType *T,
132 bool MangleReturnType);
Anders Carlssone170ba72009-12-14 01:45:37 +0000133
134 void mangleIntegerLiteral(QualType T, const llvm::APSInt &Value);
John McCall2f27bf82010-02-04 02:56:29 +0000135 void mangleMemberExpr(const Expr *Base, bool IsArrow,
136 NestedNameSpecifier *Qualifier,
137 DeclarationName Name,
138 unsigned KnownArity);
John McCall1dd73832010-02-04 01:42:13 +0000139 void mangleCalledExpression(const Expr *E, unsigned KnownArity);
Daniel Dunbar1b077112009-11-21 09:06:10 +0000140 void mangleExpression(const Expr *E);
141 void mangleCXXCtorType(CXXCtorType T);
142 void mangleCXXDtorType(CXXDtorType T);
Mike Stump1eb44332009-09-09 15:08:12 +0000143
Daniel Dunbar1b077112009-11-21 09:06:10 +0000144 void mangleTemplateArgs(const TemplateArgument *TemplateArgs,
145 unsigned NumTemplateArgs);
Anders Carlsson9e85c742009-12-23 19:30:55 +0000146 void mangleTemplateArgs(const TemplateArgumentList &L);
147 void mangleTemplateArg(const TemplateArgument &A);
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000148
Daniel Dunbar1b077112009-11-21 09:06:10 +0000149 void mangleTemplateParameter(unsigned Index);
150};
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000151}
152
Anders Carlsson43f17402009-04-02 15:51:53 +0000153static bool isInCLinkageSpecification(const Decl *D) {
Douglas Gregor457e2812009-10-28 16:31:34 +0000154 D = D->getCanonicalDecl();
Mike Stump1eb44332009-09-09 15:08:12 +0000155 for (const DeclContext *DC = D->getDeclContext();
Anders Carlsson43f17402009-04-02 15:51:53 +0000156 !DC->isTranslationUnit(); DC = DC->getParent()) {
Mike Stump1eb44332009-09-09 15:08:12 +0000157 if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))
Anders Carlsson43f17402009-04-02 15:51:53 +0000158 return Linkage->getLanguage() == LinkageSpecDecl::lang_c;
159 }
Mike Stump1eb44332009-09-09 15:08:12 +0000160
Anders Carlsson43f17402009-04-02 15:51:53 +0000161 return false;
162}
163
Daniel Dunbarf981bf82009-11-21 09:14:52 +0000164bool MangleContext::shouldMangleDeclName(const NamedDecl *D) {
165 // In C, functions with no attributes never need to be mangled. Fastpath them.
166 if (!getASTContext().getLangOptions().CPlusPlus && !D->hasAttrs())
167 return false;
168
169 // Any decl can be declared with __asm("foo") on it, and this takes precedence
170 // over all other naming in the .o file.
171 if (D->hasAttr<AsmLabelAttr>())
172 return true;
173
Mike Stump141c5af2009-09-02 00:25:38 +0000174 // Clang's "overloadable" attribute extension to C/C++ implies name mangling
Anders Carlssona1e16222009-11-07 07:15:03 +0000175 // (always) as does passing a C++ member function and a function
176 // whose name is not a simple identifier.
Daniel Dunbarf981bf82009-11-21 09:14:52 +0000177 const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
178 if (FD && (FD->hasAttr<OverloadableAttr>() || isa<CXXMethodDecl>(FD) ||
179 !FD->getDeclName().isIdentifier()))
180 return true;
Mike Stump1eb44332009-09-09 15:08:12 +0000181
Daniel Dunbarf981bf82009-11-21 09:14:52 +0000182 // Otherwise, no mangling is done outside C++ mode.
183 if (!getASTContext().getLangOptions().CPlusPlus)
184 return false;
Mike Stump1eb44332009-09-09 15:08:12 +0000185
Daniel Dunbarf981bf82009-11-21 09:14:52 +0000186 // No mangling in an "implicit extern C" header.
187 if (D->getLocation().isValid() &&
188 getASTContext().getSourceManager().
189 isInExternCSystemHeader(D->getLocation()))
190 return false;
Anders Carlsson43f17402009-04-02 15:51:53 +0000191
Sean Hunt31455252010-01-24 03:04:27 +0000192 // Variables at global scope with non-internal linkage are not mangled
Eli Friedman7facf842009-12-02 20:32:49 +0000193 if (!FD) {
194 const DeclContext *DC = D->getDeclContext();
195 // Check for extern variable declared locally.
196 if (isa<FunctionDecl>(DC) && D->hasLinkage())
197 while (!DC->isNamespace() && !DC->isTranslationUnit())
198 DC = DC->getParent();
Douglas Gregor0b6bc8b2010-02-03 09:33:45 +0000199 if (DC->isTranslationUnit() && D->getLinkage() != InternalLinkage)
Eli Friedman7facf842009-12-02 20:32:49 +0000200 return false;
201 }
202
203 // C functions and "main" are not mangled.
204 if ((FD && FD->isMain()) || isInCLinkageSpecification(D))
Daniel Dunbarf981bf82009-11-21 09:14:52 +0000205 return false;
206
Anders Carlsson43f17402009-04-02 15:51:53 +0000207 return true;
208}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000209
Daniel Dunbar7e0c1952009-11-21 09:17:15 +0000210void CXXNameMangler::mangle(const NamedDecl *D, llvm::StringRef Prefix) {
Mike Stump141c5af2009-09-02 00:25:38 +0000211 // Any decl can be declared with __asm("foo") on it, and this takes precedence
212 // over all other naming in the .o file.
Argyrios Kyrtzidis40b598e2009-06-30 02:34:44 +0000213 if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
Chris Lattnerca3f25c2009-03-21 08:24:40 +0000214 // If we have an asm name, then we use it as the mangling.
215 Out << '\01'; // LLVM IR Marker for __asm("foo")
216 Out << ALA->getLabel();
Daniel Dunbarf981bf82009-11-21 09:14:52 +0000217 return;
Chris Lattnerca3f25c2009-03-21 08:24:40 +0000218 }
Mike Stump1eb44332009-09-09 15:08:12 +0000219
Sean Hunt31455252010-01-24 03:04:27 +0000220 // <mangled-name> ::= _Z <encoding>
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000221 // ::= <data name>
222 // ::= <special-name>
Daniel Dunbar7e0c1952009-11-21 09:17:15 +0000223 Out << Prefix;
224 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
Daniel Dunbarf981bf82009-11-21 09:14:52 +0000225 mangleFunctionEncoding(FD);
Daniel Dunbar7e0c1952009-11-21 09:17:15 +0000226 else
227 mangleName(cast<VarDecl>(D));
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000228}
229
230void CXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) {
231 // <encoding> ::= <function name> <bare-function-type>
232 mangleName(FD);
Mike Stump1eb44332009-09-09 15:08:12 +0000233
Daniel Dunbar7e0c1952009-11-21 09:17:15 +0000234 // Don't mangle in the type if this isn't a decl we should typically mangle.
235 if (!Context.shouldMangleDeclName(FD))
236 return;
237
Mike Stump141c5af2009-09-02 00:25:38 +0000238 // Whether the mangling of a function type includes the return type depends on
239 // the context and the nature of the function. The rules for deciding whether
240 // the return type is included are:
Mike Stump1eb44332009-09-09 15:08:12 +0000241 //
Douglas Gregor1fd2dd12009-06-29 22:39:32 +0000242 // 1. Template functions (names or types) have return types encoded, with
243 // the exceptions listed below.
Mike Stump1eb44332009-09-09 15:08:12 +0000244 // 2. Function types not appearing as part of a function name mangling,
Douglas Gregor1fd2dd12009-06-29 22:39:32 +0000245 // e.g. parameters, pointer types, etc., have return type encoded, with the
246 // exceptions listed below.
247 // 3. Non-template function names do not have return types encoded.
248 //
Mike Stump141c5af2009-09-02 00:25:38 +0000249 // The exceptions mentioned in (1) and (2) above, for which the return type is
250 // never included, are
Douglas Gregor1fd2dd12009-06-29 22:39:32 +0000251 // 1. Constructors.
252 // 2. Destructors.
253 // 3. Conversion operator functions, e.g. operator int.
254 bool MangleReturnType = false;
Anders Carlsson9234b7f2009-09-17 03:46:43 +0000255 if (FunctionTemplateDecl *PrimaryTemplate = FD->getPrimaryTemplate()) {
256 if (!(isa<CXXConstructorDecl>(FD) || isa<CXXDestructorDecl>(FD) ||
257 isa<CXXConversionDecl>(FD)))
258 MangleReturnType = true;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000259
Anders Carlsson9234b7f2009-09-17 03:46:43 +0000260 // Mangle the type of the primary template.
261 FD = PrimaryTemplate->getTemplatedDecl();
262 }
263
John McCall54e14c42009-10-22 22:37:11 +0000264 // Do the canonicalization out here because parameter types can
265 // undergo additional canonicalization (e.g. array decay).
266 FunctionType *FT = cast<FunctionType>(Context.getASTContext()
267 .getCanonicalType(FD->getType()));
268
269 mangleBareFunctionType(FT, MangleReturnType);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000270}
271
Anders Carlsson47846d22009-12-04 06:23:23 +0000272/// isStd - Return whether a given namespace is the 'std' namespace.
273static bool isStd(const NamespaceDecl *NS) {
John McCall9aeed322009-10-01 00:25:31 +0000274 const IdentifierInfo *II = NS->getOriginalNamespace()->getIdentifier();
275 return II && II->isStr("std");
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000276}
277
Anders Carlsson47846d22009-12-04 06:23:23 +0000278static const DeclContext *IgnoreLinkageSpecDecls(const DeclContext *DC) {
279 while (isa<LinkageSpecDecl>(DC)) {
280 assert(cast<LinkageSpecDecl>(DC)->getLanguage() ==
281 LinkageSpecDecl::lang_cxx && "Unexpected linkage decl!");
282 DC = DC->getParent();
283 }
284
285 return DC;
286}
287
288// isStdNamespace - Return whether a given decl context is a toplevel 'std'
289// namespace.
Daniel Dunbar1308af92009-11-21 09:11:45 +0000290static bool isStdNamespace(const DeclContext *DC) {
Anders Carlsson47846d22009-12-04 06:23:23 +0000291 if (!DC->isNamespace())
292 return false;
293
294 if (!IgnoreLinkageSpecDecls(DC->getParent())->isTranslationUnit())
295 return false;
296
297 return isStd(cast<NamespaceDecl>(DC));
Daniel Dunbar1308af92009-11-21 09:11:45 +0000298}
299
Anders Carlssonbb36ba42009-09-26 03:24:57 +0000300static const TemplateDecl *
301isTemplate(const NamedDecl *ND, const TemplateArgumentList *&TemplateArgs) {
Anders Carlsson2744a062009-09-18 19:00:18 +0000302 // Check if we have a function template.
303 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(ND)){
Anders Carlssonbb36ba42009-09-26 03:24:57 +0000304 if (const TemplateDecl *TD = FD->getPrimaryTemplate()) {
Anders Carlsson2744a062009-09-18 19:00:18 +0000305 TemplateArgs = FD->getTemplateSpecializationArgs();
Anders Carlssonbb36ba42009-09-26 03:24:57 +0000306 return TD;
Anders Carlsson2744a062009-09-18 19:00:18 +0000307 }
308 }
309
Anders Carlssoneafc6dc2009-09-18 19:44:50 +0000310 // Check if we have a class template.
311 if (const ClassTemplateSpecializationDecl *Spec =
312 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
313 TemplateArgs = &Spec->getTemplateArgs();
Anders Carlssonbb36ba42009-09-26 03:24:57 +0000314 return Spec->getSpecializedTemplate();
Anders Carlssoneafc6dc2009-09-18 19:44:50 +0000315 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000316
Anders Carlsson2744a062009-09-18 19:00:18 +0000317 return 0;
318}
319
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000320void CXXNameMangler::mangleName(const NamedDecl *ND) {
321 // <name> ::= <nested-name>
322 // ::= <unscoped-name>
323 // ::= <unscoped-template-name> <template-args>
Anders Carlsson201ce742009-09-17 03:17:01 +0000324 // ::= <local-name>
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000325 //
Anders Carlssond58d6f72009-09-17 16:12:20 +0000326 const DeclContext *DC = ND->getDeclContext();
Eli Friedman7facf842009-12-02 20:32:49 +0000327
328 // If this is an extern variable declared locally, the relevant DeclContext
329 // is that of the containing namespace, or the translation unit.
330 if (isa<FunctionDecl>(DC) && ND->hasLinkage())
331 while (!DC->isNamespace() && !DC->isTranslationUnit())
332 DC = DC->getParent();
333
Anders Carlsson5cc58c62009-09-22 17:23:30 +0000334 while (isa<LinkageSpecDecl>(DC))
Anders Carlssond58d6f72009-09-17 16:12:20 +0000335 DC = DC->getParent();
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000336
Anders Carlssond58d6f72009-09-17 16:12:20 +0000337 if (DC->isTranslationUnit() || isStdNamespace(DC)) {
Anders Carlsson2744a062009-09-18 19:00:18 +0000338 // Check if we have a template.
339 const TemplateArgumentList *TemplateArgs = 0;
Anders Carlsson0fa6df42009-09-26 19:45:45 +0000340 if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
Anders Carlsson2744a062009-09-18 19:00:18 +0000341 mangleUnscopedTemplateName(TD);
Anders Carlsson9e85c742009-12-23 19:30:55 +0000342 mangleTemplateArgs(*TemplateArgs);
Anders Carlsson2744a062009-09-18 19:00:18 +0000343 return;
Anders Carlsson7482e242009-09-18 04:29:09 +0000344 }
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000345
Anders Carlsson7482e242009-09-18 04:29:09 +0000346 mangleUnscopedName(ND);
347 return;
348 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000349
Anders Carlsson7b06f6c2009-12-10 03:14:39 +0000350 if (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC)) {
Anders Carlsson7482e242009-09-18 04:29:09 +0000351 mangleLocalName(ND);
352 return;
353 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000354
Eli Friedman7facf842009-12-02 20:32:49 +0000355 mangleNestedName(ND, DC);
Anders Carlsson7482e242009-09-18 04:29:09 +0000356}
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000357void CXXNameMangler::mangleName(const TemplateDecl *TD,
Anders Carlsson7624f212009-09-18 02:42:01 +0000358 const TemplateArgument *TemplateArgs,
359 unsigned NumTemplateArgs) {
Anders Carlsson47846d22009-12-04 06:23:23 +0000360 const DeclContext *DC = IgnoreLinkageSpecDecls(TD->getDeclContext());
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000361
Anders Carlsson7624f212009-09-18 02:42:01 +0000362 if (DC->isTranslationUnit() || isStdNamespace(DC)) {
Anders Carlsson0fa6df42009-09-26 19:45:45 +0000363 mangleUnscopedTemplateName(TD);
Anders Carlsson7624f212009-09-18 02:42:01 +0000364 mangleTemplateArgs(TemplateArgs, NumTemplateArgs);
365 } else {
366 mangleNestedName(TD, TemplateArgs, NumTemplateArgs);
367 }
368}
369
Anders Carlsson201ce742009-09-17 03:17:01 +0000370void CXXNameMangler::mangleUnscopedName(const NamedDecl *ND) {
371 // <unscoped-name> ::= <unqualified-name>
372 // ::= St <unqualified-name> # ::std::
373 if (isStdNamespace(ND->getDeclContext()))
374 Out << "St";
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000375
Anders Carlsson201ce742009-09-17 03:17:01 +0000376 mangleUnqualifiedName(ND);
377}
378
Anders Carlsson0fa6df42009-09-26 19:45:45 +0000379void CXXNameMangler::mangleUnscopedTemplateName(const TemplateDecl *ND) {
Anders Carlsson201ce742009-09-17 03:17:01 +0000380 // <unscoped-template-name> ::= <unscoped-name>
381 // ::= <substitution>
Anders Carlsson7624f212009-09-18 02:42:01 +0000382 if (mangleSubstitution(ND))
Anders Carlsson03c9d532009-09-17 04:02:31 +0000383 return;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000384
Anders Carlsson1668f202009-09-26 20:13:56 +0000385 mangleUnscopedName(ND->getTemplatedDecl());
Anders Carlsson7624f212009-09-18 02:42:01 +0000386 addSubstitution(ND);
Anders Carlsson201ce742009-09-17 03:17:01 +0000387}
388
Anders Carlssona94822e2009-11-26 02:32:05 +0000389void CXXNameMangler::mangleNumber(int64_t Number) {
390 // <number> ::= [n] <non-negative decimal integer>
391 if (Number < 0) {
392 Out << 'n';
393 Number = -Number;
394 }
395
396 Out << Number;
397}
398
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000399void CXXNameMangler::mangleCallOffset(const ThunkAdjustment &Adjustment) {
Mike Stump141c5af2009-09-02 00:25:38 +0000400 // <call-offset> ::= h <nv-offset> _
401 // ::= v <v-offset> _
402 // <nv-offset> ::= <offset number> # non-virtual base override
Anders Carlssona94822e2009-11-26 02:32:05 +0000403 // <v-offset> ::= <offset number> _ <virtual offset number>
Mike Stump141c5af2009-09-02 00:25:38 +0000404 // # virtual base override, with vcall offset
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000405 if (!Adjustment.Virtual) {
Anders Carlssona94822e2009-11-26 02:32:05 +0000406 Out << 'h';
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000407 mangleNumber(Adjustment.NonVirtual);
Anders Carlssona94822e2009-11-26 02:32:05 +0000408 Out << '_';
409 return;
Mike Stump141c5af2009-09-02 00:25:38 +0000410 }
Anders Carlssona94822e2009-11-26 02:32:05 +0000411
412 Out << 'v';
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000413 mangleNumber(Adjustment.NonVirtual);
Anders Carlssona94822e2009-11-26 02:32:05 +0000414 Out << '_';
Anders Carlssonb73a5be2009-11-26 02:49:32 +0000415 mangleNumber(Adjustment.Virtual);
Anders Carlssona94822e2009-11-26 02:32:05 +0000416 Out << '_';
Mike Stump9124bcc2009-09-02 00:56:18 +0000417}
418
John McCall1dd73832010-02-04 01:42:13 +0000419void CXXNameMangler::mangleUnresolvedScope(NestedNameSpecifier *Qualifier) {
420 Qualifier = getASTContext().getCanonicalNestedNameSpecifier(Qualifier);
421 switch (Qualifier->getKind()) {
422 case NestedNameSpecifier::Global:
423 // nothing
424 break;
425 case NestedNameSpecifier::Namespace:
426 mangleName(Qualifier->getAsNamespace());
427 break;
428 case NestedNameSpecifier::TypeSpec:
429 case NestedNameSpecifier::TypeSpecWithTemplate:
430 mangleType(QualType(Qualifier->getAsType(), 0));
431 break;
432 case NestedNameSpecifier::Identifier:
433 mangleUnresolvedScope(Qualifier->getPrefix());
434 mangleSourceName(Qualifier->getAsIdentifier());
435 break;
436 }
437}
438
439/// Mangles a name which was not resolved to a specific entity.
440void CXXNameMangler::mangleUnresolvedName(NestedNameSpecifier *Qualifier,
441 DeclarationName Name,
442 unsigned KnownArity) {
443 if (Qualifier)
444 mangleUnresolvedScope(Qualifier);
445 // FIXME: ambiguity of unqualified lookup with ::
446
447 mangleUnqualifiedName(0, Name, KnownArity);
448}
449
450void CXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
451 DeclarationName Name,
452 unsigned KnownArity) {
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000453 // <unqualified-name> ::= <operator-name>
Mike Stump1eb44332009-09-09 15:08:12 +0000454 // ::= <ctor-dtor-name>
455 // ::= <source-name>
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000456 switch (Name.getNameKind()) {
Anders Carlssonc4355b62009-10-07 01:45:02 +0000457 case DeclarationName::Identifier: {
Anders Carlssonc4355b62009-10-07 01:45:02 +0000458 if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
Sean Hunt31455252010-01-24 03:04:27 +0000459 // We must avoid conflicts between internally- and externally-
460 // linked names in the same TU. This naming convention is the
461 // same as that followed by GCC, though it shouldn't actually matter.
John McCall1dd73832010-02-04 01:42:13 +0000462 if (ND && ND->getLinkage() == InternalLinkage &&
Sean Hunt31455252010-01-24 03:04:27 +0000463 ND->getDeclContext()->isFileContext())
464 Out << 'L';
465
Anders Carlssonc4355b62009-10-07 01:45:02 +0000466 mangleSourceName(II);
467 break;
468 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000469
John McCall1dd73832010-02-04 01:42:13 +0000470 // Otherwise, an anonymous entity. We must have a declaration.
471 assert(ND && "mangling empty name without declaration");
472
473 if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
474 if (NS->isAnonymousNamespace()) {
475 // This is how gcc mangles these names.
476 Out << "12_GLOBAL__N_1";
477 break;
478 }
479 }
480
Anders Carlssonc4355b62009-10-07 01:45:02 +0000481 // We must have an anonymous struct.
482 const TagDecl *TD = cast<TagDecl>(ND);
483 if (const TypedefDecl *D = TD->getTypedefForAnonDecl()) {
484 assert(TD->getDeclContext() == D->getDeclContext() &&
485 "Typedef should not be in another decl context!");
486 assert(D->getDeclName().getAsIdentifierInfo() &&
487 "Typedef was not named!");
488 mangleSourceName(D->getDeclName().getAsIdentifierInfo());
489 break;
490 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000491
Anders Carlssonc4355b62009-10-07 01:45:02 +0000492 // Get a unique id for the anonymous struct.
493 uint64_t AnonStructId = Context.getAnonymousStructId(TD);
494
495 // Mangle it as a source name in the form
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000496 // [n] $_<id>
Anders Carlssonc4355b62009-10-07 01:45:02 +0000497 // where n is the length of the string.
498 llvm::SmallString<8> Str;
499 Str += "$_";
500 Str += llvm::utostr(AnonStructId);
501
502 Out << Str.size();
503 Out << Str.str();
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000504 break;
Anders Carlssonc4355b62009-10-07 01:45:02 +0000505 }
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000506
507 case DeclarationName::ObjCZeroArgSelector:
508 case DeclarationName::ObjCOneArgSelector:
509 case DeclarationName::ObjCMultiArgSelector:
510 assert(false && "Can't mangle Objective-C selector names here!");
511 break;
512
513 case DeclarationName::CXXConstructorName:
Anders Carlsson27ae5362009-04-17 01:58:57 +0000514 if (ND == Structor)
Mike Stump141c5af2009-09-02 00:25:38 +0000515 // If the named decl is the C++ constructor we're mangling, use the type
516 // we were given.
Anders Carlsson27ae5362009-04-17 01:58:57 +0000517 mangleCXXCtorType(static_cast<CXXCtorType>(StructorType));
Anders Carlsson3ac86b52009-04-15 05:36:58 +0000518 else
519 // Otherwise, use the complete constructor name. This is relevant if a
520 // class with a constructor is declared within a constructor.
521 mangleCXXCtorType(Ctor_Complete);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000522 break;
523
524 case DeclarationName::CXXDestructorName:
Anders Carlsson27ae5362009-04-17 01:58:57 +0000525 if (ND == Structor)
Mike Stump141c5af2009-09-02 00:25:38 +0000526 // If the named decl is the C++ destructor we're mangling, use the type we
527 // were given.
Anders Carlsson27ae5362009-04-17 01:58:57 +0000528 mangleCXXDtorType(static_cast<CXXDtorType>(StructorType));
529 else
530 // Otherwise, use the complete destructor name. This is relevant if a
531 // class with a destructor is declared within a destructor.
532 mangleCXXDtorType(Dtor_Complete);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000533 break;
534
535 case DeclarationName::CXXConversionFunctionName:
Mike Stump1eb44332009-09-09 15:08:12 +0000536 // <operator-name> ::= cv <type> # (cast)
Douglas Gregor219cc612009-02-13 01:28:03 +0000537 Out << "cv";
Anders Carlssonb5404912009-10-07 01:06:45 +0000538 mangleType(Context.getASTContext().getCanonicalType(Name.getCXXNameType()));
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000539 break;
540
Anders Carlsson8257d412009-12-22 06:36:32 +0000541 case DeclarationName::CXXOperatorName: {
John McCall1dd73832010-02-04 01:42:13 +0000542 unsigned Arity;
543 if (ND) {
544 Arity = cast<FunctionDecl>(ND)->getNumParams();
Anders Carlsson8257d412009-12-22 06:36:32 +0000545
John McCall1dd73832010-02-04 01:42:13 +0000546 // If we have a C++ member function, we need to include the 'this' pointer.
547 // FIXME: This does not make sense for operators that are static, but their
548 // names stay the same regardless of the arity (operator new for instance).
549 if (isa<CXXMethodDecl>(ND))
550 Arity++;
551 } else
552 Arity = KnownArity;
553
Anders Carlsson8257d412009-12-22 06:36:32 +0000554 mangleOperatorName(Name.getCXXOverloadedOperator(), Arity);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000555 break;
Anders Carlsson8257d412009-12-22 06:36:32 +0000556 }
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000557
Sean Hunt3e518bd2009-11-29 07:34:05 +0000558 case DeclarationName::CXXLiteralOperatorName:
Sean Hunt5dd6b392009-12-04 21:11:13 +0000559 // FIXME: This mangling is not yet official.
Sean Hunt2421f662009-12-04 21:01:37 +0000560 Out << "li";
Sean Hunt3e518bd2009-11-29 07:34:05 +0000561 mangleSourceName(Name.getCXXLiteralIdentifier());
562 break;
563
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000564 case DeclarationName::CXXUsingDirective:
565 assert(false && "Can't mangle a using directive name!");
Douglas Gregor219cc612009-02-13 01:28:03 +0000566 break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000567 }
568}
569
570void CXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
571 // <source-name> ::= <positive length number> <identifier>
572 // <number> ::= [n] <non-negative decimal integer>
573 // <identifier> ::= <unqualified source code identifier>
574 Out << II->getLength() << II->getName();
575}
576
Eli Friedman7facf842009-12-02 20:32:49 +0000577void CXXNameMangler::mangleNestedName(const NamedDecl *ND,
578 const DeclContext *DC) {
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000579 // <nested-name> ::= N [<CV-qualifiers>] <prefix> <unqualified-name> E
580 // ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
Anders Carlssond99edc42009-09-26 03:55:37 +0000581
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000582 Out << 'N';
583 if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(ND))
John McCall0953e762009-09-24 19:53:00 +0000584 mangleQualifiers(Qualifiers::fromCVRMask(Method->getTypeQualifiers()));
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000585
Anders Carlsson2744a062009-09-18 19:00:18 +0000586 // Check if we have a template.
587 const TemplateArgumentList *TemplateArgs = 0;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000588 if (const TemplateDecl *TD = isTemplate(ND, TemplateArgs)) {
Anders Carlsson2744a062009-09-18 19:00:18 +0000589 mangleTemplatePrefix(TD);
Anders Carlsson9e85c742009-12-23 19:30:55 +0000590 mangleTemplateArgs(*TemplateArgs);
Anders Carlsson7482e242009-09-18 04:29:09 +0000591 } else {
Eli Friedman7facf842009-12-02 20:32:49 +0000592 manglePrefix(DC);
Anders Carlsson7482e242009-09-18 04:29:09 +0000593 mangleUnqualifiedName(ND);
594 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000595
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000596 Out << 'E';
597}
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000598void CXXNameMangler::mangleNestedName(const TemplateDecl *TD,
Anders Carlsson7624f212009-09-18 02:42:01 +0000599 const TemplateArgument *TemplateArgs,
600 unsigned NumTemplateArgs) {
Anders Carlssone45117b2009-09-27 19:53:49 +0000601 // <nested-name> ::= N [<CV-qualifiers>] <template-prefix> <template-args> E
602
Anders Carlsson7624f212009-09-18 02:42:01 +0000603 Out << 'N';
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000604
Anders Carlssone45117b2009-09-27 19:53:49 +0000605 mangleTemplatePrefix(TD);
Anders Carlsson7624f212009-09-18 02:42:01 +0000606 mangleTemplateArgs(TemplateArgs, NumTemplateArgs);
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000607
Anders Carlsson7624f212009-09-18 02:42:01 +0000608 Out << 'E';
609}
610
Anders Carlsson1b42c792009-04-02 16:24:45 +0000611void CXXNameMangler::mangleLocalName(const NamedDecl *ND) {
612 // <local-name> := Z <function encoding> E <entity name> [<discriminator>]
613 // := Z <function encoding> E s [<discriminator>]
Mike Stump1eb44332009-09-09 15:08:12 +0000614 // <discriminator> := _ <non-negative number>
Anders Carlsson1b42c792009-04-02 16:24:45 +0000615 Out << 'Z';
Anders Carlsson7b06f6c2009-12-10 03:14:39 +0000616
617 if (const ObjCMethodDecl *MD = dyn_cast<ObjCMethodDecl>(ND->getDeclContext()))
618 mangleObjCMethodName(MD);
619 else
620 mangleFunctionEncoding(cast<FunctionDecl>(ND->getDeclContext()));
621
Anders Carlsson1b42c792009-04-02 16:24:45 +0000622 Out << 'E';
Eli Friedman6f9f25d2009-12-11 20:21:38 +0000623 mangleUnqualifiedName(ND);
Anders Carlsson1b42c792009-04-02 16:24:45 +0000624}
625
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000626void CXXNameMangler::manglePrefix(const DeclContext *DC) {
627 // <prefix> ::= <prefix> <unqualified-name>
628 // ::= <template-prefix> <template-args>
629 // ::= <template-param>
630 // ::= # empty
631 // ::= <substitution>
Anders Carlsson6862fc72009-09-17 04:16:28 +0000632
Anders Carlssonadd28822009-09-22 20:33:31 +0000633 while (isa<LinkageSpecDecl>(DC))
634 DC = DC->getParent();
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000635
Anders Carlsson9263e912009-09-18 18:39:58 +0000636 if (DC->isTranslationUnit())
637 return;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000638
Anders Carlsson6862fc72009-09-17 04:16:28 +0000639 if (mangleSubstitution(cast<NamedDecl>(DC)))
640 return;
Anders Carlsson7482e242009-09-18 04:29:09 +0000641
Anders Carlsson2ee3fca2009-09-18 20:11:09 +0000642 // Check if we have a template.
643 const TemplateArgumentList *TemplateArgs = 0;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000644 if (const TemplateDecl *TD = isTemplate(cast<NamedDecl>(DC), TemplateArgs)) {
Anders Carlsson2ee3fca2009-09-18 20:11:09 +0000645 mangleTemplatePrefix(TD);
Anders Carlsson9e85c742009-12-23 19:30:55 +0000646 mangleTemplateArgs(*TemplateArgs);
Anders Carlsson2ee3fca2009-09-18 20:11:09 +0000647 } else {
648 manglePrefix(DC->getParent());
649 mangleUnqualifiedName(cast<NamedDecl>(DC));
650 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000651
Anders Carlsson6862fc72009-09-17 04:16:28 +0000652 addSubstitution(cast<NamedDecl>(DC));
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000653}
654
Anders Carlsson0fa6df42009-09-26 19:45:45 +0000655void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND) {
Anders Carlsson7482e242009-09-18 04:29:09 +0000656 // <template-prefix> ::= <prefix> <template unqualified-name>
657 // ::= <template-param>
658 // ::= <substitution>
659
Anders Carlssonaeb85372009-09-26 22:18:22 +0000660 if (mangleSubstitution(ND))
661 return;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000662
Anders Carlssonaeb85372009-09-26 22:18:22 +0000663 // FIXME: <template-param>
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000664
Anders Carlssonaa73ab12009-09-18 18:47:07 +0000665 manglePrefix(ND->getDeclContext());
Anders Carlsson1668f202009-09-26 20:13:56 +0000666 mangleUnqualifiedName(ND->getTemplatedDecl());
Daniel Dunbar3c9e4632009-11-21 09:05:47 +0000667
Anders Carlssonaeb85372009-09-26 22:18:22 +0000668 addSubstitution(ND);
Anders Carlsson7482e242009-09-18 04:29:09 +0000669}
670
Mike Stump1eb44332009-09-09 15:08:12 +0000671void
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000672CXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity) {
673 switch (OO) {
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000674 // <operator-name> ::= nw # new
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000675 case OO_New: Out << "nw"; break;
676 // ::= na # new[]
677 case OO_Array_New: Out << "na"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000678 // ::= dl # delete
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000679 case OO_Delete: Out << "dl"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000680 // ::= da # delete[]
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000681 case OO_Array_Delete: Out << "da"; break;
682 // ::= ps # + (unary)
683 // ::= pl # +
Anders Carlsson8257d412009-12-22 06:36:32 +0000684 case OO_Plus:
685 assert((Arity == 1 || Arity == 2) && "Invalid arity!");
686 Out << (Arity == 1? "ps" : "pl"); break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000687 // ::= ng # - (unary)
688 // ::= mi # -
Anders Carlsson8257d412009-12-22 06:36:32 +0000689 case OO_Minus:
690 assert((Arity == 1 || Arity == 2) && "Invalid arity!");
691 Out << (Arity == 1? "ng" : "mi"); break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000692 // ::= ad # & (unary)
693 // ::= an # &
Anders Carlsson8257d412009-12-22 06:36:32 +0000694 case OO_Amp:
695 assert((Arity == 1 || Arity == 2) && "Invalid arity!");
696 Out << (Arity == 1? "ad" : "an"); break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000697 // ::= de # * (unary)
698 // ::= ml # *
Anders Carlsson8257d412009-12-22 06:36:32 +0000699 case OO_Star:
700 assert((Arity == 1 || Arity == 2) && "Invalid arity!");
701 Out << (Arity == 1? "de" : "ml"); break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000702 // ::= co # ~
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000703 case OO_Tilde: Out << "co"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000704 // ::= dv # /
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000705 case OO_Slash: Out << "dv"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000706 // ::= rm # %
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000707 case OO_Percent: Out << "rm"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000708 // ::= or # |
709 case OO_Pipe: Out << "or"; break;
710 // ::= eo # ^
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000711 case OO_Caret: Out << "eo"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000712 // ::= aS # =
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000713 case OO_Equal: Out << "aS"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000714 // ::= pL # +=
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000715 case OO_PlusEqual: Out << "pL"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000716 // ::= mI # -=
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000717 case OO_MinusEqual: Out << "mI"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000718 // ::= mL # *=
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000719 case OO_StarEqual: Out << "mL"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000720 // ::= dV # /=
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000721 case OO_SlashEqual: Out << "dV"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000722 // ::= rM # %=
723 case OO_PercentEqual: Out << "rM"; break;
724 // ::= aN # &=
725 case OO_AmpEqual: Out << "aN"; break;
726 // ::= oR # |=
727 case OO_PipeEqual: Out << "oR"; break;
728 // ::= eO # ^=
729 case OO_CaretEqual: Out << "eO"; break;
730 // ::= ls # <<
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000731 case OO_LessLess: Out << "ls"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000732 // ::= rs # >>
733 case OO_GreaterGreater: Out << "rs"; break;
734 // ::= lS # <<=
735 case OO_LessLessEqual: Out << "lS"; break;
736 // ::= rS # >>=
737 case OO_GreaterGreaterEqual: Out << "rS"; break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000738 // ::= eq # ==
739 case OO_EqualEqual: Out << "eq"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000740 // ::= ne # !=
741 case OO_ExclaimEqual: Out << "ne"; break;
742 // ::= lt # <
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000743 case OO_Less: Out << "lt"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000744 // ::= gt # >
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000745 case OO_Greater: Out << "gt"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000746 // ::= le # <=
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000747 case OO_LessEqual: Out << "le"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000748 // ::= ge # >=
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000749 case OO_GreaterEqual: Out << "ge"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000750 // ::= nt # !
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000751 case OO_Exclaim: Out << "nt"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000752 // ::= aa # &&
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000753 case OO_AmpAmp: Out << "aa"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000754 // ::= oo # ||
755 case OO_PipePipe: Out << "oo"; break;
756 // ::= pp # ++
757 case OO_PlusPlus: Out << "pp"; break;
758 // ::= mm # --
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000759 case OO_MinusMinus: Out << "mm"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000760 // ::= cm # ,
761 case OO_Comma: Out << "cm"; break;
762 // ::= pm # ->*
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000763 case OO_ArrowStar: Out << "pm"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000764 // ::= pt # ->
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000765 case OO_Arrow: Out << "pt"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000766 // ::= cl # ()
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000767 case OO_Call: Out << "cl"; break;
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000768 // ::= ix # []
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000769 case OO_Subscript: Out << "ix"; break;
Anders Carlssone170ba72009-12-14 01:45:37 +0000770
771 // ::= qu # ?
772 // The conditional operator can't be overloaded, but we still handle it when
773 // mangling expressions.
774 case OO_Conditional: Out << "qu"; break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000775
Sebastian Redl3201f6b2009-04-16 17:51:27 +0000776 case OO_None:
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000777 case NUM_OVERLOADED_OPERATORS:
Mike Stump1eb44332009-09-09 15:08:12 +0000778 assert(false && "Not an overloaded operator");
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000779 break;
780 }
781}
782
John McCall0953e762009-09-24 19:53:00 +0000783void CXXNameMangler::mangleQualifiers(Qualifiers Quals) {
Mike Stump1eb44332009-09-09 15:08:12 +0000784 // <CV-qualifiers> ::= [r] [V] [K] # restrict (C99), volatile, const
John McCall0953e762009-09-24 19:53:00 +0000785 if (Quals.hasRestrict())
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000786 Out << 'r';
John McCall0953e762009-09-24 19:53:00 +0000787 if (Quals.hasVolatile())
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000788 Out << 'V';
John McCall0953e762009-09-24 19:53:00 +0000789 if (Quals.hasConst())
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000790 Out << 'K';
John McCall0953e762009-09-24 19:53:00 +0000791
792 // FIXME: For now, just drop all extension qualifiers on the floor.
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000793}
794
Anders Carlsson7b06f6c2009-12-10 03:14:39 +0000795void CXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
796 llvm::SmallString<64> Name;
797 llvm::raw_svector_ostream OS(Name);
798
799 const ObjCContainerDecl *CD =
800 dyn_cast<ObjCContainerDecl>(MD->getDeclContext());
801 assert (CD && "Missing container decl in GetNameForMethod");
802 OS << (MD->isInstanceMethod() ? '-' : '+') << '[' << CD->getName();
803 if (const ObjCCategoryImplDecl *CID = dyn_cast<ObjCCategoryImplDecl>(CD))
804 OS << '(' << CID->getNameAsString() << ')';
805 OS << ' ' << MD->getSelector().getAsString() << ']';
806
807 Out << OS.str().size() << OS.str();
808}
809
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000810void CXXNameMangler::mangleType(QualType T) {
Anders Carlsson4843e582009-03-10 17:07:44 +0000811 // Only operate on the canonical type!
Anders Carlssonb5404912009-10-07 01:06:45 +0000812 T = Context.getASTContext().getCanonicalType(T);
Anders Carlsson4843e582009-03-10 17:07:44 +0000813
Douglas Gregora4923eb2009-11-16 21:35:15 +0000814 bool IsSubstitutable = T.hasLocalQualifiers() || !isa<BuiltinType>(T);
Anders Carlsson76967372009-09-17 00:43:46 +0000815 if (IsSubstitutable && mangleSubstitution(T))
816 return;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000817
Douglas Gregora4923eb2009-11-16 21:35:15 +0000818 if (Qualifiers Quals = T.getLocalQualifiers()) {
John McCall0953e762009-09-24 19:53:00 +0000819 mangleQualifiers(Quals);
820 // Recurse: even if the qualified type isn't yet substitutable,
821 // the unqualified type might be.
Douglas Gregora4923eb2009-11-16 21:35:15 +0000822 mangleType(T.getLocalUnqualifiedType());
Anders Carlsson76967372009-09-17 00:43:46 +0000823 } else {
824 switch (T->getTypeClass()) {
John McCallefe6aee2009-09-05 07:56:18 +0000825#define ABSTRACT_TYPE(CLASS, PARENT)
826#define NON_CANONICAL_TYPE(CLASS, PARENT) \
Anders Carlsson76967372009-09-17 00:43:46 +0000827 case Type::CLASS: \
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +0000828 llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
Anders Carlsson76967372009-09-17 00:43:46 +0000829 return;
John McCallefe6aee2009-09-05 07:56:18 +0000830#define TYPE(CLASS, PARENT) \
Anders Carlsson76967372009-09-17 00:43:46 +0000831 case Type::CLASS: \
John McCall0953e762009-09-24 19:53:00 +0000832 mangleType(static_cast<const CLASS##Type*>(T.getTypePtr())); \
Anders Carlsson76967372009-09-17 00:43:46 +0000833 break;
John McCallefe6aee2009-09-05 07:56:18 +0000834#include "clang/AST/TypeNodes.def"
Anders Carlsson76967372009-09-17 00:43:46 +0000835 }
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000836 }
Anders Carlsson76967372009-09-17 00:43:46 +0000837
838 // Add the substitution.
839 if (IsSubstitutable)
840 addSubstitution(T);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000841}
842
843void CXXNameMangler::mangleType(const BuiltinType *T) {
John McCallefe6aee2009-09-05 07:56:18 +0000844 // <type> ::= <builtin-type>
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000845 // <builtin-type> ::= v # void
846 // ::= w # wchar_t
847 // ::= b # bool
848 // ::= c # char
849 // ::= a # signed char
850 // ::= h # unsigned char
851 // ::= s # short
852 // ::= t # unsigned short
853 // ::= i # int
854 // ::= j # unsigned int
855 // ::= l # long
856 // ::= m # unsigned long
857 // ::= x # long long, __int64
858 // ::= y # unsigned long long, __int64
859 // ::= n # __int128
860 // UNSUPPORTED: ::= o # unsigned __int128
861 // ::= f # float
862 // ::= d # double
863 // ::= e # long double, __float80
864 // UNSUPPORTED: ::= g # __float128
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000865 // UNSUPPORTED: ::= Dd # IEEE 754r decimal floating point (64 bits)
866 // UNSUPPORTED: ::= De # IEEE 754r decimal floating point (128 bits)
867 // UNSUPPORTED: ::= Df # IEEE 754r decimal floating point (32 bits)
868 // UNSUPPORTED: ::= Dh # IEEE 754r half-precision floating point (16 bits)
Alisdair Meredithf5c209d2009-07-14 06:30:34 +0000869 // ::= Di # char32_t
870 // ::= Ds # char16_t
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000871 // ::= u <source-name> # vendor extended type
Sebastian Redl6e8ed162009-05-10 18:38:11 +0000872 // From our point of view, std::nullptr_t is a builtin, but as far as mangling
873 // is concerned, it's a type called std::nullptr_t.
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000874 switch (T->getKind()) {
875 case BuiltinType::Void: Out << 'v'; break;
876 case BuiltinType::Bool: Out << 'b'; break;
877 case BuiltinType::Char_U: case BuiltinType::Char_S: Out << 'c'; break;
878 case BuiltinType::UChar: Out << 'h'; break;
879 case BuiltinType::UShort: Out << 't'; break;
880 case BuiltinType::UInt: Out << 'j'; break;
881 case BuiltinType::ULong: Out << 'm'; break;
882 case BuiltinType::ULongLong: Out << 'y'; break;
Chris Lattner2df9ced2009-04-30 02:43:43 +0000883 case BuiltinType::UInt128: Out << 'o'; break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000884 case BuiltinType::SChar: Out << 'a'; break;
885 case BuiltinType::WChar: Out << 'w'; break;
Alisdair Meredithf5c209d2009-07-14 06:30:34 +0000886 case BuiltinType::Char16: Out << "Ds"; break;
887 case BuiltinType::Char32: Out << "Di"; break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000888 case BuiltinType::Short: Out << 's'; break;
889 case BuiltinType::Int: Out << 'i'; break;
890 case BuiltinType::Long: Out << 'l'; break;
891 case BuiltinType::LongLong: Out << 'x'; break;
Chris Lattner2df9ced2009-04-30 02:43:43 +0000892 case BuiltinType::Int128: Out << 'n'; break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000893 case BuiltinType::Float: Out << 'f'; break;
894 case BuiltinType::Double: Out << 'd'; break;
895 case BuiltinType::LongDouble: Out << 'e'; break;
Sebastian Redl6e8ed162009-05-10 18:38:11 +0000896 case BuiltinType::NullPtr: Out << "St9nullptr_t"; break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000897
898 case BuiltinType::Overload:
899 case BuiltinType::Dependent:
Mike Stump1eb44332009-09-09 15:08:12 +0000900 assert(false &&
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000901 "Overloaded and dependent types shouldn't get to name mangling");
902 break;
Anders Carlssone89d1592009-06-26 18:41:36 +0000903 case BuiltinType::UndeducedAuto:
904 assert(0 && "Should not see undeduced auto here");
905 break;
Steve Naroff9533a7f2009-07-22 17:14:51 +0000906 case BuiltinType::ObjCId: Out << "11objc_object"; break;
907 case BuiltinType::ObjCClass: Out << "10objc_class"; break;
Fariborz Jahanian13dcd002009-11-21 19:53:08 +0000908 case BuiltinType::ObjCSel: Out << "13objc_selector"; break;
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000909 }
910}
911
John McCallefe6aee2009-09-05 07:56:18 +0000912// <type> ::= <function-type>
913// <function-type> ::= F [Y] <bare-function-type> E
914void CXXNameMangler::mangleType(const FunctionProtoType *T) {
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000915 Out << 'F';
Mike Stumpf5408fe2009-05-16 07:57:57 +0000916 // FIXME: We don't have enough information in the AST to produce the 'Y'
917 // encoding for extern "C" function types.
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000918 mangleBareFunctionType(T, /*MangleReturnType=*/true);
919 Out << 'E';
920}
John McCallefe6aee2009-09-05 07:56:18 +0000921void CXXNameMangler::mangleType(const FunctionNoProtoType *T) {
Jeffrey Yasskin9f61aa92009-12-12 05:05:38 +0000922 llvm_unreachable("Can't mangle K&R function prototypes");
John McCallefe6aee2009-09-05 07:56:18 +0000923}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000924void CXXNameMangler::mangleBareFunctionType(const FunctionType *T,
925 bool MangleReturnType) {
John McCallefe6aee2009-09-05 07:56:18 +0000926 // We should never be mangling something without a prototype.
927 const FunctionProtoType *Proto = cast<FunctionProtoType>(T);
928
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000929 // <bare-function-type> ::= <signature type>+
930 if (MangleReturnType)
John McCallefe6aee2009-09-05 07:56:18 +0000931 mangleType(Proto->getResultType());
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000932
Anders Carlssonc6c91bc2009-04-01 00:15:23 +0000933 if (Proto->getNumArgs() == 0) {
934 Out << 'v';
935 return;
936 }
Mike Stump1eb44332009-09-09 15:08:12 +0000937
Douglas Gregor72564e72009-02-26 23:50:07 +0000938 for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(),
Mike Stump1eb44332009-09-09 15:08:12 +0000939 ArgEnd = Proto->arg_type_end();
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000940 Arg != ArgEnd; ++Arg)
941 mangleType(*Arg);
Douglas Gregor219cc612009-02-13 01:28:03 +0000942
943 // <builtin-type> ::= z # ellipsis
944 if (Proto->isVariadic())
945 Out << 'z';
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000946}
947
John McCallefe6aee2009-09-05 07:56:18 +0000948// <type> ::= <class-enum-type>
Mike Stump1eb44332009-09-09 15:08:12 +0000949// <class-enum-type> ::= <name>
John McCalled976492009-12-04 22:46:56 +0000950void CXXNameMangler::mangleType(const UnresolvedUsingType *T) {
951 mangleName(T->getDecl());
952}
953
954// <type> ::= <class-enum-type>
955// <class-enum-type> ::= <name>
John McCallefe6aee2009-09-05 07:56:18 +0000956void CXXNameMangler::mangleType(const EnumType *T) {
957 mangleType(static_cast<const TagType*>(T));
958}
959void CXXNameMangler::mangleType(const RecordType *T) {
960 mangleType(static_cast<const TagType*>(T));
961}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000962void CXXNameMangler::mangleType(const TagType *T) {
Eli Friedmanecb7e932009-12-11 18:00:57 +0000963 mangleName(T->getDecl());
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000964}
965
John McCallefe6aee2009-09-05 07:56:18 +0000966// <type> ::= <array-type>
967// <array-type> ::= A <positive dimension number> _ <element type>
968// ::= A [<dimension expression>] _ <element type>
969void CXXNameMangler::mangleType(const ConstantArrayType *T) {
970 Out << 'A' << T->getSize() << '_';
971 mangleType(T->getElementType());
972}
973void CXXNameMangler::mangleType(const VariableArrayType *T) {
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000974 Out << 'A';
John McCallefe6aee2009-09-05 07:56:18 +0000975 mangleExpression(T->getSizeExpr());
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000976 Out << '_';
977 mangleType(T->getElementType());
978}
John McCallefe6aee2009-09-05 07:56:18 +0000979void CXXNameMangler::mangleType(const DependentSizedArrayType *T) {
980 Out << 'A';
981 mangleExpression(T->getSizeExpr());
982 Out << '_';
983 mangleType(T->getElementType());
984}
985void CXXNameMangler::mangleType(const IncompleteArrayType *T) {
986 Out << 'A' << '_';
987 mangleType(T->getElementType());
988}
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000989
John McCallefe6aee2009-09-05 07:56:18 +0000990// <type> ::= <pointer-to-member-type>
991// <pointer-to-member-type> ::= M <class type> <member type>
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000992void CXXNameMangler::mangleType(const MemberPointerType *T) {
Douglas Gregor5f2bfd42009-02-13 00:10:09 +0000993 Out << 'M';
994 mangleType(QualType(T->getClass(), 0));
Anders Carlsson0e650012009-05-17 17:41:20 +0000995 QualType PointeeType = T->getPointeeType();
996 if (const FunctionProtoType *FPT = dyn_cast<FunctionProtoType>(PointeeType)) {
John McCall0953e762009-09-24 19:53:00 +0000997 mangleQualifiers(Qualifiers::fromCVRMask(FPT->getTypeQuals()));
Anders Carlsson0e650012009-05-17 17:41:20 +0000998 mangleType(FPT);
Mike Stump1eb44332009-09-09 15:08:12 +0000999 } else
Anders Carlsson0e650012009-05-17 17:41:20 +00001000 mangleType(PointeeType);
Douglas Gregor5f2bfd42009-02-13 00:10:09 +00001001}
1002
John McCallefe6aee2009-09-05 07:56:18 +00001003// <type> ::= <template-param>
Douglas Gregor5f2bfd42009-02-13 00:10:09 +00001004void CXXNameMangler::mangleType(const TemplateTypeParmType *T) {
Anders Carlsson0ccdf8d2009-09-27 00:38:53 +00001005 mangleTemplateParameter(T->getIndex());
Douglas Gregor5f2bfd42009-02-13 00:10:09 +00001006}
1007
John McCallefe6aee2009-09-05 07:56:18 +00001008// FIXME: <type> ::= <template-template-param> <template-args>
John McCallefe6aee2009-09-05 07:56:18 +00001009
1010// <type> ::= P <type> # pointer-to
1011void CXXNameMangler::mangleType(const PointerType *T) {
1012 Out << 'P';
1013 mangleType(T->getPointeeType());
1014}
1015void CXXNameMangler::mangleType(const ObjCObjectPointerType *T) {
1016 Out << 'P';
1017 mangleType(T->getPointeeType());
1018}
1019
1020// <type> ::= R <type> # reference-to
1021void CXXNameMangler::mangleType(const LValueReferenceType *T) {
1022 Out << 'R';
1023 mangleType(T->getPointeeType());
1024}
1025
1026// <type> ::= O <type> # rvalue reference-to (C++0x)
1027void CXXNameMangler::mangleType(const RValueReferenceType *T) {
1028 Out << 'O';
1029 mangleType(T->getPointeeType());
1030}
1031
1032// <type> ::= C <type> # complex pair (C 2000)
1033void CXXNameMangler::mangleType(const ComplexType *T) {
1034 Out << 'C';
1035 mangleType(T->getElementType());
1036}
1037
1038// GNU extension: vector types
1039void CXXNameMangler::mangleType(const VectorType *T) {
1040 Out << "U8__vector";
1041 mangleType(T->getElementType());
1042}
1043void CXXNameMangler::mangleType(const ExtVectorType *T) {
1044 mangleType(static_cast<const VectorType*>(T));
1045}
1046void CXXNameMangler::mangleType(const DependentSizedExtVectorType *T) {
1047 Out << "U8__vector";
1048 mangleType(T->getElementType());
1049}
1050
Anders Carlssona40c5e42009-03-07 22:03:21 +00001051void CXXNameMangler::mangleType(const ObjCInterfaceType *T) {
1052 mangleSourceName(T->getDecl()->getIdentifier());
1053}
1054
John McCallefe6aee2009-09-05 07:56:18 +00001055void CXXNameMangler::mangleType(const BlockPointerType *T) {
Anders Carlssonf28c6872009-12-23 22:31:44 +00001056 Out << "U13block_pointer";
1057 mangleType(T->getPointeeType());
John McCallefe6aee2009-09-05 07:56:18 +00001058}
1059
John McCallefe6aee2009-09-05 07:56:18 +00001060void CXXNameMangler::mangleType(const TemplateSpecializationType *T) {
Anders Carlsson7624f212009-09-18 02:42:01 +00001061 TemplateDecl *TD = T->getTemplateName().getAsTemplateDecl();
1062 assert(TD && "FIXME: Support dependent template names!");
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001063
Anders Carlsson7624f212009-09-18 02:42:01 +00001064 mangleName(TD, T->getArgs(), T->getNumArgs());
John McCallefe6aee2009-09-05 07:56:18 +00001065}
1066
1067void CXXNameMangler::mangleType(const TypenameType *T) {
Anders Carlssonae352482009-09-26 02:26:02 +00001068 // Typename types are always nested
1069 Out << 'N';
1070
1071 const Type *QTy = T->getQualifier()->getAsType();
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001072 if (const TemplateSpecializationType *TST =
Anders Carlssonae352482009-09-26 02:26:02 +00001073 dyn_cast<TemplateSpecializationType>(QTy)) {
Anders Carlsson88599172009-09-27 01:06:07 +00001074 if (!mangleSubstitution(QualType(TST, 0))) {
1075 TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
Anders Carlssonae352482009-09-26 02:26:02 +00001076
Anders Carlsson88599172009-09-27 01:06:07 +00001077 mangleTemplatePrefix(TD);
1078 mangleTemplateArgs(TST->getArgs(), TST->getNumArgs());
1079 addSubstitution(QualType(TST, 0));
1080 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001081 } else if (const TemplateTypeParmType *TTPT =
Anders Carlsson0ccdf8d2009-09-27 00:38:53 +00001082 dyn_cast<TemplateTypeParmType>(QTy)) {
1083 // We use the QualType mangle type variant here because it handles
1084 // substitutions.
1085 mangleType(QualType(TTPT, 0));
Anders Carlssonae352482009-09-26 02:26:02 +00001086 } else
1087 assert(false && "Unhandled type!");
1088
1089 mangleSourceName(T->getIdentifier());
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001090
Anders Carlssonae352482009-09-26 02:26:02 +00001091 Out << 'E';
John McCallefe6aee2009-09-05 07:56:18 +00001092}
1093
Anders Carlssone170ba72009-12-14 01:45:37 +00001094void CXXNameMangler::mangleIntegerLiteral(QualType T,
1095 const llvm::APSInt &Value) {
1096 // <expr-primary> ::= L <type> <value number> E # integer literal
1097 Out << 'L';
1098
1099 mangleType(T);
1100 if (T->isBooleanType()) {
1101 // Boolean values are encoded as 0/1.
1102 Out << (Value.getBoolValue() ? '1' : '0');
1103 } else {
1104 if (Value.isNegative())
1105 Out << 'n';
1106 Value.abs().print(Out, false);
1107 }
1108 Out << 'E';
1109
1110}
1111
John McCall1dd73832010-02-04 01:42:13 +00001112void CXXNameMangler::mangleCalledExpression(const Expr *E, unsigned Arity) {
1113 if (E->getType() != getASTContext().OverloadTy)
1114 mangleExpression(E);
John McCall2f27bf82010-02-04 02:56:29 +00001115 // propagate arity to dependent overloads?
John McCall1dd73832010-02-04 01:42:13 +00001116
1117 llvm::PointerIntPair<OverloadExpr*,1> R
1118 = OverloadExpr::find(const_cast<Expr*>(E));
1119 if (R.getInt())
1120 Out << "an"; // &
1121 const OverloadExpr *Ovl = R.getPointer();
John McCall2f27bf82010-02-04 02:56:29 +00001122 if (const UnresolvedMemberExpr *ME = dyn_cast<UnresolvedMemberExpr>(Ovl)) {
1123 mangleMemberExpr(ME->getBase(), ME->isArrow(), ME->getQualifier(),
1124 ME->getMemberName(), Arity);
1125 return;
1126 }
John McCall1dd73832010-02-04 01:42:13 +00001127
1128 mangleUnresolvedName(Ovl->getQualifier(), Ovl->getName(), Arity);
1129}
1130
John McCall2f27bf82010-02-04 02:56:29 +00001131/// Mangles a member expression. Implicit accesses are not handled,
1132/// but that should be okay, because you shouldn't be able to
1133/// make an implicit access in a function template declaration.
1134///
1135/// The standard ABI does not describe how member expressions should
1136/// be mangled, so this is very unstandardized. We mangle as if it
1137/// were a binary operator, except that the RHS is mangled as an
1138/// abstract name.
1139///
1140/// The standard ABI also does not assign a mangling to the dot
1141/// operator, so we arbitrarily select 'me'.
1142void CXXNameMangler::mangleMemberExpr(const Expr *Base,
1143 bool IsArrow,
1144 NestedNameSpecifier *Qualifier,
1145 DeclarationName Member,
1146 unsigned Arity) {
1147 Out << (IsArrow ? "pt" : "me");
1148 mangleExpression(Base);
1149 mangleUnresolvedName(Qualifier, Member, Arity);
1150}
1151
Anders Carlssond553f8c2009-09-21 01:21:10 +00001152void CXXNameMangler::mangleExpression(const Expr *E) {
1153 // <expression> ::= <unary operator-name> <expression>
John McCall09cc1412010-02-03 00:55:45 +00001154 // ::= <binary operator-name> <expression> <expression>
1155 // ::= <trinary operator-name> <expression> <expression> <expression>
1156 // ::= cl <expression>* E # call
Anders Carlssond553f8c2009-09-21 01:21:10 +00001157 // ::= cv <type> expression # conversion with one argument
1158 // ::= cv <type> _ <expression>* E # conversion with a different number of arguments
John McCall09cc1412010-02-03 00:55:45 +00001159 // ::= st <type> # sizeof (a type)
Anders Carlssond553f8c2009-09-21 01:21:10 +00001160 // ::= at <type> # alignof (a type)
1161 // ::= <template-param>
1162 // ::= <function-param>
1163 // ::= sr <type> <unqualified-name> # dependent name
1164 // ::= sr <type> <unqualified-name> <template-args> # dependent template-id
1165 // ::= sZ <template-param> # size of a parameter pack
John McCall09cc1412010-02-03 00:55:45 +00001166 // ::= <expr-primary>
John McCall1dd73832010-02-04 01:42:13 +00001167 // <expr-primary> ::= L <type> <value number> E # integer literal
1168 // ::= L <type <value float> E # floating literal
1169 // ::= L <mangled-name> E # external name
Anders Carlssond553f8c2009-09-21 01:21:10 +00001170 switch (E->getStmtClass()) {
John McCall09cc1412010-02-03 00:55:45 +00001171 default:
1172 llvm_unreachable("unexpected statement kind");
1173 break;
1174
John McCall1dd73832010-02-04 01:42:13 +00001175 case Expr::CallExprClass: {
1176 const CallExpr *CE = cast<CallExpr>(E);
1177 Out << "cl";
1178 mangleCalledExpression(CE->getCallee(), CE->getNumArgs());
1179 for (unsigned I = 0, N = CE->getNumArgs(); I != N; ++I)
1180 mangleExpression(CE->getArg(I));
1181 Out << "E";
John McCall09cc1412010-02-03 00:55:45 +00001182 break;
John McCall1dd73832010-02-04 01:42:13 +00001183 }
John McCall09cc1412010-02-03 00:55:45 +00001184
John McCall2f27bf82010-02-04 02:56:29 +00001185 case Expr::MemberExprClass: {
1186 const MemberExpr *ME = cast<MemberExpr>(E);
1187 mangleMemberExpr(ME->getBase(), ME->isArrow(),
1188 ME->getQualifier(), ME->getMemberDecl()->getDeclName(),
1189 UnknownArity);
1190 break;
1191 }
1192
1193 case Expr::UnresolvedMemberExprClass: {
1194 const UnresolvedMemberExpr *ME = cast<UnresolvedMemberExpr>(E);
1195 mangleMemberExpr(ME->getBase(), ME->isArrow(),
1196 ME->getQualifier(), ME->getMemberName(),
1197 UnknownArity);
1198 break;
1199 }
1200
1201 case Expr::CXXDependentScopeMemberExprClass: {
1202 const CXXDependentScopeMemberExpr *ME
1203 = cast<CXXDependentScopeMemberExpr>(E);
1204 mangleMemberExpr(ME->getBase(), ME->isArrow(),
1205 ME->getQualifier(), ME->getMember(),
1206 UnknownArity);
1207 break;
1208 }
1209
John McCall1dd73832010-02-04 01:42:13 +00001210 case Expr::UnresolvedLookupExprClass: {
John McCalla3218e72010-02-04 01:48:38 +00001211 // The ABI doesn't cover how to mangle overload sets, so we mangle
1212 // using something as close as possible to the original lookup
1213 // expression.
John McCall1dd73832010-02-04 01:42:13 +00001214 const UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(E);
1215 mangleUnresolvedName(ULE->getQualifier(), ULE->getName(), UnknownArity);
1216 break;
1217 }
1218
1219 case Expr::CXXUnresolvedConstructExprClass: {
1220 const CXXUnresolvedConstructExpr *CE = cast<CXXUnresolvedConstructExpr>(E);
1221 unsigned N = CE->arg_size();
1222
1223 Out << "cv";
1224 mangleType(CE->getType());
1225 if (N != 1) Out << "_";
1226 for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I));
1227 if (N != 1) Out << "E";
John McCall09cc1412010-02-03 00:55:45 +00001228 break;
John McCall1dd73832010-02-04 01:42:13 +00001229 }
John McCall09cc1412010-02-03 00:55:45 +00001230
John McCall1dd73832010-02-04 01:42:13 +00001231 case Expr::CXXTemporaryObjectExprClass:
1232 case Expr::CXXConstructExprClass: {
1233 const CXXConstructExpr *CE = cast<CXXConstructExpr>(E);
1234 unsigned N = CE->getNumArgs();
1235
1236 Out << "cv";
1237 mangleType(CE->getType());
1238 if (N != 1) Out << "_";
1239 for (unsigned I = 0; I != N; ++I) mangleExpression(CE->getArg(I));
1240 if (N != 1) Out << "E";
John McCall09cc1412010-02-03 00:55:45 +00001241 break;
John McCall1dd73832010-02-04 01:42:13 +00001242 }
1243
1244 case Expr::SizeOfAlignOfExprClass: {
1245 const SizeOfAlignOfExpr *SAE = cast<SizeOfAlignOfExpr>(E);
1246 if (SAE->isSizeOf()) Out << "s";
1247 else Out << "a";
1248 if (SAE->isArgumentType()) {
1249 Out << "t";
1250 mangleType(SAE->getArgumentType());
1251 } else {
1252 Out << "z";
1253 mangleExpression(SAE->getArgumentExpr());
1254 }
1255 break;
1256 }
Anders Carlssona7694082009-11-06 02:50:19 +00001257
Anders Carlssone170ba72009-12-14 01:45:37 +00001258 case Expr::UnaryOperatorClass: {
1259 const UnaryOperator *UO = cast<UnaryOperator>(E);
1260 mangleOperatorName(UnaryOperator::getOverloadedOperator(UO->getOpcode()),
1261 /*Arity=*/1);
1262 mangleExpression(UO->getSubExpr());
1263 break;
1264 }
1265
1266 case Expr::BinaryOperatorClass: {
1267 const BinaryOperator *BO = cast<BinaryOperator>(E);
1268 mangleOperatorName(BinaryOperator::getOverloadedOperator(BO->getOpcode()),
1269 /*Arity=*/2);
1270 mangleExpression(BO->getLHS());
1271 mangleExpression(BO->getRHS());
1272 break;
John McCall2f27bf82010-02-04 02:56:29 +00001273 }
Anders Carlssone170ba72009-12-14 01:45:37 +00001274
1275 case Expr::ConditionalOperatorClass: {
1276 const ConditionalOperator *CO = cast<ConditionalOperator>(E);
1277 mangleOperatorName(OO_Conditional, /*Arity=*/3);
1278 mangleExpression(CO->getCond());
1279 mangleExpression(CO->getLHS());
1280 mangleExpression(CO->getRHS());
1281 break;
1282 }
1283
Douglas Gregor46287c72010-01-29 16:37:09 +00001284 case Expr::ImplicitCastExprClass: {
1285 mangleExpression(cast<ImplicitCastExpr>(E)->getSubExpr());
1286 break;
1287 }
1288
1289 case Expr::CStyleCastExprClass:
1290 case Expr::CXXStaticCastExprClass:
1291 case Expr::CXXDynamicCastExprClass:
1292 case Expr::CXXReinterpretCastExprClass:
1293 case Expr::CXXConstCastExprClass:
1294 case Expr::CXXFunctionalCastExprClass: {
1295 const ExplicitCastExpr *ECE = cast<ExplicitCastExpr>(E);
1296 Out << "cv";
1297 mangleType(ECE->getType());
1298 mangleExpression(ECE->getSubExpr());
1299 break;
1300 }
1301
Anders Carlsson58040a52009-12-16 05:48:46 +00001302 case Expr::CXXOperatorCallExprClass: {
1303 const CXXOperatorCallExpr *CE = cast<CXXOperatorCallExpr>(E);
1304 unsigned NumArgs = CE->getNumArgs();
1305 mangleOperatorName(CE->getOperator(), /*Arity=*/NumArgs);
1306 // Mangle the arguments.
1307 for (unsigned i = 0; i != NumArgs; ++i)
1308 mangleExpression(CE->getArg(i));
1309 break;
1310 }
1311
Anders Carlssona7694082009-11-06 02:50:19 +00001312 case Expr::ParenExprClass:
1313 mangleExpression(cast<ParenExpr>(E)->getSubExpr());
1314 break;
1315
Anders Carlssond553f8c2009-09-21 01:21:10 +00001316 case Expr::DeclRefExprClass: {
1317 const Decl *D = cast<DeclRefExpr>(E)->getDecl();
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001318
Anders Carlssond553f8c2009-09-21 01:21:10 +00001319 switch (D->getKind()) {
1320 default: assert(false && "Unhandled decl kind!");
1321 case Decl::NonTypeTemplateParm: {
1322 const NonTypeTemplateParmDecl *PD = cast<NonTypeTemplateParmDecl>(D);
Anders Carlsson0ccdf8d2009-09-27 00:38:53 +00001323 mangleTemplateParameter(PD->getIndex());
Anders Carlssond553f8c2009-09-21 01:21:10 +00001324 break;
1325 }
1326
1327 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001328
Anders Carlsson50755b02009-09-27 20:11:34 +00001329 break;
Anders Carlssond553f8c2009-09-21 01:21:10 +00001330 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001331
John McCall865d4472009-11-19 22:55:06 +00001332 case Expr::DependentScopeDeclRefExprClass: {
1333 const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E);
Anders Carlsson50755b02009-09-27 20:11:34 +00001334 const Type *QTy = DRE->getQualifier()->getAsType();
1335 assert(QTy && "Qualifier was not type!");
1336
1337 // ::= sr <type> <unqualified-name> # dependent name
1338 Out << "sr";
1339 mangleType(QualType(QTy, 0));
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001340
Anders Carlsson50755b02009-09-27 20:11:34 +00001341 assert(DRE->getDeclName().getNameKind() == DeclarationName::Identifier &&
1342 "Unhandled decl name kind!");
1343 mangleSourceName(DRE->getDeclName().getAsIdentifierInfo());
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001344
Anders Carlsson50755b02009-09-27 20:11:34 +00001345 break;
1346 }
1347
John McCall1dd73832010-02-04 01:42:13 +00001348 case Expr::FloatingLiteralClass: {
1349 const FloatingLiteral *FL = cast<FloatingLiteral>(E);
1350 Out << "L";
1351 mangleType(FL->getType());
1352
1353 // TODO: avoid this copy with careful stream management.
1354 llvm::SmallVector<char,20> Buffer;
1355 FL->getValue().bitcastToAPInt().toString(Buffer, 16, false);
1356 Out.write(Buffer.data(), Buffer.size());
1357
1358 Out << "E";
1359 break;
1360 }
1361
Anders Carlssone170ba72009-12-14 01:45:37 +00001362 case Expr::IntegerLiteralClass:
1363 mangleIntegerLiteral(E->getType(),
1364 llvm::APSInt(cast<IntegerLiteral>(E)->getValue()));
1365 break;
1366
Anders Carlssond553f8c2009-09-21 01:21:10 +00001367 }
Douglas Gregor5f2bfd42009-02-13 00:10:09 +00001368}
1369
John McCallefe6aee2009-09-05 07:56:18 +00001370// FIXME: <type> ::= G <type> # imaginary (C 2000)
1371// FIXME: <type> ::= U <source-name> <type> # vendor extended type qualifier
1372
Anders Carlsson3ac86b52009-04-15 05:36:58 +00001373void CXXNameMangler::mangleCXXCtorType(CXXCtorType T) {
1374 // <ctor-dtor-name> ::= C1 # complete object constructor
1375 // ::= C2 # base object constructor
1376 // ::= C3 # complete object allocating constructor
1377 //
1378 switch (T) {
1379 case Ctor_Complete:
1380 Out << "C1";
1381 break;
1382 case Ctor_Base:
1383 Out << "C2";
1384 break;
1385 case Ctor_CompleteAllocating:
1386 Out << "C3";
1387 break;
1388 }
1389}
1390
Anders Carlsson27ae5362009-04-17 01:58:57 +00001391void CXXNameMangler::mangleCXXDtorType(CXXDtorType T) {
1392 // <ctor-dtor-name> ::= D0 # deleting destructor
1393 // ::= D1 # complete object destructor
1394 // ::= D2 # base object destructor
1395 //
1396 switch (T) {
1397 case Dtor_Deleting:
1398 Out << "D0";
1399 break;
1400 case Dtor_Complete:
1401 Out << "D1";
1402 break;
1403 case Dtor_Base:
1404 Out << "D2";
1405 break;
1406 }
1407}
1408
Anders Carlsson9e85c742009-12-23 19:30:55 +00001409void CXXNameMangler::mangleTemplateArgs(const TemplateArgumentList &L) {
Anders Carlsson7a0ba872009-05-15 16:09:15 +00001410 // <template-args> ::= I <template-arg>+ E
1411 Out << "I";
Daniel Dunbar7e0c1952009-11-21 09:17:15 +00001412 for (unsigned i = 0, e = L.size(); i != e; ++i)
Anders Carlsson9e85c742009-12-23 19:30:55 +00001413 mangleTemplateArg(L[i]);
Anders Carlsson7a0ba872009-05-15 16:09:15 +00001414 Out << "E";
1415}
1416
Anders Carlsson7624f212009-09-18 02:42:01 +00001417void CXXNameMangler::mangleTemplateArgs(const TemplateArgument *TemplateArgs,
1418 unsigned NumTemplateArgs) {
1419 // <template-args> ::= I <template-arg>+ E
1420 Out << "I";
Daniel Dunbar7e0c1952009-11-21 09:17:15 +00001421 for (unsigned i = 0; i != NumTemplateArgs; ++i)
Anders Carlsson9e85c742009-12-23 19:30:55 +00001422 mangleTemplateArg(TemplateArgs[i]);
Anders Carlsson7624f212009-09-18 02:42:01 +00001423 Out << "E";
1424}
1425
Anders Carlsson9e85c742009-12-23 19:30:55 +00001426void CXXNameMangler::mangleTemplateArg(const TemplateArgument &A) {
Mike Stump1eb44332009-09-09 15:08:12 +00001427 // <template-arg> ::= <type> # type or template
Anders Carlsson7a0ba872009-05-15 16:09:15 +00001428 // ::= X <expression> E # expression
1429 // ::= <expr-primary> # simple expressions
1430 // ::= I <template-arg>* E # argument pack
1431 // ::= sp <expression> # pack expansion of (C++0x)
1432 switch (A.getKind()) {
1433 default:
1434 assert(0 && "Unknown template argument kind!");
1435 case TemplateArgument::Type:
1436 mangleType(A.getAsType());
1437 break;
Anders Carlsson9e85c742009-12-23 19:30:55 +00001438 case TemplateArgument::Template:
1439 mangleName(A.getAsTemplate().getAsTemplateDecl());
1440 break;
Anders Carlssond553f8c2009-09-21 01:21:10 +00001441 case TemplateArgument::Expression:
1442 Out << 'X';
1443 mangleExpression(A.getAsExpr());
1444 Out << 'E';
1445 break;
Anders Carlssone170ba72009-12-14 01:45:37 +00001446 case TemplateArgument::Integral:
1447 mangleIntegerLiteral(A.getIntegralType(), *A.getAsIntegral());
Anders Carlsson7a0ba872009-05-15 16:09:15 +00001448 break;
Daniel Dunbar7e0c1952009-11-21 09:17:15 +00001449 case TemplateArgument::Declaration: {
1450 // <expr-primary> ::= L <mangled-name> E # external name
1451
1452 // FIXME: Clang produces AST's where pointer-to-member-function expressions
1453 // and pointer-to-function expressions are represented as a declaration not
1454 // an expression; this is not how gcc represents them and this changes the
1455 // mangling.
1456 Out << 'L';
1457 // References to external entities use the mangled name; if the name would
1458 // not normally be manged then mangle it as unqualified.
1459 //
1460 // FIXME: The ABI specifies that external names here should have _Z, but
1461 // gcc leaves this off.
1462 mangle(cast<NamedDecl>(A.getAsDecl()), "Z");
1463 Out << 'E';
1464 break;
1465 }
1466 }
Anders Carlsson7a0ba872009-05-15 16:09:15 +00001467}
1468
Anders Carlsson0ccdf8d2009-09-27 00:38:53 +00001469void CXXNameMangler::mangleTemplateParameter(unsigned Index) {
1470 // <template-param> ::= T_ # first template parameter
1471 // ::= T <parameter-2 non-negative number> _
1472 if (Index == 0)
1473 Out << "T_";
1474 else
1475 Out << 'T' << (Index - 1) << '_';
1476}
1477
Anders Carlsson76967372009-09-17 00:43:46 +00001478// <substitution> ::= S <seq-id> _
1479// ::= S_
Anders Carlsson6862fc72009-09-17 04:16:28 +00001480bool CXXNameMangler::mangleSubstitution(const NamedDecl *ND) {
Anders Carlssone7c8cb62009-09-26 20:53:44 +00001481 // Try one of the standard substitutions first.
1482 if (mangleStandardSubstitution(ND))
1483 return true;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001484
Anders Carlsson433d1372009-11-07 04:26:04 +00001485 ND = cast<NamedDecl>(ND->getCanonicalDecl());
Anders Carlsson6862fc72009-09-17 04:16:28 +00001486 return mangleSubstitution(reinterpret_cast<uintptr_t>(ND));
1487}
1488
Anders Carlsson76967372009-09-17 00:43:46 +00001489bool CXXNameMangler::mangleSubstitution(QualType T) {
Anders Carlssond99edc42009-09-26 03:55:37 +00001490 if (!T.getCVRQualifiers()) {
1491 if (const RecordType *RT = T->getAs<RecordType>())
1492 return mangleSubstitution(RT->getDecl());
1493 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001494
Anders Carlsson76967372009-09-17 00:43:46 +00001495 uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
1496
Anders Carlssond3a932a2009-09-17 03:53:28 +00001497 return mangleSubstitution(TypePtr);
1498}
1499
1500bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) {
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001501 llvm::DenseMap<uintptr_t, unsigned>::iterator I =
Anders Carlssond3a932a2009-09-17 03:53:28 +00001502 Substitutions.find(Ptr);
Anders Carlsson76967372009-09-17 00:43:46 +00001503 if (I == Substitutions.end())
1504 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001505
Anders Carlsson76967372009-09-17 00:43:46 +00001506 unsigned SeqID = I->second;
1507 if (SeqID == 0)
1508 Out << "S_";
1509 else {
1510 SeqID--;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001511
Anders Carlsson76967372009-09-17 00:43:46 +00001512 // <seq-id> is encoded in base-36, using digits and upper case letters.
1513 char Buffer[10];
1514 char *BufferPtr = Buffer + 9;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001515
Anders Carlsson76967372009-09-17 00:43:46 +00001516 *BufferPtr = 0;
1517 if (SeqID == 0) *--BufferPtr = '0';
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001518
Anders Carlsson76967372009-09-17 00:43:46 +00001519 while (SeqID) {
1520 assert(BufferPtr > Buffer && "Buffer overflow!");
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001521
Anders Carlsson76967372009-09-17 00:43:46 +00001522 unsigned char c = static_cast<unsigned char>(SeqID) % 36;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001523
Anders Carlsson76967372009-09-17 00:43:46 +00001524 *--BufferPtr = (c < 10 ? '0' + c : 'A' + c - 10);
1525 SeqID /= 36;
1526 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001527
Anders Carlsson76967372009-09-17 00:43:46 +00001528 Out << 'S' << BufferPtr << '_';
1529 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001530
Anders Carlsson76967372009-09-17 00:43:46 +00001531 return true;
1532}
1533
Anders Carlssonf514b542009-09-27 00:12:57 +00001534static bool isCharType(QualType T) {
1535 if (T.isNull())
1536 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001537
Anders Carlssonf514b542009-09-27 00:12:57 +00001538 return T->isSpecificBuiltinType(BuiltinType::Char_S) ||
1539 T->isSpecificBuiltinType(BuiltinType::Char_U);
1540}
1541
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001542/// isCharSpecialization - Returns whether a given type is a template
Anders Carlssonf514b542009-09-27 00:12:57 +00001543/// specialization of a given name with a single argument of type char.
1544static bool isCharSpecialization(QualType T, const char *Name) {
1545 if (T.isNull())
1546 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001547
Anders Carlssonf514b542009-09-27 00:12:57 +00001548 const RecordType *RT = T->getAs<RecordType>();
1549 if (!RT)
1550 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001551
1552 const ClassTemplateSpecializationDecl *SD =
Anders Carlssonf514b542009-09-27 00:12:57 +00001553 dyn_cast<ClassTemplateSpecializationDecl>(RT->getDecl());
1554 if (!SD)
1555 return false;
1556
1557 if (!isStdNamespace(SD->getDeclContext()))
1558 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001559
Anders Carlssonf514b542009-09-27 00:12:57 +00001560 const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs();
1561 if (TemplateArgs.size() != 1)
1562 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001563
Anders Carlssonf514b542009-09-27 00:12:57 +00001564 if (!isCharType(TemplateArgs[0].getAsType()))
1565 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001566
Daniel Dunbar01eb9b92009-10-18 21:17:35 +00001567 return SD->getIdentifier()->getName() == Name;
Anders Carlssonf514b542009-09-27 00:12:57 +00001568}
1569
Anders Carlsson91f88602009-12-07 19:56:42 +00001570template <std::size_t StrLen>
1571bool isStreamCharSpecialization(const ClassTemplateSpecializationDecl *SD,
1572 const char (&Str)[StrLen]) {
1573 if (!SD->getIdentifier()->isStr(Str))
1574 return false;
1575
1576 const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs();
1577 if (TemplateArgs.size() != 2)
1578 return false;
1579
1580 if (!isCharType(TemplateArgs[0].getAsType()))
1581 return false;
1582
1583 if (!isCharSpecialization(TemplateArgs[1].getAsType(), "char_traits"))
1584 return false;
1585
1586 return true;
1587}
1588
Anders Carlssone7c8cb62009-09-26 20:53:44 +00001589bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) {
1590 // <substitution> ::= St # ::std::
Anders Carlsson8c031552009-09-26 23:10:05 +00001591 if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
Anders Carlsson47846d22009-12-04 06:23:23 +00001592 if (isStd(NS)) {
Anders Carlsson8c031552009-09-26 23:10:05 +00001593 Out << "St";
1594 return true;
1595 }
1596 }
1597
1598 if (const ClassTemplateDecl *TD = dyn_cast<ClassTemplateDecl>(ND)) {
1599 if (!isStdNamespace(TD->getDeclContext()))
1600 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001601
Anders Carlsson8c031552009-09-26 23:10:05 +00001602 // <substitution> ::= Sa # ::std::allocator
1603 if (TD->getIdentifier()->isStr("allocator")) {
1604 Out << "Sa";
1605 return true;
1606 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001607
Anders Carlsson189d59c2009-09-26 23:14:39 +00001608 // <<substitution> ::= Sb # ::std::basic_string
1609 if (TD->getIdentifier()->isStr("basic_string")) {
1610 Out << "Sb";
1611 return true;
1612 }
Anders Carlsson8c031552009-09-26 23:10:05 +00001613 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001614
1615 if (const ClassTemplateSpecializationDecl *SD =
Anders Carlssonf514b542009-09-27 00:12:57 +00001616 dyn_cast<ClassTemplateSpecializationDecl>(ND)) {
1617 // <substitution> ::= Ss # ::std::basic_string<char,
1618 // ::std::char_traits<char>,
1619 // ::std::allocator<char> >
1620 if (SD->getIdentifier()->isStr("basic_string")) {
1621 const TemplateArgumentList &TemplateArgs = SD->getTemplateArgs();
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001622
Anders Carlssonf514b542009-09-27 00:12:57 +00001623 if (TemplateArgs.size() != 3)
1624 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001625
Anders Carlssonf514b542009-09-27 00:12:57 +00001626 if (!isCharType(TemplateArgs[0].getAsType()))
1627 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001628
Anders Carlssonf514b542009-09-27 00:12:57 +00001629 if (!isCharSpecialization(TemplateArgs[1].getAsType(), "char_traits"))
1630 return false;
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001631
Anders Carlssonf514b542009-09-27 00:12:57 +00001632 if (!isCharSpecialization(TemplateArgs[2].getAsType(), "allocator"))
1633 return false;
1634
1635 Out << "Ss";
1636 return true;
1637 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001638
Anders Carlsson91f88602009-12-07 19:56:42 +00001639 // <substitution> ::= Si # ::std::basic_istream<char,
1640 // ::std::char_traits<char> >
1641 if (isStreamCharSpecialization(SD, "basic_istream")) {
1642 Out << "Si";
1643 return true;
1644 }
1645
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001646 // <substitution> ::= So # ::std::basic_ostream<char,
Anders Carlsson8f8fd8e2009-10-08 17:20:26 +00001647 // ::std::char_traits<char> >
Anders Carlsson91f88602009-12-07 19:56:42 +00001648 if (isStreamCharSpecialization(SD, "basic_ostream")) {
Anders Carlsson8f8fd8e2009-10-08 17:20:26 +00001649 Out << "So";
1650 return true;
1651 }
Anders Carlsson91f88602009-12-07 19:56:42 +00001652
1653 // <substitution> ::= Sd # ::std::basic_iostream<char,
1654 // ::std::char_traits<char> >
1655 if (isStreamCharSpecialization(SD, "basic_iostream")) {
1656 Out << "Sd";
1657 return true;
1658 }
Anders Carlssonf514b542009-09-27 00:12:57 +00001659 }
Anders Carlsson8c031552009-09-26 23:10:05 +00001660 return false;
Anders Carlssone7c8cb62009-09-26 20:53:44 +00001661}
1662
Anders Carlsson76967372009-09-17 00:43:46 +00001663void CXXNameMangler::addSubstitution(QualType T) {
Anders Carlssond99edc42009-09-26 03:55:37 +00001664 if (!T.getCVRQualifiers()) {
1665 if (const RecordType *RT = T->getAs<RecordType>()) {
1666 addSubstitution(RT->getDecl());
1667 return;
1668 }
1669 }
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001670
Anders Carlsson76967372009-09-17 00:43:46 +00001671 uintptr_t TypePtr = reinterpret_cast<uintptr_t>(T.getAsOpaquePtr());
Anders Carlssond3a932a2009-09-17 03:53:28 +00001672 addSubstitution(TypePtr);
1673}
1674
1675void CXXNameMangler::addSubstitution(uintptr_t Ptr) {
Anders Carlsson76967372009-09-17 00:43:46 +00001676 unsigned SeqID = Substitutions.size();
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001677
Anders Carlssond3a932a2009-09-17 03:53:28 +00001678 assert(!Substitutions.count(Ptr) && "Substitution already exists!");
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001679 Substitutions[Ptr] = SeqID;
Anders Carlsson76967372009-09-17 00:43:46 +00001680}
1681
Daniel Dunbar1b077112009-11-21 09:06:10 +00001682//
Mike Stump1eb44332009-09-09 15:08:12 +00001683
Daniel Dunbar1b077112009-11-21 09:06:10 +00001684/// \brief Mangles the name of the declaration D and emits that name to the
1685/// given output stream.
1686///
1687/// If the declaration D requires a mangled name, this routine will emit that
1688/// mangled name to \p os and return true. Otherwise, \p os will be unchanged
1689/// and this routine will return false. In this case, the caller should just
1690/// emit the identifier of the declaration (\c D->getIdentifier()) as its
1691/// name.
Daniel Dunbarf981bf82009-11-21 09:14:52 +00001692void MangleContext::mangleName(const NamedDecl *D,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001693 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc02ab4c2009-11-21 09:14:44 +00001694 assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) &&
1695 "Invalid mangleName() call, argument is not a variable or function!");
1696 assert(!isa<CXXConstructorDecl>(D) && !isa<CXXDestructorDecl>(D) &&
1697 "Invalid mangleName() call on 'structor decl!");
Daniel Dunbar3c9e4632009-11-21 09:05:47 +00001698
Daniel Dunbar1b077112009-11-21 09:06:10 +00001699 PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
1700 getASTContext().getSourceManager(),
1701 "Mangling declaration");
Mike Stump1eb44332009-09-09 15:08:12 +00001702
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001703 CXXNameMangler Mangler(*this, Res);
1704 return Mangler.mangle(D);
Daniel Dunbar1b077112009-11-21 09:06:10 +00001705}
Mike Stump1eb44332009-09-09 15:08:12 +00001706
Daniel Dunbar1b077112009-11-21 09:06:10 +00001707void MangleContext::mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001708 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbar77939c92009-11-21 09:06:31 +00001709 CXXNameMangler Mangler(*this, Res, D, Type);
1710 Mangler.mangle(D);
Daniel Dunbar1b077112009-11-21 09:06:10 +00001711}
Mike Stump1eb44332009-09-09 15:08:12 +00001712
Daniel Dunbar1b077112009-11-21 09:06:10 +00001713void MangleContext::mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001714 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbar77939c92009-11-21 09:06:31 +00001715 CXXNameMangler Mangler(*this, Res, D, Type);
1716 Mangler.mangle(D);
Daniel Dunbar1b077112009-11-21 09:06:10 +00001717}
Mike Stumpf1216772009-07-31 18:25:34 +00001718
Daniel Dunbarc0747712009-11-21 09:12:13 +00001719/// \brief Mangles the a thunk with the offset n for the declaration D and
1720/// emits that name to the given output stream.
Anders Carlssona94822e2009-11-26 02:32:05 +00001721void MangleContext::mangleThunk(const FunctionDecl *FD,
Anders Carlssonb73a5be2009-11-26 02:49:32 +00001722 const ThunkAdjustment &ThisAdjustment,
Daniel Dunbarc0747712009-11-21 09:12:13 +00001723 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc0747712009-11-21 09:12:13 +00001724 assert(!isa<CXXDestructorDecl>(FD) &&
1725 "Use mangleCXXDtor for destructor decls!");
1726
1727 // <special-name> ::= T <call-offset> <base encoding>
1728 // # base is the nominal target function of thunk
1729 CXXNameMangler Mangler(*this, Res);
1730 Mangler.getStream() << "_ZT";
Anders Carlssonb73a5be2009-11-26 02:49:32 +00001731 Mangler.mangleCallOffset(ThisAdjustment);
Daniel Dunbarc0747712009-11-21 09:12:13 +00001732 Mangler.mangleFunctionEncoding(FD);
1733}
1734
Eli Friedman61d89b62009-12-03 00:03:05 +00001735void MangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *D,
1736 CXXDtorType Type,
1737 const ThunkAdjustment &ThisAdjustment,
1738 llvm::SmallVectorImpl<char> &Res) {
1739 // <special-name> ::= T <call-offset> <base encoding>
1740 // # base is the nominal target function of thunk
1741 CXXNameMangler Mangler(*this, Res, D, Type);
1742 Mangler.getStream() << "_ZT";
1743 Mangler.mangleCallOffset(ThisAdjustment);
1744 Mangler.mangleFunctionEncoding(D);
1745}
1746
Daniel Dunbarc0747712009-11-21 09:12:13 +00001747/// \brief Mangles the a covariant thunk for the declaration D and emits that
1748/// name to the given output stream.
Anders Carlsson7622cd32009-11-26 03:09:37 +00001749void
1750MangleContext::mangleCovariantThunk(const FunctionDecl *FD,
1751 const CovariantThunkAdjustment& Adjustment,
1752 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc0747712009-11-21 09:12:13 +00001753 assert(!isa<CXXDestructorDecl>(FD) &&
Eli Friedman61d89b62009-12-03 00:03:05 +00001754 "No such thing as a covariant thunk for a destructor!");
Daniel Dunbarc0747712009-11-21 09:12:13 +00001755
1756 // <special-name> ::= Tc <call-offset> <call-offset> <base encoding>
1757 // # base is the nominal target function of thunk
1758 // # first call-offset is 'this' adjustment
1759 // # second call-offset is result adjustment
1760 CXXNameMangler Mangler(*this, Res);
1761 Mangler.getStream() << "_ZTc";
Anders Carlsson7622cd32009-11-26 03:09:37 +00001762 Mangler.mangleCallOffset(Adjustment.ThisAdjustment);
1763 Mangler.mangleCallOffset(Adjustment.ReturnAdjustment);
Daniel Dunbarc0747712009-11-21 09:12:13 +00001764 Mangler.mangleFunctionEncoding(FD);
1765}
1766
1767/// mangleGuardVariable - Returns the mangled name for a guard variable
1768/// for the passed in VarDecl.
1769void MangleContext::mangleGuardVariable(const VarDecl *D,
1770 llvm::SmallVectorImpl<char> &Res) {
1771 // <special-name> ::= GV <object name> # Guard variable for one-time
1772 // # initialization
1773 CXXNameMangler Mangler(*this, Res);
1774 Mangler.getStream() << "_ZGV";
1775 Mangler.mangleName(D);
1776}
1777
Daniel Dunbar1b077112009-11-21 09:06:10 +00001778void MangleContext::mangleCXXVtable(const CXXRecordDecl *RD,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001779 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc0747712009-11-21 09:12:13 +00001780 // <special-name> ::= TV <type> # virtual table
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001781 CXXNameMangler Mangler(*this, Res);
Daniel Dunbarc0747712009-11-21 09:12:13 +00001782 Mangler.getStream() << "_ZTV";
1783 Mangler.mangleName(RD);
Daniel Dunbar1b077112009-11-21 09:06:10 +00001784}
Mike Stump82d75b02009-11-10 01:58:37 +00001785
Daniel Dunbar1b077112009-11-21 09:06:10 +00001786void MangleContext::mangleCXXVTT(const CXXRecordDecl *RD,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001787 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc0747712009-11-21 09:12:13 +00001788 // <special-name> ::= TT <type> # VTT structure
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001789 CXXNameMangler Mangler(*this, Res);
Daniel Dunbarc0747712009-11-21 09:12:13 +00001790 Mangler.getStream() << "_ZTT";
1791 Mangler.mangleName(RD);
Daniel Dunbar1b077112009-11-21 09:06:10 +00001792}
Mike Stumpab3f7e92009-11-10 01:41:59 +00001793
Daniel Dunbar1b077112009-11-21 09:06:10 +00001794void MangleContext::mangleCXXCtorVtable(const CXXRecordDecl *RD, int64_t Offset,
1795 const CXXRecordDecl *Type,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001796 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc0747712009-11-21 09:12:13 +00001797 // <special-name> ::= TC <type> <offset number> _ <base type>
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001798 CXXNameMangler Mangler(*this, Res);
Daniel Dunbarc0747712009-11-21 09:12:13 +00001799 Mangler.getStream() << "_ZTC";
1800 Mangler.mangleName(RD);
1801 Mangler.getStream() << Offset;
1802 Mangler.getStream() << "_";
1803 Mangler.mangleName(Type);
Daniel Dunbar1b077112009-11-21 09:06:10 +00001804}
Mike Stump738f8c22009-07-31 23:15:31 +00001805
Mike Stumpde050572009-12-02 18:57:08 +00001806void MangleContext::mangleCXXRTTI(QualType Ty,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001807 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc0747712009-11-21 09:12:13 +00001808 // <special-name> ::= TI <type> # typeinfo structure
Douglas Gregor154fe982009-12-23 22:04:40 +00001809 assert(!Ty.hasQualifiers() && "RTTI info cannot have top-level qualifiers");
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001810 CXXNameMangler Mangler(*this, Res);
Daniel Dunbarc0747712009-11-21 09:12:13 +00001811 Mangler.getStream() << "_ZTI";
1812 Mangler.mangleType(Ty);
Daniel Dunbar1b077112009-11-21 09:06:10 +00001813}
Mike Stump67795982009-11-14 00:14:13 +00001814
Mike Stumpde050572009-12-02 18:57:08 +00001815void MangleContext::mangleCXXRTTIName(QualType Ty,
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001816 llvm::SmallVectorImpl<char> &Res) {
Daniel Dunbarc0747712009-11-21 09:12:13 +00001817 // <special-name> ::= TS <type> # typeinfo name (null terminated byte string)
Daniel Dunbar94fd26d2009-11-21 09:06:22 +00001818 CXXNameMangler Mangler(*this, Res);
Daniel Dunbarc0747712009-11-21 09:12:13 +00001819 Mangler.getStream() << "_ZTS";
1820 Mangler.mangleType(Ty);
Mike Stumpf1216772009-07-31 18:25:34 +00001821}