blob: ddf32ece5858964b06ebca2e737ffe4f03ea0205 [file] [log] [blame]
Charles Davis74ce8592010-06-09 23:25:41 +00001//===--- MicrosoftCXXABI.cpp - Emit LLVM Code from ASTs for a Module ------===//
2//
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// This provides C++ code generation targetting the Microsoft Visual C++ ABI.
11// The class in this file generates structures that follow the Microsoft
12// Visual C++ ABI, which is actually not very well documented at all outside
13// of Microsoft.
14//
15//===----------------------------------------------------------------------===//
16
17#include "CGCXXABI.h"
18#include "CodeGenModule.h"
19#include "Mangle.h"
20#include "clang/AST/ASTContext.h"
21#include "clang/AST/Decl.h"
22#include "clang/AST/DeclCXX.h"
23#include "clang/AST/DeclTemplate.h"
24#include "clang/AST/ExprCXX.h"
25#include "CGVTables.h"
26
27using namespace clang;
28using namespace CodeGen;
29
30namespace {
31
Charles Davis9af2d4a2010-06-11 03:07:32 +000032/// MicrosoftCXXNameMangler - Manage the mangling of a single name for the
33/// Microsoft Visual C++ ABI.
34class MicrosoftCXXNameMangler {
35 MangleContext &Context;
36 llvm::raw_svector_ostream Out;
37
38 ASTContext &getASTContext() const { return Context.getASTContext(); }
39
40public:
41 MicrosoftCXXNameMangler(MangleContext &C, llvm::SmallVectorImpl<char> &Res)
42 : Context(C), Out(Res) { }
43
44 llvm::raw_svector_ostream &getStream() { return Out; }
45
46 void mangle(const NamedDecl *D, llvm::StringRef Prefix = "?");
47 void mangleName(const NamedDecl *ND);
Charles Davis89338af2010-06-16 05:33:16 +000048 void mangleFunctionEncoding(const FunctionDecl *FD);
Charles Davis2d7b10c2010-06-14 05:29:01 +000049 void mangleVariableEncoding(const VarDecl *VD);
Charles Davis108f5a22010-06-18 07:51:00 +000050 void mangleNumber(int64_t Number);
Charles Davis7dacc952010-06-12 08:11:16 +000051 void mangleType(QualType T);
Charles Davis9af2d4a2010-06-11 03:07:32 +000052
53private:
54 void mangleUnqualifiedName(const NamedDecl *ND) {
55 mangleUnqualifiedName(ND, ND->getDeclName());
56 }
57 void mangleUnqualifiedName(const NamedDecl *ND, DeclarationName Name);
58 void mangleSourceName(const IdentifierInfo *II);
59 void manglePostfix(const DeclContext *DC, bool NoFunction=false);
Charles Davis8c02c132010-06-17 06:47:31 +000060 void mangleOperatorName(OverloadedOperatorKind OO);
Charles Davis2d7b10c2010-06-14 05:29:01 +000061 void mangleQualifiers(Qualifiers Quals, bool IsMember);
Charles Davis9af2d4a2010-06-11 03:07:32 +000062
63 void mangleObjCMethodName(const ObjCMethodDecl *MD);
64
Charles Davis7dacc952010-06-12 08:11:16 +000065 // Declare manglers for every type class.
66#define ABSTRACT_TYPE(CLASS, PARENT)
67#define NON_CANONICAL_TYPE(CLASS, PARENT)
68#define TYPE(CLASS, PARENT) void mangleType(const CLASS##Type *T);
69#include "clang/AST/TypeNodes.def"
70
Charles Davis108f5a22010-06-18 07:51:00 +000071 void mangleType(const TagType*);
Charles Davis89338af2010-06-16 05:33:16 +000072 void mangleType(const FunctionType *T, bool IsStructor);
73 void mangleFunctionClass(const FunctionDecl *FD);
74 void mangleCallingConvention(const FunctionType *T);
75 void mangleThrowSpecification(const FunctionProtoType *T);
76
Charles Davis9af2d4a2010-06-11 03:07:32 +000077};
78
Charles Davis74ce8592010-06-09 23:25:41 +000079/// MicrosoftMangleContext - Overrides the default MangleContext for the
80/// Microsoft Visual C++ ABI.
81class MicrosoftMangleContext : public MangleContext {
82public:
83 MicrosoftMangleContext(ASTContext &Context,
84 Diagnostic &Diags) : MangleContext(Context, Diags) { }
Charles Davisb6a5a0d2010-06-11 04:25:47 +000085 virtual bool shouldMangleDeclName(const NamedDecl *D);
Charles Davis74ce8592010-06-09 23:25:41 +000086 virtual void mangleName(const NamedDecl *D, llvm::SmallVectorImpl<char> &);
87 virtual void mangleThunk(const CXXMethodDecl *MD,
88 const ThunkInfo &Thunk,
89 llvm::SmallVectorImpl<char> &);
90 virtual void mangleCXXDtorThunk(const CXXDestructorDecl *DD, CXXDtorType Type,
91 const ThisAdjustment &ThisAdjustment,
92 llvm::SmallVectorImpl<char> &);
93 virtual void mangleGuardVariable(const VarDecl *D,
94 llvm::SmallVectorImpl<char> &);
95 virtual void mangleCXXVTable(const CXXRecordDecl *RD,
96 llvm::SmallVectorImpl<char> &);
97 virtual void mangleCXXVTT(const CXXRecordDecl *RD,
98 llvm::SmallVectorImpl<char> &);
99 virtual void mangleCXXCtorVTable(const CXXRecordDecl *RD, int64_t Offset,
100 const CXXRecordDecl *Type,
101 llvm::SmallVectorImpl<char> &);
102 virtual void mangleCXXRTTI(QualType T, llvm::SmallVectorImpl<char> &);
103 virtual void mangleCXXRTTIName(QualType T, llvm::SmallVectorImpl<char> &);
104 virtual void mangleCXXCtor(const CXXConstructorDecl *D, CXXCtorType Type,
105 llvm::SmallVectorImpl<char> &);
106 virtual void mangleCXXDtor(const CXXDestructorDecl *D, CXXDtorType Type,
107 llvm::SmallVectorImpl<char> &);
108};
109
110class MicrosoftCXXABI : public CXXABI {
111 MicrosoftMangleContext MangleCtx;
112public:
113 MicrosoftCXXABI(CodeGenModule &CGM)
114 : MangleCtx(CGM.getContext(), CGM.getDiags()) {}
115
116 MicrosoftMangleContext &getMangleContext() {
117 return MangleCtx;
118 }
119};
120
121}
122
Charles Davisb6a5a0d2010-06-11 04:25:47 +0000123static bool isInCLinkageSpecification(const Decl *D) {
124 D = D->getCanonicalDecl();
125 for (const DeclContext *DC = D->getDeclContext();
126 !DC->isTranslationUnit(); DC = DC->getParent()) {
127 if (const LinkageSpecDecl *Linkage = dyn_cast<LinkageSpecDecl>(DC))
128 return Linkage->getLanguage() == LinkageSpecDecl::lang_c;
129 }
Charles Davis7dacc952010-06-12 08:11:16 +0000130
Charles Davisb6a5a0d2010-06-11 04:25:47 +0000131 return false;
132}
133
134bool MicrosoftMangleContext::shouldMangleDeclName(const NamedDecl *D) {
135 // In C, functions with no attributes never need to be mangled. Fastpath them.
136 if (!getASTContext().getLangOptions().CPlusPlus && !D->hasAttrs())
137 return false;
138
139 // Any decl can be declared with __asm("foo") on it, and this takes precedence
140 // over all other naming in the .o file.
141 if (D->hasAttr<AsmLabelAttr>())
142 return true;
143
144 // Clang's "overloadable" attribute extension to C/C++ implies name mangling
145 // (always) as does passing a C++ member function and a function
146 // whose name is not a simple identifier.
147 const FunctionDecl *FD = dyn_cast<FunctionDecl>(D);
148 if (FD && (FD->hasAttr<OverloadableAttr>() || isa<CXXMethodDecl>(FD) ||
149 !FD->getDeclName().isIdentifier()))
150 return true;
151
152 // Otherwise, no mangling is done outside C++ mode.
153 if (!getASTContext().getLangOptions().CPlusPlus)
154 return false;
155
Charles Davis7dacc952010-06-12 08:11:16 +0000156 // Variables at global scope with internal linkage are not mangled.
157 if (!FD) {
158 const DeclContext *DC = D->getDeclContext();
159 if (DC->isTranslationUnit() && D->getLinkage() == InternalLinkage)
160 return false;
161 }
162
Charles Davisb6a5a0d2010-06-11 04:25:47 +0000163 // C functions and "main" are not mangled.
164 if ((FD && FD->isMain()) || isInCLinkageSpecification(D))
165 return false;
166
167 return true;
168}
169
Charles Davis9af2d4a2010-06-11 03:07:32 +0000170void MicrosoftCXXNameMangler::mangle(const NamedDecl *D,
171 llvm::StringRef Prefix) {
172 // MSVC doesn't mangle C++ names the same way it mangles extern "C" names.
173 // Therefore it's really important that we don't decorate the
174 // name with leading underscores or leading/trailing at signs. So, emit a
175 // asm marker at the start so we get the name right.
176 Out << '\01'; // LLVM IR Marker for __asm("foo")
177
178 // Any decl can be declared with __asm("foo") on it, and this takes precedence
179 // over all other naming in the .o file.
180 if (const AsmLabelAttr *ALA = D->getAttr<AsmLabelAttr>()) {
181 // If we have an asm name, then we use it as the mangling.
182 Out << ALA->getLabel();
183 return;
184 }
185
Charles Davis89338af2010-06-16 05:33:16 +0000186 // <mangled-name> ::= ? <name> <type-encoding>
Charles Davis9af2d4a2010-06-11 03:07:32 +0000187 Out << Prefix;
188 mangleName(D);
Charles Davis89338af2010-06-16 05:33:16 +0000189 if (const FunctionDecl *FD = dyn_cast<FunctionDecl>(D))
190 mangleFunctionEncoding(FD);
191 else if (const VarDecl *VD = dyn_cast<VarDecl>(D))
Charles Davis2d7b10c2010-06-14 05:29:01 +0000192 mangleVariableEncoding(VD);
Charles Davis89338af2010-06-16 05:33:16 +0000193 // TODO: Fields? Can MSVC even mangle them?
194}
195
196void MicrosoftCXXNameMangler::mangleFunctionEncoding(const FunctionDecl *FD) {
197 // <type-encoding> ::= <function-class> <function-type>
198
199 // Don't mangle in the type if this isn't a decl we should typically mangle.
200 if (!Context.shouldMangleDeclName(FD))
201 return;
202
203 // We should never ever see a FunctionNoProtoType at this point.
204 // We don't even know how to mangle their types anyway :).
205 FunctionProtoType *OldType = cast<FunctionProtoType>(FD->getType());
206
207 bool InStructor = false;
208 const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD);
209 if (MD) {
210 if (isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD))
211 InStructor = true;
212 }
213
214 // First, the function class.
215 mangleFunctionClass(FD);
216
217 // If this is a C++ instance method, mangle the CVR qualifiers for the
218 // this pointer.
219 if (MD && MD->isInstance())
220 mangleQualifiers(Qualifiers::fromCVRMask(OldType->getTypeQuals()), false);
221
222 // Do the canonicalization out here because parameter types can
223 // undergo additional canonicalization (e.g. array decay).
224 const FunctionProtoType *FT = cast<FunctionProtoType>(getASTContext()
225 .getCanonicalType(OldType));
226 // If the function's type had a throw spec, canonicalization removed it.
227 // Get it back.
228 FT = cast<FunctionProtoType>(getASTContext().getFunctionType(
229 FT->getResultType(),
230 FT->arg_type_begin(),
231 FT->getNumArgs(),
232 FT->isVariadic(),
233 FT->getTypeQuals(),
234 OldType->hasExceptionSpec(),
235 OldType->hasAnyExceptionSpec(),
236 OldType->getNumExceptions(),
237 OldType->exception_begin(),
238 FT->getExtInfo()).getTypePtr());
239 mangleType(FT, InStructor);
Charles Davis2d7b10c2010-06-14 05:29:01 +0000240}
241
242void MicrosoftCXXNameMangler::mangleVariableEncoding(const VarDecl *VD) {
Charles Davis89338af2010-06-16 05:33:16 +0000243 // <type-encoding> ::= <storage-class> <variable-type>
Charles Davis2d7b10c2010-06-14 05:29:01 +0000244 // <storage-class> ::= 0 # private static member
245 // ::= 1 # protected static member
246 // ::= 2 # public static member
247 // ::= 3 # global
248 // ::= 4 # static local
249
250 // The first character in the encoding (after the name) is the storage class.
251 if (VD->isStaticDataMember()) {
252 // If it's a static member, it also encodes the access level.
253 switch (VD->getAccess()) {
254 default:
255 case AS_private: Out << '0'; break;
256 case AS_protected: Out << '1'; break;
257 case AS_public: Out << '2'; break;
258 }
259 }
260 else if (!VD->isStaticLocal())
261 Out << '3';
262 else
263 Out << '4';
264 // Now mangle the type.
265 // <variable-type> ::= <type> <cvr-qualifiers>
266 QualType Ty = VD->getType();
267 mangleType(Ty.getLocalUnqualifiedType());
268 mangleQualifiers(Ty.getLocalQualifiers(), false);
Charles Davis9af2d4a2010-06-11 03:07:32 +0000269}
270
271void MicrosoftCXXNameMangler::mangleName(const NamedDecl *ND) {
272 // <name> ::= <unscoped-name> {[<named-scope>]+ | [<nested-name>]}? @
273 const DeclContext *DC = ND->getDeclContext();
274
275 // Always start with the unqualified name.
276 mangleUnqualifiedName(ND);
277
278 // If this is an extern variable declared locally, the relevant DeclContext
279 // is that of the containing namespace, or the translation unit.
280 if (isa<FunctionDecl>(DC) && ND->hasLinkage())
281 while (!DC->isNamespace() && !DC->isTranslationUnit())
282 DC = DC->getParent();
283
284 manglePostfix(DC);
285
286 // Terminate the whole name with an '@'.
287 Out << '@';
288}
289
Charles Davis108f5a22010-06-18 07:51:00 +0000290void MicrosoftCXXNameMangler::mangleNumber(int64_t Number) {
291 // <number> ::= [?] <decimal digit> # <= 9
292 // ::= [?] <hex digit>+ @ # > 9; A = 0, B = 1, etc...
293 if (Number < 0) {
294 Out << '?';
295 Number = -Number;
296 }
297 if (Number <= 9) {
298 Out << Number;
299 } else {
300 // We have to build up the encoding in reverse order, so it will come
301 // out right when we write it out.
302 char Encoding[16];
303 char *EndPtr = Encoding+sizeof(Encoding);
304 char *CurPtr = EndPtr;
305 while (Number) {
306 *--CurPtr = 'A' + (Number % 16);
307 Number /= 16;
308 }
309 Out.write(CurPtr, EndPtr-CurPtr);
310 Out << '@';
311 }
312}
313
Charles Davis9af2d4a2010-06-11 03:07:32 +0000314void
315MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
316 DeclarationName Name) {
317 // <unqualified-name> ::= <operator-name>
318 // ::= <ctor-dtor-name>
319 // ::= <source-name>
320 switch (Name.getNameKind()) {
321 case DeclarationName::Identifier: {
322 if (const IdentifierInfo *II = Name.getAsIdentifierInfo()) {
323 mangleSourceName(II);
324 break;
325 }
326
327 // Otherwise, an anonymous entity. We must have a declaration.
328 assert(ND && "mangling empty name without declaration");
329
330 if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) {
331 if (NS->isAnonymousNamespace()) {
332 Out << "?A";
333 break;
334 }
335 }
336
337 // We must have an anonymous struct.
338 const TagDecl *TD = cast<TagDecl>(ND);
339 if (const TypedefDecl *D = TD->getTypedefForAnonDecl()) {
340 assert(TD->getDeclContext() == D->getDeclContext() &&
341 "Typedef should not be in another decl context!");
342 assert(D->getDeclName().getAsIdentifierInfo() &&
343 "Typedef was not named!");
344 mangleSourceName(D->getDeclName().getAsIdentifierInfo());
345 break;
346 }
347
348 // TODO: How does VC mangle anonymous structs?
349 assert(false && "Don't know how to mangle anonymous types yet!");
350 break;
351 }
352
353 case DeclarationName::ObjCZeroArgSelector:
354 case DeclarationName::ObjCOneArgSelector:
355 case DeclarationName::ObjCMultiArgSelector:
356 assert(false && "Can't mangle Objective-C selector names here!");
357 break;
358
359 case DeclarationName::CXXConstructorName:
360 assert(false && "Can't mangle constructors yet!");
361 break;
362
363 case DeclarationName::CXXDestructorName:
364 assert(false && "Can't mangle destructors yet!");
365 break;
366
367 case DeclarationName::CXXConversionFunctionName:
368 // <operator-name> ::= ?B # (cast)
369 // The target type is encoded as the return type.
370 Out << "?B";
371 break;
372
373 case DeclarationName::CXXOperatorName:
Charles Davis8c02c132010-06-17 06:47:31 +0000374 mangleOperatorName(Name.getCXXOverloadedOperator());
375 break;
Charles Davis9af2d4a2010-06-11 03:07:32 +0000376
377 case DeclarationName::CXXLiteralOperatorName:
378 // FIXME: Was this added in VS2010? Does MS even know how to mangle this?
379 assert(false && "Don't know how to mangle literal operators yet!");
380 break;
381
382 case DeclarationName::CXXUsingDirective:
383 assert(false && "Can't mangle a using directive name!");
384 break;
385 }
386}
387
388void MicrosoftCXXNameMangler::manglePostfix(const DeclContext *DC,
389 bool NoFunction) {
390 // <postfix> ::= <unqualified-name> [<postfix>]
391 // ::= <template-postfix> <template-args> [<postfix>]
392 // ::= <template-param>
393 // ::= <substitution> [<postfix>]
394
395 if (!DC) return;
396
397 while (isa<LinkageSpecDecl>(DC))
398 DC = DC->getParent();
399
400 if (DC->isTranslationUnit())
401 return;
402
403 if (const BlockDecl *BD = dyn_cast<BlockDecl>(DC)) {
404 llvm::SmallString<64> Name;
Fariborz Jahanian9b5528d2010-06-24 00:08:06 +0000405 Context.mangleBlock(GlobalDecl(), BD, Name);
Charles Davis9af2d4a2010-06-11 03:07:32 +0000406 Out << Name << '@';
407 return manglePostfix(DC->getParent(), NoFunction);
408 }
409
410 if (NoFunction && (isa<FunctionDecl>(DC) || isa<ObjCMethodDecl>(DC)))
411 return;
412 else if (const ObjCMethodDecl *Method = dyn_cast<ObjCMethodDecl>(DC))
413 mangleObjCMethodName(Method);
414 else {
415 mangleUnqualifiedName(cast<NamedDecl>(DC));
416 manglePostfix(DC->getParent(), NoFunction);
417 }
418}
419
Charles Davis8c02c132010-06-17 06:47:31 +0000420void MicrosoftCXXNameMangler::mangleOperatorName(OverloadedOperatorKind OO) {
421 switch (OO) {
422 // ?0 # constructor
423 // ?1 # destructor
424 // <operator-name> ::= ?2 # new
425 case OO_New: Out << "?2"; break;
426 // <operator-name> ::= ?3 # delete
427 case OO_Delete: Out << "?3"; break;
428 // <operator-name> ::= ?4 # =
429 case OO_Equal: Out << "?4"; break;
430 // <operator-name> ::= ?5 # >>
431 case OO_GreaterGreater: Out << "?5"; break;
432 // <operator-name> ::= ?6 # <<
433 case OO_LessLess: Out << "?6"; break;
434 // <operator-name> ::= ?7 # !
435 case OO_Exclaim: Out << "?7"; break;
436 // <operator-name> ::= ?8 # ==
437 case OO_EqualEqual: Out << "?8"; break;
438 // <operator-name> ::= ?9 # !=
439 case OO_ExclaimEqual: Out << "?9"; break;
440 // <operator-name> ::= ?A # []
441 case OO_Subscript: Out << "?A"; break;
442 // ?B # conversion
443 // <operator-name> ::= ?C # ->
444 case OO_Arrow: Out << "?C"; break;
445 // <operator-name> ::= ?D # *
446 case OO_Star: Out << "?D"; break;
447 // <operator-name> ::= ?E # ++
448 case OO_PlusPlus: Out << "?E"; break;
449 // <operator-name> ::= ?F # --
450 case OO_MinusMinus: Out << "?F"; break;
451 // <operator-name> ::= ?G # -
452 case OO_Minus: Out << "?G"; break;
453 // <operator-name> ::= ?H # +
454 case OO_Plus: Out << "?H"; break;
455 // <operator-name> ::= ?I # &
456 case OO_Amp: Out << "?I"; break;
457 // <operator-name> ::= ?J # ->*
458 case OO_ArrowStar: Out << "?J"; break;
459 // <operator-name> ::= ?K # /
460 case OO_Slash: Out << "?K"; break;
461 // <operator-name> ::= ?L # %
462 case OO_Percent: Out << "?L"; break;
463 // <operator-name> ::= ?M # <
464 case OO_Less: Out << "?M"; break;
465 // <operator-name> ::= ?N # <=
466 case OO_LessEqual: Out << "?N"; break;
467 // <operator-name> ::= ?O # >
468 case OO_Greater: Out << "?O"; break;
469 // <operator-name> ::= ?P # >=
470 case OO_GreaterEqual: Out << "?P"; break;
471 // <operator-name> ::= ?Q # ,
472 case OO_Comma: Out << "?Q"; break;
473 // <operator-name> ::= ?R # ()
474 case OO_Call: Out << "?R"; break;
475 // <operator-name> ::= ?S # ~
476 case OO_Tilde: Out << "?S"; break;
477 // <operator-name> ::= ?T # ^
478 case OO_Caret: Out << "?T"; break;
479 // <operator-name> ::= ?U # |
480 case OO_Pipe: Out << "?U"; break;
481 // <operator-name> ::= ?V # &&
482 case OO_AmpAmp: Out << "?V"; break;
483 // <operator-name> ::= ?W # ||
484 case OO_PipePipe: Out << "?W"; break;
485 // <operator-name> ::= ?X # *=
486 case OO_StarEqual: Out << "?X"; break;
487 // <operator-name> ::= ?Y # +=
488 case OO_PlusEqual: Out << "?Y"; break;
489 // <operator-name> ::= ?Z # -=
490 case OO_MinusEqual: Out << "?Z"; break;
491 // <operator-name> ::= ?_0 # /=
492 case OO_SlashEqual: Out << "?_0"; break;
493 // <operator-name> ::= ?_1 # %=
494 case OO_PercentEqual: Out << "?_1"; break;
495 // <operator-name> ::= ?_2 # >>=
496 case OO_GreaterGreaterEqual: Out << "?_2"; break;
497 // <operator-name> ::= ?_3 # <<=
498 case OO_LessLessEqual: Out << "?_3"; break;
499 // <operator-name> ::= ?_4 # &=
500 case OO_AmpEqual: Out << "?_4"; break;
501 // <operator-name> ::= ?_5 # |=
502 case OO_PipeEqual: Out << "?_5"; break;
503 // <operator-name> ::= ?_6 # ^=
504 case OO_CaretEqual: Out << "?_6"; break;
505 // ?_7 # vftable
506 // ?_8 # vbtable
507 // ?_9 # vcall
508 // ?_A # typeof
509 // ?_B # local static guard
510 // ?_C # string
511 // ?_D # vbase destructor
512 // ?_E # vector deleting destructor
513 // ?_F # default constructor closure
514 // ?_G # scalar deleting destructor
515 // ?_H # vector constructor iterator
516 // ?_I # vector destructor iterator
517 // ?_J # vector vbase constructor iterator
518 // ?_K # virtual displacement map
519 // ?_L # eh vector constructor iterator
520 // ?_M # eh vector destructor iterator
521 // ?_N # eh vector vbase constructor iterator
522 // ?_O # copy constructor closure
523 // ?_P<name> # udt returning <name>
524 // ?_Q # <unknown>
525 // ?_R0 # RTTI Type Descriptor
526 // ?_R1 # RTTI Base Class Descriptor at (a,b,c,d)
527 // ?_R2 # RTTI Base Class Array
528 // ?_R3 # RTTI Class Hierarchy Descriptor
529 // ?_R4 # RTTI Complete Object Locator
530 // ?_S # local vftable
531 // ?_T # local vftable constructor closure
532 // <operator-name> ::= ?_U # new[]
533 case OO_Array_New: Out << "?_U"; break;
534 // <operator-name> ::= ?_V # delete[]
535 case OO_Array_Delete: Out << "?_V"; break;
536
537 case OO_Conditional:
538 assert(false && "Don't know how to mangle ?:");
539 break;
540
541 case OO_None:
542 case NUM_OVERLOADED_OPERATORS:
543 assert(false && "Not an overloaded operator");
544 break;
545 }
546}
547
Charles Davis9af2d4a2010-06-11 03:07:32 +0000548void MicrosoftCXXNameMangler::mangleSourceName(const IdentifierInfo *II) {
549 // <source name> ::= <identifier> @
550 Out << II->getName() << '@';
551}
552
553void MicrosoftCXXNameMangler::mangleObjCMethodName(const ObjCMethodDecl *MD) {
554 llvm::SmallString<64> Buffer;
555 MiscNameMangler(Context, Buffer).mangleObjCMethodName(MD);
556 Out << Buffer;
557}
558
Charles Davis2d7b10c2010-06-14 05:29:01 +0000559void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals,
560 bool IsMember) {
561 // <cvr-qualifiers> ::= [E] [F] [I] <base-cvr-qualifiers>
562 // 'E' means __ptr64 (32-bit only); 'F' means __unaligned (32/64-bit only);
563 // 'I' means __restrict (32/64-bit).
564 // Note that the MSVC __restrict keyword isn't the same as the C99 restrict
565 // keyword!
566 // <base-cvr-qualifiers> ::= A # near
567 // ::= B # near const
568 // ::= C # near volatile
569 // ::= D # near const volatile
570 // ::= E # far (16-bit)
571 // ::= F # far const (16-bit)
572 // ::= G # far volatile (16-bit)
573 // ::= H # far const volatile (16-bit)
574 // ::= I # huge (16-bit)
575 // ::= J # huge const (16-bit)
576 // ::= K # huge volatile (16-bit)
577 // ::= L # huge const volatile (16-bit)
578 // ::= M <basis> # based
579 // ::= N <basis> # based const
580 // ::= O <basis> # based volatile
581 // ::= P <basis> # based const volatile
582 // ::= Q # near member
583 // ::= R # near const member
584 // ::= S # near volatile member
585 // ::= T # near const volatile member
586 // ::= U # far member (16-bit)
587 // ::= V # far const member (16-bit)
588 // ::= W # far volatile member (16-bit)
589 // ::= X # far const volatile member (16-bit)
590 // ::= Y # huge member (16-bit)
591 // ::= Z # huge const member (16-bit)
592 // ::= 0 # huge volatile member (16-bit)
593 // ::= 1 # huge const volatile member (16-bit)
594 // ::= 2 <basis> # based member
595 // ::= 3 <basis> # based const member
596 // ::= 4 <basis> # based volatile member
597 // ::= 5 <basis> # based const volatile member
598 // ::= 6 # near function (pointers only)
599 // ::= 7 # far function (pointers only)
600 // ::= 8 # near method (pointers only)
601 // ::= 9 # far method (pointers only)
602 // ::= _A <basis> # based function (pointers only)
603 // ::= _B <basis> # based function (far?) (pointers only)
604 // ::= _C <basis> # based method (pointers only)
605 // ::= _D <basis> # based method (far?) (pointers only)
606 // <basis> ::= 0 # __based(void)
607 // ::= 1 # __based(segment)?
608 // ::= 2 <name> # __based(name)
609 // ::= 3 # ?
610 // ::= 4 # ?
611 // ::= 5 # not really based
612 if (!IsMember) {
613 if (!Quals.hasVolatile()) {
614 if (!Quals.hasConst())
615 Out << 'A';
616 else
617 Out << 'B';
618 } else {
619 if (!Quals.hasConst())
620 Out << 'C';
621 else
622 Out << 'D';
623 }
624 } else {
625 if (!Quals.hasVolatile()) {
626 if (!Quals.hasConst())
627 Out << 'Q';
628 else
629 Out << 'R';
630 } else {
631 if (!Quals.hasConst())
632 Out << 'S';
633 else
634 Out << 'T';
635 }
636 }
637
638 // FIXME: For now, just drop all extension qualifiers on the floor.
639}
640
Charles Davis7dacc952010-06-12 08:11:16 +0000641void MicrosoftCXXNameMangler::mangleType(QualType T) {
642 // Only operate on the canonical type!
643 T = getASTContext().getCanonicalType(T);
644
645 switch (T->getTypeClass()) {
646#define ABSTRACT_TYPE(CLASS, PARENT)
647#define NON_CANONICAL_TYPE(CLASS, PARENT) \
648case Type::CLASS: \
649llvm_unreachable("can't mangle non-canonical type " #CLASS "Type"); \
650return;
651#define TYPE(CLASS, PARENT)
652#include "clang/AST/TypeNodes.def"
653 case Type::Builtin:
654 mangleType(static_cast<BuiltinType *>(T.getTypePtr()));
655 break;
Charles Davis108f5a22010-06-18 07:51:00 +0000656 case Type::Enum:
657 mangleType(static_cast<EnumType *>(T.getTypePtr()));
658 break;
659 case Type::Record:
660 mangleType(static_cast<RecordType *>(T.getTypePtr()));
661 break;
Charles Davis7dacc952010-06-12 08:11:16 +0000662 default:
663 assert(false && "Don't know how to mangle this type!");
664 break;
665 }
666}
667
668void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T) {
669 // <type> ::= <builtin-type>
670 // <builtin-type> ::= X # void
671 // ::= C # signed char
672 // ::= D # char
673 // ::= E # unsigned char
674 // ::= F # short
675 // ::= G # unsigned short (or wchar_t if it's not a builtin)
676 // ::= H # int
677 // ::= I # unsigned int
678 // ::= J # long
679 // ::= K # unsigned long
680 // L # <none>
681 // ::= M # float
682 // ::= N # double
683 // ::= O # long double (__float80 is mangled differently)
684 // ::= _D # __int8 (yup, it's a distinct type in MSVC)
685 // ::= _E # unsigned __int8
686 // ::= _F # __int16
687 // ::= _G # unsigned __int16
688 // ::= _H # __int32
689 // ::= _I # unsigned __int32
690 // ::= _J # long long, __int64
691 // ::= _K # unsigned long long, __int64
692 // ::= _L # __int128
693 // ::= _M # unsigned __int128
694 // ::= _N # bool
695 // _O # <array in parameter>
696 // ::= _T # __float80 (Intel)
697 // ::= _W # wchar_t
698 // ::= _Z # __float80 (Digital Mars)
699 switch (T->getKind()) {
700 case BuiltinType::Void: Out << 'X'; break;
701 case BuiltinType::SChar: Out << 'C'; break;
702 case BuiltinType::Char_U: case BuiltinType::Char_S: Out << 'D'; break;
703 case BuiltinType::UChar: Out << 'E'; break;
704 case BuiltinType::Short: Out << 'F'; break;
705 case BuiltinType::UShort: Out << 'G'; break;
706 case BuiltinType::Int: Out << 'H'; break;
707 case BuiltinType::UInt: Out << 'I'; break;
708 case BuiltinType::Long: Out << 'J'; break;
709 case BuiltinType::ULong: Out << 'K'; break;
710 case BuiltinType::Float: Out << 'M'; break;
711 case BuiltinType::Double: Out << 'N'; break;
712 // TODO: Determine size and mangle accordingly
713 case BuiltinType::LongDouble: Out << 'O'; break;
714 // TODO: __int8 and friends
715 case BuiltinType::LongLong: Out << "_J"; break;
716 case BuiltinType::ULongLong: Out << "_K"; break;
717 case BuiltinType::Int128: Out << "_L"; break;
718 case BuiltinType::UInt128: Out << "_M"; break;
719 case BuiltinType::Bool: Out << "_N"; break;
720 case BuiltinType::WChar: Out << "_W"; break;
721
722 case BuiltinType::Overload:
723 case BuiltinType::Dependent:
724 assert(false &&
725 "Overloaded and dependent types shouldn't get to name mangling");
726 break;
727 case BuiltinType::UndeducedAuto:
728 assert(0 && "Should not see undeduced auto here");
729 break;
730 case BuiltinType::ObjCId: Out << "PAUobjc_object@@"; break;
731 case BuiltinType::ObjCClass: Out << "PAUobjc_class@@"; break;
732 case BuiltinType::ObjCSel: Out << "PAUobjc_selector@@"; break;
733
734 case BuiltinType::Char16:
735 case BuiltinType::Char32:
736 case BuiltinType::NullPtr:
737 assert(false && "Don't know how to mangle this type");
738 break;
739 }
740}
741
Charles Davis89338af2010-06-16 05:33:16 +0000742// <type> ::= <function-type>
743void MicrosoftCXXNameMangler::mangleType(const FunctionProtoType *T) {
744 // Structors only appear in decls, so at this point we know it's not a
745 // structor type.
746 mangleType(T, false);
747}
748void MicrosoftCXXNameMangler::mangleType(const FunctionNoProtoType *T) {
749 llvm_unreachable("Can't mangle K&R function prototypes");
750}
751
752void MicrosoftCXXNameMangler::mangleType(const FunctionType *T,
753 bool IsStructor) {
754 // <function-type> ::= <calling-convention> <return-type> <argument-list>
755 // <throw-spec>
756 mangleCallingConvention(T);
757
758 const FunctionProtoType *Proto = cast<FunctionProtoType>(T);
759
760 // Structors always have a 'void' return type, but MSVC mangles them as an
761 // '@' (because they have no declared return type).
762 if (IsStructor)
763 Out << '@';
764 else
765 mangleType(Proto->getResultType());
766
767 // <argument-list> ::= X # void
768 // ::= <type>+ @
769 // ::= <type>* Z # varargs
770 if (Proto->getNumArgs() == 0 && !Proto->isVariadic()) {
771 Out << 'X';
772 } else {
773 for (FunctionProtoType::arg_type_iterator Arg = Proto->arg_type_begin(),
774 ArgEnd = Proto->arg_type_end();
775 Arg != ArgEnd; ++Arg)
776 mangleType(*Arg);
777
778 // <builtin-type> ::= Z # ellipsis
779 if (Proto->isVariadic())
780 Out << 'Z';
781 else
782 Out << '@';
783 }
784
785 mangleThrowSpecification(Proto);
786}
787
788void MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) {
789 // <function-class> ::= A # private: near
790 // ::= B # private: far
791 // ::= C # private: static near
792 // ::= D # private: static far
793 // ::= E # private: virtual near
794 // ::= F # private: virtual far
795 // ::= G # private: thunk near
796 // ::= H # private: thunk far
797 // ::= I # protected: near
798 // ::= J # protected: far
799 // ::= K # protected: static near
800 // ::= L # protected: static far
801 // ::= M # protected: virtual near
802 // ::= N # protected: virtual far
803 // ::= O # protected: thunk near
804 // ::= P # protected: thunk far
805 // ::= Q # public: near
806 // ::= R # public: far
807 // ::= S # public: static near
808 // ::= T # public: static far
809 // ::= U # public: virtual near
810 // ::= V # public: virtual far
811 // ::= W # public: thunk near
812 // ::= X # public: thunk far
813 // ::= Y # global near
814 // ::= Z # global far
815 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(FD)) {
816 switch (MD->getAccess()) {
817 default:
818 case AS_private:
819 if (MD->isStatic())
820 Out << 'C';
821 else if (MD->isVirtual())
822 Out << 'E';
823 else
824 Out << 'A';
825 break;
826 case AS_protected:
827 if (MD->isStatic())
828 Out << 'K';
829 else if (MD->isVirtual())
830 Out << 'M';
831 else
832 Out << 'I';
833 break;
834 case AS_public:
835 if (MD->isStatic())
836 Out << 'S';
837 else if (MD->isVirtual())
838 Out << 'U';
839 else
840 Out << 'Q';
841 }
842 } else
843 Out << 'Y';
844}
845void MicrosoftCXXNameMangler::mangleCallingConvention(const FunctionType *T) {
846 // <calling-convention> ::= A # __cdecl
847 // ::= B # __export __cdecl
848 // ::= C # __pascal
849 // ::= D # __export __pascal
850 // ::= E # __thiscall
851 // ::= F # __export __thiscall
852 // ::= G # __stdcall
853 // ::= H # __export __stdcall
854 // ::= I # __fastcall
855 // ::= J # __export __fastcall
856 // The 'export' calling conventions are from a bygone era
857 // (*cough*Win16*cough*) when functions were declared for export with
858 // that keyword. (It didn't actually export them, it just made them so
859 // that they could be in a DLL and somebody from another module could call
860 // them.)
861 switch (T->getCallConv()) {
862 case CC_Default:
863 case CC_C: Out << 'A'; break;
864 case CC_X86ThisCall: Out << 'E'; break;
865 case CC_X86StdCall: Out << 'G'; break;
866 case CC_X86FastCall: Out << 'I'; break;
867 }
868}
869void MicrosoftCXXNameMangler::mangleThrowSpecification(
870 const FunctionProtoType *FT) {
871 // <throw-spec> ::= Z # throw(...) (default)
872 // ::= @ # throw() or __declspec/__attribute__((nothrow))
873 // ::= <type>+
874 if (!FT->hasExceptionSpec() || FT->hasAnyExceptionSpec())
875 Out << 'Z';
876 else {
877 for (unsigned Exception = 0, NumExceptions = FT->getNumExceptions();
878 Exception < NumExceptions;
879 ++Exception)
880 mangleType(FT->getExceptionType(Exception).getLocalUnqualifiedType());
881 Out << '@';
882 }
883}
884
Charles Davis108f5a22010-06-18 07:51:00 +0000885// <type> ::= <union-type> | <struct-type> | <class-type> | <enum-type>
886// <union-type> ::= T <name>
887// <struct-type> ::= U <name>
888// <class-type> ::= V <name>
889// <enum-type> ::= W <size> <name>
890void MicrosoftCXXNameMangler::mangleType(const EnumType *T) {
891 mangleType(static_cast<const TagType*>(T));
892}
893void MicrosoftCXXNameMangler::mangleType(const RecordType *T) {
894 mangleType(static_cast<const TagType*>(T));
895}
896void MicrosoftCXXNameMangler::mangleType(const TagType *T) {
897 switch (T->getDecl()->getTagKind()) {
898 case TTK_Union:
899 Out << 'T';
900 break;
901 case TTK_Struct:
902 Out << 'U';
903 break;
904 case TTK_Class:
905 Out << 'V';
906 break;
907 case TTK_Enum:
908 Out << 'W';
909 mangleNumber(getASTContext().getTypeSizeInChars(
910 cast<EnumDecl>(T->getDecl())->getIntegerType()).getQuantity());
911 break;
912 }
913 mangleName(T->getDecl());
914}
915
Charles Davis74ce8592010-06-09 23:25:41 +0000916void MicrosoftMangleContext::mangleName(const NamedDecl *D,
917 llvm::SmallVectorImpl<char> &Name) {
Charles Davis9af2d4a2010-06-11 03:07:32 +0000918 assert((isa<FunctionDecl>(D) || isa<VarDecl>(D)) &&
919 "Invalid mangleName() call, argument is not a variable or function!");
920 assert(!isa<CXXConstructorDecl>(D) && !isa<CXXDestructorDecl>(D) &&
921 "Invalid mangleName() call on 'structor decl!");
922
923 PrettyStackTraceDecl CrashInfo(D, SourceLocation(),
924 getASTContext().getSourceManager(),
925 "Mangling declaration");
926
927 MicrosoftCXXNameMangler Mangler(*this, Name);
928 return Mangler.mangle(D);
Charles Davis74ce8592010-06-09 23:25:41 +0000929}
930void MicrosoftMangleContext::mangleThunk(const CXXMethodDecl *MD,
931 const ThunkInfo &Thunk,
932 llvm::SmallVectorImpl<char> &) {
933 assert(false && "Can't yet mangle thunks!");
934}
935void MicrosoftMangleContext::mangleCXXDtorThunk(const CXXDestructorDecl *DD,
936 CXXDtorType Type,
937 const ThisAdjustment &,
938 llvm::SmallVectorImpl<char> &) {
939 assert(false && "Can't yet mangle destructor thunks!");
940}
941void MicrosoftMangleContext::mangleGuardVariable(const VarDecl *D,
942 llvm::SmallVectorImpl<char> &) {
943 assert(false && "Can't yet mangle guard variables!");
944}
945void MicrosoftMangleContext::mangleCXXVTable(const CXXRecordDecl *RD,
946 llvm::SmallVectorImpl<char> &) {
947 assert(false && "Can't yet mangle virtual tables!");
948}
949void MicrosoftMangleContext::mangleCXXVTT(const CXXRecordDecl *RD,
950 llvm::SmallVectorImpl<char> &) {
951 llvm_unreachable("The MS C++ ABI does not have virtual table tables!");
952}
953void MicrosoftMangleContext::mangleCXXCtorVTable(const CXXRecordDecl *RD,
954 int64_t Offset,
955 const CXXRecordDecl *Type,
956 llvm::SmallVectorImpl<char> &) {
957 llvm_unreachable("The MS C++ ABI does not have constructor vtables!");
958}
959void MicrosoftMangleContext::mangleCXXRTTI(QualType T,
960 llvm::SmallVectorImpl<char> &) {
961 assert(false && "Can't yet mangle RTTI!");
962}
963void MicrosoftMangleContext::mangleCXXRTTIName(QualType T,
964 llvm::SmallVectorImpl<char> &) {
965 assert(false && "Can't yet mangle RTTI names!");
966}
967void MicrosoftMangleContext::mangleCXXCtor(const CXXConstructorDecl *D,
968 CXXCtorType Type,
969 llvm::SmallVectorImpl<char> &) {
970 assert(false && "Can't yet mangle constructors!");
971}
972void MicrosoftMangleContext::mangleCXXDtor(const CXXDestructorDecl *D,
973 CXXDtorType Type,
974 llvm::SmallVectorImpl<char> &) {
975 assert(false && "Can't yet mangle destructors!");
976}
977
Charles Davis95a546e2010-06-11 01:06:47 +0000978CXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
Charles Davis74ce8592010-06-09 23:25:41 +0000979 return new MicrosoftCXXABI(CGM);
980}
981