blob: 663011570d52a4f33eff9742913d32be1e2a908a [file] [log] [blame]
Charles Davisc3926642010-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 Lattnerfc8f0e12011-04-15 05:22:18 +000010// This provides C++ code generation targeting the Microsoft Visual C++ ABI.
Charles Davisc3926642010-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"
18#include "CodeGenModule.h"
Reid Kleckner90633022013-06-19 15:20:38 +000019#include "CGVTables.h"
20#include "MicrosoftVBTables.h"
Charles Davisc3926642010-06-09 23:25:41 +000021#include "clang/AST/Decl.h"
22#include "clang/AST/DeclCXX.h"
Charles Davisc3926642010-06-09 23:25:41 +000023
24using namespace clang;
25using namespace CodeGen;
26
27namespace {
28
Charles Davis071cc7d2010-08-16 03:33:14 +000029class MicrosoftCXXABI : public CGCXXABI {
Charles Davisc3926642010-06-09 23:25:41 +000030public:
Peter Collingbourne14110472011-01-13 18:57:25 +000031 MicrosoftCXXABI(CodeGenModule &CGM) : CGCXXABI(CGM) {}
John McCall4c40d982010-08-31 07:33:07 +000032
Stephen Lind4c0cd02013-06-18 17:00:49 +000033 bool HasThisReturn(GlobalDecl GD) const;
34
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +000035 bool isReturnTypeIndirect(const CXXRecordDecl *RD) const {
36 // Structures that are not C++03 PODs are always indirect.
37 return !RD->isPOD();
38 }
39
40 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const {
41 if (RD->hasNonTrivialCopyConstructor())
42 return RAA_DirectInMemory;
43 return RAA_Default;
44 }
45
Joao Matos285baac2012-07-17 17:10:11 +000046 StringRef GetPureVirtualCallName() { return "_purecall"; }
David Blaikie2eb9a952012-10-16 22:56:05 +000047 // No known support for deleted functions in MSVC yet, so this choice is
48 // arbitrary.
49 StringRef GetDeletedVirtualCallName() { return "_purecall"; }
Joao Matos285baac2012-07-17 17:10:11 +000050
John McCallecd03b42012-09-25 10:10:39 +000051 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF,
52 llvm::Value *ptr,
53 QualType type);
54
Reid Klecknerb0f533e2013-05-29 18:02:47 +000055 llvm::Value *GetVirtualBaseClassOffset(CodeGenFunction &CGF,
56 llvm::Value *This,
57 const CXXRecordDecl *ClassDecl,
58 const CXXRecordDecl *BaseClassDecl);
59
John McCall4c40d982010-08-31 07:33:07 +000060 void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
61 CXXCtorType Type,
62 CanQualType &ResTy,
John McCallbd315742012-09-25 08:00:39 +000063 SmallVectorImpl<CanQualType> &ArgTys);
John McCall4c40d982010-08-31 07:33:07 +000064
Reid Kleckner90633022013-06-19 15:20:38 +000065 llvm::BasicBlock *EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
66 const CXXRecordDecl *RD);
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +000067
John McCall4c40d982010-08-31 07:33:07 +000068 void BuildDestructorSignature(const CXXDestructorDecl *Ctor,
69 CXXDtorType Type,
70 CanQualType &ResTy,
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000071 SmallVectorImpl<CanQualType> &ArgTys);
John McCall4c40d982010-08-31 07:33:07 +000072
73 void BuildInstanceFunctionParams(CodeGenFunction &CGF,
74 QualType &ResTy,
John McCallbd315742012-09-25 08:00:39 +000075 FunctionArgList &Params);
John McCall4c40d982010-08-31 07:33:07 +000076
John McCallbd315742012-09-25 08:00:39 +000077 void EmitInstanceFunctionProlog(CodeGenFunction &CGF);
John McCallfd708262011-01-27 02:46:02 +000078
Stephen Lind4c0cd02013-06-18 17:00:49 +000079 RValue EmitConstructorCall(CodeGenFunction &CGF,
80 const CXXConstructorDecl *D,
81 CXXCtorType Type,
82 bool ForVirtualBase, bool Delegating,
83 ReturnValueSlot ReturnValue,
84 llvm::Value *This,
85 CallExpr::const_arg_iterator ArgBeg,
86 CallExpr::const_arg_iterator ArgEnd);
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +000087
Timur Iskhodzhanov0f9827f2013-02-15 14:45:22 +000088 RValue EmitVirtualDestructorCall(CodeGenFunction &CGF,
89 const CXXDestructorDecl *Dtor,
90 CXXDtorType DtorType,
91 SourceLocation CallLoc,
92 ReturnValueSlot ReturnValue,
93 llvm::Value *This);
94
Reid Kleckner90633022013-06-19 15:20:38 +000095 void EmitVirtualInheritanceTables(llvm::GlobalVariable::LinkageTypes Linkage,
96 const CXXRecordDecl *RD);
97
John McCall20bb1752012-05-01 06:13:13 +000098 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
99 llvm::GlobalVariable *DeclPtr,
100 bool PerformInit);
101
John McCallfd708262011-01-27 02:46:02 +0000102 // ==== Notes on array cookies =========
103 //
104 // MSVC seems to only use cookies when the class has a destructor; a
105 // two-argument usual array deallocation function isn't sufficient.
106 //
107 // For example, this code prints "100" and "1":
108 // struct A {
109 // char x;
110 // void *operator new[](size_t sz) {
111 // printf("%u\n", sz);
112 // return malloc(sz);
113 // }
114 // void operator delete[](void *p, size_t sz) {
115 // printf("%u\n", sz);
116 // free(p);
117 // }
118 // };
119 // int main() {
120 // A *p = new A[100];
121 // delete[] p;
122 // }
123 // Whereas it prints "104" and "104" if you give A a destructor.
John McCalle2b45e22012-05-01 05:23:51 +0000124
125 bool requiresArrayCookie(const CXXDeleteExpr *expr, QualType elementType);
126 bool requiresArrayCookie(const CXXNewExpr *expr);
127 CharUnits getArrayCookieSizeImpl(QualType type);
128 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
129 llvm::Value *NewPtr,
130 llvm::Value *NumElements,
131 const CXXNewExpr *expr,
132 QualType ElementType);
133 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
134 llvm::Value *allocPtr,
135 CharUnits cookieSize);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000136
137private:
Reid Klecknera3609b02013-04-11 18:13:19 +0000138 llvm::Constant *getZeroInt() {
139 return llvm::ConstantInt::get(CGM.IntTy, 0);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000140 }
141
Reid Klecknera3609b02013-04-11 18:13:19 +0000142 llvm::Constant *getAllOnesInt() {
143 return llvm::Constant::getAllOnesValue(CGM.IntTy);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000144 }
145
Reid Klecknerf6327302013-05-09 21:01:17 +0000146 llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) {
147 return C ? C : getZeroInt();
148 }
149
150 llvm::Value *getValueOrZeroInt(llvm::Value *C) {
151 return C ? C : getZeroInt();
152 }
153
Reid Klecknera3609b02013-04-11 18:13:19 +0000154 void
155 GetNullMemberPointerFields(const MemberPointerType *MPT,
156 llvm::SmallVectorImpl<llvm::Constant *> &fields);
157
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000158 /// \brief Finds the offset from the base of RD to the vbptr it uses, even if
159 /// it is reusing a vbptr from a non-virtual base. RD must have morally
160 /// virtual bases.
161 CharUnits GetVBPtrOffsetFromBases(const CXXRecordDecl *RD);
162
163 /// \brief Shared code for virtual base adjustment. Returns the offset from
164 /// the vbptr to the virtual base. Optionally returns the address of the
165 /// vbptr itself.
166 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
167 llvm::Value *Base,
168 llvm::Value *VBPtrOffset,
169 llvm::Value *VBTableOffset,
170 llvm::Value **VBPtr = 0);
171
172 /// \brief Performs a full virtual base adjustment. Used to dereference
173 /// pointers to members of virtual bases.
Reid Klecknera3609b02013-04-11 18:13:19 +0000174 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const CXXRecordDecl *RD,
175 llvm::Value *Base,
176 llvm::Value *VirtualBaseAdjustmentOffset,
177 llvm::Value *VBPtrOffset /* optional */);
178
Reid Kleckner79e02912013-05-03 01:15:11 +0000179 /// \brief Emits a full member pointer with the fields common to data and
180 /// function member pointers.
181 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
182 bool IsMemberFunction,
Reid Klecknerf6327302013-05-09 21:01:17 +0000183 const CXXRecordDecl *RD,
184 CharUnits NonVirtualBaseAdjustment);
185
186 llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD,
187 const CXXMethodDecl *MD,
188 CharUnits NonVirtualBaseAdjustment);
189
190 bool MemberPointerConstantIsNull(const MemberPointerType *MPT,
191 llvm::Constant *MP);
Reid Kleckner79e02912013-05-03 01:15:11 +0000192
Reid Kleckner90633022013-06-19 15:20:38 +0000193 /// \brief - Initialize all vbptrs of 'this' with RD as the complete type.
194 void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD);
195
196 /// \brief Caching wrapper around VBTableBuilder::enumerateVBTables().
197 const VBTableVector &EnumerateVBTables(const CXXRecordDecl *RD);
198
Reid Klecknera8a0f762013-03-22 19:02:54 +0000199public:
Reid Klecknera3609b02013-04-11 18:13:19 +0000200 virtual llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT);
201
202 virtual bool isZeroInitializable(const MemberPointerType *MPT);
203
Reid Klecknera8a0f762013-03-22 19:02:54 +0000204 virtual llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT);
205
206 virtual llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
207 CharUnits offset);
Reid Kleckner79e02912013-05-03 01:15:11 +0000208 virtual llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD);
209 virtual llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000210
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000211 virtual llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
212 llvm::Value *L,
213 llvm::Value *R,
214 const MemberPointerType *MPT,
215 bool Inequality);
216
Reid Klecknera8a0f762013-03-22 19:02:54 +0000217 virtual llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
218 llvm::Value *MemPtr,
219 const MemberPointerType *MPT);
220
221 virtual llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF,
222 llvm::Value *Base,
223 llvm::Value *MemPtr,
224 const MemberPointerType *MPT);
225
Reid Klecknerf6327302013-05-09 21:01:17 +0000226 virtual llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
227 const CastExpr *E,
228 llvm::Value *Src);
229
230 virtual llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
231 llvm::Constant *Src);
232
Reid Klecknera3609b02013-04-11 18:13:19 +0000233 virtual llvm::Value *
234 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
235 llvm::Value *&This,
236 llvm::Value *MemPtr,
237 const MemberPointerType *MPT);
238
Reid Kleckner90633022013-06-19 15:20:38 +0000239private:
240 /// VBTables - All the vbtables which have been referenced.
241 llvm::DenseMap<const CXXRecordDecl *, VBTableVector> VBTablesMap;
Charles Davisc3926642010-06-09 23:25:41 +0000242};
243
244}
245
John McCallecd03b42012-09-25 10:10:39 +0000246llvm::Value *MicrosoftCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
247 llvm::Value *ptr,
248 QualType type) {
249 // FIXME: implement
250 return ptr;
251}
252
Reid Kleckner8c474322013-06-04 21:32:29 +0000253/// \brief Finds the first non-virtual base of RD that has virtual bases. If RD
254/// doesn't have a vbptr, it will reuse the vbptr of the returned class.
255static const CXXRecordDecl *FindFirstNVBaseWithVBases(const CXXRecordDecl *RD) {
256 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
257 E = RD->bases_end(); I != E; ++I) {
258 const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl();
259 if (!I->isVirtual() && Base->getNumVBases() > 0)
260 return Base;
261 }
262 llvm_unreachable("RD must have an nv base with vbases");
263}
264
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000265CharUnits MicrosoftCXXABI::GetVBPtrOffsetFromBases(const CXXRecordDecl *RD) {
266 assert(RD->getNumVBases());
267 CharUnits Total = CharUnits::Zero();
268 while (RD) {
269 const ASTRecordLayout &RDLayout = getContext().getASTRecordLayout(RD);
270 CharUnits VBPtrOffset = RDLayout.getVBPtrOffset();
271 // -1 is the sentinel for no vbptr.
272 if (VBPtrOffset != CharUnits::fromQuantity(-1)) {
273 Total += VBPtrOffset;
274 break;
275 }
Reid Kleckner8c474322013-06-04 21:32:29 +0000276 RD = FindFirstNVBaseWithVBases(RD);
277 Total += RDLayout.getBaseClassOffset(RD);
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000278 }
279 return Total;
280}
281
Reid Kleckner8c474322013-06-04 21:32:29 +0000282/// \brief Computes the index of BaseClassDecl in the vbtable of ClassDecl.
283/// BaseClassDecl must be a morally virtual base of ClassDecl. The vbtable is
284/// an array of i32 offsets. The first entry is a self entry, and the rest are
285/// offsets from the vbptr to virtual bases. The bases are ordered the same way
286/// our vbases are ordered: as they appear in a left-to-right depth-first search
287/// of the hierarchy.
288static unsigned GetVBTableIndex(const CXXRecordDecl *ClassDecl,
289 const CXXRecordDecl *BaseClassDecl) {
290 unsigned VBTableIndex = 1; // Start with one to skip the self entry.
291 for (CXXRecordDecl::base_class_const_iterator I = ClassDecl->vbases_begin(),
292 E = ClassDecl->vbases_end(); I != E; ++I) {
293 if (I->getType()->getAsCXXRecordDecl() == BaseClassDecl)
294 return VBTableIndex;
295 VBTableIndex++;
296 }
297 llvm_unreachable("BaseClassDecl must be a vbase of ClassDecl");
298}
299
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000300llvm::Value *
301MicrosoftCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
302 llvm::Value *This,
303 const CXXRecordDecl *ClassDecl,
304 const CXXRecordDecl *BaseClassDecl) {
305 int64_t VBPtrChars = GetVBPtrOffsetFromBases(ClassDecl).getQuantity();
306 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars);
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000307 CharUnits IntSize = getContext().getTypeSizeInChars(getContext().IntTy);
Reid Kleckner8c474322013-06-04 21:32:29 +0000308 CharUnits VBTableChars = IntSize * GetVBTableIndex(ClassDecl, BaseClassDecl);
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000309 llvm::Value *VBTableOffset =
310 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity());
311
312 llvm::Value *VBPtrToNewBase =
313 GetVBaseOffsetFromVBPtr(CGF, This, VBTableOffset, VBPtrOffset);
314 VBPtrToNewBase =
315 CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy);
316 return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase);
317}
318
Stephen Lind4c0cd02013-06-18 17:00:49 +0000319bool MicrosoftCXXABI::HasThisReturn(GlobalDecl GD) const {
320 return isa<CXXConstructorDecl>(GD.getDecl());
John McCallbd315742012-09-25 08:00:39 +0000321}
322
323void MicrosoftCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
324 CXXCtorType Type,
325 CanQualType &ResTy,
326 SmallVectorImpl<CanQualType> &ArgTys) {
Stephen Lind4c0cd02013-06-18 17:00:49 +0000327 // 'this' parameter and 'this' return are already in place
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000328
329 const CXXRecordDecl *Class = Ctor->getParent();
330 if (Class->getNumVBases()) {
331 // Constructors of classes with virtual bases take an implicit parameter.
332 ArgTys.push_back(CGM.getContext().IntTy);
333 }
334}
335
Reid Kleckner90633022013-06-19 15:20:38 +0000336llvm::BasicBlock *
337MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
338 const CXXRecordDecl *RD) {
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000339 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
340 assert(IsMostDerivedClass &&
341 "ctor for a class with virtual bases must have an implicit parameter");
Reid Kleckner90633022013-06-19 15:20:38 +0000342 llvm::Value *IsCompleteObject =
343 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object");
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000344
345 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases");
346 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases");
347 CGF.Builder.CreateCondBr(IsCompleteObject,
348 CallVbaseCtorsBB, SkipVbaseCtorsBB);
349
350 CGF.EmitBlock(CallVbaseCtorsBB);
Reid Kleckner90633022013-06-19 15:20:38 +0000351
352 // Fill in the vbtable pointers here.
353 EmitVBPtrStores(CGF, RD);
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000354
355 // CGF will put the base ctor calls in this basic block for us later.
356
357 return SkipVbaseCtorsBB;
John McCallbd315742012-09-25 08:00:39 +0000358}
359
Reid Kleckner90633022013-06-19 15:20:38 +0000360void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF,
361 const CXXRecordDecl *RD) {
362 llvm::Value *ThisInt8Ptr =
363 CGF.Builder.CreateBitCast(getThisValue(CGF), CGM.Int8PtrTy, "this.int8");
364
365 const VBTableVector &VBTables = EnumerateVBTables(RD);
366 for (VBTableVector::const_iterator I = VBTables.begin(), E = VBTables.end();
367 I != E; ++I) {
368 const ASTRecordLayout &SubobjectLayout =
369 CGM.getContext().getASTRecordLayout(I->VBPtrSubobject.getBase());
370 uint64_t Offs = (I->VBPtrSubobject.getBaseOffset() +
371 SubobjectLayout.getVBPtrOffset()).getQuantity();
372 llvm::Value *VBPtr =
373 CGF.Builder.CreateConstInBoundsGEP1_64(ThisInt8Ptr, Offs);
374 VBPtr = CGF.Builder.CreateBitCast(VBPtr, I->GV->getType()->getPointerTo(0),
375 "vbptr." + I->ReusingBase->getName());
376 CGF.Builder.CreateStore(I->GV, VBPtr);
377 }
378}
379
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000380void MicrosoftCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
381 CXXDtorType Type,
382 CanQualType &ResTy,
383 SmallVectorImpl<CanQualType> &ArgTys) {
384 // 'this' is already in place
Stephen Lind4c0cd02013-06-18 17:00:49 +0000385
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000386 // TODO: 'for base' flag
387
388 if (Type == Dtor_Deleting) {
389 // The scalar deleting destructor takes an implicit bool parameter.
390 ArgTys.push_back(CGM.getContext().BoolTy);
391 }
392}
393
394static bool IsDeletingDtor(GlobalDecl GD) {
395 const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl());
396 if (isa<CXXDestructorDecl>(MD)) {
397 return GD.getDtorType() == Dtor_Deleting;
398 }
399 return false;
400}
401
John McCallbd315742012-09-25 08:00:39 +0000402void MicrosoftCXXABI::BuildInstanceFunctionParams(CodeGenFunction &CGF,
403 QualType &ResTy,
404 FunctionArgList &Params) {
405 BuildThisParam(CGF, Params);
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000406
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000407 ASTContext &Context = getContext();
408 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
409 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
410 ImplicitParamDecl *IsMostDerived
411 = ImplicitParamDecl::Create(Context, 0,
412 CGF.CurGD.getDecl()->getLocation(),
413 &Context.Idents.get("is_most_derived"),
414 Context.IntTy);
415 Params.push_back(IsMostDerived);
416 getStructorImplicitParamDecl(CGF) = IsMostDerived;
417 } else if (IsDeletingDtor(CGF.CurGD)) {
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000418 ImplicitParamDecl *ShouldDelete
419 = ImplicitParamDecl::Create(Context, 0,
420 CGF.CurGD.getDecl()->getLocation(),
421 &Context.Idents.get("should_call_delete"),
422 Context.BoolTy);
423 Params.push_back(ShouldDelete);
424 getStructorImplicitParamDecl(CGF) = ShouldDelete;
425 }
John McCallbd315742012-09-25 08:00:39 +0000426}
427
428void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
429 EmitThisParam(CGF);
Stephen Lind4c0cd02013-06-18 17:00:49 +0000430
431 /// If this is a function that the ABI specifies returns 'this', initialize
432 /// the return slot to 'this' at the start of the function.
433 ///
434 /// Unlike the setting of return types, this is done within the ABI
435 /// implementation instead of by clients of CGCXXABI because:
436 /// 1) getThisValue is currently protected
437 /// 2) in theory, an ABI could implement 'this' returns some other way;
438 /// HasThisReturn only specifies a contract, not the implementation
439 if (HasThisReturn(CGF.CurGD))
John McCallbd315742012-09-25 08:00:39 +0000440 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000441
442 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
443 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
444 assert(getStructorImplicitParamDecl(CGF) &&
445 "no implicit parameter for a constructor with virtual bases?");
446 getStructorImplicitParamValue(CGF)
447 = CGF.Builder.CreateLoad(
448 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
449 "is_most_derived");
450 }
451
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000452 if (IsDeletingDtor(CGF.CurGD)) {
453 assert(getStructorImplicitParamDecl(CGF) &&
454 "no implicit parameter for a deleting destructor?");
455 getStructorImplicitParamValue(CGF)
456 = CGF.Builder.CreateLoad(
457 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
458 "should_call_delete");
459 }
John McCallbd315742012-09-25 08:00:39 +0000460}
461
Stephen Lind4c0cd02013-06-18 17:00:49 +0000462RValue MicrosoftCXXABI::EmitConstructorCall(CodeGenFunction &CGF,
463 const CXXConstructorDecl *D,
464 CXXCtorType Type,
465 bool ForVirtualBase,
466 bool Delegating,
467 ReturnValueSlot ReturnValue,
468 llvm::Value *This,
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000469 CallExpr::const_arg_iterator ArgBeg,
470 CallExpr::const_arg_iterator ArgEnd) {
471 assert(Type == Ctor_Complete || Type == Ctor_Base);
472 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Ctor_Complete);
473
474 llvm::Value *ImplicitParam = 0;
475 QualType ImplicitParamTy;
476 if (D->getParent()->getNumVBases()) {
477 ImplicitParam = llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete);
478 ImplicitParamTy = getContext().IntTy;
479 }
480
481 // FIXME: Provide a source location here.
Stephen Lind4c0cd02013-06-18 17:00:49 +0000482 return CGF.EmitCXXMemberCall(D, SourceLocation(), Callee, ReturnValue,
483 This, ImplicitParam, ImplicitParamTy,
484 ArgBeg, ArgEnd);
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000485}
486
Timur Iskhodzhanov0f9827f2013-02-15 14:45:22 +0000487RValue MicrosoftCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
488 const CXXDestructorDecl *Dtor,
489 CXXDtorType DtorType,
490 SourceLocation CallLoc,
491 ReturnValueSlot ReturnValue,
492 llvm::Value *This) {
493 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
494
495 // We have only one destructor in the vftable but can get both behaviors
496 // by passing an implicit bool parameter.
497 const CGFunctionInfo *FInfo
498 = &CGM.getTypes().arrangeCXXDestructor(Dtor, Dtor_Deleting);
499 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
500 llvm::Value *Callee = CGF.BuildVirtualCall(Dtor, Dtor_Deleting, This, Ty);
501
502 ASTContext &Context = CGF.getContext();
503 llvm::Value *ImplicitParam
504 = llvm::ConstantInt::get(llvm::IntegerType::getInt1Ty(CGF.getLLVMContext()),
505 DtorType == Dtor_Deleting);
506
507 return CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValue, This,
508 ImplicitParam, Context.BoolTy, 0, 0);
509}
510
Reid Kleckner90633022013-06-19 15:20:38 +0000511const VBTableVector &
512MicrosoftCXXABI::EnumerateVBTables(const CXXRecordDecl *RD) {
513 // At this layer, we can key the cache off of a single class, which is much
514 // easier than caching at the GlobalVariable layer.
515 llvm::DenseMap<const CXXRecordDecl*, VBTableVector>::iterator I;
516 bool added;
517 llvm::tie(I, added) = VBTablesMap.insert(std::make_pair(RD, VBTableVector()));
518 VBTableVector &VBTables = I->second;
519 if (!added)
520 return VBTables;
521
522 VBTableBuilder(CGM, RD).enumerateVBTables(VBTables);
523
524 return VBTables;
525}
526
527void MicrosoftCXXABI::EmitVirtualInheritanceTables(
528 llvm::GlobalVariable::LinkageTypes Linkage, const CXXRecordDecl *RD) {
529 const VBTableVector &VBTables = EnumerateVBTables(RD);
530 for (VBTableVector::const_iterator I = VBTables.begin(), E = VBTables.end();
531 I != E; ++I) {
532 I->EmitVBTableDefinition(CGM, RD, Linkage);
533 }
534}
535
John McCalle2b45e22012-05-01 05:23:51 +0000536bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr,
537 QualType elementType) {
538 // Microsoft seems to completely ignore the possibility of a
539 // two-argument usual deallocation function.
540 return elementType.isDestructedType();
541}
542
543bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) {
544 // Microsoft seems to completely ignore the possibility of a
545 // two-argument usual deallocation function.
546 return expr->getAllocatedType().isDestructedType();
547}
548
549CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) {
550 // The array cookie is always a size_t; we then pad that out to the
551 // alignment of the element type.
552 ASTContext &Ctx = getContext();
553 return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
554 Ctx.getTypeAlignInChars(type));
555}
556
557llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
558 llvm::Value *allocPtr,
559 CharUnits cookieSize) {
Micah Villmow956a5a12012-10-25 15:39:14 +0000560 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
John McCalle2b45e22012-05-01 05:23:51 +0000561 llvm::Value *numElementsPtr =
562 CGF.Builder.CreateBitCast(allocPtr, CGF.SizeTy->getPointerTo(AS));
563 return CGF.Builder.CreateLoad(numElementsPtr);
564}
565
566llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
567 llvm::Value *newPtr,
568 llvm::Value *numElements,
569 const CXXNewExpr *expr,
570 QualType elementType) {
571 assert(requiresArrayCookie(expr));
572
573 // The size of the cookie.
574 CharUnits cookieSize = getArrayCookieSizeImpl(elementType);
575
576 // Compute an offset to the cookie.
577 llvm::Value *cookiePtr = newPtr;
578
579 // Write the number of elements into the appropriate slot.
Micah Villmow956a5a12012-10-25 15:39:14 +0000580 unsigned AS = newPtr->getType()->getPointerAddressSpace();
John McCalle2b45e22012-05-01 05:23:51 +0000581 llvm::Value *numElementsPtr
582 = CGF.Builder.CreateBitCast(cookiePtr, CGF.SizeTy->getPointerTo(AS));
583 CGF.Builder.CreateStore(numElements, numElementsPtr);
584
585 // Finally, compute a pointer to the actual data buffer by skipping
586 // over the cookie completely.
587 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
588 cookieSize.getQuantity());
589}
590
John McCall20bb1752012-05-01 06:13:13 +0000591void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
592 llvm::GlobalVariable *DeclPtr,
593 bool PerformInit) {
594 // FIXME: this code was only tested for global initialization.
595 // Not sure whether we want thread-safe static local variables as VS
596 // doesn't make them thread-safe.
597
Richard Smith04e51762013-04-14 23:01:42 +0000598 if (D.getTLSKind())
599 CGM.ErrorUnsupported(&D, "dynamic TLS initialization");
600
John McCall20bb1752012-05-01 06:13:13 +0000601 // Emit the initializer and add a global destructor if appropriate.
602 CGF.EmitCXXGlobalVarDeclInit(D, DeclPtr, PerformInit);
603}
604
Reid Klecknera3609b02013-04-11 18:13:19 +0000605// Member pointer helpers.
606static bool hasVBPtrOffsetField(MSInheritanceModel Inheritance) {
607 return Inheritance == MSIM_Unspecified;
Reid Klecknera8a0f762013-03-22 19:02:54 +0000608}
609
Reid Klecknerf6327302013-05-09 21:01:17 +0000610static bool hasOnlyOneField(bool IsMemberFunction,
611 MSInheritanceModel Inheritance) {
612 return Inheritance <= MSIM_SinglePolymorphic ||
613 (!IsMemberFunction && Inheritance <= MSIM_MultiplePolymorphic);
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000614}
615
Reid Klecknera3609b02013-04-11 18:13:19 +0000616// Only member pointers to functions need a this adjustment, since it can be
617// combined with the field offset for data pointers.
Reid Kleckner79e02912013-05-03 01:15:11 +0000618static bool hasNonVirtualBaseAdjustmentField(bool IsMemberFunction,
Reid Klecknera3609b02013-04-11 18:13:19 +0000619 MSInheritanceModel Inheritance) {
Reid Kleckner79e02912013-05-03 01:15:11 +0000620 return (IsMemberFunction && Inheritance >= MSIM_Multiple);
Reid Klecknera3609b02013-04-11 18:13:19 +0000621}
622
623static bool hasVirtualBaseAdjustmentField(MSInheritanceModel Inheritance) {
624 return Inheritance >= MSIM_Virtual;
625}
626
627// Use zero for the field offset of a null data member pointer if we can
628// guarantee that zero is not a valid field offset, or if the member pointer has
629// multiple fields. Polymorphic classes have a vfptr at offset zero, so we can
630// use zero for null. If there are multiple fields, we can use zero even if it
631// is a valid field offset because null-ness testing will check the other
632// fields.
633static bool nullFieldOffsetIsZero(MSInheritanceModel Inheritance) {
634 return Inheritance != MSIM_Multiple && Inheritance != MSIM_Single;
635}
636
637bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
638 // Null-ness for function memptrs only depends on the first field, which is
639 // the function pointer. The rest don't matter, so we can zero initialize.
640 if (MPT->isMemberFunctionPointer())
641 return true;
642
643 // The virtual base adjustment field is always -1 for null, so if we have one
644 // we can't zero initialize. The field offset is sometimes also -1 if 0 is a
645 // valid field offset.
646 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
647 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
648 return (!hasVirtualBaseAdjustmentField(Inheritance) &&
649 nullFieldOffsetIsZero(Inheritance));
650}
651
652llvm::Type *
653MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
654 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
655 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
656 llvm::SmallVector<llvm::Type *, 4> fields;
657 if (MPT->isMemberFunctionPointer())
658 fields.push_back(CGM.VoidPtrTy); // FunctionPointerOrVirtualThunk
659 else
660 fields.push_back(CGM.IntTy); // FieldOffset
661
Reid Kleckner79e02912013-05-03 01:15:11 +0000662 if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(),
663 Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000664 fields.push_back(CGM.IntTy);
Reid Kleckner79e02912013-05-03 01:15:11 +0000665 if (hasVBPtrOffsetField(Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000666 fields.push_back(CGM.IntTy);
667 if (hasVirtualBaseAdjustmentField(Inheritance))
668 fields.push_back(CGM.IntTy); // VirtualBaseAdjustmentOffset
669
670 if (fields.size() == 1)
671 return fields[0];
672 return llvm::StructType::get(CGM.getLLVMContext(), fields);
673}
674
675void MicrosoftCXXABI::
676GetNullMemberPointerFields(const MemberPointerType *MPT,
677 llvm::SmallVectorImpl<llvm::Constant *> &fields) {
678 assert(fields.empty());
679 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
680 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
681 if (MPT->isMemberFunctionPointer()) {
682 // FunctionPointerOrVirtualThunk
683 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
684 } else {
685 if (nullFieldOffsetIsZero(Inheritance))
686 fields.push_back(getZeroInt()); // FieldOffset
687 else
688 fields.push_back(getAllOnesInt()); // FieldOffset
Reid Klecknera8a0f762013-03-22 19:02:54 +0000689 }
Reid Klecknera3609b02013-04-11 18:13:19 +0000690
Reid Kleckner79e02912013-05-03 01:15:11 +0000691 if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(),
692 Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000693 fields.push_back(getZeroInt());
Reid Kleckner79e02912013-05-03 01:15:11 +0000694 if (hasVBPtrOffsetField(Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000695 fields.push_back(getZeroInt());
696 if (hasVirtualBaseAdjustmentField(Inheritance))
697 fields.push_back(getAllOnesInt());
Reid Klecknera8a0f762013-03-22 19:02:54 +0000698}
699
700llvm::Constant *
701MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
Reid Klecknera3609b02013-04-11 18:13:19 +0000702 llvm::SmallVector<llvm::Constant *, 4> fields;
703 GetNullMemberPointerFields(MPT, fields);
704 if (fields.size() == 1)
705 return fields[0];
706 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields);
707 assert(Res->getType() == ConvertMemberPointerType(MPT));
708 return Res;
Reid Klecknera8a0f762013-03-22 19:02:54 +0000709}
710
711llvm::Constant *
Reid Kleckner79e02912013-05-03 01:15:11 +0000712MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
713 bool IsMemberFunction,
Reid Klecknerf6327302013-05-09 21:01:17 +0000714 const CXXRecordDecl *RD,
715 CharUnits NonVirtualBaseAdjustment)
Reid Kleckner79e02912013-05-03 01:15:11 +0000716{
Reid Klecknera3609b02013-04-11 18:13:19 +0000717 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
Reid Kleckner79e02912013-05-03 01:15:11 +0000718
719 // Single inheritance class member pointer are represented as scalars instead
720 // of aggregates.
Reid Klecknerf6327302013-05-09 21:01:17 +0000721 if (hasOnlyOneField(IsMemberFunction, Inheritance))
Reid Kleckner79e02912013-05-03 01:15:11 +0000722 return FirstField;
723
Reid Klecknera3609b02013-04-11 18:13:19 +0000724 llvm::SmallVector<llvm::Constant *, 4> fields;
Reid Kleckner79e02912013-05-03 01:15:11 +0000725 fields.push_back(FirstField);
726
727 if (hasNonVirtualBaseAdjustmentField(IsMemberFunction, Inheritance))
Reid Klecknerf6327302013-05-09 21:01:17 +0000728 fields.push_back(llvm::ConstantInt::get(
729 CGM.IntTy, NonVirtualBaseAdjustment.getQuantity()));
Reid Kleckner79e02912013-05-03 01:15:11 +0000730
Reid Klecknera3609b02013-04-11 18:13:19 +0000731 if (hasVBPtrOffsetField(Inheritance)) {
Reid Klecknera06d5852013-06-05 15:58:29 +0000732 fields.push_back(llvm::ConstantInt::get(
733 CGM.IntTy, GetVBPtrOffsetFromBases(RD).getQuantity()));
Reid Klecknera3609b02013-04-11 18:13:19 +0000734 }
Reid Kleckner79e02912013-05-03 01:15:11 +0000735
736 // The rest of the fields are adjusted by conversions to a more derived class.
Reid Klecknera3609b02013-04-11 18:13:19 +0000737 if (hasVirtualBaseAdjustmentField(Inheritance))
738 fields.push_back(getZeroInt());
Reid Kleckner79e02912013-05-03 01:15:11 +0000739
Reid Klecknera3609b02013-04-11 18:13:19 +0000740 return llvm::ConstantStruct::getAnon(fields);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000741}
742
Reid Kleckner79e02912013-05-03 01:15:11 +0000743llvm::Constant *
744MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
745 CharUnits offset) {
746 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
747 llvm::Constant *FirstField =
748 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity());
Reid Klecknerf6327302013-05-09 21:01:17 +0000749 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD,
750 CharUnits::Zero());
751}
752
753llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
754 return BuildMemberPointer(MD->getParent(), MD, CharUnits::Zero());
755}
756
757llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP,
758 QualType MPType) {
759 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
760 const ValueDecl *MPD = MP.getMemberPointerDecl();
761 if (!MPD)
762 return EmitNullMemberPointer(MPT);
763
764 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
765
766 // FIXME PR15713: Support virtual inheritance paths.
767
768 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
769 return BuildMemberPointer(MPT->getClass()->getAsCXXRecordDecl(),
770 MD, ThisAdjustment);
771
772 CharUnits FieldOffset =
773 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
774 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
Reid Kleckner79e02912013-05-03 01:15:11 +0000775}
776
777llvm::Constant *
Reid Klecknerf6327302013-05-09 21:01:17 +0000778MicrosoftCXXABI::BuildMemberPointer(const CXXRecordDecl *RD,
779 const CXXMethodDecl *MD,
780 CharUnits NonVirtualBaseAdjustment) {
Reid Kleckner79e02912013-05-03 01:15:11 +0000781 assert(MD->isInstance() && "Member function must not be static!");
782 MD = MD->getCanonicalDecl();
Reid Kleckner79e02912013-05-03 01:15:11 +0000783 CodeGenTypes &Types = CGM.getTypes();
784
785 llvm::Constant *FirstField;
786 if (MD->isVirtual()) {
787 // FIXME: We have to instantiate a thunk that loads the vftable and jumps to
788 // the right offset.
789 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
790 } else {
791 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
792 llvm::Type *Ty;
793 // Check whether the function has a computable LLVM signature.
794 if (Types.isFuncTypeConvertible(FPT)) {
795 // The function has a computable LLVM signature; use the correct type.
796 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
797 } else {
798 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
799 // function type is incomplete.
800 Ty = CGM.PtrDiffTy;
801 }
802 FirstField = CGM.GetAddrOfFunction(MD, Ty);
803 FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy);
804 }
805
806 // The rest of the fields are common with data member pointers.
Reid Klecknerf6327302013-05-09 21:01:17 +0000807 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD,
808 NonVirtualBaseAdjustment);
Reid Kleckner79e02912013-05-03 01:15:11 +0000809}
810
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000811/// Member pointers are the same if they're either bitwise identical *or* both
812/// null. Null-ness for function members is determined by the first field,
813/// while for data member pointers we must compare all fields.
814llvm::Value *
815MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
816 llvm::Value *L,
817 llvm::Value *R,
818 const MemberPointerType *MPT,
819 bool Inequality) {
820 CGBuilderTy &Builder = CGF.Builder;
821
822 // Handle != comparisons by switching the sense of all boolean operations.
823 llvm::ICmpInst::Predicate Eq;
824 llvm::Instruction::BinaryOps And, Or;
825 if (Inequality) {
826 Eq = llvm::ICmpInst::ICMP_NE;
827 And = llvm::Instruction::Or;
828 Or = llvm::Instruction::And;
829 } else {
830 Eq = llvm::ICmpInst::ICMP_EQ;
831 And = llvm::Instruction::And;
832 Or = llvm::Instruction::Or;
833 }
834
835 // If this is a single field member pointer (single inheritance), this is a
836 // single icmp.
837 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
838 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
Reid Klecknerf6327302013-05-09 21:01:17 +0000839 if (hasOnlyOneField(MPT->isMemberFunctionPointer(), Inheritance))
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000840 return Builder.CreateICmp(Eq, L, R);
841
842 // Compare the first field.
843 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0");
844 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0");
845 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first");
846
847 // Compare everything other than the first field.
848 llvm::Value *Res = 0;
849 llvm::StructType *LType = cast<llvm::StructType>(L->getType());
850 for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) {
851 llvm::Value *LF = Builder.CreateExtractValue(L, I);
852 llvm::Value *RF = Builder.CreateExtractValue(R, I);
853 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest");
854 if (Res)
855 Res = Builder.CreateBinOp(And, Res, Cmp);
856 else
857 Res = Cmp;
858 }
859
860 // Check if the first field is 0 if this is a function pointer.
861 if (MPT->isMemberFunctionPointer()) {
862 // (l1 == r1 && ...) || l0 == 0
863 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType());
864 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero");
865 Res = Builder.CreateBinOp(Or, Res, IsZero);
866 }
867
868 // Combine the comparison of the first field, which must always be true for
869 // this comparison to succeeed.
870 return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp");
871}
872
Reid Klecknera8a0f762013-03-22 19:02:54 +0000873llvm::Value *
874MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
875 llvm::Value *MemPtr,
876 const MemberPointerType *MPT) {
877 CGBuilderTy &Builder = CGF.Builder;
Reid Klecknera3609b02013-04-11 18:13:19 +0000878 llvm::SmallVector<llvm::Constant *, 4> fields;
879 // We only need one field for member functions.
880 if (MPT->isMemberFunctionPointer())
881 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
882 else
883 GetNullMemberPointerFields(MPT, fields);
884 assert(!fields.empty());
885 llvm::Value *FirstField = MemPtr;
886 if (MemPtr->getType()->isStructTy())
887 FirstField = Builder.CreateExtractValue(MemPtr, 0);
888 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0");
Reid Klecknera8a0f762013-03-22 19:02:54 +0000889
Reid Klecknera3609b02013-04-11 18:13:19 +0000890 // For function member pointers, we only need to test the function pointer
891 // field. The other fields if any can be garbage.
892 if (MPT->isMemberFunctionPointer())
893 return Res;
894
895 // Otherwise, emit a series of compares and combine the results.
896 for (int I = 1, E = fields.size(); I < E; ++I) {
897 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I);
898 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp");
899 Res = Builder.CreateAnd(Res, Next, "memptr.tobool");
900 }
901 return Res;
902}
903
Reid Klecknerf6327302013-05-09 21:01:17 +0000904bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT,
905 llvm::Constant *Val) {
906 // Function pointers are null if the pointer in the first field is null.
907 if (MPT->isMemberFunctionPointer()) {
908 llvm::Constant *FirstField = Val->getType()->isStructTy() ?
909 Val->getAggregateElement(0U) : Val;
910 return FirstField->isNullValue();
911 }
912
913 // If it's not a function pointer and it's zero initializable, we can easily
914 // check zero.
915 if (isZeroInitializable(MPT) && Val->isNullValue())
916 return true;
917
918 // Otherwise, break down all the fields for comparison. Hopefully these
919 // little Constants are reused, while a big null struct might not be.
920 llvm::SmallVector<llvm::Constant *, 4> Fields;
921 GetNullMemberPointerFields(MPT, Fields);
922 if (Fields.size() == 1) {
923 assert(Val->getType()->isIntegerTy());
924 return Val == Fields[0];
925 }
926
927 unsigned I, E;
928 for (I = 0, E = Fields.size(); I != E; ++I) {
929 if (Val->getAggregateElement(I) != Fields[I])
930 break;
931 }
932 return I == E;
933}
934
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000935llvm::Value *
936MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
937 llvm::Value *This,
938 llvm::Value *VBTableOffset,
939 llvm::Value *VBPtrOffset,
940 llvm::Value **VBPtrOut) {
941 CGBuilderTy &Builder = CGF.Builder;
942 // Load the vbtable pointer from the vbptr in the instance.
943 This = Builder.CreateBitCast(This, CGM.Int8PtrTy);
944 llvm::Value *VBPtr =
945 Builder.CreateInBoundsGEP(This, VBPtrOffset, "vbptr");
946 if (VBPtrOut) *VBPtrOut = VBPtr;
947 VBPtr = Builder.CreateBitCast(VBPtr, CGM.Int8PtrTy->getPointerTo(0));
948 llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable");
949
950 // Load an i32 offset from the vb-table.
951 llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableOffset);
952 VBaseOffs = Builder.CreateBitCast(VBaseOffs, CGM.Int32Ty->getPointerTo(0));
953 return Builder.CreateLoad(VBaseOffs, "vbase_offs");
954}
955
Reid Klecknera3609b02013-04-11 18:13:19 +0000956// Returns an adjusted base cast to i8*, since we do more address arithmetic on
957// it.
958llvm::Value *
959MicrosoftCXXABI::AdjustVirtualBase(CodeGenFunction &CGF,
960 const CXXRecordDecl *RD, llvm::Value *Base,
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000961 llvm::Value *VBTableOffset,
Reid Klecknera3609b02013-04-11 18:13:19 +0000962 llvm::Value *VBPtrOffset) {
963 CGBuilderTy &Builder = CGF.Builder;
964 Base = Builder.CreateBitCast(Base, CGM.Int8PtrTy);
965 llvm::BasicBlock *OriginalBB = 0;
966 llvm::BasicBlock *SkipAdjustBB = 0;
967 llvm::BasicBlock *VBaseAdjustBB = 0;
968
969 // In the unspecified inheritance model, there might not be a vbtable at all,
970 // in which case we need to skip the virtual base lookup. If there is a
971 // vbtable, the first entry is a no-op entry that gives back the original
972 // base, so look for a virtual base adjustment offset of zero.
973 if (VBPtrOffset) {
974 OriginalBB = Builder.GetInsertBlock();
975 VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust");
976 SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust");
977 llvm::Value *IsVirtual =
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000978 Builder.CreateICmpNE(VBTableOffset, getZeroInt(),
Reid Klecknera3609b02013-04-11 18:13:19 +0000979 "memptr.is_vbase");
980 Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB);
981 CGF.EmitBlock(VBaseAdjustBB);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000982 }
983
Reid Klecknera3609b02013-04-11 18:13:19 +0000984 // If we weren't given a dynamic vbptr offset, RD should be complete and we'll
985 // know the vbptr offset.
986 if (!VBPtrOffset) {
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000987 CharUnits offs = CharUnits::Zero();
988 if (RD->getNumVBases()) {
989 offs = GetVBPtrOffsetFromBases(RD);
990 }
Reid Klecknera3609b02013-04-11 18:13:19 +0000991 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity());
992 }
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000993 llvm::Value *VBPtr = 0;
Reid Klecknera3609b02013-04-11 18:13:19 +0000994 llvm::Value *VBaseOffs =
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000995 GetVBaseOffsetFromVBPtr(CGF, Base, VBTableOffset, VBPtrOffset, &VBPtr);
Reid Klecknera3609b02013-04-11 18:13:19 +0000996 llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs);
997
998 // Merge control flow with the case where we didn't have to adjust.
999 if (VBaseAdjustBB) {
1000 Builder.CreateBr(SkipAdjustBB);
1001 CGF.EmitBlock(SkipAdjustBB);
1002 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base");
1003 Phi->addIncoming(Base, OriginalBB);
1004 Phi->addIncoming(AdjustedBase, VBaseAdjustBB);
1005 return Phi;
1006 }
1007 return AdjustedBase;
Reid Klecknera8a0f762013-03-22 19:02:54 +00001008}
1009
1010llvm::Value *
1011MicrosoftCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF,
1012 llvm::Value *Base,
1013 llvm::Value *MemPtr,
1014 const MemberPointerType *MPT) {
Reid Klecknera3609b02013-04-11 18:13:19 +00001015 assert(MPT->isMemberDataPointer());
Reid Klecknera8a0f762013-03-22 19:02:54 +00001016 unsigned AS = Base->getType()->getPointerAddressSpace();
1017 llvm::Type *PType =
1018 CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
1019 CGBuilderTy &Builder = CGF.Builder;
Reid Klecknera3609b02013-04-11 18:13:19 +00001020 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
1021 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
Reid Klecknera8a0f762013-03-22 19:02:54 +00001022
Reid Klecknera3609b02013-04-11 18:13:19 +00001023 // Extract the fields we need, regardless of model. We'll apply them if we
1024 // have them.
1025 llvm::Value *FieldOffset = MemPtr;
1026 llvm::Value *VirtualBaseAdjustmentOffset = 0;
1027 llvm::Value *VBPtrOffset = 0;
1028 if (MemPtr->getType()->isStructTy()) {
1029 // We need to extract values.
1030 unsigned I = 0;
1031 FieldOffset = Builder.CreateExtractValue(MemPtr, I++);
1032 if (hasVBPtrOffsetField(Inheritance))
1033 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
1034 if (hasVirtualBaseAdjustmentField(Inheritance))
1035 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Klecknera8a0f762013-03-22 19:02:54 +00001036 }
1037
Reid Klecknera3609b02013-04-11 18:13:19 +00001038 if (VirtualBaseAdjustmentOffset) {
1039 Base = AdjustVirtualBase(CGF, RD, Base, VirtualBaseAdjustmentOffset,
1040 VBPtrOffset);
Reid Klecknera8a0f762013-03-22 19:02:54 +00001041 }
Reid Klecknera3609b02013-04-11 18:13:19 +00001042 llvm::Value *Addr =
1043 Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset");
Reid Klecknera8a0f762013-03-22 19:02:54 +00001044
1045 // Cast the address to the appropriate pointer type, adopting the address
1046 // space of the base pointer.
1047 return Builder.CreateBitCast(Addr, PType);
1048}
1049
Reid Klecknerf6327302013-05-09 21:01:17 +00001050static MSInheritanceModel
1051getInheritanceFromMemptr(const MemberPointerType *MPT) {
1052 return MPT->getClass()->getAsCXXRecordDecl()->getMSInheritanceModel();
1053}
1054
1055llvm::Value *
1056MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
1057 const CastExpr *E,
1058 llvm::Value *Src) {
1059 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
1060 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
1061 E->getCastKind() == CK_ReinterpretMemberPointer);
1062
1063 // Use constant emission if we can.
1064 if (isa<llvm::Constant>(Src))
1065 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src));
1066
1067 // We may be adding or dropping fields from the member pointer, so we need
1068 // both types and the inheritance models of both records.
1069 const MemberPointerType *SrcTy =
1070 E->getSubExpr()->getType()->castAs<MemberPointerType>();
1071 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
1072 MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy);
1073 MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy);
1074 bool IsFunc = SrcTy->isMemberFunctionPointer();
1075
1076 // If the classes use the same null representation, reinterpret_cast is a nop.
1077 bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer;
1078 if (IsReinterpret && (IsFunc ||
1079 nullFieldOffsetIsZero(SrcInheritance) ==
1080 nullFieldOffsetIsZero(DstInheritance)))
1081 return Src;
1082
1083 CGBuilderTy &Builder = CGF.Builder;
1084
1085 // Branch past the conversion if Src is null.
1086 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy);
1087 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy);
1088
1089 // C++ 5.2.10p9: The null member pointer value is converted to the null member
1090 // pointer value of the destination type.
1091 if (IsReinterpret) {
1092 // For reinterpret casts, sema ensures that src and dst are both functions
1093 // or data and have the same size, which means the LLVM types should match.
1094 assert(Src->getType() == DstNull->getType());
1095 return Builder.CreateSelect(IsNotNull, Src, DstNull);
1096 }
1097
1098 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock();
1099 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert");
1100 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted");
1101 Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB);
1102 CGF.EmitBlock(ConvertBB);
1103
1104 // Decompose src.
1105 llvm::Value *FirstField = Src;
1106 llvm::Value *NonVirtualBaseAdjustment = 0;
1107 llvm::Value *VirtualBaseAdjustmentOffset = 0;
1108 llvm::Value *VBPtrOffset = 0;
1109 if (!hasOnlyOneField(IsFunc, SrcInheritance)) {
1110 // We need to extract values.
1111 unsigned I = 0;
1112 FirstField = Builder.CreateExtractValue(Src, I++);
1113 if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance))
1114 NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++);
1115 if (hasVBPtrOffsetField(SrcInheritance))
1116 VBPtrOffset = Builder.CreateExtractValue(Src, I++);
1117 if (hasVirtualBaseAdjustmentField(SrcInheritance))
1118 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++);
1119 }
1120
1121 // For data pointers, we adjust the field offset directly. For functions, we
1122 // have a separate field.
1123 llvm::Constant *Adj = getMemberPointerAdjustment(E);
1124 if (Adj) {
1125 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
1126 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField;
1127 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1128 if (!NVAdjustField) // If this field didn't exist in src, it's zero.
1129 NVAdjustField = getZeroInt();
1130 if (isDerivedToBase)
1131 NVAdjustField = Builder.CreateNSWSub(NVAdjustField, Adj, "adj");
1132 else
1133 NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, Adj, "adj");
1134 }
1135
1136 // FIXME PR15713: Support conversions through virtually derived classes.
1137
1138 // Recompose dst from the null struct and the adjusted fields from src.
1139 llvm::Value *Dst;
1140 if (hasOnlyOneField(IsFunc, DstInheritance)) {
1141 Dst = FirstField;
1142 } else {
1143 Dst = llvm::UndefValue::get(DstNull->getType());
1144 unsigned Idx = 0;
1145 Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++);
1146 if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance))
1147 Dst = Builder.CreateInsertValue(
1148 Dst, getValueOrZeroInt(NonVirtualBaseAdjustment), Idx++);
1149 if (hasVBPtrOffsetField(DstInheritance))
1150 Dst = Builder.CreateInsertValue(
1151 Dst, getValueOrZeroInt(VBPtrOffset), Idx++);
1152 if (hasVirtualBaseAdjustmentField(DstInheritance))
1153 Dst = Builder.CreateInsertValue(
1154 Dst, getValueOrZeroInt(VirtualBaseAdjustmentOffset), Idx++);
1155 }
1156 Builder.CreateBr(ContinueBB);
1157
1158 // In the continuation, choose between DstNull and Dst.
1159 CGF.EmitBlock(ContinueBB);
1160 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted");
1161 Phi->addIncoming(DstNull, OriginalBB);
1162 Phi->addIncoming(Dst, ConvertBB);
1163 return Phi;
1164}
1165
1166llvm::Constant *
1167MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E,
1168 llvm::Constant *Src) {
1169 const MemberPointerType *SrcTy =
1170 E->getSubExpr()->getType()->castAs<MemberPointerType>();
1171 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
1172
1173 // If src is null, emit a new null for dst. We can't return src because dst
1174 // might have a new representation.
1175 if (MemberPointerConstantIsNull(SrcTy, Src))
1176 return EmitNullMemberPointer(DstTy);
1177
1178 // We don't need to do anything for reinterpret_casts of non-null member
1179 // pointers. We should only get here when the two type representations have
1180 // the same size.
1181 if (E->getCastKind() == CK_ReinterpretMemberPointer)
1182 return Src;
1183
1184 MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy);
1185 MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy);
1186
1187 // Decompose src.
1188 llvm::Constant *FirstField = Src;
1189 llvm::Constant *NonVirtualBaseAdjustment = 0;
1190 llvm::Constant *VirtualBaseAdjustmentOffset = 0;
1191 llvm::Constant *VBPtrOffset = 0;
1192 bool IsFunc = SrcTy->isMemberFunctionPointer();
1193 if (!hasOnlyOneField(IsFunc, SrcInheritance)) {
1194 // We need to extract values.
1195 unsigned I = 0;
1196 FirstField = Src->getAggregateElement(I++);
1197 if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance))
1198 NonVirtualBaseAdjustment = Src->getAggregateElement(I++);
1199 if (hasVBPtrOffsetField(SrcInheritance))
1200 VBPtrOffset = Src->getAggregateElement(I++);
1201 if (hasVirtualBaseAdjustmentField(SrcInheritance))
1202 VirtualBaseAdjustmentOffset = Src->getAggregateElement(I++);
1203 }
1204
1205 // For data pointers, we adjust the field offset directly. For functions, we
1206 // have a separate field.
1207 llvm::Constant *Adj = getMemberPointerAdjustment(E);
1208 if (Adj) {
1209 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
1210 llvm::Constant *&NVAdjustField =
1211 IsFunc ? NonVirtualBaseAdjustment : FirstField;
1212 bool IsDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1213 if (!NVAdjustField) // If this field didn't exist in src, it's zero.
1214 NVAdjustField = getZeroInt();
1215 if (IsDerivedToBase)
1216 NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj);
1217 else
1218 NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj);
1219 }
1220
1221 // FIXME PR15713: Support conversions through virtually derived classes.
1222
1223 // Recompose dst from the null struct and the adjusted fields from src.
1224 if (hasOnlyOneField(IsFunc, DstInheritance))
1225 return FirstField;
1226
1227 llvm::SmallVector<llvm::Constant *, 4> Fields;
1228 Fields.push_back(FirstField);
1229 if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance))
1230 Fields.push_back(getConstantOrZeroInt(NonVirtualBaseAdjustment));
1231 if (hasVBPtrOffsetField(DstInheritance))
1232 Fields.push_back(getConstantOrZeroInt(VBPtrOffset));
1233 if (hasVirtualBaseAdjustmentField(DstInheritance))
1234 Fields.push_back(getConstantOrZeroInt(VirtualBaseAdjustmentOffset));
1235 return llvm::ConstantStruct::getAnon(Fields);
1236}
1237
Reid Klecknera3609b02013-04-11 18:13:19 +00001238llvm::Value *
1239MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
1240 llvm::Value *&This,
1241 llvm::Value *MemPtr,
1242 const MemberPointerType *MPT) {
1243 assert(MPT->isMemberFunctionPointer());
1244 const FunctionProtoType *FPT =
1245 MPT->getPointeeType()->castAs<FunctionProtoType>();
1246 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
1247 llvm::FunctionType *FTy =
1248 CGM.getTypes().GetFunctionType(
1249 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
1250 CGBuilderTy &Builder = CGF.Builder;
1251
1252 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
1253
1254 // Extract the fields we need, regardless of model. We'll apply them if we
1255 // have them.
1256 llvm::Value *FunctionPointer = MemPtr;
1257 llvm::Value *NonVirtualBaseAdjustment = NULL;
1258 llvm::Value *VirtualBaseAdjustmentOffset = NULL;
1259 llvm::Value *VBPtrOffset = NULL;
1260 if (MemPtr->getType()->isStructTy()) {
1261 // We need to extract values.
1262 unsigned I = 0;
1263 FunctionPointer = Builder.CreateExtractValue(MemPtr, I++);
Reid Klecknera3609b02013-04-11 18:13:19 +00001264 if (hasNonVirtualBaseAdjustmentField(MPT, Inheritance))
1265 NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner79e02912013-05-03 01:15:11 +00001266 if (hasVBPtrOffsetField(Inheritance))
1267 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Klecknera3609b02013-04-11 18:13:19 +00001268 if (hasVirtualBaseAdjustmentField(Inheritance))
1269 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
1270 }
1271
1272 if (VirtualBaseAdjustmentOffset) {
1273 This = AdjustVirtualBase(CGF, RD, This, VirtualBaseAdjustmentOffset,
1274 VBPtrOffset);
1275 }
1276
1277 if (NonVirtualBaseAdjustment) {
1278 // Apply the adjustment and cast back to the original struct type.
1279 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
1280 Ptr = Builder.CreateInBoundsGEP(Ptr, NonVirtualBaseAdjustment);
1281 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
1282 }
1283
1284 return Builder.CreateBitCast(FunctionPointer, FTy->getPointerTo());
1285}
1286
Charles Davis071cc7d2010-08-16 03:33:14 +00001287CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
Charles Davisc3926642010-06-09 23:25:41 +00001288 return new MicrosoftCXXABI(CGM);
1289}
1290