blob: 929130bc476685d5448464752fe890d52747959b [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
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +000033 bool isReturnTypeIndirect(const CXXRecordDecl *RD) const {
34 // Structures that are not C++03 PODs are always indirect.
35 return !RD->isPOD();
36 }
37
38 RecordArgABI getRecordArgABI(const CXXRecordDecl *RD) const {
Reid Kleckner9b601952013-06-21 12:45:15 +000039 if (RD->hasNonTrivialCopyConstructor() || RD->hasNonTrivialDestructor())
Timur Iskhodzhanoved23bdf2013-04-17 12:54:10 +000040 return RAA_DirectInMemory;
41 return RAA_Default;
42 }
43
Joao Matos285baac2012-07-17 17:10:11 +000044 StringRef GetPureVirtualCallName() { return "_purecall"; }
David Blaikie2eb9a952012-10-16 22:56:05 +000045 // No known support for deleted functions in MSVC yet, so this choice is
46 // arbitrary.
47 StringRef GetDeletedVirtualCallName() { return "_purecall"; }
Joao Matos285baac2012-07-17 17:10:11 +000048
John McCallecd03b42012-09-25 10:10:39 +000049 llvm::Value *adjustToCompleteObject(CodeGenFunction &CGF,
50 llvm::Value *ptr,
51 QualType type);
52
Reid Klecknerb0f533e2013-05-29 18:02:47 +000053 llvm::Value *GetVirtualBaseClassOffset(CodeGenFunction &CGF,
54 llvm::Value *This,
55 const CXXRecordDecl *ClassDecl,
56 const CXXRecordDecl *BaseClassDecl);
57
John McCall4c40d982010-08-31 07:33:07 +000058 void BuildConstructorSignature(const CXXConstructorDecl *Ctor,
59 CXXCtorType Type,
60 CanQualType &ResTy,
John McCallbd315742012-09-25 08:00:39 +000061 SmallVectorImpl<CanQualType> &ArgTys);
John McCall4c40d982010-08-31 07:33:07 +000062
Reid Kleckner90633022013-06-19 15:20:38 +000063 llvm::BasicBlock *EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
64 const CXXRecordDecl *RD);
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +000065
John McCall4c40d982010-08-31 07:33:07 +000066 void BuildDestructorSignature(const CXXDestructorDecl *Ctor,
67 CXXDtorType Type,
68 CanQualType &ResTy,
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +000069 SmallVectorImpl<CanQualType> &ArgTys);
John McCall4c40d982010-08-31 07:33:07 +000070
71 void BuildInstanceFunctionParams(CodeGenFunction &CGF,
72 QualType &ResTy,
John McCallbd315742012-09-25 08:00:39 +000073 FunctionArgList &Params);
John McCall4c40d982010-08-31 07:33:07 +000074
John McCallbd315742012-09-25 08:00:39 +000075 void EmitInstanceFunctionProlog(CodeGenFunction &CGF);
John McCallfd708262011-01-27 02:46:02 +000076
Stephen Lin3258abc2013-06-19 23:23:19 +000077 llvm::Value *EmitConstructorCall(CodeGenFunction &CGF,
78 const CXXConstructorDecl *D,
79 CXXCtorType Type, bool ForVirtualBase,
80 bool Delegating,
Stephen Lin4444dbb2013-06-19 18:10:35 +000081 llvm::Value *This,
82 CallExpr::const_arg_iterator ArgBeg,
83 CallExpr::const_arg_iterator ArgEnd);
Stephen Lin3258abc2013-06-19 23:23:19 +000084
85 RValue EmitVirtualDestructorCall(CodeGenFunction &CGF,
86 const CXXDestructorDecl *Dtor,
87 CXXDtorType DtorType,
88 SourceLocation CallLoc,
89 ReturnValueSlot ReturnValue,
90 llvm::Value *This);
Timur Iskhodzhanov0f9827f2013-02-15 14:45:22 +000091
Reid Kleckner90633022013-06-19 15:20:38 +000092 void EmitVirtualInheritanceTables(llvm::GlobalVariable::LinkageTypes Linkage,
93 const CXXRecordDecl *RD);
94
John McCall20bb1752012-05-01 06:13:13 +000095 void EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
96 llvm::GlobalVariable *DeclPtr,
97 bool PerformInit);
98
John McCallfd708262011-01-27 02:46:02 +000099 // ==== Notes on array cookies =========
100 //
101 // MSVC seems to only use cookies when the class has a destructor; a
102 // two-argument usual array deallocation function isn't sufficient.
103 //
104 // For example, this code prints "100" and "1":
105 // struct A {
106 // char x;
107 // void *operator new[](size_t sz) {
108 // printf("%u\n", sz);
109 // return malloc(sz);
110 // }
111 // void operator delete[](void *p, size_t sz) {
112 // printf("%u\n", sz);
113 // free(p);
114 // }
115 // };
116 // int main() {
117 // A *p = new A[100];
118 // delete[] p;
119 // }
120 // Whereas it prints "104" and "104" if you give A a destructor.
John McCalle2b45e22012-05-01 05:23:51 +0000121
122 bool requiresArrayCookie(const CXXDeleteExpr *expr, QualType elementType);
123 bool requiresArrayCookie(const CXXNewExpr *expr);
124 CharUnits getArrayCookieSizeImpl(QualType type);
125 llvm::Value *InitializeArrayCookie(CodeGenFunction &CGF,
126 llvm::Value *NewPtr,
127 llvm::Value *NumElements,
128 const CXXNewExpr *expr,
129 QualType ElementType);
130 llvm::Value *readArrayCookieImpl(CodeGenFunction &CGF,
131 llvm::Value *allocPtr,
132 CharUnits cookieSize);
Stephen Lin3258abc2013-06-19 23:23:19 +0000133 static bool needThisReturn(GlobalDecl GD);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000134
135private:
Reid Klecknera3609b02013-04-11 18:13:19 +0000136 llvm::Constant *getZeroInt() {
137 return llvm::ConstantInt::get(CGM.IntTy, 0);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000138 }
139
Reid Klecknera3609b02013-04-11 18:13:19 +0000140 llvm::Constant *getAllOnesInt() {
141 return llvm::Constant::getAllOnesValue(CGM.IntTy);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000142 }
143
Reid Klecknerf6327302013-05-09 21:01:17 +0000144 llvm::Constant *getConstantOrZeroInt(llvm::Constant *C) {
145 return C ? C : getZeroInt();
146 }
147
148 llvm::Value *getValueOrZeroInt(llvm::Value *C) {
149 return C ? C : getZeroInt();
150 }
151
Reid Klecknera3609b02013-04-11 18:13:19 +0000152 void
153 GetNullMemberPointerFields(const MemberPointerType *MPT,
154 llvm::SmallVectorImpl<llvm::Constant *> &fields);
155
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000156 /// \brief Finds the offset from the base of RD to the vbptr it uses, even if
157 /// it is reusing a vbptr from a non-virtual base. RD must have morally
158 /// virtual bases.
159 CharUnits GetVBPtrOffsetFromBases(const CXXRecordDecl *RD);
160
161 /// \brief Shared code for virtual base adjustment. Returns the offset from
162 /// the vbptr to the virtual base. Optionally returns the address of the
163 /// vbptr itself.
164 llvm::Value *GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
165 llvm::Value *Base,
166 llvm::Value *VBPtrOffset,
167 llvm::Value *VBTableOffset,
168 llvm::Value **VBPtr = 0);
169
170 /// \brief Performs a full virtual base adjustment. Used to dereference
171 /// pointers to members of virtual bases.
Reid Klecknera3609b02013-04-11 18:13:19 +0000172 llvm::Value *AdjustVirtualBase(CodeGenFunction &CGF, const CXXRecordDecl *RD,
173 llvm::Value *Base,
174 llvm::Value *VirtualBaseAdjustmentOffset,
175 llvm::Value *VBPtrOffset /* optional */);
176
Reid Kleckner79e02912013-05-03 01:15:11 +0000177 /// \brief Emits a full member pointer with the fields common to data and
178 /// function member pointers.
179 llvm::Constant *EmitFullMemberPointer(llvm::Constant *FirstField,
180 bool IsMemberFunction,
Reid Klecknerf6327302013-05-09 21:01:17 +0000181 const CXXRecordDecl *RD,
182 CharUnits NonVirtualBaseAdjustment);
183
184 llvm::Constant *BuildMemberPointer(const CXXRecordDecl *RD,
185 const CXXMethodDecl *MD,
186 CharUnits NonVirtualBaseAdjustment);
187
188 bool MemberPointerConstantIsNull(const MemberPointerType *MPT,
189 llvm::Constant *MP);
Reid Kleckner79e02912013-05-03 01:15:11 +0000190
Reid Kleckner90633022013-06-19 15:20:38 +0000191 /// \brief - Initialize all vbptrs of 'this' with RD as the complete type.
192 void EmitVBPtrStores(CodeGenFunction &CGF, const CXXRecordDecl *RD);
193
194 /// \brief Caching wrapper around VBTableBuilder::enumerateVBTables().
195 const VBTableVector &EnumerateVBTables(const CXXRecordDecl *RD);
196
Reid Klecknera8a0f762013-03-22 19:02:54 +0000197public:
Reid Klecknera3609b02013-04-11 18:13:19 +0000198 virtual llvm::Type *ConvertMemberPointerType(const MemberPointerType *MPT);
199
200 virtual bool isZeroInitializable(const MemberPointerType *MPT);
201
Reid Klecknera8a0f762013-03-22 19:02:54 +0000202 virtual llvm::Constant *EmitNullMemberPointer(const MemberPointerType *MPT);
203
204 virtual llvm::Constant *EmitMemberDataPointer(const MemberPointerType *MPT,
205 CharUnits offset);
Reid Kleckner79e02912013-05-03 01:15:11 +0000206 virtual llvm::Constant *EmitMemberPointer(const CXXMethodDecl *MD);
207 virtual llvm::Constant *EmitMemberPointer(const APValue &MP, QualType MPT);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000208
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000209 virtual llvm::Value *EmitMemberPointerComparison(CodeGenFunction &CGF,
210 llvm::Value *L,
211 llvm::Value *R,
212 const MemberPointerType *MPT,
213 bool Inequality);
214
Reid Klecknera8a0f762013-03-22 19:02:54 +0000215 virtual llvm::Value *EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
216 llvm::Value *MemPtr,
217 const MemberPointerType *MPT);
218
219 virtual llvm::Value *EmitMemberDataPointerAddress(CodeGenFunction &CGF,
220 llvm::Value *Base,
221 llvm::Value *MemPtr,
222 const MemberPointerType *MPT);
223
Reid Klecknerf6327302013-05-09 21:01:17 +0000224 virtual llvm::Value *EmitMemberPointerConversion(CodeGenFunction &CGF,
225 const CastExpr *E,
226 llvm::Value *Src);
227
228 virtual llvm::Constant *EmitMemberPointerConversion(const CastExpr *E,
229 llvm::Constant *Src);
230
Reid Klecknera3609b02013-04-11 18:13:19 +0000231 virtual llvm::Value *
232 EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
233 llvm::Value *&This,
234 llvm::Value *MemPtr,
235 const MemberPointerType *MPT);
236
Reid Kleckner90633022013-06-19 15:20:38 +0000237private:
238 /// VBTables - All the vbtables which have been referenced.
239 llvm::DenseMap<const CXXRecordDecl *, VBTableVector> VBTablesMap;
Charles Davisc3926642010-06-09 23:25:41 +0000240};
241
242}
243
John McCallecd03b42012-09-25 10:10:39 +0000244llvm::Value *MicrosoftCXXABI::adjustToCompleteObject(CodeGenFunction &CGF,
245 llvm::Value *ptr,
246 QualType type) {
247 // FIXME: implement
248 return ptr;
249}
250
Reid Kleckner8c474322013-06-04 21:32:29 +0000251/// \brief Finds the first non-virtual base of RD that has virtual bases. If RD
252/// doesn't have a vbptr, it will reuse the vbptr of the returned class.
253static const CXXRecordDecl *FindFirstNVBaseWithVBases(const CXXRecordDecl *RD) {
254 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(),
255 E = RD->bases_end(); I != E; ++I) {
256 const CXXRecordDecl *Base = I->getType()->getAsCXXRecordDecl();
257 if (!I->isVirtual() && Base->getNumVBases() > 0)
258 return Base;
259 }
260 llvm_unreachable("RD must have an nv base with vbases");
261}
262
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000263CharUnits MicrosoftCXXABI::GetVBPtrOffsetFromBases(const CXXRecordDecl *RD) {
264 assert(RD->getNumVBases());
265 CharUnits Total = CharUnits::Zero();
266 while (RD) {
267 const ASTRecordLayout &RDLayout = getContext().getASTRecordLayout(RD);
268 CharUnits VBPtrOffset = RDLayout.getVBPtrOffset();
269 // -1 is the sentinel for no vbptr.
270 if (VBPtrOffset != CharUnits::fromQuantity(-1)) {
271 Total += VBPtrOffset;
272 break;
273 }
Reid Kleckner8c474322013-06-04 21:32:29 +0000274 RD = FindFirstNVBaseWithVBases(RD);
275 Total += RDLayout.getBaseClassOffset(RD);
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000276 }
277 return Total;
278}
279
Reid Kleckner8c474322013-06-04 21:32:29 +0000280/// \brief Computes the index of BaseClassDecl in the vbtable of ClassDecl.
281/// BaseClassDecl must be a morally virtual base of ClassDecl. The vbtable is
282/// an array of i32 offsets. The first entry is a self entry, and the rest are
283/// offsets from the vbptr to virtual bases. The bases are ordered the same way
284/// our vbases are ordered: as they appear in a left-to-right depth-first search
285/// of the hierarchy.
286static unsigned GetVBTableIndex(const CXXRecordDecl *ClassDecl,
287 const CXXRecordDecl *BaseClassDecl) {
288 unsigned VBTableIndex = 1; // Start with one to skip the self entry.
289 for (CXXRecordDecl::base_class_const_iterator I = ClassDecl->vbases_begin(),
290 E = ClassDecl->vbases_end(); I != E; ++I) {
291 if (I->getType()->getAsCXXRecordDecl() == BaseClassDecl)
292 return VBTableIndex;
293 VBTableIndex++;
294 }
295 llvm_unreachable("BaseClassDecl must be a vbase of ClassDecl");
296}
297
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000298llvm::Value *
299MicrosoftCXXABI::GetVirtualBaseClassOffset(CodeGenFunction &CGF,
300 llvm::Value *This,
301 const CXXRecordDecl *ClassDecl,
302 const CXXRecordDecl *BaseClassDecl) {
303 int64_t VBPtrChars = GetVBPtrOffsetFromBases(ClassDecl).getQuantity();
304 llvm::Value *VBPtrOffset = llvm::ConstantInt::get(CGM.PtrDiffTy, VBPtrChars);
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000305 CharUnits IntSize = getContext().getTypeSizeInChars(getContext().IntTy);
Reid Kleckner8c474322013-06-04 21:32:29 +0000306 CharUnits VBTableChars = IntSize * GetVBTableIndex(ClassDecl, BaseClassDecl);
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000307 llvm::Value *VBTableOffset =
308 llvm::ConstantInt::get(CGM.IntTy, VBTableChars.getQuantity());
309
310 llvm::Value *VBPtrToNewBase =
311 GetVBaseOffsetFromVBPtr(CGF, This, VBTableOffset, VBPtrOffset);
312 VBPtrToNewBase =
313 CGF.Builder.CreateSExtOrBitCast(VBPtrToNewBase, CGM.PtrDiffTy);
314 return CGF.Builder.CreateNSWAdd(VBPtrOffset, VBPtrToNewBase);
315}
316
Stephen Lin3258abc2013-06-19 23:23:19 +0000317bool MicrosoftCXXABI::needThisReturn(GlobalDecl GD) {
318 const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl());
319 return isa<CXXConstructorDecl>(MD);
John McCallbd315742012-09-25 08:00:39 +0000320}
321
322void MicrosoftCXXABI::BuildConstructorSignature(const CXXConstructorDecl *Ctor,
323 CXXCtorType Type,
324 CanQualType &ResTy,
325 SmallVectorImpl<CanQualType> &ArgTys) {
Stephen Lin3258abc2013-06-19 23:23:19 +0000326 // 'this' is already in place
327
328 // Ctor returns this ptr
329 ResTy = ArgTys[0];
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000330
331 const CXXRecordDecl *Class = Ctor->getParent();
332 if (Class->getNumVBases()) {
333 // Constructors of classes with virtual bases take an implicit parameter.
334 ArgTys.push_back(CGM.getContext().IntTy);
335 }
336}
337
Reid Kleckner90633022013-06-19 15:20:38 +0000338llvm::BasicBlock *
339MicrosoftCXXABI::EmitCtorCompleteObjectHandler(CodeGenFunction &CGF,
340 const CXXRecordDecl *RD) {
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000341 llvm::Value *IsMostDerivedClass = getStructorImplicitParamValue(CGF);
342 assert(IsMostDerivedClass &&
343 "ctor for a class with virtual bases must have an implicit parameter");
Reid Kleckner90633022013-06-19 15:20:38 +0000344 llvm::Value *IsCompleteObject =
345 CGF.Builder.CreateIsNotNull(IsMostDerivedClass, "is_complete_object");
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000346
347 llvm::BasicBlock *CallVbaseCtorsBB = CGF.createBasicBlock("ctor.init_vbases");
348 llvm::BasicBlock *SkipVbaseCtorsBB = CGF.createBasicBlock("ctor.skip_vbases");
349 CGF.Builder.CreateCondBr(IsCompleteObject,
350 CallVbaseCtorsBB, SkipVbaseCtorsBB);
351
352 CGF.EmitBlock(CallVbaseCtorsBB);
Reid Kleckner90633022013-06-19 15:20:38 +0000353
354 // Fill in the vbtable pointers here.
355 EmitVBPtrStores(CGF, RD);
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000356
357 // CGF will put the base ctor calls in this basic block for us later.
358
359 return SkipVbaseCtorsBB;
John McCallbd315742012-09-25 08:00:39 +0000360}
361
Reid Kleckner90633022013-06-19 15:20:38 +0000362void MicrosoftCXXABI::EmitVBPtrStores(CodeGenFunction &CGF,
363 const CXXRecordDecl *RD) {
364 llvm::Value *ThisInt8Ptr =
365 CGF.Builder.CreateBitCast(getThisValue(CGF), CGM.Int8PtrTy, "this.int8");
366
367 const VBTableVector &VBTables = EnumerateVBTables(RD);
368 for (VBTableVector::const_iterator I = VBTables.begin(), E = VBTables.end();
369 I != E; ++I) {
370 const ASTRecordLayout &SubobjectLayout =
371 CGM.getContext().getASTRecordLayout(I->VBPtrSubobject.getBase());
372 uint64_t Offs = (I->VBPtrSubobject.getBaseOffset() +
373 SubobjectLayout.getVBPtrOffset()).getQuantity();
374 llvm::Value *VBPtr =
375 CGF.Builder.CreateConstInBoundsGEP1_64(ThisInt8Ptr, Offs);
376 VBPtr = CGF.Builder.CreateBitCast(VBPtr, I->GV->getType()->getPointerTo(0),
377 "vbptr." + I->ReusingBase->getName());
378 CGF.Builder.CreateStore(I->GV, VBPtr);
379 }
380}
381
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000382void MicrosoftCXXABI::BuildDestructorSignature(const CXXDestructorDecl *Dtor,
383 CXXDtorType Type,
384 CanQualType &ResTy,
385 SmallVectorImpl<CanQualType> &ArgTys) {
386 // 'this' is already in place
387 // TODO: 'for base' flag
388
389 if (Type == Dtor_Deleting) {
390 // The scalar deleting destructor takes an implicit bool parameter.
391 ArgTys.push_back(CGM.getContext().BoolTy);
392 }
393}
394
395static bool IsDeletingDtor(GlobalDecl GD) {
396 const CXXMethodDecl* MD = cast<CXXMethodDecl>(GD.getDecl());
397 if (isa<CXXDestructorDecl>(MD)) {
398 return GD.getDtorType() == Dtor_Deleting;
399 }
400 return false;
401}
402
John McCallbd315742012-09-25 08:00:39 +0000403void MicrosoftCXXABI::BuildInstanceFunctionParams(CodeGenFunction &CGF,
404 QualType &ResTy,
405 FunctionArgList &Params) {
406 BuildThisParam(CGF, Params);
Stephen Lin3258abc2013-06-19 23:23:19 +0000407 if (needThisReturn(CGF.CurGD)) {
408 ResTy = Params[0]->getType();
409 }
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000410
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000411 ASTContext &Context = getContext();
412 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
413 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
414 ImplicitParamDecl *IsMostDerived
415 = ImplicitParamDecl::Create(Context, 0,
416 CGF.CurGD.getDecl()->getLocation(),
417 &Context.Idents.get("is_most_derived"),
418 Context.IntTy);
419 Params.push_back(IsMostDerived);
420 getStructorImplicitParamDecl(CGF) = IsMostDerived;
421 } else if (IsDeletingDtor(CGF.CurGD)) {
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000422 ImplicitParamDecl *ShouldDelete
423 = ImplicitParamDecl::Create(Context, 0,
424 CGF.CurGD.getDecl()->getLocation(),
425 &Context.Idents.get("should_call_delete"),
426 Context.BoolTy);
427 Params.push_back(ShouldDelete);
428 getStructorImplicitParamDecl(CGF) = ShouldDelete;
429 }
John McCallbd315742012-09-25 08:00:39 +0000430}
431
432void MicrosoftCXXABI::EmitInstanceFunctionProlog(CodeGenFunction &CGF) {
433 EmitThisParam(CGF);
Stephen Lin3258abc2013-06-19 23:23:19 +0000434 if (needThisReturn(CGF.CurGD)) {
John McCallbd315742012-09-25 08:00:39 +0000435 CGF.Builder.CreateStore(getThisValue(CGF), CGF.ReturnValue);
Stephen Lin3258abc2013-06-19 23:23:19 +0000436 }
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000437
438 const CXXMethodDecl *MD = cast<CXXMethodDecl>(CGF.CurGD.getDecl());
439 if (isa<CXXConstructorDecl>(MD) && MD->getParent()->getNumVBases()) {
440 assert(getStructorImplicitParamDecl(CGF) &&
441 "no implicit parameter for a constructor with virtual bases?");
442 getStructorImplicitParamValue(CGF)
443 = CGF.Builder.CreateLoad(
444 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
445 "is_most_derived");
446 }
447
Timur Iskhodzhanov59660c22013-02-13 08:37:51 +0000448 if (IsDeletingDtor(CGF.CurGD)) {
449 assert(getStructorImplicitParamDecl(CGF) &&
450 "no implicit parameter for a deleting destructor?");
451 getStructorImplicitParamValue(CGF)
452 = CGF.Builder.CreateLoad(
453 CGF.GetAddrOfLocalVar(getStructorImplicitParamDecl(CGF)),
454 "should_call_delete");
455 }
John McCallbd315742012-09-25 08:00:39 +0000456}
457
Stephen Lin3258abc2013-06-19 23:23:19 +0000458llvm::Value *MicrosoftCXXABI::EmitConstructorCall(CodeGenFunction &CGF,
Stephen Lin4444dbb2013-06-19 18:10:35 +0000459 const CXXConstructorDecl *D,
Stephen Lin3258abc2013-06-19 23:23:19 +0000460 CXXCtorType Type, bool ForVirtualBase,
Stephen Lin4444dbb2013-06-19 18:10:35 +0000461 bool Delegating,
462 llvm::Value *This,
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000463 CallExpr::const_arg_iterator ArgBeg,
464 CallExpr::const_arg_iterator ArgEnd) {
465 assert(Type == Ctor_Complete || Type == Ctor_Base);
466 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Ctor_Complete);
467
468 llvm::Value *ImplicitParam = 0;
469 QualType ImplicitParamTy;
470 if (D->getParent()->getNumVBases()) {
471 ImplicitParam = llvm::ConstantInt::get(CGM.Int32Ty, Type == Ctor_Complete);
472 ImplicitParamTy = getContext().IntTy;
473 }
474
475 // FIXME: Provide a source location here.
Stephen Lin4444dbb2013-06-19 18:10:35 +0000476 CGF.EmitCXXMemberCall(D, SourceLocation(), Callee, ReturnValueSlot(), This,
Stephen Lin3258abc2013-06-19 23:23:19 +0000477 ImplicitParam, ImplicitParamTy,
478 ArgBeg, ArgEnd);
479 return Callee;
Timur Iskhodzhanov1d4fff52013-02-27 13:46:31 +0000480}
481
Stephen Lin3258abc2013-06-19 23:23:19 +0000482RValue MicrosoftCXXABI::EmitVirtualDestructorCall(CodeGenFunction &CGF,
483 const CXXDestructorDecl *Dtor,
484 CXXDtorType DtorType,
485 SourceLocation CallLoc,
486 ReturnValueSlot ReturnValue,
487 llvm::Value *This) {
Timur Iskhodzhanov0f9827f2013-02-15 14:45:22 +0000488 assert(DtorType == Dtor_Deleting || DtorType == Dtor_Complete);
489
490 // We have only one destructor in the vftable but can get both behaviors
491 // by passing an implicit bool parameter.
492 const CGFunctionInfo *FInfo
493 = &CGM.getTypes().arrangeCXXDestructor(Dtor, Dtor_Deleting);
494 llvm::Type *Ty = CGF.CGM.getTypes().GetFunctionType(*FInfo);
495 llvm::Value *Callee = CGF.BuildVirtualCall(Dtor, Dtor_Deleting, This, Ty);
496
497 ASTContext &Context = CGF.getContext();
498 llvm::Value *ImplicitParam
499 = llvm::ConstantInt::get(llvm::IntegerType::getInt1Ty(CGF.getLLVMContext()),
500 DtorType == Dtor_Deleting);
501
Stephen Lin3258abc2013-06-19 23:23:19 +0000502 return CGF.EmitCXXMemberCall(Dtor, CallLoc, Callee, ReturnValue, This,
503 ImplicitParam, Context.BoolTy, 0, 0);
Timur Iskhodzhanov0f9827f2013-02-15 14:45:22 +0000504}
505
Reid Kleckner90633022013-06-19 15:20:38 +0000506const VBTableVector &
507MicrosoftCXXABI::EnumerateVBTables(const CXXRecordDecl *RD) {
508 // At this layer, we can key the cache off of a single class, which is much
509 // easier than caching at the GlobalVariable layer.
510 llvm::DenseMap<const CXXRecordDecl*, VBTableVector>::iterator I;
511 bool added;
512 llvm::tie(I, added) = VBTablesMap.insert(std::make_pair(RD, VBTableVector()));
513 VBTableVector &VBTables = I->second;
514 if (!added)
515 return VBTables;
516
517 VBTableBuilder(CGM, RD).enumerateVBTables(VBTables);
518
519 return VBTables;
520}
521
522void MicrosoftCXXABI::EmitVirtualInheritanceTables(
523 llvm::GlobalVariable::LinkageTypes Linkage, const CXXRecordDecl *RD) {
524 const VBTableVector &VBTables = EnumerateVBTables(RD);
525 for (VBTableVector::const_iterator I = VBTables.begin(), E = VBTables.end();
526 I != E; ++I) {
527 I->EmitVBTableDefinition(CGM, RD, Linkage);
528 }
529}
530
John McCalle2b45e22012-05-01 05:23:51 +0000531bool MicrosoftCXXABI::requiresArrayCookie(const CXXDeleteExpr *expr,
532 QualType elementType) {
533 // Microsoft seems to completely ignore the possibility of a
534 // two-argument usual deallocation function.
535 return elementType.isDestructedType();
536}
537
538bool MicrosoftCXXABI::requiresArrayCookie(const CXXNewExpr *expr) {
539 // Microsoft seems to completely ignore the possibility of a
540 // two-argument usual deallocation function.
541 return expr->getAllocatedType().isDestructedType();
542}
543
544CharUnits MicrosoftCXXABI::getArrayCookieSizeImpl(QualType type) {
545 // The array cookie is always a size_t; we then pad that out to the
546 // alignment of the element type.
547 ASTContext &Ctx = getContext();
548 return std::max(Ctx.getTypeSizeInChars(Ctx.getSizeType()),
549 Ctx.getTypeAlignInChars(type));
550}
551
552llvm::Value *MicrosoftCXXABI::readArrayCookieImpl(CodeGenFunction &CGF,
553 llvm::Value *allocPtr,
554 CharUnits cookieSize) {
Micah Villmow956a5a12012-10-25 15:39:14 +0000555 unsigned AS = allocPtr->getType()->getPointerAddressSpace();
John McCalle2b45e22012-05-01 05:23:51 +0000556 llvm::Value *numElementsPtr =
557 CGF.Builder.CreateBitCast(allocPtr, CGF.SizeTy->getPointerTo(AS));
558 return CGF.Builder.CreateLoad(numElementsPtr);
559}
560
561llvm::Value* MicrosoftCXXABI::InitializeArrayCookie(CodeGenFunction &CGF,
562 llvm::Value *newPtr,
563 llvm::Value *numElements,
564 const CXXNewExpr *expr,
565 QualType elementType) {
566 assert(requiresArrayCookie(expr));
567
568 // The size of the cookie.
569 CharUnits cookieSize = getArrayCookieSizeImpl(elementType);
570
571 // Compute an offset to the cookie.
572 llvm::Value *cookiePtr = newPtr;
573
574 // Write the number of elements into the appropriate slot.
Micah Villmow956a5a12012-10-25 15:39:14 +0000575 unsigned AS = newPtr->getType()->getPointerAddressSpace();
John McCalle2b45e22012-05-01 05:23:51 +0000576 llvm::Value *numElementsPtr
577 = CGF.Builder.CreateBitCast(cookiePtr, CGF.SizeTy->getPointerTo(AS));
578 CGF.Builder.CreateStore(numElements, numElementsPtr);
579
580 // Finally, compute a pointer to the actual data buffer by skipping
581 // over the cookie completely.
582 return CGF.Builder.CreateConstInBoundsGEP1_64(newPtr,
583 cookieSize.getQuantity());
584}
585
John McCall20bb1752012-05-01 06:13:13 +0000586void MicrosoftCXXABI::EmitGuardedInit(CodeGenFunction &CGF, const VarDecl &D,
587 llvm::GlobalVariable *DeclPtr,
588 bool PerformInit) {
589 // FIXME: this code was only tested for global initialization.
590 // Not sure whether we want thread-safe static local variables as VS
591 // doesn't make them thread-safe.
592
Richard Smith04e51762013-04-14 23:01:42 +0000593 if (D.getTLSKind())
594 CGM.ErrorUnsupported(&D, "dynamic TLS initialization");
595
John McCall20bb1752012-05-01 06:13:13 +0000596 // Emit the initializer and add a global destructor if appropriate.
597 CGF.EmitCXXGlobalVarDeclInit(D, DeclPtr, PerformInit);
598}
599
Reid Klecknera3609b02013-04-11 18:13:19 +0000600// Member pointer helpers.
601static bool hasVBPtrOffsetField(MSInheritanceModel Inheritance) {
602 return Inheritance == MSIM_Unspecified;
Reid Klecknera8a0f762013-03-22 19:02:54 +0000603}
604
Reid Klecknerf6327302013-05-09 21:01:17 +0000605static bool hasOnlyOneField(bool IsMemberFunction,
606 MSInheritanceModel Inheritance) {
607 return Inheritance <= MSIM_SinglePolymorphic ||
608 (!IsMemberFunction && Inheritance <= MSIM_MultiplePolymorphic);
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000609}
610
Reid Klecknera3609b02013-04-11 18:13:19 +0000611// Only member pointers to functions need a this adjustment, since it can be
612// combined with the field offset for data pointers.
Reid Kleckner79e02912013-05-03 01:15:11 +0000613static bool hasNonVirtualBaseAdjustmentField(bool IsMemberFunction,
Reid Klecknera3609b02013-04-11 18:13:19 +0000614 MSInheritanceModel Inheritance) {
Reid Kleckner79e02912013-05-03 01:15:11 +0000615 return (IsMemberFunction && Inheritance >= MSIM_Multiple);
Reid Klecknera3609b02013-04-11 18:13:19 +0000616}
617
618static bool hasVirtualBaseAdjustmentField(MSInheritanceModel Inheritance) {
619 return Inheritance >= MSIM_Virtual;
620}
621
622// Use zero for the field offset of a null data member pointer if we can
623// guarantee that zero is not a valid field offset, or if the member pointer has
624// multiple fields. Polymorphic classes have a vfptr at offset zero, so we can
625// use zero for null. If there are multiple fields, we can use zero even if it
626// is a valid field offset because null-ness testing will check the other
627// fields.
628static bool nullFieldOffsetIsZero(MSInheritanceModel Inheritance) {
629 return Inheritance != MSIM_Multiple && Inheritance != MSIM_Single;
630}
631
632bool MicrosoftCXXABI::isZeroInitializable(const MemberPointerType *MPT) {
633 // Null-ness for function memptrs only depends on the first field, which is
634 // the function pointer. The rest don't matter, so we can zero initialize.
635 if (MPT->isMemberFunctionPointer())
636 return true;
637
638 // The virtual base adjustment field is always -1 for null, so if we have one
639 // we can't zero initialize. The field offset is sometimes also -1 if 0 is a
640 // valid field offset.
641 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
642 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
643 return (!hasVirtualBaseAdjustmentField(Inheritance) &&
644 nullFieldOffsetIsZero(Inheritance));
645}
646
647llvm::Type *
648MicrosoftCXXABI::ConvertMemberPointerType(const MemberPointerType *MPT) {
649 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
650 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
651 llvm::SmallVector<llvm::Type *, 4> fields;
652 if (MPT->isMemberFunctionPointer())
653 fields.push_back(CGM.VoidPtrTy); // FunctionPointerOrVirtualThunk
654 else
655 fields.push_back(CGM.IntTy); // FieldOffset
656
Reid Kleckner79e02912013-05-03 01:15:11 +0000657 if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(),
658 Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000659 fields.push_back(CGM.IntTy);
Reid Kleckner79e02912013-05-03 01:15:11 +0000660 if (hasVBPtrOffsetField(Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000661 fields.push_back(CGM.IntTy);
662 if (hasVirtualBaseAdjustmentField(Inheritance))
663 fields.push_back(CGM.IntTy); // VirtualBaseAdjustmentOffset
664
665 if (fields.size() == 1)
666 return fields[0];
667 return llvm::StructType::get(CGM.getLLVMContext(), fields);
668}
669
670void MicrosoftCXXABI::
671GetNullMemberPointerFields(const MemberPointerType *MPT,
672 llvm::SmallVectorImpl<llvm::Constant *> &fields) {
673 assert(fields.empty());
674 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
675 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
676 if (MPT->isMemberFunctionPointer()) {
677 // FunctionPointerOrVirtualThunk
678 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
679 } else {
680 if (nullFieldOffsetIsZero(Inheritance))
681 fields.push_back(getZeroInt()); // FieldOffset
682 else
683 fields.push_back(getAllOnesInt()); // FieldOffset
Reid Klecknera8a0f762013-03-22 19:02:54 +0000684 }
Reid Klecknera3609b02013-04-11 18:13:19 +0000685
Reid Kleckner79e02912013-05-03 01:15:11 +0000686 if (hasNonVirtualBaseAdjustmentField(MPT->isMemberFunctionPointer(),
687 Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000688 fields.push_back(getZeroInt());
Reid Kleckner79e02912013-05-03 01:15:11 +0000689 if (hasVBPtrOffsetField(Inheritance))
Reid Klecknera3609b02013-04-11 18:13:19 +0000690 fields.push_back(getZeroInt());
691 if (hasVirtualBaseAdjustmentField(Inheritance))
692 fields.push_back(getAllOnesInt());
Reid Klecknera8a0f762013-03-22 19:02:54 +0000693}
694
695llvm::Constant *
696MicrosoftCXXABI::EmitNullMemberPointer(const MemberPointerType *MPT) {
Reid Klecknera3609b02013-04-11 18:13:19 +0000697 llvm::SmallVector<llvm::Constant *, 4> fields;
698 GetNullMemberPointerFields(MPT, fields);
699 if (fields.size() == 1)
700 return fields[0];
701 llvm::Constant *Res = llvm::ConstantStruct::getAnon(fields);
702 assert(Res->getType() == ConvertMemberPointerType(MPT));
703 return Res;
Reid Klecknera8a0f762013-03-22 19:02:54 +0000704}
705
706llvm::Constant *
Reid Kleckner79e02912013-05-03 01:15:11 +0000707MicrosoftCXXABI::EmitFullMemberPointer(llvm::Constant *FirstField,
708 bool IsMemberFunction,
Reid Klecknerf6327302013-05-09 21:01:17 +0000709 const CXXRecordDecl *RD,
710 CharUnits NonVirtualBaseAdjustment)
Reid Kleckner79e02912013-05-03 01:15:11 +0000711{
Reid Klecknera3609b02013-04-11 18:13:19 +0000712 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
Reid Kleckner79e02912013-05-03 01:15:11 +0000713
714 // Single inheritance class member pointer are represented as scalars instead
715 // of aggregates.
Reid Klecknerf6327302013-05-09 21:01:17 +0000716 if (hasOnlyOneField(IsMemberFunction, Inheritance))
Reid Kleckner79e02912013-05-03 01:15:11 +0000717 return FirstField;
718
Reid Klecknera3609b02013-04-11 18:13:19 +0000719 llvm::SmallVector<llvm::Constant *, 4> fields;
Reid Kleckner79e02912013-05-03 01:15:11 +0000720 fields.push_back(FirstField);
721
722 if (hasNonVirtualBaseAdjustmentField(IsMemberFunction, Inheritance))
Reid Klecknerf6327302013-05-09 21:01:17 +0000723 fields.push_back(llvm::ConstantInt::get(
724 CGM.IntTy, NonVirtualBaseAdjustment.getQuantity()));
Reid Kleckner79e02912013-05-03 01:15:11 +0000725
Reid Klecknera3609b02013-04-11 18:13:19 +0000726 if (hasVBPtrOffsetField(Inheritance)) {
Reid Klecknera06d5852013-06-05 15:58:29 +0000727 fields.push_back(llvm::ConstantInt::get(
728 CGM.IntTy, GetVBPtrOffsetFromBases(RD).getQuantity()));
Reid Klecknera3609b02013-04-11 18:13:19 +0000729 }
Reid Kleckner79e02912013-05-03 01:15:11 +0000730
731 // The rest of the fields are adjusted by conversions to a more derived class.
Reid Klecknera3609b02013-04-11 18:13:19 +0000732 if (hasVirtualBaseAdjustmentField(Inheritance))
733 fields.push_back(getZeroInt());
Reid Kleckner79e02912013-05-03 01:15:11 +0000734
Reid Klecknera3609b02013-04-11 18:13:19 +0000735 return llvm::ConstantStruct::getAnon(fields);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000736}
737
Reid Kleckner79e02912013-05-03 01:15:11 +0000738llvm::Constant *
739MicrosoftCXXABI::EmitMemberDataPointer(const MemberPointerType *MPT,
740 CharUnits offset) {
741 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
742 llvm::Constant *FirstField =
743 llvm::ConstantInt::get(CGM.IntTy, offset.getQuantity());
Reid Klecknerf6327302013-05-09 21:01:17 +0000744 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/false, RD,
745 CharUnits::Zero());
746}
747
748llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const CXXMethodDecl *MD) {
749 return BuildMemberPointer(MD->getParent(), MD, CharUnits::Zero());
750}
751
752llvm::Constant *MicrosoftCXXABI::EmitMemberPointer(const APValue &MP,
753 QualType MPType) {
754 const MemberPointerType *MPT = MPType->castAs<MemberPointerType>();
755 const ValueDecl *MPD = MP.getMemberPointerDecl();
756 if (!MPD)
757 return EmitNullMemberPointer(MPT);
758
759 CharUnits ThisAdjustment = getMemberPointerPathAdjustment(MP);
760
761 // FIXME PR15713: Support virtual inheritance paths.
762
763 if (const CXXMethodDecl *MD = dyn_cast<CXXMethodDecl>(MPD))
764 return BuildMemberPointer(MPT->getClass()->getAsCXXRecordDecl(),
765 MD, ThisAdjustment);
766
767 CharUnits FieldOffset =
768 getContext().toCharUnitsFromBits(getContext().getFieldOffset(MPD));
769 return EmitMemberDataPointer(MPT, ThisAdjustment + FieldOffset);
Reid Kleckner79e02912013-05-03 01:15:11 +0000770}
771
772llvm::Constant *
Reid Klecknerf6327302013-05-09 21:01:17 +0000773MicrosoftCXXABI::BuildMemberPointer(const CXXRecordDecl *RD,
774 const CXXMethodDecl *MD,
775 CharUnits NonVirtualBaseAdjustment) {
Reid Kleckner79e02912013-05-03 01:15:11 +0000776 assert(MD->isInstance() && "Member function must not be static!");
777 MD = MD->getCanonicalDecl();
Reid Kleckner79e02912013-05-03 01:15:11 +0000778 CodeGenTypes &Types = CGM.getTypes();
779
780 llvm::Constant *FirstField;
781 if (MD->isVirtual()) {
782 // FIXME: We have to instantiate a thunk that loads the vftable and jumps to
783 // the right offset.
784 FirstField = llvm::Constant::getNullValue(CGM.VoidPtrTy);
785 } else {
786 const FunctionProtoType *FPT = MD->getType()->castAs<FunctionProtoType>();
787 llvm::Type *Ty;
788 // Check whether the function has a computable LLVM signature.
789 if (Types.isFuncTypeConvertible(FPT)) {
790 // The function has a computable LLVM signature; use the correct type.
791 Ty = Types.GetFunctionType(Types.arrangeCXXMethodDeclaration(MD));
792 } else {
793 // Use an arbitrary non-function type to tell GetAddrOfFunction that the
794 // function type is incomplete.
795 Ty = CGM.PtrDiffTy;
796 }
797 FirstField = CGM.GetAddrOfFunction(MD, Ty);
798 FirstField = llvm::ConstantExpr::getBitCast(FirstField, CGM.VoidPtrTy);
799 }
800
801 // The rest of the fields are common with data member pointers.
Reid Klecknerf6327302013-05-09 21:01:17 +0000802 return EmitFullMemberPointer(FirstField, /*IsMemberFunction=*/true, RD,
803 NonVirtualBaseAdjustment);
Reid Kleckner79e02912013-05-03 01:15:11 +0000804}
805
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000806/// Member pointers are the same if they're either bitwise identical *or* both
807/// null. Null-ness for function members is determined by the first field,
808/// while for data member pointers we must compare all fields.
809llvm::Value *
810MicrosoftCXXABI::EmitMemberPointerComparison(CodeGenFunction &CGF,
811 llvm::Value *L,
812 llvm::Value *R,
813 const MemberPointerType *MPT,
814 bool Inequality) {
815 CGBuilderTy &Builder = CGF.Builder;
816
817 // Handle != comparisons by switching the sense of all boolean operations.
818 llvm::ICmpInst::Predicate Eq;
819 llvm::Instruction::BinaryOps And, Or;
820 if (Inequality) {
821 Eq = llvm::ICmpInst::ICMP_NE;
822 And = llvm::Instruction::Or;
823 Or = llvm::Instruction::And;
824 } else {
825 Eq = llvm::ICmpInst::ICMP_EQ;
826 And = llvm::Instruction::And;
827 Or = llvm::Instruction::Or;
828 }
829
830 // If this is a single field member pointer (single inheritance), this is a
831 // single icmp.
832 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
833 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
Reid Klecknerf6327302013-05-09 21:01:17 +0000834 if (hasOnlyOneField(MPT->isMemberFunctionPointer(), Inheritance))
Reid Kleckner3d2f0002013-04-30 20:15:14 +0000835 return Builder.CreateICmp(Eq, L, R);
836
837 // Compare the first field.
838 llvm::Value *L0 = Builder.CreateExtractValue(L, 0, "lhs.0");
839 llvm::Value *R0 = Builder.CreateExtractValue(R, 0, "rhs.0");
840 llvm::Value *Cmp0 = Builder.CreateICmp(Eq, L0, R0, "memptr.cmp.first");
841
842 // Compare everything other than the first field.
843 llvm::Value *Res = 0;
844 llvm::StructType *LType = cast<llvm::StructType>(L->getType());
845 for (unsigned I = 1, E = LType->getNumElements(); I != E; ++I) {
846 llvm::Value *LF = Builder.CreateExtractValue(L, I);
847 llvm::Value *RF = Builder.CreateExtractValue(R, I);
848 llvm::Value *Cmp = Builder.CreateICmp(Eq, LF, RF, "memptr.cmp.rest");
849 if (Res)
850 Res = Builder.CreateBinOp(And, Res, Cmp);
851 else
852 Res = Cmp;
853 }
854
855 // Check if the first field is 0 if this is a function pointer.
856 if (MPT->isMemberFunctionPointer()) {
857 // (l1 == r1 && ...) || l0 == 0
858 llvm::Value *Zero = llvm::Constant::getNullValue(L0->getType());
859 llvm::Value *IsZero = Builder.CreateICmp(Eq, L0, Zero, "memptr.cmp.iszero");
860 Res = Builder.CreateBinOp(Or, Res, IsZero);
861 }
862
863 // Combine the comparison of the first field, which must always be true for
864 // this comparison to succeeed.
865 return Builder.CreateBinOp(And, Res, Cmp0, "memptr.cmp");
866}
867
Reid Klecknera8a0f762013-03-22 19:02:54 +0000868llvm::Value *
869MicrosoftCXXABI::EmitMemberPointerIsNotNull(CodeGenFunction &CGF,
870 llvm::Value *MemPtr,
871 const MemberPointerType *MPT) {
872 CGBuilderTy &Builder = CGF.Builder;
Reid Klecknera3609b02013-04-11 18:13:19 +0000873 llvm::SmallVector<llvm::Constant *, 4> fields;
874 // We only need one field for member functions.
875 if (MPT->isMemberFunctionPointer())
876 fields.push_back(llvm::Constant::getNullValue(CGM.VoidPtrTy));
877 else
878 GetNullMemberPointerFields(MPT, fields);
879 assert(!fields.empty());
880 llvm::Value *FirstField = MemPtr;
881 if (MemPtr->getType()->isStructTy())
882 FirstField = Builder.CreateExtractValue(MemPtr, 0);
883 llvm::Value *Res = Builder.CreateICmpNE(FirstField, fields[0], "memptr.cmp0");
Reid Klecknera8a0f762013-03-22 19:02:54 +0000884
Reid Klecknera3609b02013-04-11 18:13:19 +0000885 // For function member pointers, we only need to test the function pointer
886 // field. The other fields if any can be garbage.
887 if (MPT->isMemberFunctionPointer())
888 return Res;
889
890 // Otherwise, emit a series of compares and combine the results.
891 for (int I = 1, E = fields.size(); I < E; ++I) {
892 llvm::Value *Field = Builder.CreateExtractValue(MemPtr, I);
893 llvm::Value *Next = Builder.CreateICmpNE(Field, fields[I], "memptr.cmp");
894 Res = Builder.CreateAnd(Res, Next, "memptr.tobool");
895 }
896 return Res;
897}
898
Reid Klecknerf6327302013-05-09 21:01:17 +0000899bool MicrosoftCXXABI::MemberPointerConstantIsNull(const MemberPointerType *MPT,
900 llvm::Constant *Val) {
901 // Function pointers are null if the pointer in the first field is null.
902 if (MPT->isMemberFunctionPointer()) {
903 llvm::Constant *FirstField = Val->getType()->isStructTy() ?
904 Val->getAggregateElement(0U) : Val;
905 return FirstField->isNullValue();
906 }
907
908 // If it's not a function pointer and it's zero initializable, we can easily
909 // check zero.
910 if (isZeroInitializable(MPT) && Val->isNullValue())
911 return true;
912
913 // Otherwise, break down all the fields for comparison. Hopefully these
914 // little Constants are reused, while a big null struct might not be.
915 llvm::SmallVector<llvm::Constant *, 4> Fields;
916 GetNullMemberPointerFields(MPT, Fields);
917 if (Fields.size() == 1) {
918 assert(Val->getType()->isIntegerTy());
919 return Val == Fields[0];
920 }
921
922 unsigned I, E;
923 for (I = 0, E = Fields.size(); I != E; ++I) {
924 if (Val->getAggregateElement(I) != Fields[I])
925 break;
926 }
927 return I == E;
928}
929
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000930llvm::Value *
931MicrosoftCXXABI::GetVBaseOffsetFromVBPtr(CodeGenFunction &CGF,
932 llvm::Value *This,
933 llvm::Value *VBTableOffset,
934 llvm::Value *VBPtrOffset,
935 llvm::Value **VBPtrOut) {
936 CGBuilderTy &Builder = CGF.Builder;
937 // Load the vbtable pointer from the vbptr in the instance.
938 This = Builder.CreateBitCast(This, CGM.Int8PtrTy);
939 llvm::Value *VBPtr =
940 Builder.CreateInBoundsGEP(This, VBPtrOffset, "vbptr");
941 if (VBPtrOut) *VBPtrOut = VBPtr;
942 VBPtr = Builder.CreateBitCast(VBPtr, CGM.Int8PtrTy->getPointerTo(0));
943 llvm::Value *VBTable = Builder.CreateLoad(VBPtr, "vbtable");
944
945 // Load an i32 offset from the vb-table.
946 llvm::Value *VBaseOffs = Builder.CreateInBoundsGEP(VBTable, VBTableOffset);
947 VBaseOffs = Builder.CreateBitCast(VBaseOffs, CGM.Int32Ty->getPointerTo(0));
948 return Builder.CreateLoad(VBaseOffs, "vbase_offs");
949}
950
Reid Klecknera3609b02013-04-11 18:13:19 +0000951// Returns an adjusted base cast to i8*, since we do more address arithmetic on
952// it.
953llvm::Value *
954MicrosoftCXXABI::AdjustVirtualBase(CodeGenFunction &CGF,
955 const CXXRecordDecl *RD, llvm::Value *Base,
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000956 llvm::Value *VBTableOffset,
Reid Klecknera3609b02013-04-11 18:13:19 +0000957 llvm::Value *VBPtrOffset) {
958 CGBuilderTy &Builder = CGF.Builder;
959 Base = Builder.CreateBitCast(Base, CGM.Int8PtrTy);
960 llvm::BasicBlock *OriginalBB = 0;
961 llvm::BasicBlock *SkipAdjustBB = 0;
962 llvm::BasicBlock *VBaseAdjustBB = 0;
963
964 // In the unspecified inheritance model, there might not be a vbtable at all,
965 // in which case we need to skip the virtual base lookup. If there is a
966 // vbtable, the first entry is a no-op entry that gives back the original
967 // base, so look for a virtual base adjustment offset of zero.
968 if (VBPtrOffset) {
969 OriginalBB = Builder.GetInsertBlock();
970 VBaseAdjustBB = CGF.createBasicBlock("memptr.vadjust");
971 SkipAdjustBB = CGF.createBasicBlock("memptr.skip_vadjust");
972 llvm::Value *IsVirtual =
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000973 Builder.CreateICmpNE(VBTableOffset, getZeroInt(),
Reid Klecknera3609b02013-04-11 18:13:19 +0000974 "memptr.is_vbase");
975 Builder.CreateCondBr(IsVirtual, VBaseAdjustBB, SkipAdjustBB);
976 CGF.EmitBlock(VBaseAdjustBB);
Reid Klecknera8a0f762013-03-22 19:02:54 +0000977 }
978
Reid Klecknera3609b02013-04-11 18:13:19 +0000979 // If we weren't given a dynamic vbptr offset, RD should be complete and we'll
980 // know the vbptr offset.
981 if (!VBPtrOffset) {
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000982 CharUnits offs = CharUnits::Zero();
983 if (RD->getNumVBases()) {
984 offs = GetVBPtrOffsetFromBases(RD);
985 }
Reid Klecknera3609b02013-04-11 18:13:19 +0000986 VBPtrOffset = llvm::ConstantInt::get(CGM.IntTy, offs.getQuantity());
987 }
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000988 llvm::Value *VBPtr = 0;
Reid Klecknera3609b02013-04-11 18:13:19 +0000989 llvm::Value *VBaseOffs =
Reid Klecknerb0f533e2013-05-29 18:02:47 +0000990 GetVBaseOffsetFromVBPtr(CGF, Base, VBTableOffset, VBPtrOffset, &VBPtr);
Reid Klecknera3609b02013-04-11 18:13:19 +0000991 llvm::Value *AdjustedBase = Builder.CreateInBoundsGEP(VBPtr, VBaseOffs);
992
993 // Merge control flow with the case where we didn't have to adjust.
994 if (VBaseAdjustBB) {
995 Builder.CreateBr(SkipAdjustBB);
996 CGF.EmitBlock(SkipAdjustBB);
997 llvm::PHINode *Phi = Builder.CreatePHI(CGM.Int8PtrTy, 2, "memptr.base");
998 Phi->addIncoming(Base, OriginalBB);
999 Phi->addIncoming(AdjustedBase, VBaseAdjustBB);
1000 return Phi;
1001 }
1002 return AdjustedBase;
Reid Klecknera8a0f762013-03-22 19:02:54 +00001003}
1004
1005llvm::Value *
1006MicrosoftCXXABI::EmitMemberDataPointerAddress(CodeGenFunction &CGF,
1007 llvm::Value *Base,
1008 llvm::Value *MemPtr,
1009 const MemberPointerType *MPT) {
Reid Klecknera3609b02013-04-11 18:13:19 +00001010 assert(MPT->isMemberDataPointer());
Reid Klecknera8a0f762013-03-22 19:02:54 +00001011 unsigned AS = Base->getType()->getPointerAddressSpace();
1012 llvm::Type *PType =
1013 CGF.ConvertTypeForMem(MPT->getPointeeType())->getPointerTo(AS);
1014 CGBuilderTy &Builder = CGF.Builder;
Reid Klecknera3609b02013-04-11 18:13:19 +00001015 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
1016 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
Reid Klecknera8a0f762013-03-22 19:02:54 +00001017
Reid Klecknera3609b02013-04-11 18:13:19 +00001018 // Extract the fields we need, regardless of model. We'll apply them if we
1019 // have them.
1020 llvm::Value *FieldOffset = MemPtr;
1021 llvm::Value *VirtualBaseAdjustmentOffset = 0;
1022 llvm::Value *VBPtrOffset = 0;
1023 if (MemPtr->getType()->isStructTy()) {
1024 // We need to extract values.
1025 unsigned I = 0;
1026 FieldOffset = Builder.CreateExtractValue(MemPtr, I++);
1027 if (hasVBPtrOffsetField(Inheritance))
1028 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
1029 if (hasVirtualBaseAdjustmentField(Inheritance))
1030 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Klecknera8a0f762013-03-22 19:02:54 +00001031 }
1032
Reid Klecknera3609b02013-04-11 18:13:19 +00001033 if (VirtualBaseAdjustmentOffset) {
1034 Base = AdjustVirtualBase(CGF, RD, Base, VirtualBaseAdjustmentOffset,
1035 VBPtrOffset);
Reid Klecknera8a0f762013-03-22 19:02:54 +00001036 }
Reid Klecknera3609b02013-04-11 18:13:19 +00001037 llvm::Value *Addr =
1038 Builder.CreateInBoundsGEP(Base, FieldOffset, "memptr.offset");
Reid Klecknera8a0f762013-03-22 19:02:54 +00001039
1040 // Cast the address to the appropriate pointer type, adopting the address
1041 // space of the base pointer.
1042 return Builder.CreateBitCast(Addr, PType);
1043}
1044
Reid Klecknerf6327302013-05-09 21:01:17 +00001045static MSInheritanceModel
1046getInheritanceFromMemptr(const MemberPointerType *MPT) {
1047 return MPT->getClass()->getAsCXXRecordDecl()->getMSInheritanceModel();
1048}
1049
1050llvm::Value *
1051MicrosoftCXXABI::EmitMemberPointerConversion(CodeGenFunction &CGF,
1052 const CastExpr *E,
1053 llvm::Value *Src) {
1054 assert(E->getCastKind() == CK_DerivedToBaseMemberPointer ||
1055 E->getCastKind() == CK_BaseToDerivedMemberPointer ||
1056 E->getCastKind() == CK_ReinterpretMemberPointer);
1057
1058 // Use constant emission if we can.
1059 if (isa<llvm::Constant>(Src))
1060 return EmitMemberPointerConversion(E, cast<llvm::Constant>(Src));
1061
1062 // We may be adding or dropping fields from the member pointer, so we need
1063 // both types and the inheritance models of both records.
1064 const MemberPointerType *SrcTy =
1065 E->getSubExpr()->getType()->castAs<MemberPointerType>();
1066 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
1067 MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy);
1068 MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy);
1069 bool IsFunc = SrcTy->isMemberFunctionPointer();
1070
1071 // If the classes use the same null representation, reinterpret_cast is a nop.
1072 bool IsReinterpret = E->getCastKind() == CK_ReinterpretMemberPointer;
1073 if (IsReinterpret && (IsFunc ||
1074 nullFieldOffsetIsZero(SrcInheritance) ==
1075 nullFieldOffsetIsZero(DstInheritance)))
1076 return Src;
1077
1078 CGBuilderTy &Builder = CGF.Builder;
1079
1080 // Branch past the conversion if Src is null.
1081 llvm::Value *IsNotNull = EmitMemberPointerIsNotNull(CGF, Src, SrcTy);
1082 llvm::Constant *DstNull = EmitNullMemberPointer(DstTy);
1083
1084 // C++ 5.2.10p9: The null member pointer value is converted to the null member
1085 // pointer value of the destination type.
1086 if (IsReinterpret) {
1087 // For reinterpret casts, sema ensures that src and dst are both functions
1088 // or data and have the same size, which means the LLVM types should match.
1089 assert(Src->getType() == DstNull->getType());
1090 return Builder.CreateSelect(IsNotNull, Src, DstNull);
1091 }
1092
1093 llvm::BasicBlock *OriginalBB = Builder.GetInsertBlock();
1094 llvm::BasicBlock *ConvertBB = CGF.createBasicBlock("memptr.convert");
1095 llvm::BasicBlock *ContinueBB = CGF.createBasicBlock("memptr.converted");
1096 Builder.CreateCondBr(IsNotNull, ConvertBB, ContinueBB);
1097 CGF.EmitBlock(ConvertBB);
1098
1099 // Decompose src.
1100 llvm::Value *FirstField = Src;
1101 llvm::Value *NonVirtualBaseAdjustment = 0;
1102 llvm::Value *VirtualBaseAdjustmentOffset = 0;
1103 llvm::Value *VBPtrOffset = 0;
1104 if (!hasOnlyOneField(IsFunc, SrcInheritance)) {
1105 // We need to extract values.
1106 unsigned I = 0;
1107 FirstField = Builder.CreateExtractValue(Src, I++);
1108 if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance))
1109 NonVirtualBaseAdjustment = Builder.CreateExtractValue(Src, I++);
1110 if (hasVBPtrOffsetField(SrcInheritance))
1111 VBPtrOffset = Builder.CreateExtractValue(Src, I++);
1112 if (hasVirtualBaseAdjustmentField(SrcInheritance))
1113 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(Src, I++);
1114 }
1115
1116 // For data pointers, we adjust the field offset directly. For functions, we
1117 // have a separate field.
1118 llvm::Constant *Adj = getMemberPointerAdjustment(E);
1119 if (Adj) {
1120 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
1121 llvm::Value *&NVAdjustField = IsFunc ? NonVirtualBaseAdjustment : FirstField;
1122 bool isDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1123 if (!NVAdjustField) // If this field didn't exist in src, it's zero.
1124 NVAdjustField = getZeroInt();
1125 if (isDerivedToBase)
1126 NVAdjustField = Builder.CreateNSWSub(NVAdjustField, Adj, "adj");
1127 else
1128 NVAdjustField = Builder.CreateNSWAdd(NVAdjustField, Adj, "adj");
1129 }
1130
1131 // FIXME PR15713: Support conversions through virtually derived classes.
1132
1133 // Recompose dst from the null struct and the adjusted fields from src.
1134 llvm::Value *Dst;
1135 if (hasOnlyOneField(IsFunc, DstInheritance)) {
1136 Dst = FirstField;
1137 } else {
1138 Dst = llvm::UndefValue::get(DstNull->getType());
1139 unsigned Idx = 0;
1140 Dst = Builder.CreateInsertValue(Dst, FirstField, Idx++);
1141 if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance))
1142 Dst = Builder.CreateInsertValue(
1143 Dst, getValueOrZeroInt(NonVirtualBaseAdjustment), Idx++);
1144 if (hasVBPtrOffsetField(DstInheritance))
1145 Dst = Builder.CreateInsertValue(
1146 Dst, getValueOrZeroInt(VBPtrOffset), Idx++);
1147 if (hasVirtualBaseAdjustmentField(DstInheritance))
1148 Dst = Builder.CreateInsertValue(
1149 Dst, getValueOrZeroInt(VirtualBaseAdjustmentOffset), Idx++);
1150 }
1151 Builder.CreateBr(ContinueBB);
1152
1153 // In the continuation, choose between DstNull and Dst.
1154 CGF.EmitBlock(ContinueBB);
1155 llvm::PHINode *Phi = Builder.CreatePHI(DstNull->getType(), 2, "memptr.converted");
1156 Phi->addIncoming(DstNull, OriginalBB);
1157 Phi->addIncoming(Dst, ConvertBB);
1158 return Phi;
1159}
1160
1161llvm::Constant *
1162MicrosoftCXXABI::EmitMemberPointerConversion(const CastExpr *E,
1163 llvm::Constant *Src) {
1164 const MemberPointerType *SrcTy =
1165 E->getSubExpr()->getType()->castAs<MemberPointerType>();
1166 const MemberPointerType *DstTy = E->getType()->castAs<MemberPointerType>();
1167
1168 // If src is null, emit a new null for dst. We can't return src because dst
1169 // might have a new representation.
1170 if (MemberPointerConstantIsNull(SrcTy, Src))
1171 return EmitNullMemberPointer(DstTy);
1172
1173 // We don't need to do anything for reinterpret_casts of non-null member
1174 // pointers. We should only get here when the two type representations have
1175 // the same size.
1176 if (E->getCastKind() == CK_ReinterpretMemberPointer)
1177 return Src;
1178
1179 MSInheritanceModel SrcInheritance = getInheritanceFromMemptr(SrcTy);
1180 MSInheritanceModel DstInheritance = getInheritanceFromMemptr(DstTy);
1181
1182 // Decompose src.
1183 llvm::Constant *FirstField = Src;
1184 llvm::Constant *NonVirtualBaseAdjustment = 0;
1185 llvm::Constant *VirtualBaseAdjustmentOffset = 0;
1186 llvm::Constant *VBPtrOffset = 0;
1187 bool IsFunc = SrcTy->isMemberFunctionPointer();
1188 if (!hasOnlyOneField(IsFunc, SrcInheritance)) {
1189 // We need to extract values.
1190 unsigned I = 0;
1191 FirstField = Src->getAggregateElement(I++);
1192 if (hasNonVirtualBaseAdjustmentField(IsFunc, SrcInheritance))
1193 NonVirtualBaseAdjustment = Src->getAggregateElement(I++);
1194 if (hasVBPtrOffsetField(SrcInheritance))
1195 VBPtrOffset = Src->getAggregateElement(I++);
1196 if (hasVirtualBaseAdjustmentField(SrcInheritance))
1197 VirtualBaseAdjustmentOffset = Src->getAggregateElement(I++);
1198 }
1199
1200 // For data pointers, we adjust the field offset directly. For functions, we
1201 // have a separate field.
1202 llvm::Constant *Adj = getMemberPointerAdjustment(E);
1203 if (Adj) {
1204 Adj = llvm::ConstantExpr::getTruncOrBitCast(Adj, CGM.IntTy);
1205 llvm::Constant *&NVAdjustField =
1206 IsFunc ? NonVirtualBaseAdjustment : FirstField;
1207 bool IsDerivedToBase = (E->getCastKind() == CK_DerivedToBaseMemberPointer);
1208 if (!NVAdjustField) // If this field didn't exist in src, it's zero.
1209 NVAdjustField = getZeroInt();
1210 if (IsDerivedToBase)
1211 NVAdjustField = llvm::ConstantExpr::getNSWSub(NVAdjustField, Adj);
1212 else
1213 NVAdjustField = llvm::ConstantExpr::getNSWAdd(NVAdjustField, Adj);
1214 }
1215
1216 // FIXME PR15713: Support conversions through virtually derived classes.
1217
1218 // Recompose dst from the null struct and the adjusted fields from src.
1219 if (hasOnlyOneField(IsFunc, DstInheritance))
1220 return FirstField;
1221
1222 llvm::SmallVector<llvm::Constant *, 4> Fields;
1223 Fields.push_back(FirstField);
1224 if (hasNonVirtualBaseAdjustmentField(IsFunc, DstInheritance))
1225 Fields.push_back(getConstantOrZeroInt(NonVirtualBaseAdjustment));
1226 if (hasVBPtrOffsetField(DstInheritance))
1227 Fields.push_back(getConstantOrZeroInt(VBPtrOffset));
1228 if (hasVirtualBaseAdjustmentField(DstInheritance))
1229 Fields.push_back(getConstantOrZeroInt(VirtualBaseAdjustmentOffset));
1230 return llvm::ConstantStruct::getAnon(Fields);
1231}
1232
Reid Klecknera3609b02013-04-11 18:13:19 +00001233llvm::Value *
1234MicrosoftCXXABI::EmitLoadOfMemberFunctionPointer(CodeGenFunction &CGF,
1235 llvm::Value *&This,
1236 llvm::Value *MemPtr,
1237 const MemberPointerType *MPT) {
1238 assert(MPT->isMemberFunctionPointer());
1239 const FunctionProtoType *FPT =
1240 MPT->getPointeeType()->castAs<FunctionProtoType>();
1241 const CXXRecordDecl *RD = MPT->getClass()->getAsCXXRecordDecl();
1242 llvm::FunctionType *FTy =
1243 CGM.getTypes().GetFunctionType(
1244 CGM.getTypes().arrangeCXXMethodType(RD, FPT));
1245 CGBuilderTy &Builder = CGF.Builder;
1246
1247 MSInheritanceModel Inheritance = RD->getMSInheritanceModel();
1248
1249 // Extract the fields we need, regardless of model. We'll apply them if we
1250 // have them.
1251 llvm::Value *FunctionPointer = MemPtr;
1252 llvm::Value *NonVirtualBaseAdjustment = NULL;
1253 llvm::Value *VirtualBaseAdjustmentOffset = NULL;
1254 llvm::Value *VBPtrOffset = NULL;
1255 if (MemPtr->getType()->isStructTy()) {
1256 // We need to extract values.
1257 unsigned I = 0;
1258 FunctionPointer = Builder.CreateExtractValue(MemPtr, I++);
Reid Klecknera3609b02013-04-11 18:13:19 +00001259 if (hasNonVirtualBaseAdjustmentField(MPT, Inheritance))
1260 NonVirtualBaseAdjustment = Builder.CreateExtractValue(MemPtr, I++);
Reid Kleckner79e02912013-05-03 01:15:11 +00001261 if (hasVBPtrOffsetField(Inheritance))
1262 VBPtrOffset = Builder.CreateExtractValue(MemPtr, I++);
Reid Klecknera3609b02013-04-11 18:13:19 +00001263 if (hasVirtualBaseAdjustmentField(Inheritance))
1264 VirtualBaseAdjustmentOffset = Builder.CreateExtractValue(MemPtr, I++);
1265 }
1266
1267 if (VirtualBaseAdjustmentOffset) {
1268 This = AdjustVirtualBase(CGF, RD, This, VirtualBaseAdjustmentOffset,
1269 VBPtrOffset);
1270 }
1271
1272 if (NonVirtualBaseAdjustment) {
1273 // Apply the adjustment and cast back to the original struct type.
1274 llvm::Value *Ptr = Builder.CreateBitCast(This, Builder.getInt8PtrTy());
1275 Ptr = Builder.CreateInBoundsGEP(Ptr, NonVirtualBaseAdjustment);
1276 This = Builder.CreateBitCast(Ptr, This->getType(), "this.adjusted");
1277 }
1278
1279 return Builder.CreateBitCast(FunctionPointer, FTy->getPointerTo());
1280}
1281
Charles Davis071cc7d2010-08-16 03:33:14 +00001282CGCXXABI *clang::CodeGen::CreateMicrosoftCXXABI(CodeGenModule &CGM) {
Charles Davisc3926642010-06-09 23:25:41 +00001283 return new MicrosoftCXXABI(CGM);
1284}
1285