blob: 41b7574e34c26c3a6b1dd39fae7a8d891158d4d2 [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//
Chris Lattner57540c52011-04-15 05:22:18 +000010// This provides C++ code generation targeting the Microsoft Visual C++ ABI.
Charles Davis74ce8592010-06-09 23:25:41 +000011// 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"
Reid Kleckner7810af02013-06-19 15:20:38 +000018#include "CGVTables.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000019#include "CodeGenModule.h"
Charles Davis74ce8592010-06-09 23:25:41 +000020#include "clang/AST/Decl.h"
21#include "clang/AST/DeclCXX.h"
Timur Iskhodzhanovdf7e7fb2013-07-30 09:46:19 +000022#include "clang/AST/VTableBuilder.h"
David Majnemer611cdb92014-07-07 08:09:15 +000023#include "llvm/ADT/StringExtras.h"
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +000024#include "llvm/ADT/StringSet.h"
David Majnemer1162d252014-06-22 19:05:33 +000025#include "llvm/IR/CallSite.h"
Charles Davis74ce8592010-06-09 23:25:41 +000026
27using namespace clang;
28using namespace CodeGen;
29
30namespace {
31
Reid Klecknerb40a27d2014-01-03 00:14:35 +000032/// Holds all the vbtable globals for a given class.
33struct VBTableGlobals {
Reid Kleckner9c6e9e32014-02-27 19:40:09 +000034 const VPtrInfoVector *VBTables;
Reid Klecknerb40a27d2014-01-03 00:14:35 +000035 SmallVector<llvm::GlobalVariable *, 2> Globals;
36};
37
Charles Davis53c59df2010-08-16 03:33:14 +000038class MicrosoftCXXABI : public CGCXXABI {
Charles Davis74ce8592010-06-09 23:25:41 +000039public:
David Majnemer611cdb92014-07-07 08:09:15 +000040 MicrosoftCXXABI(CodeGenModule &CGM)
41 : CGCXXABI(CGM), BaseClassDescriptorType(nullptr),
42 ClassHierarchyDescriptorType(nullptr),
43 CompleteObjectLocatorType(nullptr) {}
John McCall5d865c322010-08-31 07:33:07 +000044
Craig Topper4f12f102014-03-12 06:41:41 +000045 bool HasThisReturn(GlobalDecl GD) const override;
Stephen Lin9dc6eef2013-06-30 20:40:16 +000046
Reid Kleckner40ca9132014-05-13 22:05:45 +000047 bool classifyReturnType(CGFunctionInfo &FI) const override;
Timur Iskhodzhanov8fe501d2013-04-17 12:54:10 +000048
Reid Klecknere39ee212014-05-03 00:33:28 +000049 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const override;
Timur Iskhodzhanov8fe501d2013-04-17 12:54:10 +000050
Reid Kleckner37abaca2014-05-09 22:46:15 +000051 bool isSRetParameterAfterThis() const override { return true; }
52
Craig Topper4f12f102014-03-12 06:41:41 +000053 StringRef GetPureVirtualCallName() override { return "_purecall"; }
David Blaikieeb7d5982012-10-16 22:56:05 +000054 // No known support for deleted functions in MSVC yet, so this choice is
55 // arbitrary.
Craig Topper4f12f102014-03-12 06:41:41 +000056 StringRef GetDeletedVirtualCallName() override { return "_purecall"; }
Joao Matos2ce88ef2012-07-17 17:10:11 +000057
Hans Wennborg905f8062014-05-24 20:18:32 +000058 bool isInlineInitializedStaticDataMemberLinkOnce() override { return true; }
Hans Wennborgfeedf852013-11-21 00:15:56 +000059
John McCall82fb8922012-09-25 10:10:39 +000060 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF,
61 llvm::Value *ptr,
Craig Topper4f12f102014-03-12 06:41:41 +000062 QualType type) override;
John McCall82fb8922012-09-25 10:10:39 +000063
David Majnemere2cb8d12014-07-07 06:20:47 +000064 llvm::GlobalVariable *getMSCompleteObjectLocator(const CXXRecordDecl *RD,
65 const VPtrInfo *Info);
66
67 llvm::Constant *getAddrOfRTTIDescriptor(QualType Ty) override;
68
David Majnemer1162d252014-06-22 19:05:33 +000069 bool shouldTypeidBeNullChecked(bool IsDeref, QualType SrcRecordTy) override;
70 void EmitBadTypeidCall(CodeGenFunction &CGF) override;
71 llvm::Value *EmitTypeid(CodeGenFunction &CGF, QualType SrcRecordTy,
72 llvm::Value *ThisPtr,
73 llvm::Type *StdTypeInfoPtrTy) override;
74
75 bool shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
76 QualType SrcRecordTy) override;
77
78 llvm::Value *EmitDynamicCastCall(CodeGenFunction &CGF, llvm::Value *Value,
79 QualType SrcRecordTy, QualType DestTy,
80 QualType DestRecordTy,
81 llvm::BasicBlock *CastEnd) override;
82
83 llvm::Value *EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
84 QualType SrcRecordTy,
85 QualType DestTy) override;
86
87 bool EmitBadCastCall(CodeGenFunction &CGF) override;
88
Craig Topper4f12f102014-03-12 06:41:41 +000089 llvm::Value *
90 GetVirtualBaseClassOffset(CodeGenFunction &CGF, llvm::Value *This,
91 const CXXRecordDecl *ClassDecl,
92 const CXXRecordDecl *BaseClassDecl) override;
Reid Klecknerd8cbeec2013-05-29 18:02:47 +000093
John McCall5d865c322010-08-31 07:33:07 +000094 void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
Craig Topper4f12f102014-03-12 06:41:41 +000095 CXXCtorType Type, CanQualType &ResTy,
96 SmallVectorImpl<CanQualType> &ArgTys) override;
John McCall5d865c322010-08-31 07:33:07 +000097
Craig Topper4f12f102014-03-12 06:41:41 +000098 llvm::BasicBlock *
99 EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
100 const CXXRecordDecl *RD) override;
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000101
Timur Iskhodzhanovb6487322013-10-09 18:16:58 +0000102 void initializeHiddenVirtualInheritanceMembers(CodeGenFunction &CGF,
Craig Topper4f12f102014-03-12 06:41:41 +0000103 const CXXRecordDecl *RD) override;
Timur Iskhodzhanovb6487322013-10-09 18:16:58 +0000104
Craig Topper4f12f102014-03-12 06:41:41 +0000105 void EmitCXXConstructors(const CXXConstructorDecl *D) override;
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +0000106
Reid Klecknere7de47e2013-07-22 13:51:44 +0000107 // Background on MSVC destructors
108 // ==============================
109 //
110 // Both Itanium and MSVC ABIs have destructor variants. The variant names
111 // roughly correspond in the following way:
112 // Itanium Microsoft
113 // Base -> no name, just ~Class
114 // Complete -> vbase destructor
115 // Deleting -> scalar deleting destructor
116 // vector deleting destructor
117 //
118 // The base and complete destructors are the same as in Itanium, although the
119 // complete destructor does not accept a VTT parameter when there are virtual
120 // bases. A separate mechanism involving vtordisps is used to ensure that
121 // virtual methods of destroyed subobjects are not called.
122 //
123 // The deleting destructors accept an i32 bitfield as a second parameter. Bit
124 // 1 indicates if the memory should be deleted. Bit 2 indicates if the this
125 // pointer points to an array. The scalar deleting destructor assumes that
126 // bit 2 is zero, and therefore does not contain a loop.
127 //
128 // For virtual destructors, only one entry is reserved in the vftable, and it
129 // always points to the vector deleting destructor. The vector deleting
130 // destructor is the most general, so it can be used to destroy objects in
131 // place, delete single heap objects, or delete arrays.
132 //
133 // A TU defining a non-inline destructor is only guaranteed to emit a base
134 // destructor, and all of the other variants are emitted on an as-needed basis
135 // in COMDATs. Because a non-base destructor can be emitted in a TU that
136 // lacks a definition for the destructor, non-base destructors must always
137 // delegate to or alias the base destructor.
138
139 void BuildDestructorSignature(const CXXDestructorDecl *Dtor,
John McCall5d865c322010-08-31 07:33:07 +0000140 CXXDtorType Type,
141 CanQualType &ResTy,
Craig Topper4f12f102014-03-12 06:41:41 +0000142 SmallVectorImpl<CanQualType> &ArgTys) override;
John McCall5d865c322010-08-31 07:33:07 +0000143
Reid Klecknere7de47e2013-07-22 13:51:44 +0000144 /// Non-base dtors should be emitted as delegating thunks in this ABI.
145 bool useThunkForDtorVariant(const CXXDestructorDecl *Dtor,
Craig Topper4f12f102014-03-12 06:41:41 +0000146 CXXDtorType DT) const override {
Reid Klecknere7de47e2013-07-22 13:51:44 +0000147 return DT != Dtor_Base;
148 }
149
Craig Topper4f12f102014-03-12 06:41:41 +0000150 void EmitCXXDestructors(const CXXDestructorDecl *D) override;
Reid Klecknere7de47e2013-07-22 13:51:44 +0000151
Craig Topper4f12f102014-03-12 06:41:41 +0000152 const CXXRecordDecl *
153 getThisArgumentTypeForMethod(const CXXMethodDecl *MD) override {
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000154 MD = MD->getCanonicalDecl();
155 if (MD->isVirtual() && !isa<CXXDestructorDecl>(MD)) {
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000156 MicrosoftVTableContext::MethodVFTableLocation ML =
157 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(MD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000158 // The vbases might be ordered differently in the final overrider object
159 // and the complete object, so the "this" argument may sometimes point to
160 // memory that has no particular type (e.g. past the complete object).
161 // In this case, we just use a generic pointer type.
162 // FIXME: might want to have a more precise type in the non-virtual
163 // multiple inheritance case.
Timur Iskhodzhanov9e7f5052013-11-07 13:34:02 +0000164 if (ML.VBase || !ML.VFPtrOffset.isZero())
Craig Topper8a13c412014-05-21 05:09:00 +0000165 return nullptr;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000166 }
167 return MD->getParent();
168 }
169
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +0000170 llvm::Value *
171 adjustThisArgumentForVirtualFunctionCall(CodeGenFunction &CGF, GlobalDecl GD,
172 llvm::Value *This,
173 bool VirtualCall) override;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000174
Reid Kleckner89077a12013-12-17 19:46:40 +0000175 void addImplicitStructorParams(CodeGenFunction &CGF, QualType &ResTy,
Craig Topper4f12f102014-03-12 06:41:41 +0000176 FunctionArgList &Params) override;
John McCall5d865c322010-08-31 07:33:07 +0000177
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000178 llvm::Value *adjustThisParameterInVirtualFunctionPrologue(
Craig Topper4f12f102014-03-12 06:41:41 +0000179 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) override;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000180
Craig Topper4f12f102014-03-12 06:41:41 +0000181 void EmitInstanceFunctionProlog(CodeGenFunction &CGF) override;
John McCall29036752011-01-27 02:46:02 +0000182
Reid Kleckner89077a12013-12-17 19:46:40 +0000183 unsigned addImplicitConstructorArgs(CodeGenFunction &CGF,
184 const CXXConstructorDecl *D,
185 CXXCtorType Type, bool ForVirtualBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000186 bool Delegating,
187 CallArgList &Args) override;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000188
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000189 void EmitDestructorCall(CodeGenFunction &CGF, const CXXDestructorDecl *DD,
190 CXXDtorType Type, bool ForVirtualBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000191 bool Delegating, llvm::Value *This) override;
Reid Kleckner6fe771a2013-12-13 00:53:54 +0000192
Craig Topper4f12f102014-03-12 06:41:41 +0000193 void emitVTableDefinitions(CodeGenVTables &CGVT,
194 const CXXRecordDecl *RD) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000195
196 llvm::Value *getVTableAddressPointInStructor(
197 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass,
198 BaseSubobject Base, const CXXRecordDecl *NearestVBase,
Craig Topper4f12f102014-03-12 06:41:41 +0000199 bool &NeedsVirtualOffset) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000200
201 llvm::Constant *
202 getVTableAddressPointForConstExpr(BaseSubobject Base,
Craig Topper4f12f102014-03-12 06:41:41 +0000203 const CXXRecordDecl *VTableClass) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000204
205 llvm::GlobalVariable *getAddrOfVTable(const CXXRecordDecl *RD,
Craig Topper4f12f102014-03-12 06:41:41 +0000206 CharUnits VPtrOffset) override;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000207
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000208 llvm::Value *getVirtualFunctionPointer(CodeGenFunction &CGF, GlobalDecl GD,
Craig Topper4f12f102014-03-12 06:41:41 +0000209 llvm::Value *This,
210 llvm::Type *Ty) override;
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000211
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000212 void EmitVirtualDestructorCall(CodeGenFunction &CGF,
213 const CXXDestructorDecl *Dtor,
214 CXXDtorType DtorType, SourceLocation CallLoc,
Craig Topper4f12f102014-03-12 06:41:41 +0000215 llvm::Value *This) override;
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +0000216
Timur Iskhodzhanovad9d3b82013-10-09 09:23:58 +0000217 void adjustCallArgsForDestructorThunk(CodeGenFunction &CGF, GlobalDecl GD,
Craig Topper4f12f102014-03-12 06:41:41 +0000218 CallArgList &CallArgs) override {
Timur Iskhodzhanovad9d3b82013-10-09 09:23:58 +0000219 assert(GD.getDtorType() == Dtor_Deleting &&
220 "Only deleting destructor thunks are available in this ABI");
221 CallArgs.add(RValue::get(getStructorImplicitParamValue(CGF)),
222 CGM.getContext().IntTy);
223 }
224
Craig Topper4f12f102014-03-12 06:41:41 +0000225 void emitVirtualInheritanceTables(const CXXRecordDecl *RD) override;
Reid Kleckner7810af02013-06-19 15:20:38 +0000226
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000227 llvm::GlobalVariable *
Reid Kleckner9c6e9e32014-02-27 19:40:09 +0000228 getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD,
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000229 llvm::GlobalVariable::LinkageTypes Linkage);
230
Reid Kleckner9c6e9e32014-02-27 19:40:09 +0000231 void emitVBTableDefinition(const VPtrInfo &VBT, const CXXRecordDecl *RD,
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000232 llvm::GlobalVariable *GV) const;
233
Hans Wennborgc94391d2014-06-06 20:04:01 +0000234 void setThunkLinkage(llvm::Function *Thunk, bool ForVTable,
235 GlobalDecl GD, bool ReturnAdjustment) override {
Hans Wennborg853ae942014-05-30 16:59:42 +0000236 // Never dllimport/dllexport thunks.
237 Thunk->setDLLStorageClass(llvm::GlobalValue::DefaultStorageClass);
Hans Wennborgc94391d2014-06-06 20:04:01 +0000238
239 GVALinkage Linkage =
240 getContext().GetGVALinkageForFunction(cast<FunctionDecl>(GD.getDecl()));
241
242 if (Linkage == GVA_Internal)
243 Thunk->setLinkage(llvm::GlobalValue::InternalLinkage);
244 else if (ReturnAdjustment)
245 Thunk->setLinkage(llvm::GlobalValue::WeakODRLinkage);
246 else
247 Thunk->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
Timur Iskhodzhanovad9d3b82013-10-09 09:23:58 +0000248 }
249
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000250 llvm::Value *performThisAdjustment(CodeGenFunction &CGF, llvm::Value *This,
Craig Topper4f12f102014-03-12 06:41:41 +0000251 const ThisAdjustment &TA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000252
253 llvm::Value *performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
Craig Topper4f12f102014-03-12 06:41:41 +0000254 const ReturnAdjustment &RA) override;
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000255
John McCallc84ed6a2012-05-01 06:13:13 +0000256 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
257 llvm::GlobalVariable *DeclPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000258 bool PerformInit) override;
John McCallc84ed6a2012-05-01 06:13:13 +0000259
John McCall29036752011-01-27 02:46:02 +0000260 // ==== Notes on array cookies =========
261 //
262 // MSVC seems to only use cookies when the class has a destructor; a
263 // two-argument usual array deallocation function isn't sufficient.
264 //
265 // For example, this code prints "100" and "1":
266 // struct A {
267 // char x;
268 // void *operator new[](size_t sz) {
269 // printf("%u\n", sz);
270 // return malloc(sz);
271 // }
272 // void operator delete[](void *p, size_t sz) {
273 // printf("%u\n", sz);
274 // free(p);
275 // }
276 // };
277 // int main() {
278 // A *p = new A[100];
279 // delete[] p;
280 // }
281 // Whereas it prints "104" and "104" if you give A a destructor.
John McCallb91cd662012-05-01 05:23:51 +0000282
Craig Topper4f12f102014-03-12 06:41:41 +0000283 bool requiresArrayCookie(const CXXDeleteExpr *expr,
284 QualType elementType) override;
285 bool requiresArrayCookie(const CXXNewExpr *expr) override;
286 CharUnits getArrayCookieSizeImpl(QualType type) override;
John McCallb91cd662012-05-01 05:23:51 +0000287 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
288 llvm::Value *NewPtr,
289 llvm::Value *NumElements,
290 const CXXNewExpr *expr,
Craig Topper4f12f102014-03-12 06:41:41 +0000291 QualType ElementType) override;
John McCallb91cd662012-05-01 05:23:51 +0000292 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
293 llvm::Value *allocPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000294 CharUnits cookieSize) override;
Reid Kleckner407e8b62013-03-22 19:02:54 +0000295
David Majnemer611cdb92014-07-07 08:09:15 +0000296 friend struct MSRTTIBuilder;
297
298 bool isImageRelative() const {
299 return CGM.getTarget().getPointerWidth(/*AddressSpace=*/0) == 64;
300 }
301
302 // 5 routines for constructing the llvm types for MS RTTI structs.
303 llvm::StructType *getTypeDescriptorType(StringRef TypeInfoString) {
304 llvm::SmallString<32> TDTypeName("rtti.TypeDescriptor");
305 TDTypeName += llvm::utostr(TypeInfoString.size());
306 llvm::StructType *&TypeDescriptorType =
307 TypeDescriptorTypeMap[TypeInfoString.size()];
308 if (TypeDescriptorType)
309 return TypeDescriptorType;
310 llvm::Type *FieldTypes[] = {
311 CGM.Int8PtrPtrTy,
312 CGM.Int8PtrTy,
313 llvm::ArrayType::get(CGM.Int8Ty, TypeInfoString.size() + 1)};
314 TypeDescriptorType =
315 llvm::StructType::create(CGM.getLLVMContext(), FieldTypes, TDTypeName);
316 return TypeDescriptorType;
317 }
318
319 llvm::Type *getImageRelativeType(llvm::Type *PtrType) {
320 if (!isImageRelative())
321 return PtrType;
322 return CGM.IntTy;
323 }
324
325 llvm::StructType *getBaseClassDescriptorType() {
326 if (BaseClassDescriptorType)
327 return BaseClassDescriptorType;
328 llvm::Type *FieldTypes[] = {
329 getImageRelativeType(CGM.Int8PtrTy),
330 CGM.IntTy,
331 CGM.IntTy,
332 CGM.IntTy,
333 CGM.IntTy,
334 CGM.IntTy,
335 getImageRelativeType(getClassHierarchyDescriptorType()->getPointerTo()),
336 };
337 BaseClassDescriptorType = llvm::StructType::create(
338 CGM.getLLVMContext(), FieldTypes, "rtti.BaseClassDescriptor");
339 return BaseClassDescriptorType;
340 }
341
342 llvm::StructType *getClassHierarchyDescriptorType() {
343 if (ClassHierarchyDescriptorType)
344 return ClassHierarchyDescriptorType;
345 // Forward-declare RTTIClassHierarchyDescriptor to break a cycle.
346 ClassHierarchyDescriptorType = llvm::StructType::create(
347 CGM.getLLVMContext(), "rtti.ClassHierarchyDescriptor");
348 llvm::Type *FieldTypes[] = {
349 CGM.IntTy,
350 CGM.IntTy,
351 CGM.IntTy,
352 getImageRelativeType(
353 getBaseClassDescriptorType()->getPointerTo()->getPointerTo()),
354 };
355 ClassHierarchyDescriptorType->setBody(FieldTypes);
356 return ClassHierarchyDescriptorType;
357 }
358
359 llvm::StructType *getCompleteObjectLocatorType() {
360 if (CompleteObjectLocatorType)
361 return CompleteObjectLocatorType;
362 CompleteObjectLocatorType = llvm::StructType::create(
363 CGM.getLLVMContext(), "rtti.CompleteObjectLocator");
364 llvm::Type *FieldTypes[] = {
365 CGM.IntTy,
366 CGM.IntTy,
367 CGM.IntTy,
368 getImageRelativeType(CGM.Int8PtrTy),
369 getImageRelativeType(getClassHierarchyDescriptorType()->getPointerTo()),
370 getImageRelativeType(CompleteObjectLocatorType),
371 };
372 llvm::ArrayRef<llvm::Type *> FieldTypesRef(FieldTypes);
373 if (!isImageRelative())
374 FieldTypesRef = FieldTypesRef.drop_back();
375 CompleteObjectLocatorType->setBody(FieldTypesRef);
376 return CompleteObjectLocatorType;
377 }
378
379 llvm::GlobalVariable *getImageBase() {
380 StringRef Name = "__ImageBase";
381 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(Name))
382 return GV;
383
384 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8Ty,
385 /*isConstant=*/true,
386 llvm::GlobalValue::ExternalLinkage,
387 /*Initializer=*/nullptr, Name);
388 }
389
390 llvm::Constant *getImageRelativeConstant(llvm::Constant *PtrVal) {
391 if (!isImageRelative())
392 return PtrVal;
393
394 llvm::Constant *ImageBaseAsInt =
395 llvm::ConstantExpr::getPtrToInt(getImageBase(), CGM.IntPtrTy);
396 llvm::Constant *PtrValAsInt =
397 llvm::ConstantExpr::getPtrToInt(PtrVal, CGM.IntPtrTy);
398 llvm::Constant *Diff =
399 llvm::ConstantExpr::getSub(PtrValAsInt, ImageBaseAsInt,
400 /*HasNUW=*/true, /*HasNSW=*/true);
401 return llvm::ConstantExpr::getTrunc(Diff, CGM.IntTy);
402 }
403
Reid Kleckner407e8b62013-03-22 19:02:54 +0000404private:
Timur Iskhodzhanov67455222013-10-03 06:26:13 +0000405 MicrosoftMangleContext &getMangleContext() {
406 return cast<MicrosoftMangleContext>(CodeGen::CGCXXABI::getMangleContext());
407 }
408
Reid Kleckner2341ae32013-04-11 18:13:19 +0000409 llvm::Constant *getZeroInt() {
410 return llvm::ConstantInt::get(CGM.IntTy, 0);
Reid Kleckner407e8b62013-03-22 19:02:54 +0000411 }
412
Reid Kleckner2341ae32013-04-11 18:13:19 +0000413 llvm::Constant *getAllOnesInt() {
414 return llvm::Constant::getAllOnesValue(CGM.IntTy);
Reid Kleckner407e8b62013-03-22 19:02:54 +0000415 }
416
Reid Kleckner452abac2013-05-09 21:01:17 +0000417 llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) {
418 return C ? C : getZeroInt();
419 }
420
421 llvm::Value *getValueOrZeroInt(llvm::Value *C) {
422 return C ? C : getZeroInt();
423 }
424
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +0000425 CharUnits getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD);
426
Reid Kleckner2341ae32013-04-11 18:13:19 +0000427 void
428 GetNullMemberPointerFields(const MemberPointerType *MPT,
429 llvm::SmallVectorImpl<llvm::Constant *> &fields);
430
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000431 /// \brief Shared code for virtual base adjustment. Returns the offset from
432 /// the vbptr to the virtual base. Optionally returns the address of the
433 /// vbptr itself.
434 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
435 llvm::Value *Base,
436 llvm::Value *VBPtrOffset,
437 llvm::Value *VBTableOffset,
Craig Topper8a13c412014-05-21 05:09:00 +0000438 llvm::Value **VBPtr = nullptr);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000439
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000440 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
441 llvm::Value *Base,
442 int32_t VBPtrOffset,
443 int32_t VBTableOffset,
Craig Topper8a13c412014-05-21 05:09:00 +0000444 llvm::Value **VBPtr = nullptr) {
Timur Iskhodzhanov02014322013-10-30 11:55:43 +0000445 llvm::Value *VBPOffset = llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset),
446 *VBTOffset = llvm::ConstantInt::get(CGM.IntTy, VBTableOffset);
447 return GetVBaseOffsetFromVBPtr(CGF, Base, VBPOffset, VBTOffset, VBPtr);
448 }
449
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000450 /// \brief Performs a full virtual base adjustment. Used to dereference
451 /// pointers to members of virtual bases.
David Majnemer2b0d66d2014-02-20 23:22:07 +0000452 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const Expr *E,
453 const CXXRecordDecl *RD, llvm::Value *Base,
Reid Kleckner2341ae32013-04-11 18:13:19 +0000454 llvm::Value *VirtualBaseAdjustmentOffset,
455 llvm::Value *VBPtrOffset /* optional */);
456
Reid Kleckner7d0efb52013-05-03 01:15:11 +0000457 /// \brief Emits a full member pointer with the fields common to data and
458 /// function member pointers.
459 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
460 bool IsMemberFunction,
Reid Kleckner452abac2013-05-09 21:01:17 +0000461 const CXXRecordDecl *RD,
462 CharUnits NonVirtualBaseAdjustment);
463
464 llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD,
465 const CXXMethodDecl *MD,
466 CharUnits NonVirtualBaseAdjustment);
467
468 bool MemberPointerConstantIsNull(const MemberPointerType *MPT,
469 llvm::Constant *MP);
Reid Kleckner7d0efb52013-05-03 01:15:11 +0000470
Reid Kleckner7810af02013-06-19 15:20:38 +0000471 /// \brief - Initialize all vbptrs of 'this' with RD as the complete type.
472 void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD);
473
474 /// \brief Caching wrapper around VBTableBuilder::enumerateVBTables().
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000475 const VBTableGlobals &enumerateVBTables(const CXXRecordDecl *RD);
Reid Kleckner7810af02013-06-19 15:20:38 +0000476
Hans Wennborg88497d62013-11-15 17:24:45 +0000477 /// \brief Generate a thunk for calling a virtual member function MD.
Reid Klecknere4a52202014-02-21 02:27:32 +0000478 llvm::Function *EmitVirtualMemPtrThunk(
479 const CXXMethodDecl *MD,
480 const MicrosoftVTableContext::MethodVFTableLocation &ML);
Hans Wennborg88497d62013-11-15 17:24:45 +0000481
Reid Kleckner407e8b62013-03-22 19:02:54 +0000482public:
Craig Topper4f12f102014-03-12 06:41:41 +0000483 llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT) override;
Reid Kleckner2341ae32013-04-11 18:13:19 +0000484
Craig Topper4f12f102014-03-12 06:41:41 +0000485 bool isZeroInitializable(const MemberPointerType *MPT) override;
Reid Kleckner2341ae32013-04-11 18:13:19 +0000486
Craig Topper4f12f102014-03-12 06:41:41 +0000487 llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT) override;
Reid Kleckner407e8b62013-03-22 19:02:54 +0000488
Craig Topper4f12f102014-03-12 06:41:41 +0000489 llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
490 CharUnits offset) override;
491 llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD) override;
492 llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT) override;
Reid Kleckner407e8b62013-03-22 19:02:54 +0000493
Craig Topper4f12f102014-03-12 06:41:41 +0000494 llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
495 llvm::Value *L,
496 llvm::Value *R,
497 const MemberPointerType *MPT,
498 bool Inequality) override;
Reid Kleckner700c3ee2013-04-30 20:15:14 +0000499
Craig Topper4f12f102014-03-12 06:41:41 +0000500 llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
501 llvm::Value *MemPtr,
502 const MemberPointerType *MPT) override;
Reid Kleckner407e8b62013-03-22 19:02:54 +0000503
Craig Topper4f12f102014-03-12 06:41:41 +0000504 llvm::Value *
David Majnemer2b0d66d2014-02-20 23:22:07 +0000505 EmitMemberDataPointerAddress(CodeGenFunction &CGF, const Expr *E,
506 llvm::Value *Base, llvm::Value *MemPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000507 const MemberPointerType *MPT) override;
Reid Kleckner407e8b62013-03-22 19:02:54 +0000508
Craig Topper4f12f102014-03-12 06:41:41 +0000509 llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
510 const CastExpr *E,
511 llvm::Value *Src) override;
Reid Kleckner452abac2013-05-09 21:01:17 +0000512
Craig Topper4f12f102014-03-12 06:41:41 +0000513 llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
514 llvm::Constant *Src) override;
Reid Kleckner452abac2013-05-09 21:01:17 +0000515
Craig Topper4f12f102014-03-12 06:41:41 +0000516 llvm::Value *
David Majnemer2b0d66d2014-02-20 23:22:07 +0000517 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF, const Expr *E,
518 llvm::Value *&This, llvm::Value *MemPtr,
Craig Topper4f12f102014-03-12 06:41:41 +0000519 const MemberPointerType *MPT) override;
Reid Kleckner2341ae32013-04-11 18:13:19 +0000520
Reid Kleckner7810af02013-06-19 15:20:38 +0000521private:
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000522 typedef std::pair<const CXXRecordDecl *, CharUnits> VFTableIdTy;
David Majnemerd905da42014-07-01 20:30:31 +0000523 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalVariable *> VTablesMapTy;
524 typedef llvm::DenseMap<VFTableIdTy, llvm::GlobalValue *> VFTablesMapTy;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000525 /// \brief All the vftables that have been referenced.
526 VFTablesMapTy VFTablesMap;
David Majnemerd905da42014-07-01 20:30:31 +0000527 VTablesMapTy VTablesMap;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +0000528
529 /// \brief This set holds the record decls we've deferred vtable emission for.
530 llvm::SmallPtrSet<const CXXRecordDecl *, 4> DeferredVFTables;
531
532
533 /// \brief All the vbtables which have been referenced.
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000534 llvm::DenseMap<const CXXRecordDecl *, VBTableGlobals> VBTablesMap;
Reid Klecknerd8110b62013-09-10 20:14:30 +0000535
536 /// Info on the global variable used to guard initialization of static locals.
537 /// The BitIndex field is only used for externally invisible declarations.
538 struct GuardInfo {
Craig Topper8a13c412014-05-21 05:09:00 +0000539 GuardInfo() : Guard(nullptr), BitIndex(0) {}
Reid Klecknerd8110b62013-09-10 20:14:30 +0000540 llvm::GlobalVariable *Guard;
541 unsigned BitIndex;
542 };
543
544 /// Map from DeclContext to the current guard variable. We assume that the
545 /// AST is visited in source code order.
546 llvm::DenseMap<const DeclContext *, GuardInfo> GuardVariableMap;
David Majnemer611cdb92014-07-07 08:09:15 +0000547
548 llvm::DenseMap<size_t, llvm::StructType *> TypeDescriptorTypeMap;
549 llvm::StructType *BaseClassDescriptorType;
550 llvm::StructType *ClassHierarchyDescriptorType;
551 llvm::StructType *CompleteObjectLocatorType;
Charles Davis74ce8592010-06-09 23:25:41 +0000552};
553
554}
555
Reid Klecknere39ee212014-05-03 00:33:28 +0000556CGCXXABI::RecordArgABI
557MicrosoftCXXABI::getRecordArgABI(const CXXRecordDecl *RD) const {
558 switch (CGM.getTarget().getTriple().getArch()) {
559 default:
560 // FIXME: Implement for other architectures.
561 return RAA_Default;
562
563 case llvm::Triple::x86:
Reid Klecknercf87e102014-05-14 16:02:09 +0000564 // All record arguments are passed in memory on x86. Decide whether to
565 // construct the object directly in argument memory, or to construct the
566 // argument elsewhere and copy the bytes during the call.
567
568 // If C++ prohibits us from making a copy, construct the arguments directly
569 // into argument memory.
570 if (!canCopyArgument(RD))
Reid Klecknere39ee212014-05-03 00:33:28 +0000571 return RAA_DirectInMemory;
Reid Klecknercf87e102014-05-14 16:02:09 +0000572
573 // Otherwise, construct the argument into a temporary and copy the bytes
574 // into the outgoing argument memory.
Reid Klecknere39ee212014-05-03 00:33:28 +0000575 return RAA_Default;
576
577 case llvm::Triple::x86_64:
578 // Win64 passes objects with non-trivial copy ctors indirectly.
579 if (RD->hasNonTrivialCopyConstructor())
580 return RAA_Indirect;
Reid Klecknercf87e102014-05-14 16:02:09 +0000581
Reid Klecknere39ee212014-05-03 00:33:28 +0000582 // Win64 passes objects larger than 8 bytes indirectly.
583 if (getContext().getTypeSize(RD->getTypeForDecl()) > 64)
584 return RAA_Indirect;
Reid Klecknercf87e102014-05-14 16:02:09 +0000585
586 // We have a trivial copy constructor or no copy constructors, but we have
587 // to make sure it isn't deleted.
588 bool CopyDeleted = false;
589 for (const CXXConstructorDecl *CD : RD->ctors()) {
590 if (CD->isCopyConstructor()) {
591 assert(CD->isTrivial());
592 // We had at least one undeleted trivial copy ctor. Return directly.
593 if (!CD->isDeleted())
594 return RAA_Default;
595 CopyDeleted = true;
596 }
597 }
598
599 // The trivial copy constructor was deleted. Return indirectly.
600 if (CopyDeleted)
601 return RAA_Indirect;
602
603 // There were no copy ctors. Return in RAX.
Reid Klecknere39ee212014-05-03 00:33:28 +0000604 return RAA_Default;
605 }
606
607 llvm_unreachable("invalid enum");
608}
609
John McCall82fb8922012-09-25 10:10:39 +0000610llvm::Value *MicrosoftCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
611 llvm::Value *ptr,
612 QualType type) {
613 // FIXME: implement
614 return ptr;
615}
616
David Majnemer1162d252014-06-22 19:05:33 +0000617/// \brief Gets the offset to the virtual base that contains the vfptr for
618/// MS-ABI polymorphic types.
619static llvm::Value *getPolymorphicOffset(CodeGenFunction &CGF,
620 const CXXRecordDecl *RD,
621 llvm::Value *Value) {
622 const ASTContext &Context = RD->getASTContext();
623 for (const CXXBaseSpecifier &Base : RD->vbases())
624 if (Context.getASTRecordLayout(Base.getType()->getAsCXXRecordDecl())
625 .hasExtendableVFPtr())
626 return CGF.CGM.getCXXABI().GetVirtualBaseClassOffset(
627 CGF, Value, RD, Base.getType()->getAsCXXRecordDecl());
628 llvm_unreachable("One of our vbases should be polymorphic.");
629}
630
631static std::pair<llvm::Value *, llvm::Value *>
632performBaseAdjustment(CodeGenFunction &CGF, llvm::Value *Value,
633 QualType SrcRecordTy) {
634 Value = CGF.Builder.CreateBitCast(Value, CGF.Int8PtrTy);
635 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
636
637 if (CGF.getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr())
638 return std::make_pair(Value, llvm::ConstantInt::get(CGF.Int32Ty, 0));
639
640 // Perform a base adjustment.
641 llvm::Value *Offset = getPolymorphicOffset(CGF, SrcDecl, Value);
642 Value = CGF.Builder.CreateInBoundsGEP(Value, Offset);
643 Offset = CGF.Builder.CreateTrunc(Offset, CGF.Int32Ty);
644 return std::make_pair(Value, Offset);
645}
646
647bool MicrosoftCXXABI::shouldTypeidBeNullChecked(bool IsDeref,
648 QualType SrcRecordTy) {
649 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
650 return IsDeref &&
651 !CGM.getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr();
652}
653
654static llvm::CallSite emitRTtypeidCall(CodeGenFunction &CGF,
655 llvm::Value *Argument) {
656 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
657 llvm::FunctionType *FTy =
658 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false);
659 llvm::Value *Args[] = {Argument};
660 llvm::Constant *Fn = CGF.CGM.CreateRuntimeFunction(FTy, "__RTtypeid");
661 return CGF.EmitRuntimeCallOrInvoke(Fn, Args);
662}
663
664void MicrosoftCXXABI::EmitBadTypeidCall(CodeGenFunction &CGF) {
665 llvm::CallSite Call =
666 emitRTtypeidCall(CGF, llvm::Constant::getNullValue(CGM.VoidPtrTy));
667 Call.setDoesNotReturn();
668 CGF.Builder.CreateUnreachable();
669}
670
671llvm::Value *MicrosoftCXXABI::EmitTypeid(CodeGenFunction &CGF,
672 QualType SrcRecordTy,
673 llvm::Value *ThisPtr,
674 llvm::Type *StdTypeInfoPtrTy) {
675 llvm::Value *Offset;
676 std::tie(ThisPtr, Offset) = performBaseAdjustment(CGF, ThisPtr, SrcRecordTy);
677 return CGF.Builder.CreateBitCast(
678 emitRTtypeidCall(CGF, ThisPtr).getInstruction(), StdTypeInfoPtrTy);
679}
680
681bool MicrosoftCXXABI::shouldDynamicCastCallBeNullChecked(bool SrcIsPtr,
682 QualType SrcRecordTy) {
683 const CXXRecordDecl *SrcDecl = SrcRecordTy->getAsCXXRecordDecl();
684 return SrcIsPtr &&
685 !CGM.getContext().getASTRecordLayout(SrcDecl).hasExtendableVFPtr();
686}
687
688llvm::Value *MicrosoftCXXABI::EmitDynamicCastCall(
689 CodeGenFunction &CGF, llvm::Value *Value, QualType SrcRecordTy,
690 QualType DestTy, QualType DestRecordTy, llvm::BasicBlock *CastEnd) {
691 llvm::Type *DestLTy = CGF.ConvertType(DestTy);
692
693 llvm::Value *SrcRTTI =
694 CGF.CGM.GetAddrOfRTTIDescriptor(SrcRecordTy.getUnqualifiedType());
695 llvm::Value *DestRTTI =
696 CGF.CGM.GetAddrOfRTTIDescriptor(DestRecordTy.getUnqualifiedType());
697
698 llvm::Value *Offset;
699 std::tie(Value, Offset) = performBaseAdjustment(CGF, Value, SrcRecordTy);
700
701 // PVOID __RTDynamicCast(
702 // PVOID inptr,
703 // LONG VfDelta,
704 // PVOID SrcType,
705 // PVOID TargetType,
706 // BOOL isReference)
707 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy, CGF.Int32Ty, CGF.Int8PtrTy,
708 CGF.Int8PtrTy, CGF.Int32Ty};
709 llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction(
710 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
711 "__RTDynamicCast");
712 llvm::Value *Args[] = {
713 Value, Offset, SrcRTTI, DestRTTI,
714 llvm::ConstantInt::get(CGF.Int32Ty, DestTy->isReferenceType())};
715 Value = CGF.EmitRuntimeCallOrInvoke(Function, Args).getInstruction();
716 return CGF.Builder.CreateBitCast(Value, DestLTy);
717}
718
719llvm::Value *
720MicrosoftCXXABI::EmitDynamicCastToVoid(CodeGenFunction &CGF, llvm::Value *Value,
721 QualType SrcRecordTy,
722 QualType DestTy) {
723 llvm::Value *Offset;
724 std::tie(Value, Offset) = performBaseAdjustment(CGF, Value, SrcRecordTy);
725
726 // PVOID __RTCastToVoid(
727 // PVOID inptr)
728 llvm::Type *ArgTypes[] = {CGF.Int8PtrTy};
729 llvm::Constant *Function = CGF.CGM.CreateRuntimeFunction(
730 llvm::FunctionType::get(CGF.Int8PtrTy, ArgTypes, false),
731 "__RTCastToVoid");
732 llvm::Value *Args[] = {Value};
733 return CGF.EmitRuntimeCall(Function, Args);
734}
735
736bool MicrosoftCXXABI::EmitBadCastCall(CodeGenFunction &CGF) {
737 return false;
738}
739
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000740llvm::Value *
741MicrosoftCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
742 llvm::Value *This,
743 const CXXRecordDecl *ClassDecl,
744 const CXXRecordDecl *BaseClassDecl) {
Reid Kleckner5b1b5d52014-01-14 00:50:39 +0000745 int64_t VBPtrChars =
746 getContext().getASTRecordLayout(ClassDecl).getVBPtrOffset().getQuantity();
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000747 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000748 CharUnits IntSize = getContext().getTypeSizeInChars(getContext().IntTy);
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000749 CharUnits VBTableChars =
750 IntSize *
751 CGM.getMicrosoftVTableContext().getVBTableIndex(ClassDecl, BaseClassDecl);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000752 llvm::Value *VBTableOffset =
753 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity());
754
755 llvm::Value *VBPtrToNewBase =
Timur Iskhodzhanov07e6eff2013-10-27 17:10:27 +0000756 GetVBaseOffsetFromVBPtr(CGF, This, VBPtrOffset, VBTableOffset);
Reid Klecknerd8cbeec2013-05-29 18:02:47 +0000757 VBPtrToNewBase =
758 CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy);
759 return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase);
760}
761
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000762bool MicrosoftCXXABI::HasThisReturn(GlobalDecl GD) const {
763 return isa<CXXConstructorDecl>(GD.getDecl());
John McCall0f999f32012-09-25 08:00:39 +0000764}
765
Reid Kleckner40ca9132014-05-13 22:05:45 +0000766bool MicrosoftCXXABI::classifyReturnType(CGFunctionInfo &FI) const {
767 const CXXRecordDecl *RD = FI.getReturnType()->getAsCXXRecordDecl();
768 if (!RD)
769 return false;
770
771 if (FI.isInstanceMethod()) {
772 // If it's an instance method, aggregates are always returned indirectly via
773 // the second parameter.
774 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
775 FI.getReturnInfo().setSRetAfterThis(FI.isInstanceMethod());
776 return true;
777 } else if (!RD->isPOD()) {
778 // If it's a free function, non-POD types are returned indirectly.
779 FI.getReturnInfo() = ABIArgInfo::getIndirect(0, /*ByVal=*/false);
780 return true;
781 }
782
783 // Otherwise, use the C ABI rules.
784 return false;
785}
786
Reid Kleckner89077a12013-12-17 19:46:40 +0000787void MicrosoftCXXABI::BuildConstructorSignature(
788 const CXXConstructorDecl *Ctor, CXXCtorType Type, CanQualType &ResTy,
789 SmallVectorImpl<CanQualType> &ArgTys) {
790
791 // All parameters are already in place except is_most_derived, which goes
792 // after 'this' if it's variadic and last if it's not.
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000793
794 const CXXRecordDecl *Class = Ctor->getParent();
Reid Kleckner89077a12013-12-17 19:46:40 +0000795 const FunctionProtoType *FPT = Ctor->getType()->castAs<FunctionProtoType>();
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000796 if (Class->getNumVBases()) {
Reid Kleckner89077a12013-12-17 19:46:40 +0000797 if (FPT->isVariadic())
798 ArgTys.insert(ArgTys.begin() + 1, CGM.getContext().IntTy);
799 else
800 ArgTys.push_back(CGM.getContext().IntTy);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000801 }
802}
803
Reid Kleckner7810af02013-06-19 15:20:38 +0000804llvm::BasicBlock *
805MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
806 const CXXRecordDecl *RD) {
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000807 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
808 assert(IsMostDerivedClass &&
809 "ctor for a class with virtual bases must have an implicit parameter");
Reid Kleckner7810af02013-06-19 15:20:38 +0000810 llvm::Value *IsCompleteObject =
811 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object");
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000812
813 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases");
814 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases");
815 CGF.Builder.CreateCondBr(IsCompleteObject,
816 CallVbaseCtorsBB, SkipVbaseCtorsBB);
817
818 CGF.EmitBlock(CallVbaseCtorsBB);
Reid Kleckner7810af02013-06-19 15:20:38 +0000819
820 // Fill in the vbtable pointers here.
821 EmitVBPtrStores(CGF, RD);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +0000822
823 // CGF will put the base ctor calls in this basic block for us later.
824
825 return SkipVbaseCtorsBB;
John McCall0f999f32012-09-25 08:00:39 +0000826}
827
Timur Iskhodzhanovb6487322013-10-09 18:16:58 +0000828void MicrosoftCXXABI::initializeHiddenVirtualInheritanceMembers(
829 CodeGenFunction &CGF, const CXXRecordDecl *RD) {
830 // In most cases, an override for a vbase virtual method can adjust
831 // the "this" parameter by applying a constant offset.
832 // However, this is not enough while a constructor or a destructor of some
833 // class X is being executed if all the following conditions are met:
834 // - X has virtual bases, (1)
835 // - X overrides a virtual method M of a vbase Y, (2)
836 // - X itself is a vbase of the most derived class.
837 //
838 // If (1) and (2) are true, the vtorDisp for vbase Y is a hidden member of X
839 // which holds the extra amount of "this" adjustment we must do when we use
840 // the X vftables (i.e. during X ctor or dtor).
841 // Outside the ctors and dtors, the values of vtorDisps are zero.
842
843 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD);
844 typedef ASTRecordLayout::VBaseOffsetsMapTy VBOffsets;
845 const VBOffsets &VBaseMap = Layout.getVBaseOffsetsMap();
846 CGBuilderTy &Builder = CGF.Builder;
847
848 unsigned AS =
849 cast<llvm::PointerType>(getThisValue(CGF)->getType())->getAddressSpace();
Craig Topper8a13c412014-05-21 05:09:00 +0000850 llvm::Value *Int8This = nullptr; // Initialize lazily.
Timur Iskhodzhanovb6487322013-10-09 18:16:58 +0000851
852 for (VBOffsets::const_iterator I = VBaseMap.begin(), E = VBaseMap.end();
853 I != E; ++I) {
854 if (!I->second.hasVtorDisp())
855 continue;
856
Timur Iskhodzhanov4ddf5922013-11-13 16:03:43 +0000857 llvm::Value *VBaseOffset =
858 GetVirtualBaseClassOffset(CGF, getThisValue(CGF), RD, I->first);
Timur Iskhodzhanovb6487322013-10-09 18:16:58 +0000859 // FIXME: it doesn't look right that we SExt in GetVirtualBaseClassOffset()
860 // just to Trunc back immediately.
861 VBaseOffset = Builder.CreateTruncOrBitCast(VBaseOffset, CGF.Int32Ty);
862 uint64_t ConstantVBaseOffset =
863 Layout.getVBaseClassOffset(I->first).getQuantity();
864
865 // vtorDisp_for_vbase = vbptr[vbase_idx] - offsetof(RD, vbase).
866 llvm::Value *VtorDispValue = Builder.CreateSub(
867 VBaseOffset, llvm::ConstantInt::get(CGM.Int32Ty, ConstantVBaseOffset),
868 "vtordisp.value");
869
870 if (!Int8This)
871 Int8This = Builder.CreateBitCast(getThisValue(CGF),
872 CGF.Int8Ty->getPointerTo(AS));
873 llvm::Value *VtorDispPtr = Builder.CreateInBoundsGEP(Int8This, VBaseOffset);
874 // vtorDisp is always the 32-bits before the vbase in the class layout.
875 VtorDispPtr = Builder.CreateConstGEP1_32(VtorDispPtr, -4);
876 VtorDispPtr = Builder.CreateBitCast(
877 VtorDispPtr, CGF.Int32Ty->getPointerTo(AS), "vtordisp.ptr");
878
879 Builder.CreateStore(VtorDispValue, VtorDispPtr);
880 }
881}
882
Timur Iskhodzhanov40f2fa92013-08-04 17:30:04 +0000883void MicrosoftCXXABI::EmitCXXConstructors(const CXXConstructorDecl *D) {
884 // There's only one constructor type in this ABI.
885 CGM.EmitGlobal(GlobalDecl(D, Ctor_Complete));
886}
887
Reid Kleckner7810af02013-06-19 15:20:38 +0000888void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF,
889 const CXXRecordDecl *RD) {
890 llvm::Value *ThisInt8Ptr =
891 CGF.Builder.CreateBitCast(getThisValue(CGF), CGM.Int8PtrTy, "this.int8");
Reid Kleckner5f080942014-01-03 23:42:00 +0000892 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
Reid Kleckner7810af02013-06-19 15:20:38 +0000893
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000894 const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
895 for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
Reid Kleckner9c6e9e32014-02-27 19:40:09 +0000896 const VPtrInfo *VBT = (*VBGlobals.VBTables)[I];
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000897 llvm::GlobalVariable *GV = VBGlobals.Globals[I];
Reid Kleckner7810af02013-06-19 15:20:38 +0000898 const ASTRecordLayout &SubobjectLayout =
Reid Kleckner9c6e9e32014-02-27 19:40:09 +0000899 CGM.getContext().getASTRecordLayout(VBT->BaseWithVPtr);
Reid Kleckner5f080942014-01-03 23:42:00 +0000900 CharUnits Offs = VBT->NonVirtualOffset;
901 Offs += SubobjectLayout.getVBPtrOffset();
Reid Kleckner9c6e9e32014-02-27 19:40:09 +0000902 if (VBT->getVBaseWithVPtr())
903 Offs += Layout.getVBaseClassOffset(VBT->getVBaseWithVPtr());
Reid Kleckner7810af02013-06-19 15:20:38 +0000904 llvm::Value *VBPtr =
Reid Kleckner5f080942014-01-03 23:42:00 +0000905 CGF.Builder.CreateConstInBoundsGEP1_64(ThisInt8Ptr, Offs.getQuantity());
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000906 VBPtr = CGF.Builder.CreateBitCast(VBPtr, GV->getType()->getPointerTo(0),
Reid Kleckner5f080942014-01-03 23:42:00 +0000907 "vbptr." + VBT->ReusingBase->getName());
Reid Klecknerb40a27d2014-01-03 00:14:35 +0000908 CGF.Builder.CreateStore(GV, VBPtr);
Reid Kleckner7810af02013-06-19 15:20:38 +0000909 }
910}
911
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +0000912void MicrosoftCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
913 CXXDtorType Type,
914 CanQualType &ResTy,
915 SmallVectorImpl<CanQualType> &ArgTys) {
916 // 'this' is already in place
Stephen Lin9dc6eef2013-06-30 20:40:16 +0000917
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +0000918 // TODO: 'for base' flag
919
920 if (Type == Dtor_Deleting) {
Timur Iskhodzhanov701981f2013-08-27 10:38:19 +0000921 // The scalar deleting destructor takes an implicit int parameter.
922 ArgTys.push_back(CGM.getContext().IntTy);
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +0000923 }
924}
925
Reid Klecknere7de47e2013-07-22 13:51:44 +0000926void MicrosoftCXXABI::EmitCXXDestructors(const CXXDestructorDecl *D) {
927 // The TU defining a dtor is only guaranteed to emit a base destructor. All
928 // other destructor variants are delegating thunks.
929 CGM.EmitGlobal(GlobalDecl(D, Dtor_Base));
930}
931
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +0000932CharUnits
933MicrosoftCXXABI::getVirtualFunctionPrologueThisAdjustment(GlobalDecl GD) {
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000934 GD = GD.getCanonicalDecl();
935 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +0000936
937 GlobalDecl LookupGD = GD;
938 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
939 // Complete destructors take a pointer to the complete object as a
940 // parameter, thus don't need this adjustment.
941 if (GD.getDtorType() == Dtor_Complete)
942 return CharUnits();
943
944 // There's no Dtor_Base in vftable but it shares the this adjustment with
945 // the deleting one, so look it up instead.
946 LookupGD = GlobalDecl(DD, Dtor_Deleting);
947 }
948
949 MicrosoftVTableContext::MethodVFTableLocation ML =
950 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(LookupGD);
951 CharUnits Adjustment = ML.VFPtrOffset;
952
953 // Normal virtual instance methods need to adjust from the vfptr that first
954 // defined the virtual method to the virtual base subobject, but destructors
955 // do not. The vector deleting destructor thunk applies this adjustment for
956 // us if necessary.
957 if (isa<CXXDestructorDecl>(MD))
958 Adjustment = CharUnits::Zero();
959
960 if (ML.VBase) {
961 const ASTRecordLayout &DerivedLayout =
962 CGM.getContext().getASTRecordLayout(MD->getParent());
963 Adjustment += DerivedLayout.getVBaseClassOffset(ML.VBase);
964 }
965
966 return Adjustment;
967}
968
969llvm::Value *MicrosoftCXXABI::adjustThisArgumentForVirtualFunctionCall(
970 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This, bool VirtualCall) {
971 if (!VirtualCall) {
972 // If the call of a virtual function is not virtual, we just have to
973 // compensate for the adjustment the virtual function does in its prologue.
974 CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(GD);
975 if (Adjustment.isZero())
976 return This;
977
978 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
979 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS);
980 This = CGF.Builder.CreateBitCast(This, charPtrTy);
981 assert(Adjustment.isPositive());
982 return CGF.Builder.CreateConstGEP1_32(This, Adjustment.getQuantity());
983 }
984
985 GD = GD.getCanonicalDecl();
986 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +0000987
Timur Iskhodzhanov62082b72013-10-16 18:24:06 +0000988 GlobalDecl LookupGD = GD;
989 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) {
990 // Complete dtors take a pointer to the complete object,
991 // thus don't need adjustment.
992 if (GD.getDtorType() == Dtor_Complete)
993 return This;
994
995 // There's only Dtor_Deleting in vftable but it shares the this adjustment
996 // with the base one, so look up the deleting one instead.
997 LookupGD = GlobalDecl(DD, Dtor_Deleting);
998 }
Timur Iskhodzhanov58776632013-11-05 15:54:58 +0000999 MicrosoftVTableContext::MethodVFTableLocation ML =
1000 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(LookupGD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001001
1002 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
1003 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS);
Timur Iskhodzhanov9e7f5052013-11-07 13:34:02 +00001004 CharUnits StaticOffset = ML.VFPtrOffset;
Reid Kleckner0c12b362014-02-18 22:51:52 +00001005
1006 // Base destructors expect 'this' to point to the beginning of the base
1007 // subobject, not the first vfptr that happens to contain the virtual dtor.
1008 // However, we still need to apply the virtual base adjustment.
1009 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base)
1010 StaticOffset = CharUnits::Zero();
1011
Timur Iskhodzhanov62082b72013-10-16 18:24:06 +00001012 if (ML.VBase) {
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +00001013 This = CGF.Builder.CreateBitCast(This, charPtrTy);
1014 llvm::Value *VBaseOffset =
1015 GetVirtualBaseClassOffset(CGF, This, MD->getParent(), ML.VBase);
1016 This = CGF.Builder.CreateInBoundsGEP(This, VBaseOffset);
Timur Iskhodzhanov62082b72013-10-16 18:24:06 +00001017 }
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001018 if (!StaticOffset.isZero()) {
1019 assert(StaticOffset.isPositive());
1020 This = CGF.Builder.CreateBitCast(This, charPtrTy);
Timur Iskhodzhanov827365e2013-10-22 18:15:24 +00001021 if (ML.VBase) {
1022 // Non-virtual adjustment might result in a pointer outside the allocated
1023 // object, e.g. if the final overrider class is laid out after the virtual
1024 // base that declares a method in the most derived class.
1025 // FIXME: Update the code that emits this adjustment in thunks prologues.
1026 This = CGF.Builder.CreateConstGEP1_32(This, StaticOffset.getQuantity());
1027 } else {
1028 This = CGF.Builder.CreateConstInBoundsGEP1_32(This,
1029 StaticOffset.getQuantity());
1030 }
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001031 }
1032 return This;
1033}
1034
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +00001035static bool IsDeletingDtor(GlobalDecl GD) {
1036 const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl());
1037 if (isa<CXXDestructorDecl>(MD)) {
1038 return GD.getDtorType() == Dtor_Deleting;
1039 }
1040 return false;
1041}
1042
Reid Kleckner89077a12013-12-17 19:46:40 +00001043void MicrosoftCXXABI::addImplicitStructorParams(CodeGenFunction &CGF,
1044 QualType &ResTy,
1045 FunctionArgList &Params) {
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001046 ASTContext &Context = getContext();
1047 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
Reid Kleckner89077a12013-12-17 19:46:40 +00001048 assert(isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD));
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001049 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
1050 ImplicitParamDecl *IsMostDerived
Craig Topper8a13c412014-05-21 05:09:00 +00001051 = ImplicitParamDecl::Create(Context, nullptr,
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001052 CGF.CurGD.getDecl()->getLocation(),
1053 &Context.Idents.get("is_most_derived"),
1054 Context.IntTy);
Reid Kleckner89077a12013-12-17 19:46:40 +00001055 // The 'most_derived' parameter goes second if the ctor is variadic and last
1056 // if it's not. Dtors can't be variadic.
1057 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
1058 if (FPT->isVariadic())
1059 Params.insert(Params.begin() + 1, IsMostDerived);
1060 else
1061 Params.push_back(IsMostDerived);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001062 getStructorImplicitParamDecl(CGF) = IsMostDerived;
1063 } else if (IsDeletingDtor(CGF.CurGD)) {
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +00001064 ImplicitParamDecl *ShouldDelete
Craig Topper8a13c412014-05-21 05:09:00 +00001065 = ImplicitParamDecl::Create(Context, nullptr,
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +00001066 CGF.CurGD.getDecl()->getLocation(),
1067 &Context.Idents.get("should_call_delete"),
Timur Iskhodzhanov701981f2013-08-27 10:38:19 +00001068 Context.IntTy);
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +00001069 Params.push_back(ShouldDelete);
1070 getStructorImplicitParamDecl(CGF) = ShouldDelete;
1071 }
John McCall0f999f32012-09-25 08:00:39 +00001072}
1073
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001074llvm::Value *MicrosoftCXXABI::adjustThisParameterInVirtualFunctionPrologue(
1075 CodeGenFunction &CGF, GlobalDecl GD, llvm::Value *This) {
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001076 // In this ABI, every virtual function takes a pointer to one of the
1077 // subobjects that first defines it as the 'this' parameter, rather than a
Alp Tokerf6a24ce2013-12-05 16:25:25 +00001078 // pointer to the final overrider subobject. Thus, we need to adjust it back
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001079 // to the final overrider subobject before use.
1080 // See comments in the MicrosoftVFTableContext implementation for the details.
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +00001081 CharUnits Adjustment = getVirtualFunctionPrologueThisAdjustment(GD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001082 if (Adjustment.isZero())
1083 return This;
1084
1085 unsigned AS = cast<llvm::PointerType>(This->getType())->getAddressSpace();
1086 llvm::Type *charPtrTy = CGF.Int8Ty->getPointerTo(AS),
1087 *thisTy = This->getType();
1088
1089 This = CGF.Builder.CreateBitCast(This, charPtrTy);
1090 assert(Adjustment.isPositive());
Timur Iskhodzhanov827365e2013-10-22 18:15:24 +00001091 This =
1092 CGF.Builder.CreateConstInBoundsGEP1_32(This, -Adjustment.getQuantity());
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001093 return CGF.Builder.CreateBitCast(This, thisTy);
1094}
1095
John McCall0f999f32012-09-25 08:00:39 +00001096void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
1097 EmitThisParam(CGF);
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001098
1099 /// If this is a function that the ABI specifies returns 'this', initialize
1100 /// the return slot to 'this' at the start of the function.
1101 ///
1102 /// Unlike the setting of return types, this is done within the ABI
1103 /// implementation instead of by clients of CGCXXABI because:
1104 /// 1) getThisValue is currently protected
1105 /// 2) in theory, an ABI could implement 'this' returns some other way;
1106 /// HasThisReturn only specifies a contract, not the implementation
1107 if (HasThisReturn(CGF.CurGD))
John McCall0f999f32012-09-25 08:00:39 +00001108 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001109
1110 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
1111 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
1112 assert(getStructorImplicitParamDecl(CGF) &&
1113 "no implicit parameter for a constructor with virtual bases?");
1114 getStructorImplicitParamValue(CGF)
1115 = CGF.Builder.CreateLoad(
1116 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
1117 "is_most_derived");
1118 }
1119
Timur Iskhodzhanovee6bc532013-02-13 08:37:51 +00001120 if (IsDeletingDtor(CGF.CurGD)) {
1121 assert(getStructorImplicitParamDecl(CGF) &&
1122 "no implicit parameter for a deleting destructor?");
1123 getStructorImplicitParamValue(CGF)
1124 = CGF.Builder.CreateLoad(
1125 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
1126 "should_call_delete");
1127 }
John McCall0f999f32012-09-25 08:00:39 +00001128}
1129
Reid Kleckner89077a12013-12-17 19:46:40 +00001130unsigned MicrosoftCXXABI::addImplicitConstructorArgs(
1131 CodeGenFunction &CGF, const CXXConstructorDecl *D, CXXCtorType Type,
1132 bool ForVirtualBase, bool Delegating, CallArgList &Args) {
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001133 assert(Type == Ctor_Complete || Type == Ctor_Base);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001134
Reid Kleckner89077a12013-12-17 19:46:40 +00001135 // Check if we need a 'most_derived' parameter.
1136 if (!D->getParent()->getNumVBases())
1137 return 0;
1138
1139 // Add the 'most_derived' argument second if we are variadic or last if not.
1140 const FunctionProtoType *FPT = D->getType()->castAs<FunctionProtoType>();
1141 llvm::Value *MostDerivedArg =
1142 llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete);
1143 RValue RV = RValue::get(MostDerivedArg);
1144 if (MostDerivedArg) {
1145 if (FPT->isVariadic())
1146 Args.insert(Args.begin() + 1,
1147 CallArg(RV, getContext().IntTy, /*needscopy=*/false));
1148 else
1149 Args.add(RV, getContext().IntTy);
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001150 }
1151
Reid Kleckner89077a12013-12-17 19:46:40 +00001152 return 1; // Added one arg.
Timur Iskhodzhanov57cbe5c2013-02-27 13:46:31 +00001153}
1154
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001155void MicrosoftCXXABI::EmitDestructorCall(CodeGenFunction &CGF,
1156 const CXXDestructorDecl *DD,
1157 CXXDtorType Type, bool ForVirtualBase,
1158 bool Delegating, llvm::Value *This) {
1159 llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(DD, Type);
1160
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +00001161 if (DD->isVirtual()) {
1162 assert(Type != CXXDtorType::Dtor_Deleting &&
1163 "The deleting destructor should only be called via a virtual call");
1164 This = adjustThisArgumentForVirtualFunctionCall(CGF, GlobalDecl(DD, Type),
1165 This, false);
1166 }
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001167
1168 // FIXME: Provide a source location here.
1169 CGF.EmitCXXMemberCall(DD, SourceLocation(), Callee, ReturnValueSlot(), This,
Craig Topper8a13c412014-05-21 05:09:00 +00001170 /*ImplicitParam=*/nullptr,
1171 /*ImplicitParamTy=*/QualType(), nullptr, nullptr);
Reid Kleckner6fe771a2013-12-13 00:53:54 +00001172}
1173
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001174void MicrosoftCXXABI::emitVTableDefinitions(CodeGenVTables &CGVT,
1175 const CXXRecordDecl *RD) {
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001176 MicrosoftVTableContext &VFTContext = CGM.getMicrosoftVTableContext();
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001177 VPtrInfoVector VFPtrs = VFTContext.getVFPtrOffsets(RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001178
Warren Hunt5c2b4ea2014-05-23 16:07:43 +00001179 for (VPtrInfo *Info : VFPtrs) {
1180 llvm::GlobalVariable *VTable = getAddrOfVTable(RD, Info->FullOffsetInMDC);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001181 if (VTable->hasInitializer())
1182 continue;
David Majnemerd905da42014-07-01 20:30:31 +00001183
David Majnemere2cb8d12014-07-07 06:20:47 +00001184 llvm::Constant *RTTI = getMSCompleteObjectLocator(RD, Info);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001185
1186 const VTableLayout &VTLayout =
Warren Hunt5c2b4ea2014-05-23 16:07:43 +00001187 VFTContext.getVFTableLayout(RD, Info->FullOffsetInMDC);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001188 llvm::Constant *Init = CGVT.CreateVTableInitializer(
1189 RD, VTLayout.vtable_component_begin(),
1190 VTLayout.getNumVTableComponents(), VTLayout.vtable_thunk_begin(),
David Majnemerd905da42014-07-01 20:30:31 +00001191 VTLayout.getNumVTableThunks(), RTTI);
1192
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001193 VTable->setInitializer(Init);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001194 }
1195}
1196
1197llvm::Value *MicrosoftCXXABI::getVTableAddressPointInStructor(
1198 CodeGenFunction &CGF, const CXXRecordDecl *VTableClass, BaseSubobject Base,
1199 const CXXRecordDecl *NearestVBase, bool &NeedsVirtualOffset) {
Craig Topper8a13c412014-05-21 05:09:00 +00001200 NeedsVirtualOffset = (NearestVBase != nullptr);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001201
David Majnemerd905da42014-07-01 20:30:31 +00001202 (void)getAddrOfVTable(VTableClass, Base.getBaseOffset());
1203 VFTableIdTy ID(VTableClass, Base.getBaseOffset());
1204 llvm::GlobalValue *VTableAddressPoint = VFTablesMap[ID];
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001205 if (!VTableAddressPoint) {
1206 assert(Base.getBase()->getNumVBases() &&
1207 !CGM.getContext().getASTRecordLayout(Base.getBase()).hasOwnVFPtr());
1208 }
1209 return VTableAddressPoint;
1210}
1211
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001212static void mangleVFTableName(MicrosoftMangleContext &MangleContext,
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001213 const CXXRecordDecl *RD, const VPtrInfo *VFPtr,
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001214 SmallString<256> &Name) {
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001215 llvm::raw_svector_ostream Out(Name);
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001216 MangleContext.mangleCXXVFTable(RD, VFPtr->MangledPath, Out);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001217}
1218
1219llvm::Constant *MicrosoftCXXABI::getVTableAddressPointForConstExpr(
1220 BaseSubobject Base, const CXXRecordDecl *VTableClass) {
David Majnemerd905da42014-07-01 20:30:31 +00001221 (void)getAddrOfVTable(VTableClass, Base.getBaseOffset());
1222 VFTableIdTy ID(VTableClass, Base.getBaseOffset());
1223 llvm::GlobalValue *VFTable = VFTablesMap[ID];
1224 assert(VFTable && "Couldn't find a vftable for the given base?");
1225 return VFTable;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001226}
1227
1228llvm::GlobalVariable *MicrosoftCXXABI::getAddrOfVTable(const CXXRecordDecl *RD,
1229 CharUnits VPtrOffset) {
1230 // getAddrOfVTable may return 0 if asked to get an address of a vtable which
1231 // shouldn't be used in the given record type. We want to cache this result in
1232 // VFTablesMap, thus a simple zero check is not sufficient.
1233 VFTableIdTy ID(RD, VPtrOffset);
David Majnemerd905da42014-07-01 20:30:31 +00001234 VTablesMapTy::iterator I;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001235 bool Inserted;
David Majnemerd905da42014-07-01 20:30:31 +00001236 std::tie(I, Inserted) = VTablesMap.insert(std::make_pair(ID, nullptr));
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001237 if (!Inserted)
1238 return I->second;
1239
1240 llvm::GlobalVariable *&VTable = I->second;
1241
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001242 MicrosoftVTableContext &VTContext = CGM.getMicrosoftVTableContext();
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001243 const VPtrInfoVector &VFPtrs = VTContext.getVFPtrOffsets(RD);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001244
1245 if (DeferredVFTables.insert(RD)) {
1246 // We haven't processed this record type before.
1247 // Queue up this v-table for possible deferred emission.
1248 CGM.addDeferredVTable(RD);
1249
1250#ifndef NDEBUG
1251 // Create all the vftables at once in order to make sure each vftable has
1252 // a unique mangled name.
1253 llvm::StringSet<> ObservedMangledNames;
1254 for (size_t J = 0, F = VFPtrs.size(); J != F; ++J) {
1255 SmallString<256> Name;
Timur Iskhodzhanov67455222013-10-03 06:26:13 +00001256 mangleVFTableName(getMangleContext(), RD, VFPtrs[J], Name);
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001257 if (!ObservedMangledNames.insert(Name.str()))
1258 llvm_unreachable("Already saw this mangling before?");
1259 }
1260#endif
1261 }
1262
1263 for (size_t J = 0, F = VFPtrs.size(); J != F; ++J) {
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001264 if (VFPtrs[J]->FullOffsetInMDC != VPtrOffset)
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001265 continue;
David Majnemerd905da42014-07-01 20:30:31 +00001266 SmallString<256> VFTableName;
1267 mangleVFTableName(getMangleContext(), RD, VFPtrs[J], VFTableName);
1268 StringRef VTableName = VFTableName;
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001269
David Majnemerd905da42014-07-01 20:30:31 +00001270 uint64_t NumVTableSlots =
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001271 VTContext.getVFTableLayout(RD, VFPtrs[J]->FullOffsetInMDC)
David Majnemerd905da42014-07-01 20:30:31 +00001272 .getNumVTableComponents();
1273 llvm::GlobalValue::LinkageTypes VTableLinkage =
1274 llvm::GlobalValue::ExternalLinkage;
1275 llvm::ArrayType *VTableType =
1276 llvm::ArrayType::get(CGM.Int8PtrTy, NumVTableSlots);
David Majnemerf6072342014-07-01 22:24:56 +00001277 if (getContext().getLangOpts().RTTIData) {
David Majnemerd905da42014-07-01 20:30:31 +00001278 VTableLinkage = llvm::GlobalValue::PrivateLinkage;
1279 VTableName = "";
1280 }
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001281
David Majnemerd905da42014-07-01 20:30:31 +00001282 VTable = CGM.getModule().getNamedGlobal(VFTableName);
1283 if (!VTable) {
David Majnemerbb848712014-07-01 22:37:08 +00001284 // Create a backing variable for the contents of VTable. The VTable may
1285 // or may not include space for a pointer to RTTI data.
David Majnemerd905da42014-07-01 20:30:31 +00001286 llvm::GlobalValue *VFTable = VTable = new llvm::GlobalVariable(
1287 CGM.getModule(), VTableType, /*isConstant=*/true, VTableLinkage,
1288 /*Initializer=*/nullptr, VTableName);
1289 VTable->setUnnamedAddr(true);
David Majnemerbb848712014-07-01 22:37:08 +00001290
1291 // Only insert a pointer into the VFTable for RTTI data if we are not
1292 // importing it. We never reference the RTTI data directly so there is no
1293 // need to make room for it.
David Majnemerf6072342014-07-01 22:24:56 +00001294 if (getContext().getLangOpts().RTTIData &&
1295 !RD->hasAttr<DLLImportAttr>()) {
David Majnemerd905da42014-07-01 20:30:31 +00001296 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0),
1297 llvm::ConstantInt::get(CGM.IntTy, 1)};
David Majnemerbb848712014-07-01 22:37:08 +00001298 // Create a GEP which points just after the first entry in the VFTable,
1299 // this should be the location of the first virtual method.
David Majnemerd905da42014-07-01 20:30:31 +00001300 llvm::Constant *VTableGEP =
1301 llvm::ConstantExpr::getInBoundsGetElementPtr(VTable, GEPIndices);
David Majnemerbb848712014-07-01 22:37:08 +00001302 // The symbol for the VFTable is an alias to the GEP. It is
1303 // transparent, to other modules, what the nature of this symbol is; all
1304 // that matters is that the alias be the address of the first virtual
1305 // method.
David Majnemerd905da42014-07-01 20:30:31 +00001306 VFTable = llvm::GlobalAlias::create(
1307 cast<llvm::SequentialType>(VTableGEP->getType())->getElementType(),
1308 /*AddressSpace=*/0, llvm::GlobalValue::ExternalLinkage,
1309 VFTableName.str(), VTableGEP, &CGM.getModule());
1310 } else {
David Majnemerbb848712014-07-01 22:37:08 +00001311 // We don't need a GlobalAlias to be a symbol for the VTable if we won't
1312 // be referencing any RTTI data. The GlobalVariable will end up being
1313 // an appropriate definition of the VFTable.
David Majnemerd905da42014-07-01 20:30:31 +00001314 VTable->setName(VFTableName.str());
1315 }
1316
1317 VFTable->setUnnamedAddr(true);
1318 if (RD->hasAttr<DLLImportAttr>())
1319 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1320 else if (RD->hasAttr<DLLExportAttr>())
1321 VFTable->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1322
1323 llvm::GlobalValue::LinkageTypes VFTableLinkage = CGM.getVTableLinkage(RD);
1324 if (VFTable != VTable) {
1325 if (llvm::GlobalValue::isAvailableExternallyLinkage(VFTableLinkage)) {
1326 // AvailableExternally implies that we grabbed the data from another
1327 // executable. No need to stick the alias in a Comdat.
David Majnemerb2615aa2014-07-13 05:19:56 +00001328 } else if (llvm::GlobalValue::isInternalLinkage(VFTableLinkage) ||
1329 llvm::GlobalValue::isWeakODRLinkage(VFTableLinkage) ||
David Majnemerd905da42014-07-01 20:30:31 +00001330 llvm::GlobalValue::isLinkOnceODRLinkage(VFTableLinkage)) {
1331 // The alias is going to be dropped into a Comdat, no need to make it
1332 // weak.
David Majnemerb2615aa2014-07-13 05:19:56 +00001333 if (!llvm::GlobalValue::isInternalLinkage(VFTableLinkage))
1334 VFTableLinkage = llvm::GlobalValue::ExternalLinkage;
David Majnemerd905da42014-07-01 20:30:31 +00001335 llvm::Comdat *C =
1336 CGM.getModule().getOrInsertComdat(VFTable->getName());
David Majnemerbb848712014-07-01 22:37:08 +00001337 // We must indicate which VFTable is larger to support linking between
1338 // translation units which do and do not have RTTI data. The largest
1339 // VFTable contains the RTTI data; translation units which reference
1340 // the smaller VFTable always reference it relative to the first
1341 // virtual method.
David Majnemerd905da42014-07-01 20:30:31 +00001342 C->setSelectionKind(llvm::Comdat::Largest);
1343 VTable->setComdat(C);
1344 } else {
1345 llvm_unreachable("unexpected linkage for vftable!");
1346 }
1347 }
1348 VFTable->setLinkage(VFTableLinkage);
1349 CGM.setGlobalVisibility(VFTable, RD);
1350 VFTablesMap[ID] = VFTable;
1351 }
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001352 break;
1353 }
1354
1355 return VTable;
1356}
1357
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001358llvm::Value *MicrosoftCXXABI::getVirtualFunctionPointer(CodeGenFunction &CGF,
1359 GlobalDecl GD,
1360 llvm::Value *This,
1361 llvm::Type *Ty) {
1362 GD = GD.getCanonicalDecl();
1363 CGBuilderTy &Builder = CGF.Builder;
1364
1365 Ty = Ty->getPointerTo()->getPointerTo();
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +00001366 llvm::Value *VPtr =
1367 adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001368 llvm::Value *VTable = CGF.GetVTablePtr(VPtr, Ty);
1369
Timur Iskhodzhanov58776632013-11-05 15:54:58 +00001370 MicrosoftVTableContext::MethodVFTableLocation ML =
1371 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(GD);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001372 llvm::Value *VFuncPtr =
1373 Builder.CreateConstInBoundsGEP1_64(VTable, ML.Index, "vfn");
1374 return Builder.CreateLoad(VFuncPtr);
1375}
1376
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001377void MicrosoftCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
1378 const CXXDestructorDecl *Dtor,
1379 CXXDtorType DtorType,
1380 SourceLocation CallLoc,
1381 llvm::Value *This) {
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001382 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
1383
1384 // We have only one destructor in the vftable but can get both behaviors
Timur Iskhodzhanov701981f2013-08-27 10:38:19 +00001385 // by passing an implicit int parameter.
Timur Iskhodzhanov62082b72013-10-16 18:24:06 +00001386 GlobalDecl GD(Dtor, Dtor_Deleting);
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001387 const CGFunctionInfo *FInfo =
1388 &CGM.getTypes().arrangeCXXDestructor(Dtor, Dtor_Deleting);
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001389 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
Timur Iskhodzhanov62082b72013-10-16 18:24:06 +00001390 llvm::Value *Callee = getVirtualFunctionPointer(CGF, GD, This, Ty);
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001391
1392 ASTContext &Context = CGF.getContext();
Timur Iskhodzhanov88fd4392013-08-21 06:25:03 +00001393 llvm::Value *ImplicitParam =
Timur Iskhodzhanov701981f2013-08-27 10:38:19 +00001394 llvm::ConstantInt::get(llvm::IntegerType::getInt32Ty(CGF.getLLVMContext()),
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001395 DtorType == Dtor_Deleting);
1396
Timur Iskhodzhanovf1749422014-03-14 17:43:37 +00001397 This = adjustThisArgumentForVirtualFunctionCall(CGF, GD, This, true);
Stephen Lin9dc6eef2013-06-30 20:40:16 +00001398 CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValueSlot(), This,
Craig Topper8a13c412014-05-21 05:09:00 +00001399 ImplicitParam, Context.IntTy, nullptr, nullptr);
Timur Iskhodzhanovd6197112013-02-15 14:45:22 +00001400}
1401
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001402const VBTableGlobals &
1403MicrosoftCXXABI::enumerateVBTables(const CXXRecordDecl *RD) {
Reid Kleckner7810af02013-06-19 15:20:38 +00001404 // At this layer, we can key the cache off of a single class, which is much
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001405 // easier than caching each vbtable individually.
1406 llvm::DenseMap<const CXXRecordDecl*, VBTableGlobals>::iterator Entry;
1407 bool Added;
Benjamin Kramer867ea1d2014-03-02 13:01:17 +00001408 std::tie(Entry, Added) =
1409 VBTablesMap.insert(std::make_pair(RD, VBTableGlobals()));
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001410 VBTableGlobals &VBGlobals = Entry->second;
1411 if (!Added)
1412 return VBGlobals;
Reid Kleckner7810af02013-06-19 15:20:38 +00001413
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001414 MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
1415 VBGlobals.VBTables = &Context.enumerateVBTables(RD);
Reid Kleckner7810af02013-06-19 15:20:38 +00001416
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001417 // Cache the globals for all vbtables so we don't have to recompute the
1418 // mangled names.
1419 llvm::GlobalVariable::LinkageTypes Linkage = CGM.getVTableLinkage(RD);
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001420 for (VPtrInfoVector::const_iterator I = VBGlobals.VBTables->begin(),
1421 E = VBGlobals.VBTables->end();
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001422 I != E; ++I) {
Reid Kleckner5f080942014-01-03 23:42:00 +00001423 VBGlobals.Globals.push_back(getAddrOfVBTable(**I, RD, Linkage));
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001424 }
1425
1426 return VBGlobals;
Reid Kleckner7810af02013-06-19 15:20:38 +00001427}
1428
Reid Klecknere4a52202014-02-21 02:27:32 +00001429llvm::Function *MicrosoftCXXABI::EmitVirtualMemPtrThunk(
1430 const CXXMethodDecl *MD,
1431 const MicrosoftVTableContext::MethodVFTableLocation &ML) {
1432 // Calculate the mangled name.
1433 SmallString<256> ThunkName;
1434 llvm::raw_svector_ostream Out(ThunkName);
1435 getMangleContext().mangleVirtualMemPtrThunk(MD, Out);
1436 Out.flush();
1437
Hans Wennborg88497d62013-11-15 17:24:45 +00001438 // If the thunk has been generated previously, just return it.
1439 if (llvm::GlobalValue *GV = CGM.getModule().getNamedValue(ThunkName))
1440 return cast<llvm::Function>(GV);
1441
1442 // Create the llvm::Function.
1443 const CGFunctionInfo &FnInfo = CGM.getTypes().arrangeGlobalDeclaration(MD);
1444 llvm::FunctionType *ThunkTy = CGM.getTypes().GetFunctionType(FnInfo);
1445 llvm::Function *ThunkFn =
1446 llvm::Function::Create(ThunkTy, llvm::Function::ExternalLinkage,
1447 ThunkName.str(), &CGM.getModule());
1448 assert(ThunkFn->getName() == ThunkName && "name was uniqued!");
1449
Hans Wennborg88497d62013-11-15 17:24:45 +00001450 ThunkFn->setLinkage(MD->isExternallyVisible()
1451 ? llvm::GlobalValue::LinkOnceODRLinkage
1452 : llvm::GlobalValue::InternalLinkage);
1453
1454 CGM.SetLLVMFunctionAttributes(MD, FnInfo, ThunkFn);
1455 CGM.SetLLVMFunctionAttributesForDefinition(MD, ThunkFn);
1456
1457 // Start codegen.
1458 CodeGenFunction CGF(CGM);
1459 CGF.StartThunk(ThunkFn, MD, FnInfo);
1460
Reid Klecknere4a52202014-02-21 02:27:32 +00001461 // Load the vfptr and then callee from the vftable. The callee should have
1462 // adjusted 'this' so that the vfptr is at offset zero.
Hans Wennborg88497d62013-11-15 17:24:45 +00001463 llvm::Value *This = CGF.LoadCXXThis();
Reid Klecknere4a52202014-02-21 02:27:32 +00001464 llvm::Value *VTable =
1465 CGF.GetVTablePtr(This, ThunkTy->getPointerTo()->getPointerTo());
1466 llvm::Value *VFuncPtr =
1467 CGF.Builder.CreateConstInBoundsGEP1_64(VTable, ML.Index, "vfn");
1468 llvm::Value *Callee = CGF.Builder.CreateLoad(VFuncPtr);
Hans Wennborg88497d62013-11-15 17:24:45 +00001469
Reid Kleckner966abe72014-05-15 23:01:46 +00001470 unsigned CallingConv;
1471 CodeGen::AttributeListType AttributeList;
1472 CGM.ConstructAttributeList(FnInfo, MD, AttributeList, CallingConv, true);
1473 llvm::AttributeSet Attrs =
1474 llvm::AttributeSet::get(CGF.getLLVMContext(), AttributeList);
1475
1476 // Do a musttail call with perfect argument forwarding. Any inalloca argument
1477 // will be forwarded in place without any copy.
1478 SmallVector<llvm::Value *, 8> Args;
1479 for (llvm::Argument &A : ThunkFn->args())
1480 Args.push_back(&A);
1481 llvm::CallInst *Call = CGF.Builder.CreateCall(Callee, Args);
1482 Call->setTailCallKind(llvm::CallInst::TCK_MustTail);
1483 Call->setAttributes(Attrs);
1484 Call->setCallingConv(static_cast<llvm::CallingConv::ID>(CallingConv));
1485
1486 if (Call->getType()->isVoidTy())
1487 CGF.Builder.CreateRetVoid();
1488 else
1489 CGF.Builder.CreateRet(Call);
1490
1491 // Finish the function to maintain CodeGenFunction invariants.
1492 // FIXME: Don't emit unreachable code.
1493 CGF.EmitBlock(CGF.createBasicBlock());
1494 CGF.FinishFunction();
Hans Wennborg88497d62013-11-15 17:24:45 +00001495
1496 return ThunkFn;
1497}
1498
Timur Iskhodzhanov8b5987e2013-09-27 14:48:01 +00001499void MicrosoftCXXABI::emitVirtualInheritanceTables(const CXXRecordDecl *RD) {
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001500 const VBTableGlobals &VBGlobals = enumerateVBTables(RD);
1501 for (unsigned I = 0, E = VBGlobals.VBTables->size(); I != E; ++I) {
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001502 const VPtrInfo *VBT = (*VBGlobals.VBTables)[I];
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001503 llvm::GlobalVariable *GV = VBGlobals.Globals[I];
Reid Kleckner5f080942014-01-03 23:42:00 +00001504 emitVBTableDefinition(*VBT, RD, GV);
Reid Kleckner7810af02013-06-19 15:20:38 +00001505 }
1506}
1507
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001508llvm::GlobalVariable *
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001509MicrosoftCXXABI::getAddrOfVBTable(const VPtrInfo &VBT, const CXXRecordDecl *RD,
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001510 llvm::GlobalVariable::LinkageTypes Linkage) {
1511 SmallString<256> OutName;
1512 llvm::raw_svector_ostream Out(OutName);
David Majnemer611cdb92014-07-07 08:09:15 +00001513 getMangleContext().mangleCXXVBTable(RD, VBT.MangledPath, Out);
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001514 Out.flush();
1515 StringRef Name = OutName.str();
1516
1517 llvm::ArrayType *VBTableType =
1518 llvm::ArrayType::get(CGM.IntTy, 1 + VBT.ReusingBase->getNumVBases());
1519
1520 assert(!CGM.getModule().getNamedGlobal(Name) &&
1521 "vbtable with this name already exists: mangling bug?");
1522 llvm::GlobalVariable *GV =
1523 CGM.CreateOrReplaceCXXRuntimeVariable(Name, VBTableType, Linkage);
1524 GV->setUnnamedAddr(true);
Hans Wennborg853ae942014-05-30 16:59:42 +00001525
1526 if (RD->hasAttr<DLLImportAttr>())
1527 GV->setDLLStorageClass(llvm::GlobalValue::DLLImportStorageClass);
1528 else if (RD->hasAttr<DLLExportAttr>())
1529 GV->setDLLStorageClass(llvm::GlobalValue::DLLExportStorageClass);
1530
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001531 return GV;
1532}
1533
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001534void MicrosoftCXXABI::emitVBTableDefinition(const VPtrInfo &VBT,
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001535 const CXXRecordDecl *RD,
1536 llvm::GlobalVariable *GV) const {
1537 const CXXRecordDecl *ReusingBase = VBT.ReusingBase;
1538
1539 assert(RD->getNumVBases() && ReusingBase->getNumVBases() &&
1540 "should only emit vbtables for classes with vbtables");
1541
1542 const ASTRecordLayout &BaseLayout =
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001543 CGM.getContext().getASTRecordLayout(VBT.BaseWithVPtr);
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001544 const ASTRecordLayout &DerivedLayout =
1545 CGM.getContext().getASTRecordLayout(RD);
1546
Craig Topper8a13c412014-05-21 05:09:00 +00001547 SmallVector<llvm::Constant *, 4> Offsets(1 + ReusingBase->getNumVBases(),
1548 nullptr);
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001549
1550 // The offset from ReusingBase's vbptr to itself always leads.
1551 CharUnits VBPtrOffset = BaseLayout.getVBPtrOffset();
1552 Offsets[0] = llvm::ConstantInt::get(CGM.IntTy, -VBPtrOffset.getQuantity());
1553
1554 MicrosoftVTableContext &Context = CGM.getMicrosoftVTableContext();
Aaron Ballman445a9392014-03-13 16:15:17 +00001555 for (const auto &I : ReusingBase->vbases()) {
1556 const CXXRecordDecl *VBase = I.getType()->getAsCXXRecordDecl();
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001557 CharUnits Offset = DerivedLayout.getVBaseClassOffset(VBase);
1558 assert(!Offset.isNegative());
Reid Kleckner5f080942014-01-03 23:42:00 +00001559
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001560 // Make it relative to the subobject vbptr.
Reid Kleckner5f080942014-01-03 23:42:00 +00001561 CharUnits CompleteVBPtrOffset = VBT.NonVirtualOffset + VBPtrOffset;
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001562 if (VBT.getVBaseWithVPtr())
Reid Kleckner5f080942014-01-03 23:42:00 +00001563 CompleteVBPtrOffset +=
Reid Kleckner9c6e9e32014-02-27 19:40:09 +00001564 DerivedLayout.getVBaseClassOffset(VBT.getVBaseWithVPtr());
Reid Kleckner5f080942014-01-03 23:42:00 +00001565 Offset -= CompleteVBPtrOffset;
1566
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001567 unsigned VBIndex = Context.getVBTableIndex(ReusingBase, VBase);
Craig Topper8a13c412014-05-21 05:09:00 +00001568 assert(Offsets[VBIndex] == nullptr && "The same vbindex seen twice?");
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001569 Offsets[VBIndex] = llvm::ConstantInt::get(CGM.IntTy, Offset.getQuantity());
1570 }
1571
1572 assert(Offsets.size() ==
1573 cast<llvm::ArrayType>(cast<llvm::PointerType>(GV->getType())
1574 ->getElementType())->getNumElements());
1575 llvm::ArrayType *VBTableType =
1576 llvm::ArrayType::get(CGM.IntTy, Offsets.size());
1577 llvm::Constant *Init = llvm::ConstantArray::get(VBTableType, Offsets);
1578 GV->setInitializer(Init);
1579
1580 // Set the right visibility.
John McCall8f80a612014-02-08 00:41:16 +00001581 CGM.setGlobalVisibility(GV, RD);
Reid Klecknerb40a27d2014-01-03 00:14:35 +00001582}
1583
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001584llvm::Value *MicrosoftCXXABI::performThisAdjustment(CodeGenFunction &CGF,
1585 llvm::Value *This,
1586 const ThisAdjustment &TA) {
1587 if (TA.isEmpty())
1588 return This;
1589
1590 llvm::Value *V = CGF.Builder.CreateBitCast(This, CGF.Int8PtrTy);
1591
Timur Iskhodzhanov053142a2013-11-06 06:24:31 +00001592 if (!TA.Virtual.isEmpty()) {
1593 assert(TA.Virtual.Microsoft.VtordispOffset < 0);
1594 // Adjust the this argument based on the vtordisp value.
1595 llvm::Value *VtorDispPtr =
1596 CGF.Builder.CreateConstGEP1_32(V, TA.Virtual.Microsoft.VtordispOffset);
1597 VtorDispPtr =
1598 CGF.Builder.CreateBitCast(VtorDispPtr, CGF.Int32Ty->getPointerTo());
1599 llvm::Value *VtorDisp = CGF.Builder.CreateLoad(VtorDispPtr, "vtordisp");
1600 V = CGF.Builder.CreateGEP(V, CGF.Builder.CreateNeg(VtorDisp));
1601
1602 if (TA.Virtual.Microsoft.VBPtrOffset) {
1603 // If the final overrider is defined in a virtual base other than the one
1604 // that holds the vfptr, we have to use a vtordispex thunk which looks up
1605 // the vbtable of the derived class.
1606 assert(TA.Virtual.Microsoft.VBPtrOffset > 0);
1607 assert(TA.Virtual.Microsoft.VBOffsetOffset >= 0);
1608 llvm::Value *VBPtr;
1609 llvm::Value *VBaseOffset =
1610 GetVBaseOffsetFromVBPtr(CGF, V, -TA.Virtual.Microsoft.VBPtrOffset,
1611 TA.Virtual.Microsoft.VBOffsetOffset, &VBPtr);
1612 V = CGF.Builder.CreateInBoundsGEP(VBPtr, VBaseOffset);
1613 }
1614 }
Timur Iskhodzhanov02014322013-10-30 11:55:43 +00001615
1616 if (TA.NonVirtual) {
1617 // Non-virtual adjustment might result in a pointer outside the allocated
1618 // object, e.g. if the final overrider class is laid out after the virtual
1619 // base that declares a method in the most derived class.
1620 V = CGF.Builder.CreateConstGEP1_32(V, TA.NonVirtual);
1621 }
1622
1623 // Don't need to bitcast back, the call CodeGen will handle this.
1624 return V;
1625}
1626
1627llvm::Value *
1628MicrosoftCXXABI::performReturnAdjustment(CodeGenFunction &CGF, llvm::Value *Ret,
1629 const ReturnAdjustment &RA) {
1630 if (RA.isEmpty())
1631 return Ret;
1632
1633 llvm::Value *V = CGF.Builder.CreateBitCast(Ret, CGF.Int8PtrTy);
1634
1635 if (RA.Virtual.Microsoft.VBIndex) {
1636 assert(RA.Virtual.Microsoft.VBIndex > 0);
1637 int32_t IntSize =
1638 getContext().getTypeSizeInChars(getContext().IntTy).getQuantity();
1639 llvm::Value *VBPtr;
1640 llvm::Value *VBaseOffset =
1641 GetVBaseOffsetFromVBPtr(CGF, V, RA.Virtual.Microsoft.VBPtrOffset,
1642 IntSize * RA.Virtual.Microsoft.VBIndex, &VBPtr);
1643 V = CGF.Builder.CreateInBoundsGEP(VBPtr, VBaseOffset);
1644 }
1645
1646 if (RA.NonVirtual)
1647 V = CGF.Builder.CreateConstInBoundsGEP1_32(V, RA.NonVirtual);
1648
1649 // Cast back to the original type.
1650 return CGF.Builder.CreateBitCast(V, Ret->getType());
1651}
1652
John McCallb91cd662012-05-01 05:23:51 +00001653bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr,
1654 QualType elementType) {
1655 // Microsoft seems to completely ignore the possibility of a
1656 // two-argument usual deallocation function.
1657 return elementType.isDestructedType();
1658}
1659
1660bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) {
1661 // Microsoft seems to completely ignore the possibility of a
1662 // two-argument usual deallocation function.
1663 return expr->getAllocatedType().isDestructedType();
1664}
1665
1666CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) {
1667 // The array cookie is always a size_t; we then pad that out to the
1668 // alignment of the element type.
1669 ASTContext &Ctx = getContext();
1670 return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
1671 Ctx.getTypeAlignInChars(type));
1672}
1673
1674llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
1675 llvm::Value *allocPtr,
1676 CharUnits cookieSize) {
Micah Villmowea2fea22012-10-25 15:39:14 +00001677 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
John McCallb91cd662012-05-01 05:23:51 +00001678 llvm::Value *numElementsPtr =
1679 CGF.Builder.CreateBitCast(allocPtr, CGF.SizeTy->getPointerTo(AS));
1680 return CGF.Builder.CreateLoad(numElementsPtr);
1681}
1682
1683llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
1684 llvm::Value *newPtr,
1685 llvm::Value *numElements,
1686 const CXXNewExpr *expr,
1687 QualType elementType) {
1688 assert(requiresArrayCookie(expr));
1689
1690 // The size of the cookie.
1691 CharUnits cookieSize = getArrayCookieSizeImpl(elementType);
1692
1693 // Compute an offset to the cookie.
1694 llvm::Value *cookiePtr = newPtr;
1695
1696 // Write the number of elements into the appropriate slot.
Micah Villmowea2fea22012-10-25 15:39:14 +00001697 unsigned AS = newPtr->getType()->getPointerAddressSpace();
John McCallb91cd662012-05-01 05:23:51 +00001698 llvm::Value *numElementsPtr
1699 = CGF.Builder.CreateBitCast(cookiePtr, CGF.SizeTy->getPointerTo(AS));
1700 CGF.Builder.CreateStore(numElements, numElementsPtr);
1701
1702 // Finally, compute a pointer to the actual data buffer by skipping
1703 // over the cookie completely.
1704 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
1705 cookieSize.getQuantity());
1706}
1707
John McCallc84ed6a2012-05-01 06:13:13 +00001708void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
Reid Klecknerd8110b62013-09-10 20:14:30 +00001709 llvm::GlobalVariable *GV,
John McCallc84ed6a2012-05-01 06:13:13 +00001710 bool PerformInit) {
Reid Kleckner563f0e82014-05-23 21:13:45 +00001711 // MSVC only uses guards for static locals.
1712 if (!D.isStaticLocal()) {
1713 assert(GV->hasWeakLinkage() || GV->hasLinkOnceLinkage());
1714 // GlobalOpt is allowed to discard the initializer, so use linkonce_odr.
1715 CGF.CurFn->setLinkage(llvm::GlobalValue::LinkOnceODRLinkage);
1716 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
1717 return;
1718 }
1719
Reid Klecknerd8110b62013-09-10 20:14:30 +00001720 // MSVC always uses an i32 bitfield to guard initialization, which is *not*
1721 // threadsafe. Since the user may be linking in inline functions compiled by
1722 // cl.exe, there's no reason to provide a false sense of security by using
1723 // critical sections here.
John McCallc84ed6a2012-05-01 06:13:13 +00001724
Richard Smithdbf74ba2013-04-14 23:01:42 +00001725 if (D.getTLSKind())
1726 CGM.ErrorUnsupported(&D, "dynamic TLS initialization");
1727
Reid Klecknerd8110b62013-09-10 20:14:30 +00001728 CGBuilderTy &Builder = CGF.Builder;
1729 llvm::IntegerType *GuardTy = CGF.Int32Ty;
1730 llvm::ConstantInt *Zero = llvm::ConstantInt::get(GuardTy, 0);
1731
1732 // Get the guard variable for this function if we have one already.
Reid Kleckner563f0e82014-05-23 21:13:45 +00001733 GuardInfo *GI = &GuardVariableMap[D.getDeclContext()];
Reid Klecknerd8110b62013-09-10 20:14:30 +00001734
1735 unsigned BitIndex;
Reid Klecknere9591b32014-04-23 18:22:11 +00001736 if (D.isStaticLocal() && D.isExternallyVisible()) {
Reid Klecknerd8110b62013-09-10 20:14:30 +00001737 // Externally visible variables have to be numbered in Sema to properly
1738 // handle unreachable VarDecls.
David Majnemer2206bf52014-03-05 08:57:59 +00001739 BitIndex = getContext().getStaticLocalNumber(&D);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001740 assert(BitIndex > 0);
1741 BitIndex--;
1742 } else {
1743 // Non-externally visible variables are numbered here in CodeGen.
Reid Klecknere9591b32014-04-23 18:22:11 +00001744 BitIndex = GI->BitIndex++;
Reid Klecknerd8110b62013-09-10 20:14:30 +00001745 }
1746
1747 if (BitIndex >= 32) {
1748 if (D.isExternallyVisible())
1749 ErrorUnsupportedABI(CGF, "more than 32 guarded initializations");
1750 BitIndex %= 32;
Craig Topper8a13c412014-05-21 05:09:00 +00001751 GI->Guard = nullptr;
Reid Klecknerd8110b62013-09-10 20:14:30 +00001752 }
1753
1754 // Lazily create the i32 bitfield for this function.
Reid Klecknere9591b32014-04-23 18:22:11 +00001755 if (!GI->Guard) {
Reid Klecknerd8110b62013-09-10 20:14:30 +00001756 // Mangle the name for the guard.
1757 SmallString<256> GuardName;
1758 {
1759 llvm::raw_svector_ostream Out(GuardName);
1760 getMangleContext().mangleStaticGuardVariable(&D, Out);
1761 Out.flush();
1762 }
1763
Hans Wennborgef2272c2014-06-18 15:55:13 +00001764 // Create the guard variable with a zero-initializer. Just absorb linkage,
1765 // visibility and dll storage class from the guarded variable.
Reid Klecknere9591b32014-04-23 18:22:11 +00001766 GI->Guard =
1767 new llvm::GlobalVariable(CGM.getModule(), GuardTy, false,
1768 GV->getLinkage(), Zero, GuardName.str());
1769 GI->Guard->setVisibility(GV->getVisibility());
Hans Wennborgef2272c2014-06-18 15:55:13 +00001770 GI->Guard->setDLLStorageClass(GV->getDLLStorageClass());
Reid Klecknerd8110b62013-09-10 20:14:30 +00001771 } else {
Reid Klecknere9591b32014-04-23 18:22:11 +00001772 assert(GI->Guard->getLinkage() == GV->getLinkage() &&
Reid Klecknerd8110b62013-09-10 20:14:30 +00001773 "static local from the same function had different linkage");
1774 }
1775
1776 // Pseudo code for the test:
1777 // if (!(GuardVar & MyGuardBit)) {
1778 // GuardVar |= MyGuardBit;
1779 // ... initialize the object ...;
1780 // }
1781
1782 // Test our bit from the guard variable.
1783 llvm::ConstantInt *Bit = llvm::ConstantInt::get(GuardTy, 1U << BitIndex);
Reid Klecknere9591b32014-04-23 18:22:11 +00001784 llvm::LoadInst *LI = Builder.CreateLoad(GI->Guard);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001785 llvm::Value *IsInitialized =
1786 Builder.CreateICmpNE(Builder.CreateAnd(LI, Bit), Zero);
1787 llvm::BasicBlock *InitBlock = CGF.createBasicBlock("init");
1788 llvm::BasicBlock *EndBlock = CGF.createBasicBlock("init.end");
1789 Builder.CreateCondBr(IsInitialized, EndBlock, InitBlock);
1790
1791 // Set our bit in the guard variable and emit the initializer and add a global
1792 // destructor if appropriate.
1793 CGF.EmitBlock(InitBlock);
Reid Klecknere9591b32014-04-23 18:22:11 +00001794 Builder.CreateStore(Builder.CreateOr(LI, Bit), GI->Guard);
Reid Klecknerd8110b62013-09-10 20:14:30 +00001795 CGF.EmitCXXGlobalVarDeclInit(D, GV, PerformInit);
1796 Builder.CreateBr(EndBlock);
1797
1798 // Continue.
1799 CGF.EmitBlock(EndBlock);
John McCallc84ed6a2012-05-01 06:13:13 +00001800}
1801
Reid Kleckner2341ae32013-04-11 18:13:19 +00001802bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
1803 // Null-ness for function memptrs only depends on the first field, which is
1804 // the function pointer. The rest don't matter, so we can zero initialize.
1805 if (MPT->isMemberFunctionPointer())
1806 return true;
1807
1808 // The virtual base adjustment field is always -1 for null, so if we have one
1809 // we can't zero initialize. The field offset is sometimes also -1 if 0 is a
1810 // valid field offset.
David Majnemer1cdd96d2014-01-17 09:01:00 +00001811 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
1812 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
Reid Kleckner96f8f932014-02-05 17:27:08 +00001813 return (!MSInheritanceAttr::hasVBTableOffsetField(Inheritance) &&
1814 RD->nullFieldOffsetIsZero());
Reid Kleckner2341ae32013-04-11 18:13:19 +00001815}
1816
1817llvm::Type *
1818MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
David Majnemer1cdd96d2014-01-17 09:01:00 +00001819 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
1820 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
Reid Kleckner2341ae32013-04-11 18:13:19 +00001821 llvm::SmallVector<llvm::Type *, 4> fields;
1822 if (MPT->isMemberFunctionPointer())
1823 fields.push_back(CGM.VoidPtrTy); // FunctionPointerOrVirtualThunk
1824 else
1825 fields.push_back(CGM.IntTy); // FieldOffset
1826
Reid Kleckner96f8f932014-02-05 17:27:08 +00001827 if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(),
1828 Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00001829 fields.push_back(CGM.IntTy);
Reid Kleckner96f8f932014-02-05 17:27:08 +00001830 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00001831 fields.push_back(CGM.IntTy);
Reid Kleckner96f8f932014-02-05 17:27:08 +00001832 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00001833 fields.push_back(CGM.IntTy); // VirtualBaseAdjustmentOffset
1834
1835 if (fields.size() == 1)
1836 return fields[0];
1837 return llvm::StructType::get(CGM.getLLVMContext(), fields);
1838}
1839
1840void MicrosoftCXXABI::
1841GetNullMemberPointerFields(const MemberPointerType *MPT,
1842 llvm::SmallVectorImpl<llvm::Constant *> &fields) {
1843 assert(fields.empty());
David Majnemer1cdd96d2014-01-17 09:01:00 +00001844 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
1845 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
Reid Kleckner2341ae32013-04-11 18:13:19 +00001846 if (MPT->isMemberFunctionPointer()) {
1847 // FunctionPointerOrVirtualThunk
1848 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
1849 } else {
Reid Kleckner96f8f932014-02-05 17:27:08 +00001850 if (RD->nullFieldOffsetIsZero())
Reid Kleckner2341ae32013-04-11 18:13:19 +00001851 fields.push_back(getZeroInt()); // FieldOffset
1852 else
1853 fields.push_back(getAllOnesInt()); // FieldOffset
Reid Kleckner407e8b62013-03-22 19:02:54 +00001854 }
Reid Kleckner2341ae32013-04-11 18:13:19 +00001855
Reid Kleckner96f8f932014-02-05 17:27:08 +00001856 if (MSInheritanceAttr::hasNVOffsetField(MPT->isMemberFunctionPointer(),
1857 Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00001858 fields.push_back(getZeroInt());
Reid Kleckner96f8f932014-02-05 17:27:08 +00001859 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00001860 fields.push_back(getZeroInt());
Reid Kleckner96f8f932014-02-05 17:27:08 +00001861 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00001862 fields.push_back(getAllOnesInt());
Reid Kleckner407e8b62013-03-22 19:02:54 +00001863}
1864
1865llvm::Constant *
1866MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
Reid Kleckner2341ae32013-04-11 18:13:19 +00001867 llvm::SmallVector<llvm::Constant *, 4> fields;
1868 GetNullMemberPointerFields(MPT, fields);
1869 if (fields.size() == 1)
1870 return fields[0];
1871 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields);
1872 assert(Res->getType() == ConvertMemberPointerType(MPT));
1873 return Res;
Reid Kleckner407e8b62013-03-22 19:02:54 +00001874}
1875
1876llvm::Constant *
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001877MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
1878 bool IsMemberFunction,
Reid Kleckner452abac2013-05-09 21:01:17 +00001879 const CXXRecordDecl *RD,
1880 CharUnits NonVirtualBaseAdjustment)
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001881{
David Majnemer1cdd96d2014-01-17 09:01:00 +00001882 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001883
1884 // Single inheritance class member pointer are represented as scalars instead
1885 // of aggregates.
Reid Kleckner96f8f932014-02-05 17:27:08 +00001886 if (MSInheritanceAttr::hasOnlyOneField(IsMemberFunction, Inheritance))
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001887 return FirstField;
1888
Reid Kleckner2341ae32013-04-11 18:13:19 +00001889 llvm::SmallVector<llvm::Constant *, 4> fields;
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001890 fields.push_back(FirstField);
1891
Reid Kleckner96f8f932014-02-05 17:27:08 +00001892 if (MSInheritanceAttr::hasNVOffsetField(IsMemberFunction, Inheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00001893 fields.push_back(llvm::ConstantInt::get(
1894 CGM.IntTy, NonVirtualBaseAdjustment.getQuantity()));
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001895
Reid Kleckner96f8f932014-02-05 17:27:08 +00001896 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance)) {
Reid Kleckneraec44092013-10-15 01:18:02 +00001897 CharUnits Offs = CharUnits::Zero();
1898 if (RD->getNumVBases())
Reid Kleckner5b1b5d52014-01-14 00:50:39 +00001899 Offs = getContext().getASTRecordLayout(RD).getVBPtrOffset();
Reid Kleckneraec44092013-10-15 01:18:02 +00001900 fields.push_back(llvm::ConstantInt::get(CGM.IntTy, Offs.getQuantity()));
Reid Kleckner2341ae32013-04-11 18:13:19 +00001901 }
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001902
1903 // The rest of the fields are adjusted by conversions to a more derived class.
Reid Kleckner96f8f932014-02-05 17:27:08 +00001904 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00001905 fields.push_back(getZeroInt());
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001906
Reid Kleckner2341ae32013-04-11 18:13:19 +00001907 return llvm::ConstantStruct::getAnon(fields);
Reid Kleckner407e8b62013-03-22 19:02:54 +00001908}
1909
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001910llvm::Constant *
1911MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
1912 CharUnits offset) {
David Majnemer1cdd96d2014-01-17 09:01:00 +00001913 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001914 llvm::Constant *FirstField =
1915 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity());
Reid Kleckner452abac2013-05-09 21:01:17 +00001916 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD,
1917 CharUnits::Zero());
1918}
1919
1920llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
1921 return BuildMemberPointer(MD->getParent(), MD, CharUnits::Zero());
1922}
1923
1924llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP,
1925 QualType MPType) {
1926 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
1927 const ValueDecl *MPD = MP.getMemberPointerDecl();
1928 if (!MPD)
1929 return EmitNullMemberPointer(MPT);
1930
1931 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
1932
1933 // FIXME PR15713: Support virtual inheritance paths.
1934
1935 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
David Majnemer1cdd96d2014-01-17 09:01:00 +00001936 return BuildMemberPointer(MPT->getMostRecentCXXRecordDecl(), MD,
1937 ThisAdjustment);
Reid Kleckner452abac2013-05-09 21:01:17 +00001938
1939 CharUnits FieldOffset =
1940 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
1941 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001942}
1943
1944llvm::Constant *
Reid Kleckner452abac2013-05-09 21:01:17 +00001945MicrosoftCXXABI::BuildMemberPointer(const CXXRecordDecl *RD,
1946 const CXXMethodDecl *MD,
1947 CharUnits NonVirtualBaseAdjustment) {
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001948 assert(MD->isInstance() && "Member function must not be static!");
1949 MD = MD->getCanonicalDecl();
David Majnemer1cdd96d2014-01-17 09:01:00 +00001950 RD = RD->getMostRecentDecl();
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001951 CodeGenTypes &Types = CGM.getTypes();
1952
1953 llvm::Constant *FirstField;
Hans Wennborg88497d62013-11-15 17:24:45 +00001954 if (!MD->isVirtual()) {
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001955 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
1956 llvm::Type *Ty;
1957 // Check whether the function has a computable LLVM signature.
1958 if (Types.isFuncTypeConvertible(FPT)) {
1959 // The function has a computable LLVM signature; use the correct type.
1960 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
1961 } else {
1962 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
1963 // function type is incomplete.
1964 Ty = CGM.PtrDiffTy;
1965 }
1966 FirstField = CGM.GetAddrOfFunction(MD, Ty);
1967 FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy);
Hans Wennborg88497d62013-11-15 17:24:45 +00001968 } else {
1969 MicrosoftVTableContext::MethodVFTableLocation ML =
1970 CGM.getMicrosoftVTableContext().getMethodVFTableLocation(MD);
1971 if (MD->isVariadic()) {
1972 CGM.ErrorUnsupported(MD, "pointer to variadic virtual member function");
1973 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
1974 } else if (!CGM.getTypes().isFuncTypeConvertible(
1975 MD->getType()->castAs<FunctionType>())) {
1976 CGM.ErrorUnsupported(MD, "pointer to virtual member function with "
1977 "incomplete return or parameter type");
1978 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
1979 } else if (ML.VBase) {
1980 CGM.ErrorUnsupported(MD, "pointer to virtual member function overriding "
1981 "member function in virtual base class");
1982 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
1983 } else {
Reid Klecknere4a52202014-02-21 02:27:32 +00001984 llvm::Function *Thunk = EmitVirtualMemPtrThunk(MD, ML);
Hans Wennborg88497d62013-11-15 17:24:45 +00001985 FirstField = llvm::ConstantExpr::getBitCast(Thunk, CGM.VoidPtrTy);
Reid Klecknere4a52202014-02-21 02:27:32 +00001986 // Include the vfptr adjustment if the method is in a non-primary vftable.
1987 NonVirtualBaseAdjustment += ML.VFPtrOffset;
Hans Wennborg88497d62013-11-15 17:24:45 +00001988 }
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001989 }
1990
1991 // The rest of the fields are common with data member pointers.
Reid Kleckner452abac2013-05-09 21:01:17 +00001992 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD,
1993 NonVirtualBaseAdjustment);
Reid Kleckner7d0efb52013-05-03 01:15:11 +00001994}
1995
Reid Kleckner700c3ee2013-04-30 20:15:14 +00001996/// Member pointers are the same if they're either bitwise identical *or* both
1997/// null. Null-ness for function members is determined by the first field,
1998/// while for data member pointers we must compare all fields.
1999llvm::Value *
2000MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
2001 llvm::Value *L,
2002 llvm::Value *R,
2003 const MemberPointerType *MPT,
2004 bool Inequality) {
2005 CGBuilderTy &Builder = CGF.Builder;
2006
2007 // Handle != comparisons by switching the sense of all boolean operations.
2008 llvm::ICmpInst::Predicate Eq;
2009 llvm::Instruction::BinaryOps And, Or;
2010 if (Inequality) {
2011 Eq = llvm::ICmpInst::ICMP_NE;
2012 And = llvm::Instruction::Or;
2013 Or = llvm::Instruction::And;
2014 } else {
2015 Eq = llvm::ICmpInst::ICMP_EQ;
2016 And = llvm::Instruction::And;
2017 Or = llvm::Instruction::Or;
2018 }
2019
2020 // If this is a single field member pointer (single inheritance), this is a
2021 // single icmp.
David Majnemer1cdd96d2014-01-17 09:01:00 +00002022 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2023 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
Reid Kleckner96f8f932014-02-05 17:27:08 +00002024 if (MSInheritanceAttr::hasOnlyOneField(MPT->isMemberFunctionPointer(),
2025 Inheritance))
Reid Kleckner700c3ee2013-04-30 20:15:14 +00002026 return Builder.CreateICmp(Eq, L, R);
2027
2028 // Compare the first field.
2029 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0");
2030 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0");
2031 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first");
2032
2033 // Compare everything other than the first field.
Craig Topper8a13c412014-05-21 05:09:00 +00002034 llvm::Value *Res = nullptr;
Reid Kleckner700c3ee2013-04-30 20:15:14 +00002035 llvm::StructType *LType = cast<llvm::StructType>(L->getType());
2036 for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) {
2037 llvm::Value *LF = Builder.CreateExtractValue(L, I);
2038 llvm::Value *RF = Builder.CreateExtractValue(R, I);
2039 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest");
2040 if (Res)
2041 Res = Builder.CreateBinOp(And, Res, Cmp);
2042 else
2043 Res = Cmp;
2044 }
2045
2046 // Check if the first field is 0 if this is a function pointer.
2047 if (MPT->isMemberFunctionPointer()) {
2048 // (l1 == r1 && ...) || l0 == 0
2049 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType());
2050 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero");
2051 Res = Builder.CreateBinOp(Or, Res, IsZero);
2052 }
2053
2054 // Combine the comparison of the first field, which must always be true for
2055 // this comparison to succeeed.
2056 return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp");
2057}
2058
Reid Kleckner407e8b62013-03-22 19:02:54 +00002059llvm::Value *
2060MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
2061 llvm::Value *MemPtr,
2062 const MemberPointerType *MPT) {
2063 CGBuilderTy &Builder = CGF.Builder;
Reid Kleckner2341ae32013-04-11 18:13:19 +00002064 llvm::SmallVector<llvm::Constant *, 4> fields;
2065 // We only need one field for member functions.
2066 if (MPT->isMemberFunctionPointer())
2067 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
2068 else
2069 GetNullMemberPointerFields(MPT, fields);
2070 assert(!fields.empty());
2071 llvm::Value *FirstField = MemPtr;
2072 if (MemPtr->getType()->isStructTy())
2073 FirstField = Builder.CreateExtractValue(MemPtr, 0);
2074 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0");
Reid Kleckner407e8b62013-03-22 19:02:54 +00002075
Reid Kleckner2341ae32013-04-11 18:13:19 +00002076 // For function member pointers, we only need to test the function pointer
2077 // field. The other fields if any can be garbage.
2078 if (MPT->isMemberFunctionPointer())
2079 return Res;
2080
2081 // Otherwise, emit a series of compares and combine the results.
2082 for (int I = 1, E = fields.size(); I < E; ++I) {
2083 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I);
2084 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp");
Reid Kleckner34a38d82014-05-02 00:05:16 +00002085 Res = Builder.CreateOr(Res, Next, "memptr.tobool");
Reid Kleckner2341ae32013-04-11 18:13:19 +00002086 }
2087 return Res;
2088}
2089
Reid Kleckner452abac2013-05-09 21:01:17 +00002090bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT,
2091 llvm::Constant *Val) {
2092 // Function pointers are null if the pointer in the first field is null.
2093 if (MPT->isMemberFunctionPointer()) {
2094 llvm::Constant *FirstField = Val->getType()->isStructTy() ?
2095 Val->getAggregateElement(0U) : Val;
2096 return FirstField->isNullValue();
2097 }
2098
2099 // If it's not a function pointer and it's zero initializable, we can easily
2100 // check zero.
2101 if (isZeroInitializable(MPT) && Val->isNullValue())
2102 return true;
2103
2104 // Otherwise, break down all the fields for comparison. Hopefully these
2105 // little Constants are reused, while a big null struct might not be.
2106 llvm::SmallVector<llvm::Constant *, 4> Fields;
2107 GetNullMemberPointerFields(MPT, Fields);
2108 if (Fields.size() == 1) {
2109 assert(Val->getType()->isIntegerTy());
2110 return Val == Fields[0];
2111 }
2112
2113 unsigned I, E;
2114 for (I = 0, E = Fields.size(); I != E; ++I) {
2115 if (Val->getAggregateElement(I) != Fields[I])
2116 break;
2117 }
2118 return I == E;
2119}
2120
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00002121llvm::Value *
2122MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
2123 llvm::Value *This,
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00002124 llvm::Value *VBPtrOffset,
Timur Iskhodzhanov07e6eff2013-10-27 17:10:27 +00002125 llvm::Value *VBTableOffset,
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00002126 llvm::Value **VBPtrOut) {
2127 CGBuilderTy &Builder = CGF.Builder;
2128 // Load the vbtable pointer from the vbptr in the instance.
2129 This = Builder.CreateBitCast(This, CGM.Int8PtrTy);
2130 llvm::Value *VBPtr =
2131 Builder.CreateInBoundsGEP(This, VBPtrOffset, "vbptr");
2132 if (VBPtrOut) *VBPtrOut = VBPtr;
2133 VBPtr = Builder.CreateBitCast(VBPtr, CGM.Int8PtrTy->getPointerTo(0));
2134 llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable");
2135
2136 // Load an i32 offset from the vb-table.
2137 llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableOffset);
2138 VBaseOffs = Builder.CreateBitCast(VBaseOffs, CGM.Int32Ty->getPointerTo(0));
2139 return Builder.CreateLoad(VBaseOffs, "vbase_offs");
2140}
2141
Reid Kleckner2341ae32013-04-11 18:13:19 +00002142// Returns an adjusted base cast to i8*, since we do more address arithmetic on
2143// it.
David Majnemer2b0d66d2014-02-20 23:22:07 +00002144llvm::Value *MicrosoftCXXABI::AdjustVirtualBase(
2145 CodeGenFunction &CGF, const Expr *E, const CXXRecordDecl *RD,
2146 llvm::Value *Base, llvm::Value *VBTableOffset, llvm::Value *VBPtrOffset) {
Reid Kleckner2341ae32013-04-11 18:13:19 +00002147 CGBuilderTy &Builder = CGF.Builder;
2148 Base = Builder.CreateBitCast(Base, CGM.Int8PtrTy);
Craig Topper8a13c412014-05-21 05:09:00 +00002149 llvm::BasicBlock *OriginalBB = nullptr;
2150 llvm::BasicBlock *SkipAdjustBB = nullptr;
2151 llvm::BasicBlock *VBaseAdjustBB = nullptr;
Reid Kleckner2341ae32013-04-11 18:13:19 +00002152
2153 // In the unspecified inheritance model, there might not be a vbtable at all,
2154 // in which case we need to skip the virtual base lookup. If there is a
2155 // vbtable, the first entry is a no-op entry that gives back the original
2156 // base, so look for a virtual base adjustment offset of zero.
2157 if (VBPtrOffset) {
2158 OriginalBB = Builder.GetInsertBlock();
2159 VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust");
2160 SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust");
2161 llvm::Value *IsVirtual =
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00002162 Builder.CreateICmpNE(VBTableOffset, getZeroInt(),
Reid Kleckner2341ae32013-04-11 18:13:19 +00002163 "memptr.is_vbase");
2164 Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB);
2165 CGF.EmitBlock(VBaseAdjustBB);
Reid Kleckner407e8b62013-03-22 19:02:54 +00002166 }
2167
Reid Kleckner2341ae32013-04-11 18:13:19 +00002168 // If we weren't given a dynamic vbptr offset, RD should be complete and we'll
2169 // know the vbptr offset.
2170 if (!VBPtrOffset) {
Reid Klecknerd8cbeec2013-05-29 18:02:47 +00002171 CharUnits offs = CharUnits::Zero();
David Majnemer2b0d66d2014-02-20 23:22:07 +00002172 if (!RD->hasDefinition()) {
2173 DiagnosticsEngine &Diags = CGF.CGM.getDiags();
2174 unsigned DiagID = Diags.getCustomDiagID(
2175 DiagnosticsEngine::Error,
2176 "member pointer representation requires a "
2177 "complete class type for %0 to perform this expression");
2178 Diags.Report(E->getExprLoc(), DiagID) << RD << E->getSourceRange();
2179 } else if (RD->getNumVBases())
Reid Kleckner5b1b5d52014-01-14 00:50:39 +00002180 offs = getContext().getASTRecordLayout(RD).getVBPtrOffset();
Reid Kleckner2341ae32013-04-11 18:13:19 +00002181 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity());
2182 }
Craig Topper8a13c412014-05-21 05:09:00 +00002183 llvm::Value *VBPtr = nullptr;
Reid Kleckner2341ae32013-04-11 18:13:19 +00002184 llvm::Value *VBaseOffs =
Timur Iskhodzhanov07e6eff2013-10-27 17:10:27 +00002185 GetVBaseOffsetFromVBPtr(CGF, Base, VBPtrOffset, VBTableOffset, &VBPtr);
Reid Kleckner2341ae32013-04-11 18:13:19 +00002186 llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs);
2187
2188 // Merge control flow with the case where we didn't have to adjust.
2189 if (VBaseAdjustBB) {
2190 Builder.CreateBr(SkipAdjustBB);
2191 CGF.EmitBlock(SkipAdjustBB);
2192 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base");
2193 Phi->addIncoming(Base, OriginalBB);
2194 Phi->addIncoming(AdjustedBase, VBaseAdjustBB);
2195 return Phi;
2196 }
2197 return AdjustedBase;
Reid Kleckner407e8b62013-03-22 19:02:54 +00002198}
2199
David Majnemer2b0d66d2014-02-20 23:22:07 +00002200llvm::Value *MicrosoftCXXABI::EmitMemberDataPointerAddress(
2201 CodeGenFunction &CGF, const Expr *E, llvm::Value *Base, llvm::Value *MemPtr,
2202 const MemberPointerType *MPT) {
Reid Kleckner2341ae32013-04-11 18:13:19 +00002203 assert(MPT->isMemberDataPointer());
Reid Kleckner407e8b62013-03-22 19:02:54 +00002204 unsigned AS = Base->getType()->getPointerAddressSpace();
2205 llvm::Type *PType =
2206 CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
2207 CGBuilderTy &Builder = CGF.Builder;
David Majnemer1cdd96d2014-01-17 09:01:00 +00002208 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
2209 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
Reid Kleckner407e8b62013-03-22 19:02:54 +00002210
Reid Kleckner2341ae32013-04-11 18:13:19 +00002211 // Extract the fields we need, regardless of model. We'll apply them if we
2212 // have them.
2213 llvm::Value *FieldOffset = MemPtr;
Craig Topper8a13c412014-05-21 05:09:00 +00002214 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2215 llvm::Value *VBPtrOffset = nullptr;
Reid Kleckner2341ae32013-04-11 18:13:19 +00002216 if (MemPtr->getType()->isStructTy()) {
2217 // We need to extract values.
2218 unsigned I = 0;
2219 FieldOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002220 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00002221 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002222 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00002223 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner407e8b62013-03-22 19:02:54 +00002224 }
2225
Reid Kleckner2341ae32013-04-11 18:13:19 +00002226 if (VirtualBaseAdjustmentOffset) {
David Majnemer2b0d66d2014-02-20 23:22:07 +00002227 Base = AdjustVirtualBase(CGF, E, RD, Base, VirtualBaseAdjustmentOffset,
Reid Kleckner2341ae32013-04-11 18:13:19 +00002228 VBPtrOffset);
Reid Kleckner407e8b62013-03-22 19:02:54 +00002229 }
Reid Klecknerae945122013-12-05 22:44:07 +00002230
2231 // Cast to char*.
2232 Base = Builder.CreateBitCast(Base, Builder.getInt8Ty()->getPointerTo(AS));
2233
2234 // Apply the offset, which we assume is non-null.
Reid Kleckner2341ae32013-04-11 18:13:19 +00002235 llvm::Value *Addr =
2236 Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset");
Reid Kleckner407e8b62013-03-22 19:02:54 +00002237
2238 // Cast the address to the appropriate pointer type, adopting the address
2239 // space of the base pointer.
2240 return Builder.CreateBitCast(Addr, PType);
2241}
2242
David Majnemer1cdd96d2014-01-17 09:01:00 +00002243static MSInheritanceAttr::Spelling
Reid Kleckner452abac2013-05-09 21:01:17 +00002244getInheritanceFromMemptr(const MemberPointerType *MPT) {
David Majnemer1cdd96d2014-01-17 09:01:00 +00002245 return MPT->getMostRecentCXXRecordDecl()->getMSInheritanceModel();
Reid Kleckner452abac2013-05-09 21:01:17 +00002246}
2247
2248llvm::Value *
2249MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
2250 const CastExpr *E,
2251 llvm::Value *Src) {
2252 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
2253 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
2254 E->getCastKind() == CK_ReinterpretMemberPointer);
2255
2256 // Use constant emission if we can.
2257 if (isa<llvm::Constant>(Src))
2258 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src));
2259
2260 // We may be adding or dropping fields from the member pointer, so we need
2261 // both types and the inheritance models of both records.
2262 const MemberPointerType *SrcTy =
2263 E->getSubExpr()->getType()->castAs<MemberPointerType>();
2264 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
Reid Kleckner452abac2013-05-09 21:01:17 +00002265 bool IsFunc = SrcTy->isMemberFunctionPointer();
2266
2267 // If the classes use the same null representation, reinterpret_cast is a nop.
2268 bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer;
David Majnemer1cdd96d2014-01-17 09:01:00 +00002269 if (IsReinterpret && IsFunc)
2270 return Src;
2271
2272 CXXRecordDecl *SrcRD = SrcTy->getMostRecentCXXRecordDecl();
2273 CXXRecordDecl *DstRD = DstTy->getMostRecentCXXRecordDecl();
2274 if (IsReinterpret &&
Reid Kleckner96f8f932014-02-05 17:27:08 +00002275 SrcRD->nullFieldOffsetIsZero() == DstRD->nullFieldOffsetIsZero())
Reid Kleckner452abac2013-05-09 21:01:17 +00002276 return Src;
2277
2278 CGBuilderTy &Builder = CGF.Builder;
2279
2280 // Branch past the conversion if Src is null.
2281 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy);
2282 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy);
2283
2284 // C++ 5.2.10p9: The null member pointer value is converted to the null member
2285 // pointer value of the destination type.
2286 if (IsReinterpret) {
2287 // For reinterpret casts, sema ensures that src and dst are both functions
2288 // or data and have the same size, which means the LLVM types should match.
2289 assert(Src->getType() == DstNull->getType());
2290 return Builder.CreateSelect(IsNotNull, Src, DstNull);
2291 }
2292
2293 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock();
2294 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert");
2295 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted");
2296 Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB);
2297 CGF.EmitBlock(ConvertBB);
2298
2299 // Decompose src.
2300 llvm::Value *FirstField = Src;
Craig Topper8a13c412014-05-21 05:09:00 +00002301 llvm::Value *NonVirtualBaseAdjustment = nullptr;
2302 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2303 llvm::Value *VBPtrOffset = nullptr;
David Majnemer1cdd96d2014-01-17 09:01:00 +00002304 MSInheritanceAttr::Spelling SrcInheritance = SrcRD->getMSInheritanceModel();
Reid Kleckner96f8f932014-02-05 17:27:08 +00002305 if (!MSInheritanceAttr::hasOnlyOneField(IsFunc, SrcInheritance)) {
Reid Kleckner452abac2013-05-09 21:01:17 +00002306 // We need to extract values.
2307 unsigned I = 0;
2308 FirstField = Builder.CreateExtractValue(Src, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002309 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, SrcInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002310 NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002311 if (MSInheritanceAttr::hasVBPtrOffsetField(SrcInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002312 VBPtrOffset = Builder.CreateExtractValue(Src, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002313 if (MSInheritanceAttr::hasVBTableOffsetField(SrcInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002314 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++);
2315 }
2316
2317 // For data pointers, we adjust the field offset directly. For functions, we
2318 // have a separate field.
2319 llvm::Constant *Adj = getMemberPointerAdjustment(E);
2320 if (Adj) {
2321 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
2322 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField;
2323 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
2324 if (!NVAdjustField) // If this field didn't exist in src, it's zero.
2325 NVAdjustField = getZeroInt();
2326 if (isDerivedToBase)
2327 NVAdjustField = Builder.CreateNSWSub(NVAdjustField, Adj, "adj");
2328 else
2329 NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, Adj, "adj");
2330 }
2331
2332 // FIXME PR15713: Support conversions through virtually derived classes.
2333
2334 // Recompose dst from the null struct and the adjusted fields from src.
David Majnemer1cdd96d2014-01-17 09:01:00 +00002335 MSInheritanceAttr::Spelling DstInheritance = DstRD->getMSInheritanceModel();
Reid Kleckner452abac2013-05-09 21:01:17 +00002336 llvm::Value *Dst;
Reid Kleckner96f8f932014-02-05 17:27:08 +00002337 if (MSInheritanceAttr::hasOnlyOneField(IsFunc, DstInheritance)) {
Reid Kleckner452abac2013-05-09 21:01:17 +00002338 Dst = FirstField;
2339 } else {
2340 Dst = llvm::UndefValue::get(DstNull->getType());
2341 unsigned Idx = 0;
2342 Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002343 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, DstInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002344 Dst = Builder.CreateInsertValue(
2345 Dst, getValueOrZeroInt(NonVirtualBaseAdjustment), Idx++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002346 if (MSInheritanceAttr::hasVBPtrOffsetField(DstInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002347 Dst = Builder.CreateInsertValue(
2348 Dst, getValueOrZeroInt(VBPtrOffset), Idx++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002349 if (MSInheritanceAttr::hasVBTableOffsetField(DstInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002350 Dst = Builder.CreateInsertValue(
2351 Dst, getValueOrZeroInt(VirtualBaseAdjustmentOffset), Idx++);
2352 }
2353 Builder.CreateBr(ContinueBB);
2354
2355 // In the continuation, choose between DstNull and Dst.
2356 CGF.EmitBlock(ContinueBB);
2357 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted");
2358 Phi->addIncoming(DstNull, OriginalBB);
2359 Phi->addIncoming(Dst, ConvertBB);
2360 return Phi;
2361}
2362
2363llvm::Constant *
2364MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E,
2365 llvm::Constant *Src) {
2366 const MemberPointerType *SrcTy =
2367 E->getSubExpr()->getType()->castAs<MemberPointerType>();
2368 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
2369
2370 // If src is null, emit a new null for dst. We can't return src because dst
2371 // might have a new representation.
2372 if (MemberPointerConstantIsNull(SrcTy, Src))
2373 return EmitNullMemberPointer(DstTy);
2374
2375 // We don't need to do anything for reinterpret_casts of non-null member
2376 // pointers. We should only get here when the two type representations have
2377 // the same size.
2378 if (E->getCastKind() == CK_ReinterpretMemberPointer)
2379 return Src;
2380
David Majnemer1cdd96d2014-01-17 09:01:00 +00002381 MSInheritanceAttr::Spelling SrcInheritance = getInheritanceFromMemptr(SrcTy);
2382 MSInheritanceAttr::Spelling DstInheritance = getInheritanceFromMemptr(DstTy);
Reid Kleckner452abac2013-05-09 21:01:17 +00002383
2384 // Decompose src.
2385 llvm::Constant *FirstField = Src;
Craig Topper8a13c412014-05-21 05:09:00 +00002386 llvm::Constant *NonVirtualBaseAdjustment = nullptr;
2387 llvm::Constant *VirtualBaseAdjustmentOffset = nullptr;
2388 llvm::Constant *VBPtrOffset = nullptr;
Reid Kleckner452abac2013-05-09 21:01:17 +00002389 bool IsFunc = SrcTy->isMemberFunctionPointer();
Reid Kleckner96f8f932014-02-05 17:27:08 +00002390 if (!MSInheritanceAttr::hasOnlyOneField(IsFunc, SrcInheritance)) {
Reid Kleckner452abac2013-05-09 21:01:17 +00002391 // We need to extract values.
2392 unsigned I = 0;
2393 FirstField = Src->getAggregateElement(I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002394 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, SrcInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002395 NonVirtualBaseAdjustment = Src->getAggregateElement(I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002396 if (MSInheritanceAttr::hasVBPtrOffsetField(SrcInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002397 VBPtrOffset = Src->getAggregateElement(I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002398 if (MSInheritanceAttr::hasVBTableOffsetField(SrcInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002399 VirtualBaseAdjustmentOffset = Src->getAggregateElement(I++);
2400 }
2401
2402 // For data pointers, we adjust the field offset directly. For functions, we
2403 // have a separate field.
2404 llvm::Constant *Adj = getMemberPointerAdjustment(E);
2405 if (Adj) {
2406 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
2407 llvm::Constant *&NVAdjustField =
2408 IsFunc ? NonVirtualBaseAdjustment : FirstField;
2409 bool IsDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
2410 if (!NVAdjustField) // If this field didn't exist in src, it's zero.
2411 NVAdjustField = getZeroInt();
2412 if (IsDerivedToBase)
2413 NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj);
2414 else
2415 NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj);
2416 }
2417
2418 // FIXME PR15713: Support conversions through virtually derived classes.
2419
2420 // Recompose dst from the null struct and the adjusted fields from src.
Reid Kleckner96f8f932014-02-05 17:27:08 +00002421 if (MSInheritanceAttr::hasOnlyOneField(IsFunc, DstInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002422 return FirstField;
2423
2424 llvm::SmallVector<llvm::Constant *, 4> Fields;
2425 Fields.push_back(FirstField);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002426 if (MSInheritanceAttr::hasNVOffsetField(IsFunc, DstInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002427 Fields.push_back(getConstantOrZeroInt(NonVirtualBaseAdjustment));
Reid Kleckner96f8f932014-02-05 17:27:08 +00002428 if (MSInheritanceAttr::hasVBPtrOffsetField(DstInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002429 Fields.push_back(getConstantOrZeroInt(VBPtrOffset));
Reid Kleckner96f8f932014-02-05 17:27:08 +00002430 if (MSInheritanceAttr::hasVBTableOffsetField(DstInheritance))
Reid Kleckner452abac2013-05-09 21:01:17 +00002431 Fields.push_back(getConstantOrZeroInt(VirtualBaseAdjustmentOffset));
2432 return llvm::ConstantStruct::getAnon(Fields);
2433}
2434
David Majnemer2b0d66d2014-02-20 23:22:07 +00002435llvm::Value *MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(
2436 CodeGenFunction &CGF, const Expr *E, llvm::Value *&This,
2437 llvm::Value *MemPtr, const MemberPointerType *MPT) {
Reid Kleckner2341ae32013-04-11 18:13:19 +00002438 assert(MPT->isMemberFunctionPointer());
2439 const FunctionProtoType *FPT =
2440 MPT->getPointeeType()->castAs<FunctionProtoType>();
David Majnemer1cdd96d2014-01-17 09:01:00 +00002441 const CXXRecordDecl *RD = MPT->getMostRecentCXXRecordDecl();
Reid Kleckner2341ae32013-04-11 18:13:19 +00002442 llvm::FunctionType *FTy =
2443 CGM.getTypes().GetFunctionType(
2444 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
2445 CGBuilderTy &Builder = CGF.Builder;
2446
David Majnemer1cdd96d2014-01-17 09:01:00 +00002447 MSInheritanceAttr::Spelling Inheritance = RD->getMSInheritanceModel();
Reid Kleckner2341ae32013-04-11 18:13:19 +00002448
2449 // Extract the fields we need, regardless of model. We'll apply them if we
2450 // have them.
2451 llvm::Value *FunctionPointer = MemPtr;
Craig Topper8a13c412014-05-21 05:09:00 +00002452 llvm::Value *NonVirtualBaseAdjustment = nullptr;
2453 llvm::Value *VirtualBaseAdjustmentOffset = nullptr;
2454 llvm::Value *VBPtrOffset = nullptr;
Reid Kleckner2341ae32013-04-11 18:13:19 +00002455 if (MemPtr->getType()->isStructTy()) {
2456 // We need to extract values.
2457 unsigned I = 0;
2458 FunctionPointer = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002459 if (MSInheritanceAttr::hasNVOffsetField(MPT, Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00002460 NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002461 if (MSInheritanceAttr::hasVBPtrOffsetField(Inheritance))
Reid Kleckner7d0efb52013-05-03 01:15:11 +00002462 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner96f8f932014-02-05 17:27:08 +00002463 if (MSInheritanceAttr::hasVBTableOffsetField(Inheritance))
Reid Kleckner2341ae32013-04-11 18:13:19 +00002464 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
2465 }
2466
2467 if (VirtualBaseAdjustmentOffset) {
David Majnemer2b0d66d2014-02-20 23:22:07 +00002468 This = AdjustVirtualBase(CGF, E, RD, This, VirtualBaseAdjustmentOffset,
Reid Kleckner2341ae32013-04-11 18:13:19 +00002469 VBPtrOffset);
2470 }
2471
2472 if (NonVirtualBaseAdjustment) {
2473 // Apply the adjustment and cast back to the original struct type.
2474 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
2475 Ptr = Builder.CreateInBoundsGEP(Ptr, NonVirtualBaseAdjustment);
2476 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
2477 }
2478
2479 return Builder.CreateBitCast(FunctionPointer, FTy->getPointerTo());
2480}
2481
Charles Davis53c59df2010-08-16 03:33:14 +00002482CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
Charles Davis74ce8592010-06-09 23:25:41 +00002483 return new MicrosoftCXXABI(CGM);
2484}
David Majnemere2cb8d12014-07-07 06:20:47 +00002485
2486// MS RTTI Overview:
2487// The run time type information emitted by cl.exe contains 5 distinct types of
2488// structures. Many of them reference each other.
2489//
2490// TypeInfo: Static classes that are returned by typeid.
2491//
2492// CompleteObjectLocator: Referenced by vftables. They contain information
2493// required for dynamic casting, including OffsetFromTop. They also contain
2494// a reference to the TypeInfo for the type and a reference to the
2495// CompleteHierarchyDescriptor for the type.
2496//
2497// ClassHieararchyDescriptor: Contains information about a class hierarchy.
2498// Used during dynamic_cast to walk a class hierarchy. References a base
2499// class array and the size of said array.
2500//
2501// BaseClassArray: Contains a list of classes in a hierarchy. BaseClassArray is
2502// somewhat of a misnomer because the most derived class is also in the list
2503// as well as multiple copies of virtual bases (if they occur multiple times
2504// in the hiearchy.) The BaseClassArray contains one BaseClassDescriptor for
2505// every path in the hierarchy, in pre-order depth first order. Note, we do
2506// not declare a specific llvm type for BaseClassArray, it's merely an array
2507// of BaseClassDescriptor pointers.
2508//
2509// BaseClassDescriptor: Contains information about a class in a class hierarchy.
2510// BaseClassDescriptor is also somewhat of a misnomer for the same reason that
2511// BaseClassArray is. It contains information about a class within a
2512// hierarchy such as: is this base is ambiguous and what is its offset in the
2513// vbtable. The names of the BaseClassDescriptors have all of their fields
2514// mangled into them so they can be aggressively deduplicated by the linker.
2515
David Majnemere2cb8d12014-07-07 06:20:47 +00002516static llvm::GlobalVariable *getTypeInfoVTable(CodeGenModule &CGM) {
2517 StringRef MangledName("\01??_7type_info@@6B@");
2518 if (auto VTable = CGM.getModule().getNamedGlobal(MangledName))
2519 return VTable;
2520 return new llvm::GlobalVariable(CGM.getModule(), CGM.Int8PtrTy,
2521 /*Constant=*/true,
2522 llvm::GlobalVariable::ExternalLinkage,
2523 /*Initializer=*/nullptr, MangledName);
2524}
2525
2526namespace {
2527
2528/// \brief A Helper struct that stores information about a class in a class
2529/// hierarchy. The information stored in these structs struct is used during
2530/// the generation of ClassHierarchyDescriptors and BaseClassDescriptors.
2531// During RTTI creation, MSRTTIClasses are stored in a contiguous array with
2532// implicit depth first pre-order tree connectivity. getFirstChild and
2533// getNextSibling allow us to walk the tree efficiently.
2534struct MSRTTIClass {
2535 enum {
2536 IsPrivateOnPath = 1 | 8,
2537 IsAmbiguous = 2,
2538 IsPrivate = 4,
2539 IsVirtual = 16,
2540 HasHierarchyDescriptor = 64
2541 };
2542 MSRTTIClass(const CXXRecordDecl *RD) : RD(RD) {}
2543 uint32_t initialize(const MSRTTIClass *Parent,
2544 const CXXBaseSpecifier *Specifier);
2545
2546 MSRTTIClass *getFirstChild() { return this + 1; }
2547 static MSRTTIClass *getNextChild(MSRTTIClass *Child) {
2548 return Child + 1 + Child->NumBases;
2549 }
2550
2551 const CXXRecordDecl *RD, *VirtualRoot;
2552 uint32_t Flags, NumBases, OffsetInVBase;
2553};
2554
2555/// \brief Recursively initialize the base class array.
2556uint32_t MSRTTIClass::initialize(const MSRTTIClass *Parent,
2557 const CXXBaseSpecifier *Specifier) {
2558 Flags = HasHierarchyDescriptor;
2559 if (!Parent) {
2560 VirtualRoot = nullptr;
2561 OffsetInVBase = 0;
2562 } else {
2563 if (Specifier->getAccessSpecifier() != AS_public)
2564 Flags |= IsPrivate | IsPrivateOnPath;
2565 if (Specifier->isVirtual()) {
2566 Flags |= IsVirtual;
2567 VirtualRoot = RD;
2568 OffsetInVBase = 0;
2569 } else {
2570 if (Parent->Flags & IsPrivateOnPath)
2571 Flags |= IsPrivateOnPath;
2572 VirtualRoot = Parent->VirtualRoot;
2573 OffsetInVBase = Parent->OffsetInVBase + RD->getASTContext()
2574 .getASTRecordLayout(Parent->RD).getBaseClassOffset(RD).getQuantity();
2575 }
2576 }
2577 NumBases = 0;
2578 MSRTTIClass *Child = getFirstChild();
2579 for (const CXXBaseSpecifier &Base : RD->bases()) {
2580 NumBases += Child->initialize(this, &Base) + 1;
2581 Child = getNextChild(Child);
2582 }
2583 return NumBases;
2584}
2585
2586static llvm::GlobalValue::LinkageTypes getLinkageForRTTI(QualType Ty) {
2587 switch (Ty->getLinkage()) {
2588 case NoLinkage:
2589 case InternalLinkage:
2590 case UniqueExternalLinkage:
2591 return llvm::GlobalValue::InternalLinkage;
2592
2593 case VisibleNoLinkage:
2594 case ExternalLinkage:
2595 return llvm::GlobalValue::LinkOnceODRLinkage;
2596 }
2597 llvm_unreachable("Invalid linkage!");
2598}
2599
2600/// \brief An ephemeral helper class for building MS RTTI types. It caches some
2601/// calls to the module and information about the most derived class in a
2602/// hierarchy.
2603struct MSRTTIBuilder {
2604 enum {
2605 HasBranchingHierarchy = 1,
2606 HasVirtualBranchingHierarchy = 2,
2607 HasAmbiguousBases = 4
2608 };
2609
David Majnemer611cdb92014-07-07 08:09:15 +00002610 MSRTTIBuilder(MicrosoftCXXABI &ABI, const CXXRecordDecl *RD)
2611 : CGM(ABI.CGM), Context(CGM.getContext()),
2612 VMContext(CGM.getLLVMContext()), Module(CGM.getModule()), RD(RD),
David Majnemere2cb8d12014-07-07 06:20:47 +00002613 Linkage(getLinkageForRTTI(CGM.getContext().getTagDeclType(RD))),
David Majnemer611cdb92014-07-07 08:09:15 +00002614 ABI(ABI) {}
David Majnemere2cb8d12014-07-07 06:20:47 +00002615
2616 llvm::GlobalVariable *getBaseClassDescriptor(const MSRTTIClass &Classes);
2617 llvm::GlobalVariable *
2618 getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes);
2619 llvm::GlobalVariable *getClassHierarchyDescriptor();
2620 llvm::GlobalVariable *getCompleteObjectLocator(const VPtrInfo *Info);
2621
2622 CodeGenModule &CGM;
2623 ASTContext &Context;
2624 llvm::LLVMContext &VMContext;
2625 llvm::Module &Module;
2626 const CXXRecordDecl *RD;
2627 llvm::GlobalVariable::LinkageTypes Linkage;
David Majnemer611cdb92014-07-07 08:09:15 +00002628 MicrosoftCXXABI &ABI;
David Majnemere2cb8d12014-07-07 06:20:47 +00002629};
2630
2631} // namespace
2632
2633/// \brief Recursively serializes a class hierarchy in pre-order depth first
2634/// order.
2635static void serializeClassHierarchy(SmallVectorImpl<MSRTTIClass> &Classes,
2636 const CXXRecordDecl *RD) {
2637 Classes.push_back(MSRTTIClass(RD));
2638 for (const CXXBaseSpecifier &Base : RD->bases())
2639 serializeClassHierarchy(Classes, Base.getType()->getAsCXXRecordDecl());
2640}
2641
2642/// \brief Find ambiguity among base classes.
2643static void
2644detectAmbiguousBases(SmallVectorImpl<MSRTTIClass> &Classes) {
2645 llvm::SmallPtrSet<const CXXRecordDecl *, 8> VirtualBases;
2646 llvm::SmallPtrSet<const CXXRecordDecl *, 8> UniqueBases;
2647 llvm::SmallPtrSet<const CXXRecordDecl *, 8> AmbiguousBases;
2648 for (MSRTTIClass *Class = &Classes.front(); Class <= &Classes.back();) {
2649 if ((Class->Flags & MSRTTIClass::IsVirtual) &&
2650 !VirtualBases.insert(Class->RD)) {
2651 Class = MSRTTIClass::getNextChild(Class);
2652 continue;
2653 }
2654 if (!UniqueBases.insert(Class->RD))
2655 AmbiguousBases.insert(Class->RD);
2656 Class++;
2657 }
2658 if (AmbiguousBases.empty())
2659 return;
2660 for (MSRTTIClass &Class : Classes)
2661 if (AmbiguousBases.count(Class.RD))
2662 Class.Flags |= MSRTTIClass::IsAmbiguous;
2663}
2664
2665llvm::GlobalVariable *MSRTTIBuilder::getClassHierarchyDescriptor() {
2666 SmallString<256> MangledName;
2667 {
2668 llvm::raw_svector_ostream Out(MangledName);
David Majnemer611cdb92014-07-07 08:09:15 +00002669 ABI.getMangleContext().mangleCXXRTTIClassHierarchyDescriptor(RD, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002670 }
2671
2672 // Check to see if we've already declared this ClassHierarchyDescriptor.
2673 if (auto CHD = Module.getNamedGlobal(MangledName))
2674 return CHD;
2675
2676 // Serialize the class hierarchy and initialize the CHD Fields.
2677 SmallVector<MSRTTIClass, 8> Classes;
2678 serializeClassHierarchy(Classes, RD);
2679 Classes.front().initialize(/*Parent=*/nullptr, /*Specifier=*/nullptr);
2680 detectAmbiguousBases(Classes);
2681 int Flags = 0;
2682 for (auto Class : Classes) {
2683 if (Class.RD->getNumBases() > 1)
2684 Flags |= HasBranchingHierarchy;
2685 // Note: cl.exe does not calculate "HasAmbiguousBases" correctly. We
2686 // believe the field isn't actually used.
2687 if (Class.Flags & MSRTTIClass::IsAmbiguous)
2688 Flags |= HasAmbiguousBases;
2689 }
2690 if ((Flags & HasBranchingHierarchy) && RD->getNumVBases() != 0)
2691 Flags |= HasVirtualBranchingHierarchy;
2692 // These gep indices are used to get the address of the first element of the
2693 // base class array.
2694 llvm::Value *GEPIndices[] = {llvm::ConstantInt::get(CGM.IntTy, 0),
2695 llvm::ConstantInt::get(CGM.IntTy, 0)};
2696
2697 // Forward-declare the class hierarchy descriptor
David Majnemer611cdb92014-07-07 08:09:15 +00002698 auto Type = ABI.getClassHierarchyDescriptorType();
David Majnemere2cb8d12014-07-07 06:20:47 +00002699 auto CHD = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
2700 /*Initializer=*/nullptr,
2701 MangledName.c_str());
2702
2703 // Initialize the base class ClassHierarchyDescriptor.
2704 llvm::Constant *Fields[] = {
David Majnemer611cdb92014-07-07 08:09:15 +00002705 llvm::ConstantInt::get(CGM.IntTy, 0), // Unknown
2706 llvm::ConstantInt::get(CGM.IntTy, Flags),
2707 llvm::ConstantInt::get(CGM.IntTy, Classes.size()),
2708 ABI.getImageRelativeConstant(llvm::ConstantExpr::getInBoundsGetElementPtr(
2709 getBaseClassArray(Classes),
2710 llvm::ArrayRef<llvm::Value *>(GEPIndices))),
David Majnemere2cb8d12014-07-07 06:20:47 +00002711 };
2712 CHD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
2713 return CHD;
2714}
2715
2716llvm::GlobalVariable *
2717MSRTTIBuilder::getBaseClassArray(SmallVectorImpl<MSRTTIClass> &Classes) {
2718 SmallString<256> MangledName;
2719 {
2720 llvm::raw_svector_ostream Out(MangledName);
David Majnemer611cdb92014-07-07 08:09:15 +00002721 ABI.getMangleContext().mangleCXXRTTIBaseClassArray(RD, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002722 }
2723
2724 // Forward-declare the base class array.
2725 // cl.exe pads the base class array with 1 (in 32 bit mode) or 4 (in 64 bit
2726 // mode) bytes of padding. We provide a pointer sized amount of padding by
2727 // adding +1 to Classes.size(). The sections have pointer alignment and are
2728 // marked pick-any so it shouldn't matter.
David Majnemer26a90f82014-07-07 15:29:10 +00002729 llvm::Type *PtrType = ABI.getImageRelativeType(
David Majnemer611cdb92014-07-07 08:09:15 +00002730 ABI.getBaseClassDescriptorType()->getPointerTo());
David Majnemer26a90f82014-07-07 15:29:10 +00002731 auto *ArrType = llvm::ArrayType::get(PtrType, Classes.size() + 1);
2732 auto *BCA = new llvm::GlobalVariable(
2733 Module, ArrType,
David Majnemere2cb8d12014-07-07 06:20:47 +00002734 /*Constant=*/true, Linkage, /*Initializer=*/nullptr, MangledName.c_str());
2735
2736 // Initialize the BaseClassArray.
2737 SmallVector<llvm::Constant *, 8> BaseClassArrayData;
2738 for (MSRTTIClass &Class : Classes)
2739 BaseClassArrayData.push_back(
David Majnemer611cdb92014-07-07 08:09:15 +00002740 ABI.getImageRelativeConstant(getBaseClassDescriptor(Class)));
David Majnemere2cb8d12014-07-07 06:20:47 +00002741 BaseClassArrayData.push_back(llvm::Constant::getNullValue(PtrType));
David Majnemer26a90f82014-07-07 15:29:10 +00002742 BCA->setInitializer(llvm::ConstantArray::get(ArrType, BaseClassArrayData));
David Majnemere2cb8d12014-07-07 06:20:47 +00002743 return BCA;
2744}
2745
2746llvm::GlobalVariable *
2747MSRTTIBuilder::getBaseClassDescriptor(const MSRTTIClass &Class) {
2748 // Compute the fields for the BaseClassDescriptor. They are computed up front
2749 // because they are mangled into the name of the object.
2750 uint32_t OffsetInVBTable = 0;
2751 int32_t VBPtrOffset = -1;
2752 if (Class.VirtualRoot) {
2753 auto &VTableContext = CGM.getMicrosoftVTableContext();
2754 OffsetInVBTable = VTableContext.getVBTableIndex(RD, Class.VirtualRoot) * 4;
2755 VBPtrOffset = Context.getASTRecordLayout(RD).getVBPtrOffset().getQuantity();
2756 }
2757
2758 SmallString<256> MangledName;
2759 {
2760 llvm::raw_svector_ostream Out(MangledName);
David Majnemer611cdb92014-07-07 08:09:15 +00002761 ABI.getMangleContext().mangleCXXRTTIBaseClassDescriptor(
2762 Class.RD, Class.OffsetInVBase, VBPtrOffset, OffsetInVBTable,
2763 Class.Flags, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002764 }
2765
David Majnemer26a90f82014-07-07 15:29:10 +00002766 // Check to see if we've already declared this object.
David Majnemere2cb8d12014-07-07 06:20:47 +00002767 if (auto BCD = Module.getNamedGlobal(MangledName))
2768 return BCD;
2769
2770 // Forward-declare the base class descriptor.
David Majnemer611cdb92014-07-07 08:09:15 +00002771 auto Type = ABI.getBaseClassDescriptorType();
David Majnemere2cb8d12014-07-07 06:20:47 +00002772 auto BCD = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
2773 /*Initializer=*/nullptr,
2774 MangledName.c_str());
2775
2776 // Initialize the BaseClassDescriptor.
2777 llvm::Constant *Fields[] = {
David Majnemer611cdb92014-07-07 08:09:15 +00002778 ABI.getImageRelativeConstant(
David Majnemerccef89d2014-07-07 15:29:16 +00002779 ABI.getAddrOfRTTIDescriptor(Context.getTypeDeclType(Class.RD))),
David Majnemer611cdb92014-07-07 08:09:15 +00002780 llvm::ConstantInt::get(CGM.IntTy, Class.NumBases),
2781 llvm::ConstantInt::get(CGM.IntTy, Class.OffsetInVBase),
2782 llvm::ConstantInt::get(CGM.IntTy, VBPtrOffset),
2783 llvm::ConstantInt::get(CGM.IntTy, OffsetInVBTable),
2784 llvm::ConstantInt::get(CGM.IntTy, Class.Flags),
2785 ABI.getImageRelativeConstant(
2786 MSRTTIBuilder(ABI, Class.RD).getClassHierarchyDescriptor()),
David Majnemere2cb8d12014-07-07 06:20:47 +00002787 };
2788 BCD->setInitializer(llvm::ConstantStruct::get(Type, Fields));
2789 return BCD;
2790}
2791
2792llvm::GlobalVariable *
2793MSRTTIBuilder::getCompleteObjectLocator(const VPtrInfo *Info) {
2794 SmallString<256> MangledName;
2795 {
2796 llvm::raw_svector_ostream Out(MangledName);
David Majnemer611cdb92014-07-07 08:09:15 +00002797 ABI.getMangleContext().mangleCXXRTTICompleteObjectLocator(RD, Info->MangledPath, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002798 }
2799
2800 // Check to see if we've already computed this complete object locator.
2801 if (auto COL = Module.getNamedGlobal(MangledName))
2802 return COL;
2803
2804 // Compute the fields of the complete object locator.
2805 int OffsetToTop = Info->FullOffsetInMDC.getQuantity();
2806 int VFPtrOffset = 0;
2807 // The offset includes the vtordisp if one exists.
2808 if (const CXXRecordDecl *VBase = Info->getVBaseWithVPtr())
2809 if (Context.getASTRecordLayout(RD)
2810 .getVBaseOffsetsMap()
2811 .find(VBase)
2812 ->second.hasVtorDisp())
2813 VFPtrOffset = Info->NonVirtualOffset.getQuantity() + 4;
2814
2815 // Forward-declare the complete object locator.
David Majnemer611cdb92014-07-07 08:09:15 +00002816 llvm::StructType *Type = ABI.getCompleteObjectLocatorType();
David Majnemere2cb8d12014-07-07 06:20:47 +00002817 auto COL = new llvm::GlobalVariable(Module, Type, /*Constant=*/true, Linkage,
2818 /*Initializer=*/nullptr, MangledName.c_str());
2819
2820 // Initialize the CompleteObjectLocator.
2821 llvm::Constant *Fields[] = {
David Majnemer611cdb92014-07-07 08:09:15 +00002822 llvm::ConstantInt::get(CGM.IntTy, ABI.isImageRelative()),
2823 llvm::ConstantInt::get(CGM.IntTy, OffsetToTop),
2824 llvm::ConstantInt::get(CGM.IntTy, VFPtrOffset),
2825 ABI.getImageRelativeConstant(
2826 CGM.GetAddrOfRTTIDescriptor(Context.getTypeDeclType(RD))),
2827 ABI.getImageRelativeConstant(getClassHierarchyDescriptor()),
2828 ABI.getImageRelativeConstant(COL),
David Majnemere2cb8d12014-07-07 06:20:47 +00002829 };
2830 llvm::ArrayRef<llvm::Constant *> FieldsRef(Fields);
David Majnemer611cdb92014-07-07 08:09:15 +00002831 if (!ABI.isImageRelative())
2832 FieldsRef = FieldsRef.drop_back();
David Majnemere2cb8d12014-07-07 06:20:47 +00002833 COL->setInitializer(llvm::ConstantStruct::get(Type, FieldsRef));
2834 return COL;
2835}
2836
2837/// \brief Gets a TypeDescriptor. Returns a llvm::Constant * rather than a
2838/// llvm::GlobalVariable * because different type descriptors have different
2839/// types, and need to be abstracted. They are abstracting by casting the
2840/// address to an Int8PtrTy.
2841llvm::Constant *MicrosoftCXXABI::getAddrOfRTTIDescriptor(QualType Type) {
David Majnemere2cb8d12014-07-07 06:20:47 +00002842 SmallString<256> MangledName, TypeInfoString;
2843 {
2844 llvm::raw_svector_ostream Out(MangledName);
David Majnemer611cdb92014-07-07 08:09:15 +00002845 getMangleContext().mangleCXXRTTI(Type, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002846 }
2847
2848 // Check to see if we've already declared this TypeDescriptor.
2849 if (llvm::GlobalVariable *GV = CGM.getModule().getNamedGlobal(MangledName))
2850 return llvm::ConstantExpr::getBitCast(GV, CGM.Int8PtrTy);
2851
2852 // Compute the fields for the TypeDescriptor.
2853 {
2854 llvm::raw_svector_ostream Out(TypeInfoString);
David Majnemer611cdb92014-07-07 08:09:15 +00002855 getMangleContext().mangleCXXRTTIName(Type, Out);
David Majnemere2cb8d12014-07-07 06:20:47 +00002856 }
2857
2858 // Declare and initialize the TypeDescriptor.
2859 llvm::Constant *Fields[] = {
2860 getTypeInfoVTable(CGM), // VFPtr
2861 llvm::ConstantPointerNull::get(CGM.Int8PtrTy), // Runtime data
2862 llvm::ConstantDataArray::getString(CGM.getLLVMContext(), TypeInfoString)};
2863 llvm::StructType *TypeDescriptorType =
David Majnemer611cdb92014-07-07 08:09:15 +00002864 getTypeDescriptorType(TypeInfoString);
David Majnemere2cb8d12014-07-07 06:20:47 +00002865 return llvm::ConstantExpr::getBitCast(
2866 new llvm::GlobalVariable(
2867 CGM.getModule(), TypeDescriptorType, /*Constant=*/false,
2868 getLinkageForRTTI(Type),
2869 llvm::ConstantStruct::get(TypeDescriptorType, Fields),
2870 MangledName.c_str()),
2871 CGM.Int8PtrTy);
2872}
2873
2874/// \brief Gets or a creates a Microsoft CompleteObjectLocator.
2875llvm::GlobalVariable *
2876MicrosoftCXXABI::getMSCompleteObjectLocator(const CXXRecordDecl *RD,
2877 const VPtrInfo *Info) {
David Majnemer611cdb92014-07-07 08:09:15 +00002878 return MSRTTIBuilder(*this, RD).getCompleteObjectLocator(Info);
David Majnemere2cb8d12014-07-07 06:20:47 +00002879}