blob: 73324e40f3b1076f81396b8fe5d261da24fe64d0 [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;
70
David Majnemer00350522015-08-31 18:48:39 +000071 llvm::SmallDenseMap<TagDecl *, DeclaratorDecl *>
72 UnnamedTagDeclToDeclaratorDecl;
73 llvm::SmallDenseMap<TagDecl *, TypedefNameDecl *>
74 UnnamedTagDeclToTypedefNameDecl;
75
Charles Davis53c59df2010-08-16 03:33:14 +000076public:
77 MicrosoftCXXABI(ASTContext &Ctx) : Context(Ctx) { }
78
Reid Kleckner3a52abf2013-03-28 20:02:56 +000079 std::pair<uint64_t, unsigned>
Craig Toppercbce6e92014-03-11 06:22:39 +000080 getMemberPointerWidthAndAlign(const MemberPointerType *MPT) const override;
Charles Davis31575f72010-10-29 03:25:11 +000081
Craig Toppercbce6e92014-03-11 06:22:39 +000082 CallingConv getDefaultMethodCallConv(bool isVariadic) const override {
Benjamin Kramer08db4612013-04-04 17:07:04 +000083 if (!isVariadic &&
84 Context.getTargetInfo().getTriple().getArch() == llvm::Triple::x86)
Charles Davis31575f72010-10-29 03:25:11 +000085 return CC_X86ThisCall;
Benjamin Kramer08db4612013-04-04 17:07:04 +000086 return CC_C;
Charles Davis31575f72010-10-29 03:25:11 +000087 }
Anders Carlsson60a62632010-11-25 01:51:53 +000088
Craig Toppercbce6e92014-03-11 06:22:39 +000089 bool isNearlyEmpty(const CXXRecordDecl *RD) const override {
David Majnemeree6c4092015-10-22 07:15:56 +000090 llvm_unreachable("unapplicable to the MS ABI");
David Majnemere7a818f2015-03-06 18:53:55 +000091 }
92
93 const CXXConstructorDecl *
94 getCopyConstructorForExceptionObject(CXXRecordDecl *RD) override {
95 return RecordToCopyCtor[RD];
96 }
97
98 void
99 addCopyConstructorForExceptionObject(CXXRecordDecl *RD,
100 CXXConstructorDecl *CD) override {
101 assert(CD != nullptr);
102 assert(RecordToCopyCtor[RD] == nullptr || RecordToCopyCtor[RD] == CD);
103 RecordToCopyCtor[RD] = CD;
104 }
Reid Klecknerd8110b62013-09-10 20:14:30 +0000105
David Majnemer00350522015-08-31 18:48:39 +0000106 void addTypedefNameForUnnamedTagDecl(TagDecl *TD,
107 TypedefNameDecl *DD) override {
108 TD = TD->getCanonicalDecl();
109 DD = cast<TypedefNameDecl>(DD->getCanonicalDecl());
110 TypedefNameDecl *&I = UnnamedTagDeclToTypedefNameDecl[TD];
111 if (!I)
112 I = DD;
113 }
114
115 TypedefNameDecl *getTypedefNameForUnnamedTagDecl(const TagDecl *TD) override {
David Majnemer7f0674d2015-09-01 01:53:07 +0000116 return UnnamedTagDeclToTypedefNameDecl.lookup(
117 const_cast<TagDecl *>(TD->getCanonicalDecl()));
David Majnemer00350522015-08-31 18:48:39 +0000118 }
119
120 void addDeclaratorForUnnamedTagDecl(TagDecl *TD,
121 DeclaratorDecl *DD) override {
122 TD = TD->getCanonicalDecl();
123 DD = cast<DeclaratorDecl>(DD->getCanonicalDecl());
124 DeclaratorDecl *&I = UnnamedTagDeclToDeclaratorDecl[TD];
125 if (!I)
126 I = DD;
127 }
128
129 DeclaratorDecl *getDeclaratorForUnnamedTagDecl(const TagDecl *TD) override {
David Majnemer7f0674d2015-09-01 01:53:07 +0000130 return UnnamedTagDeclToDeclaratorDecl.lookup(
131 const_cast<TagDecl *>(TD->getCanonicalDecl()));
David Majnemer00350522015-08-31 18:48:39 +0000132 }
133
Justin Lebar20ebffc2016-10-10 16:26:19 +0000134 std::unique_ptr<MangleNumberingContext>
135 createMangleNumberingContext() const override {
136 return llvm::make_unique<MicrosoftNumberingContext>();
Reid Klecknerd8110b62013-09-10 20:14:30 +0000137 }
Charles Davis53c59df2010-08-16 03:33:14 +0000138};
Alexander Kornienkoab9db512015-06-22 23:07:51 +0000139}
Charles Davis53c59df2010-08-16 03:33:14 +0000140
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000141// getNumBases() seems to only give us the number of direct bases, and not the
142// total. This function tells us if we inherit from anybody that uses MI, or if
143// we have a non-primary base class, which uses the multiple inheritance model.
Benjamin Kramer08db4612013-04-04 17:07:04 +0000144static bool usesMultipleInheritanceModel(const CXXRecordDecl *RD) {
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000145 while (RD->getNumBases() > 0) {
146 if (RD->getNumBases() > 1)
147 return true;
148 assert(RD->getNumBases() == 1);
Benjamin Kramer08db4612013-04-04 17:07:04 +0000149 const CXXRecordDecl *Base =
150 RD->bases_begin()->getType()->getAsCXXRecordDecl();
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000151 if (RD->isPolymorphic() && !Base->isPolymorphic())
152 return true;
153 RD = Base;
154 }
155 return false;
156}
157
David Majnemer2c4e00a2014-01-29 22:07:36 +0000158MSInheritanceAttr::Spelling CXXRecordDecl::calculateInheritanceModel() const {
David Majnemer5ef4fe72014-06-13 06:43:46 +0000159 if (!hasDefinition() || isParsingBaseSpecifiers())
David Majnemer1cdd96d2014-01-17 09:01:00 +0000160 return MSInheritanceAttr::Keyword_unspecified_inheritance;
David Majnemer2c4e00a2014-01-29 22:07:36 +0000161 if (getNumVBases() > 0)
David Majnemer1cdd96d2014-01-17 09:01:00 +0000162 return MSInheritanceAttr::Keyword_virtual_inheritance;
David Majnemer2c4e00a2014-01-29 22:07:36 +0000163 if (usesMultipleInheritanceModel(this))
David Majnemer1cdd96d2014-01-17 09:01:00 +0000164 return MSInheritanceAttr::Keyword_multiple_inheritance;
165 return MSInheritanceAttr::Keyword_single_inheritance;
166}
167
168MSInheritanceAttr::Spelling
169CXXRecordDecl::getMSInheritanceModel() const {
170 MSInheritanceAttr *IA = getAttr<MSInheritanceAttr>();
171 assert(IA && "Expected MSInheritanceAttr on the CXXRecordDecl!");
David Majnemer2c4e00a2014-01-29 22:07:36 +0000172 return IA->getSemanticSpelling();
David Majnemer1cdd96d2014-01-17 09:01:00 +0000173}
174
Reid Klecknerc0dca6d2014-02-12 23:50:26 +0000175MSVtorDispAttr::Mode CXXRecordDecl::getMSVtorDispMode() const {
176 if (MSVtorDispAttr *VDA = getAttr<MSVtorDispAttr>())
177 return VDA->getVtorDispMode();
178 return MSVtorDispAttr::Mode(getASTContext().getLangOpts().VtorDispMode);
179}
180
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000181// Returns the number of pointer and integer slots used to represent a member
182// pointer in the MS C++ ABI.
183//
184// Member function pointers have the following general form; however, fields
185// are dropped as permitted (under the MSVC interpretation) by the inheritance
186// model of the actual class.
187//
188// struct {
189// // A pointer to the member function to call. If the member function is
190// // virtual, this will be a thunk that forwards to the appropriate vftable
191// // slot.
192// void *FunctionPointerOrVirtualThunk;
193//
Nico Weber9c39f832015-06-12 04:44:52 +0000194// // An offset to add to the address of the vbtable pointer after
195// // (possibly) selecting the virtual base but before resolving and calling
196// // the function.
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000197// // Only needed if the class has any virtual bases or bases at a non-zero
198// // offset.
199// int NonVirtualBaseAdjustment;
200//
Reid Kleckner96f8f932014-02-05 17:27:08 +0000201// // The offset of the vb-table pointer within the object. Only needed for
202// // incomplete types.
203// int VBPtrOffset;
204//
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000205// // An offset within the vb-table that selects the virtual base containing
206// // the member. Loading from this offset produces a new offset that is
207// // added to the address of the vb-table pointer to produce the base.
208// int VirtualBaseAdjustmentOffset;
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000209// };
Reid Kleckner2341ae32013-04-11 18:13:19 +0000210static std::pair<unsigned, unsigned>
211getMSMemberPointerSlots(const MemberPointerType *MPT) {
David Majnemer1cdd96d2014-01-17 09:01:00 +0000212 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
213 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
214 unsigned Ptrs = 0;
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000215 unsigned Ints = 0;
Reid Kleckner96f8f932014-02-05 17:27:08 +0000216 if (MPT->isMemberFunctionPointer())
217 Ptrs = 1;
218 else
219 Ints = 1;
220 if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(),
221 Inheritance))
222 Ints++;
223 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
224 Ints++;
225 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
226 Ints++;
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000227 return std::make_pair(Ptrs, Ints);
228}
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000229
Benjamin Kramer08db4612013-04-04 17:07:04 +0000230std::pair<uint64_t, unsigned> MicrosoftCXXABI::getMemberPointerWidthAndAlign(
231 const MemberPointerType *MPT) const {
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000232 // The nominal struct is laid out with pointers followed by ints and aligned
233 // to a pointer width if any are present and an int width otherwise.
David Majnemer37ea5782015-04-24 01:24:59 +0000234 const TargetInfo &Target = Context.getTargetInfo();
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000235 unsigned PtrSize = Target.getPointerWidth(0);
236 unsigned IntSize = Target.getIntWidth();
David Majnemer37ea5782015-04-24 01:24:59 +0000237
238 unsigned Ptrs, Ints;
239 std::tie(Ptrs, Ints) = getMSMemberPointerSlots(MPT);
Reid Klecknerbe377cd2013-04-02 16:23:57 +0000240 uint64_t Width = Ptrs * PtrSize + Ints * IntSize;
Reid Klecknerbd63b332014-01-31 22:28:50 +0000241 unsigned Align;
242
243 // When MSVC does x86_32 record layout, it aligns aggregate member pointers to
244 // 8 bytes. However, __alignof usually returns 4 for data memptrs and 8 for
245 // function memptrs.
David Majnemer37ea5782015-04-24 01:24:59 +0000246 if (Ptrs + Ints > 1 && Target.getTriple().isArch32Bit())
247 Align = 64;
Reid Klecknerbd63b332014-01-31 22:28:50 +0000248 else if (Ptrs)
249 Align = Target.getPointerAlign(0);
250 else
251 Align = Target.getIntAlign();
252
David Majnemer37ea5782015-04-24 01:24:59 +0000253 if (Target.getTriple().isArch64Bit())
Rui Ueyama83aa9792016-01-14 21:00:27 +0000254 Width = llvm::alignTo(Width, Align);
Reid Kleckner3a52abf2013-03-28 20:02:56 +0000255 return std::make_pair(Width, Align);
Charles Davis53c59df2010-08-16 03:33:14 +0000256}
257
258CXXABI *clang::CreateMicrosoftCXXABI(ASTContext &Ctx) {
259 return new MicrosoftCXXABI(Ctx);
260}
261