blob: 3ae04538d626739f3b684e85b2158784431d6ed0 [file] [log] [blame]
Charles Davis53c59df2010-08-16 03:33:14 +00001//===------- MicrosoftCXXABI.cpp - AST support for the Microsoft C++ ABI --===//
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//
Chris Lattner57540c52011-04-15 05:22:18 +000010// This provides C++ AST support targeting the Microsoft Visual C++
Charles Davis53c59df2010-08-16 03:33:14 +000011// ABI.
12//
13//===----------------------------------------------------------------------===//
14
15#include "CXXABI.h"
16#include "clang/AST/ASTContext.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000017#include "clang/AST/Attr.h"
Charles Davis53c59df2010-08-16 03:33:14 +000018#include "clang/AST/DeclCXX.h"
Reid Klecknerd8110b62013-09-10 20:14:30 +000019#include "clang/AST/MangleNumberingContext.h"
Anders Carlsson60a62632010-11-25 01:51:53 +000020#include "clang/AST/RecordLayout.h"
21#include "clang/AST/Type.h"
22#include "clang/Basic/TargetInfo.h"
Charles Davis53c59df2010-08-16 03:33:14 +000023
24using namespace clang;
25
26namespace {
Reid Klecknerd8110b62013-09-10 20:14:30 +000027
28/// \brief Numbers things which need to correspond across multiple TUs.
29/// Typically these are things like static locals, lambdas, or blocks.
30class MicrosoftNumberingContext : public MangleNumberingContext {
David Majnemer118da502014-08-22 04:22:50 +000031 llvm::DenseMap<const Type *, unsigned> ManglingNumbers;
32 unsigned LambdaManglingNumber;
33 unsigned StaticLocalNumber;
David Majnemerec8e54b2015-05-07 21:19:06 +000034 unsigned StaticThreadlocalNumber;
David Majnemer118da502014-08-22 04:22:50 +000035
Reid Klecknerd8110b62013-09-10 20:14:30 +000036public:
David Majnemer118da502014-08-22 04:22:50 +000037 MicrosoftNumberingContext()
38 : MangleNumberingContext(), LambdaManglingNumber(0),
David Majnemerec8e54b2015-05-07 21:19:06 +000039 StaticLocalNumber(0), StaticThreadlocalNumber(0) {}
David Majnemer118da502014-08-22 04:22:50 +000040
41 unsigned getManglingNumber(const CXXMethodDecl *CallOperator) override {
42 return ++LambdaManglingNumber;
43 }
44
Fariborz Jahanian5afc8692014-10-01 16:56:40 +000045 unsigned getManglingNumber(const BlockDecl *BD) override {
David Majnemer118da502014-08-22 04:22:50 +000046 const Type *Ty = nullptr;
47 return ++ManglingNumbers[Ty];
48 }
49
50 unsigned getStaticLocalNumber(const VarDecl *VD) override {
David Majnemerec8e54b2015-05-07 21:19:06 +000051 if (VD->getTLSKind())
52 return ++StaticThreadlocalNumber;
David Majnemer118da502014-08-22 04:22:50 +000053 return ++StaticLocalNumber;
54 }
55
Craig Toppercbce6e92014-03-11 06:22:39 +000056 unsigned getManglingNumber(const VarDecl *VD,
57 unsigned MSLocalManglingNumber) override {
David Majnemerf27217f2014-03-05 18:55:38 +000058 return MSLocalManglingNumber;
David Majnemer2206bf52014-03-05 08:57:59 +000059 }
Reid Klecknerd8110b62013-09-10 20:14:30 +000060
Craig Toppercbce6e92014-03-11 06:22:39 +000061 unsigned getManglingNumber(const TagDecl *TD,
62 unsigned MSLocalManglingNumber) override {
David Majnemerf27217f2014-03-05 18:55:38 +000063 return MSLocalManglingNumber;
Reid Klecknerd8110b62013-09-10 20:14:30 +000064 }
65};
66
Charles Davis53c59df2010-08-16 03:33:14 +000067class MicrosoftCXXABI : public CXXABI {
68 ASTContext &Context;
David Majnemere7a818f2015-03-06 18:53:55 +000069 llvm::SmallDenseMap<CXXRecordDecl *, CXXConstructorDecl *> RecordToCopyCtor;
David Majnemerdfa6d202015-03-11 18:36:39 +000070 llvm::SmallDenseMap<std::pair<const CXXConstructorDecl *, unsigned>, Expr *>
71 CtorToDefaultArgExpr;
David Majnemere7a818f2015-03-06 18:53:55 +000072
David Majnemer00350522015-08-31 18:48:39 +000073 llvm::SmallDenseMap<TagDecl *, DeclaratorDecl *>
74 UnnamedTagDeclToDeclaratorDecl;
75 llvm::SmallDenseMap<TagDecl *, TypedefNameDecl *>
76 UnnamedTagDeclToTypedefNameDecl;
77
Charles Davis53c59df2010-08-16 03:33:14 +000078public:
79 MicrosoftCXXABI(ASTContext &Ctx) : Context(Ctx) { }
80
Reid Kleckner3a52abf2013-03-28 20:02:56 +000081 std::pair<uint64_t, unsigned>
Craig Toppercbce6e92014-03-11 06:22:39 +000082 getMemberPointerWidthAndAlign(const MemberPointerType *MPT) const override;
Charles Davis31575f72010-10-29 03:25:11 +000083
Craig Toppercbce6e92014-03-11 06:22:39 +000084 CallingConv getDefaultMethodCallConv(bool isVariadic) const override {
Benjamin Kramer08db4612013-04-04 17:07:04 +000085 if (!isVariadic &&
86 Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
Charles Davis31575f72010-10-29 03:25:11 +000087 return CC_X86ThisCall;
Benjamin Kramer08db4612013-04-04 17:07:04 +000088 return CC_C;
Charles Davis31575f72010-10-29 03:25:11 +000089 }
Anders Carlsson60a62632010-11-25 01:51:53 +000090
Craig Toppercbce6e92014-03-11 06:22:39 +000091 bool isNearlyEmpty(const CXXRecordDecl *RD) const override {
David Majnemeree6c4092015-10-22 07:15:56 +000092 llvm_unreachable("unapplicable to the MS ABI");
David Majnemere7a818f2015-03-06 18:53:55 +000093 }
94
David Majnemerdfa6d202015-03-11 18:36:39 +000095 void addDefaultArgExprForConstructor(const CXXConstructorDecl *CD,
96 unsigned ParmIdx, Expr *DAE) override {
97 CtorToDefaultArgExpr[std::make_pair(CD, ParmIdx)] = DAE;
98 }
99
100 Expr *getDefaultArgExprForConstructor(const CXXConstructorDecl *CD,
101 unsigned ParmIdx) override {
102 return CtorToDefaultArgExpr[std::make_pair(CD, ParmIdx)];
103 }
104
David Majnemere7a818f2015-03-06 18:53:55 +0000105 const CXXConstructorDecl *
106 getCopyConstructorForExceptionObject(CXXRecordDecl *RD) override {
107 return RecordToCopyCtor[RD];
108 }
109
110 void
111 addCopyConstructorForExceptionObject(CXXRecordDecl *RD,
112 CXXConstructorDecl *CD) override {
113 assert(CD != nullptr);
114 assert(RecordToCopyCtor[RD] == nullptr || RecordToCopyCtor[RD] == CD);
115 RecordToCopyCtor[RD] = CD;
116 }
Reid Klecknerd8110b62013-09-10 20:14:30 +0000117
David Majnemer00350522015-08-31 18:48:39 +0000118 void addTypedefNameForUnnamedTagDecl(TagDecl *TD,
119 TypedefNameDecl *DD) override {
120 TD = TD->getCanonicalDecl();
121 DD = cast<TypedefNameDecl>(DD->getCanonicalDecl());
122 TypedefNameDecl *&I = UnnamedTagDeclToTypedefNameDecl[TD];
123 if (!I)
124 I = DD;
125 }
126
127 TypedefNameDecl *getTypedefNameForUnnamedTagDecl(const TagDecl *TD) override {
David Majnemer7f0674d2015-09-01 01:53:07 +0000128 return UnnamedTagDeclToTypedefNameDecl.lookup(
129 const_cast<TagDecl *>(TD->getCanonicalDecl()));
David Majnemer00350522015-08-31 18:48:39 +0000130 }
131
132 void addDeclaratorForUnnamedTagDecl(TagDecl *TD,
133 DeclaratorDecl *DD) override {
134 TD = TD->getCanonicalDecl();
135 DD = cast<DeclaratorDecl>(DD->getCanonicalDecl());
136 DeclaratorDecl *&I = UnnamedTagDeclToDeclaratorDecl[TD];
137 if (!I)
138 I = DD;
139 }
140
141 DeclaratorDecl *getDeclaratorForUnnamedTagDecl(const TagDecl *TD) override {
David Majnemer7f0674d2015-09-01 01:53:07 +0000142 return UnnamedTagDeclToDeclaratorDecl.lookup(
143 const_cast<TagDecl *>(TD->getCanonicalDecl()));
David Majnemer00350522015-08-31 18:48:39 +0000144 }
145
Craig Toppercbce6e92014-03-11 06:22:39 +0000146 MangleNumberingContext *createMangleNumberingContext() const override {
Reid Klecknerd8110b62013-09-10 20:14:30 +0000147 return new MicrosoftNumberingContext();
148 }
Charles Davis53c59df2010-08-16 03:33:14 +0000149};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000150}
Charles Davis53c59df2010-08-16 03:33:14 +0000151
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000152// getNumBases() seems to only give us the number of direct bases, and not the
153// total. This function tells us if we inherit from anybody that uses MI, or if
154// we have a non-primary base class, which uses the multiple inheritance model.
Benjamin Kramer08db4612013-04-04 17:07:04 +0000155static bool usesMultipleInheritanceModel(const CXXRecordDecl *RD) {
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000156 while (RD->getNumBases() > 0) {
157 if (RD->getNumBases() > 1)
158 return true;
159 assert(RD->getNumBases() == 1);
Benjamin Kramer08db4612013-04-04 17:07:04 +0000160 const CXXRecordDecl *Base =
161 RD->bases_begin()->getType()->getAsCXXRecordDecl();
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000162 if (RD->isPolymorphic() && !Base->isPolymorphic())
163 return true;
164 RD = Base;
165 }
166 return false;
167}
168
David Majnemer2c4e00a2014-01-29 22:07:36 +0000169MSInheritanceAttr::Spelling CXXRecordDecl::calculateInheritanceModel() const {
David Majnemer5ef4fe72014-06-13 06:43:46 +0000170 if (!hasDefinition() || isParsingBaseSpecifiers())
David Majnemer1cdd96d2014-01-17 09:01:00 +0000171 return MSInheritanceAttr::Keyword_unspecified_inheritance;
David Majnemer2c4e00a2014-01-29 22:07:36 +0000172 if (getNumVBases() > 0)
David Majnemer1cdd96d2014-01-17 09:01:00 +0000173 return MSInheritanceAttr::Keyword_virtual_inheritance;
David Majnemer2c4e00a2014-01-29 22:07:36 +0000174 if (usesMultipleInheritanceModel(this))
David Majnemer1cdd96d2014-01-17 09:01:00 +0000175 return MSInheritanceAttr::Keyword_multiple_inheritance;
176 return MSInheritanceAttr::Keyword_single_inheritance;
177}
178
179MSInheritanceAttr::Spelling
180CXXRecordDecl::getMSInheritanceModel() const {
181 MSInheritanceAttr *IA = getAttr<MSInheritanceAttr>();
182 assert(IA && "Expected MSInheritanceAttr on the CXXRecordDecl!");
David Majnemer2c4e00a2014-01-29 22:07:36 +0000183 return IA->getSemanticSpelling();
David Majnemer1cdd96d2014-01-17 09:01:00 +0000184}
185
Reid Klecknerc0dca6d2014-02-12 23:50:26 +0000186MSVtorDispAttr::Mode CXXRecordDecl::getMSVtorDispMode() const {
187 if (MSVtorDispAttr *VDA = getAttr<MSVtorDispAttr>())
188 return VDA->getVtorDispMode();
189 return MSVtorDispAttr::Mode(getASTContext().getLangOpts().VtorDispMode);
190}
191
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000192// Returns the number of pointer and integer slots used to represent a member
193// pointer in the MS C++ ABI.
194//
195// Member function pointers have the following general form; however, fields
196// are dropped as permitted (under the MSVC interpretation) by the inheritance
197// model of the actual class.
198//
199// struct {
200// // A pointer to the member function to call. If the member function is
201// // virtual, this will be a thunk that forwards to the appropriate vftable
202// // slot.
203// void *FunctionPointerOrVirtualThunk;
204//
Nico Weber9c39f832015-06-12 04:44:52 +0000205// // An offset to add to the address of the vbtable pointer after
206// // (possibly) selecting the virtual base but before resolving and calling
207// // the function.
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000208// // Only needed if the class has any virtual bases or bases at a non-zero
209// // offset.
210// int NonVirtualBaseAdjustment;
211//
Reid Kleckner96f8f932014-02-05 17:27:08 +0000212// // The offset of the vb-table pointer within the object. Only needed for
213// // incomplete types.
214// int VBPtrOffset;
215//
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000216// // An offset within the vb-table that selects the virtual base containing
217// // the member. Loading from this offset produces a new offset that is
218// // added to the address of the vb-table pointer to produce the base.
219// int VirtualBaseAdjustmentOffset;
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000220// };
Reid Kleckner2341ae32013-04-11 18:13:19 +0000221static std::pair<unsigned, unsigned>
222getMSMemberPointerSlots(const MemberPointerType *MPT) {
David Majnemer1cdd96d2014-01-17 09:01:00 +0000223 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
224 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
225 unsigned Ptrs = 0;
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000226 unsigned Ints = 0;
Reid Kleckner96f8f932014-02-05 17:27:08 +0000227 if (MPT->isMemberFunctionPointer())
228 Ptrs = 1;
229 else
230 Ints = 1;
231 if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(),
232 Inheritance))
233 Ints++;
234 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
235 Ints++;
236 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
237 Ints++;
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000238 return std::make_pair(Ptrs, Ints);
239}
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000240
Benjamin Kramer08db4612013-04-04 17:07:04 +0000241std::pair<uint64_t, unsigned> MicrosoftCXXABI::getMemberPointerWidthAndAlign(
242 const MemberPointerType *MPT) const {
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000243 // The nominal struct is laid out with pointers followed by ints and aligned
244 // to a pointer width if any are present and an int width otherwise.
David Majnemer37ea5782015-04-24 01:24:59 +0000245 const TargetInfo &Target = Context.getTargetInfo();
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000246 unsigned PtrSize = Target.getPointerWidth(0);
247 unsigned IntSize = Target.getIntWidth();
David Majnemer37ea5782015-04-24 01:24:59 +0000248
249 unsigned Ptrs, Ints;
250 std::tie(Ptrs, Ints) = getMSMemberPointerSlots(MPT);
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000251 uint64_t Width = Ptrs * PtrSize + Ints * IntSize;
Reid Klecknerbd63b332014-01-31 22:28:50 +0000252 unsigned Align;
253
254 // When MSVC does x86_32 record layout, it aligns aggregate member pointers to
255 // 8 bytes. However, __alignof usually returns 4 for data memptrs and 8 for
256 // function memptrs.
David Majnemer37ea5782015-04-24 01:24:59 +0000257 if (Ptrs + Ints > 1 && Target.getTriple().isArch32Bit())
258 Align = 64;
Reid Klecknerbd63b332014-01-31 22:28:50 +0000259 else if (Ptrs)
260 Align = Target.getPointerAlign(0);
261 else
262 Align = Target.getIntAlign();
263
David Majnemer37ea5782015-04-24 01:24:59 +0000264 if (Target.getTriple().isArch64Bit())
Rui Ueyama83aa9792016-01-14 21:00:27 +0000265 Width = llvm::alignTo(Width, Align);
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000266 return std::make_pair(Width, Align);
Charles Davis53c59df2010-08-16 03:33:14 +0000267}
268
269CXXABI *clang::CreateMicrosoftCXXABI(ASTContext &Ctx) {
270 return new MicrosoftCXXABI(Ctx);
271}
272