blob: 18d33ad2beaf666bfd20911e688ca46d85f7e324 [file] [log] [blame]
Anders Carlsson5b955922009-11-24 05:51:11 +00001//===--- CGClass.cpp - Emit LLVM Code for C++ classes ---------------------===//
Anders Carlsson5d58a1d2009-09-12 04:27:24 +00002//
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//
10// This contains code dealing with C++ code generation of classes
11//
12//===----------------------------------------------------------------------===//
13
14#include "CodeGenFunction.h"
Anders Carlsson2f1986b2009-10-06 22:43:30 +000015#include "clang/AST/CXXInheritance.h"
Anders Carlsson5d58a1d2009-09-12 04:27:24 +000016#include "clang/AST/RecordLayout.h"
Anders Carlsson2f1986b2009-10-06 22:43:30 +000017
Anders Carlsson5d58a1d2009-09-12 04:27:24 +000018using namespace clang;
19using namespace CodeGen;
20
Anders Carlsson2f1986b2009-10-06 22:43:30 +000021static uint64_t
22ComputeNonVirtualBaseClassOffset(ASTContext &Context, CXXBasePaths &Paths,
23 unsigned Start) {
24 uint64_t Offset = 0;
Anders Carlsson5d58a1d2009-09-12 04:27:24 +000025
Anders Carlsson2f1986b2009-10-06 22:43:30 +000026 const CXXBasePath &Path = Paths.front();
27 for (unsigned i = Start, e = Path.size(); i != e; ++i) {
28 const CXXBasePathElement& Element = Path[i];
Anders Carlsson5d58a1d2009-09-12 04:27:24 +000029
Anders Carlsson2f1986b2009-10-06 22:43:30 +000030 // Get the layout.
31 const ASTRecordLayout &Layout = Context.getASTRecordLayout(Element.Class);
Anders Carlsson5d58a1d2009-09-12 04:27:24 +000032
Anders Carlsson2f1986b2009-10-06 22:43:30 +000033 const CXXBaseSpecifier *BS = Element.Base;
34 assert(!BS->isVirtual() && "Should not see virtual bases here!");
Anders Carlsson5d58a1d2009-09-12 04:27:24 +000035
Anders Carlsson2f1986b2009-10-06 22:43:30 +000036 const CXXRecordDecl *Base =
37 cast<CXXRecordDecl>(BS->getType()->getAs<RecordType>()->getDecl());
38
39 // Add the offset.
40 Offset += Layout.getBaseClassOffset(Base) / 8;
41 }
42
43 return Offset;
Anders Carlsson5d58a1d2009-09-12 04:27:24 +000044}
45
Anders Carlsson84080ec2009-09-29 03:13:20 +000046llvm::Constant *
Anders Carlssonbb7e17b2010-01-31 01:36:53 +000047CodeGenModule::GetNonVirtualBaseClassOffset(const CXXRecordDecl *Class,
48 const CXXRecordDecl *BaseClass) {
49 if (Class == BaseClass)
Anders Carlsson84080ec2009-09-29 03:13:20 +000050 return 0;
51
Anders Carlsson2f1986b2009-10-06 22:43:30 +000052 CXXBasePaths Paths(/*FindAmbiguities=*/false,
53 /*RecordPaths=*/true, /*DetectVirtual=*/false);
Anders Carlssonbb7e17b2010-01-31 01:36:53 +000054 if (!const_cast<CXXRecordDecl *>(Class)->
55 isDerivedFrom(const_cast<CXXRecordDecl *>(BaseClass), Paths)) {
Anders Carlsson2f1986b2009-10-06 22:43:30 +000056 assert(false && "Class must be derived from the passed in base class!");
57 return 0;
58 }
Anders Carlsson84080ec2009-09-29 03:13:20 +000059
Anders Carlsson2f1986b2009-10-06 22:43:30 +000060 uint64_t Offset = ComputeNonVirtualBaseClassOffset(getContext(), Paths, 0);
Anders Carlsson84080ec2009-09-29 03:13:20 +000061 if (!Offset)
62 return 0;
63
Anders Carlsson2b358352009-10-03 14:56:57 +000064 const llvm::Type *PtrDiffTy =
65 Types.ConvertType(getContext().getPointerDiffType());
Anders Carlsson84080ec2009-09-29 03:13:20 +000066
67 return llvm::ConstantInt::get(PtrDiffTy, Offset);
68}
69
Anders Carlssonbb7e17b2010-01-31 01:36:53 +000070static llvm::Value *GetBaseClassOffset(CodeGenFunction &CGF,
71 llvm::Value *BaseValue,
72 const CXXRecordDecl *ClassDecl,
73 const CXXRecordDecl *BaseClassDecl) {
Anders Carlsson2f1986b2009-10-06 22:43:30 +000074 CXXBasePaths Paths(/*FindAmbiguities=*/false,
Eli Friedman8432f252009-11-28 03:31:34 +000075 /*RecordPaths=*/true, /*DetectVirtual=*/false);
Anders Carlsson2f1986b2009-10-06 22:43:30 +000076 if (!const_cast<CXXRecordDecl *>(ClassDecl)->
77 isDerivedFrom(const_cast<CXXRecordDecl *>(BaseClassDecl), Paths)) {
78 assert(false && "Class must be derived from the passed in base class!");
79 return 0;
80 }
81
82 unsigned Start = 0;
83 llvm::Value *VirtualOffset = 0;
Eli Friedman8432f252009-11-28 03:31:34 +000084
85 const CXXBasePath &Path = Paths.front();
86 const CXXRecordDecl *VBase = 0;
87 for (unsigned i = 0, e = Path.size(); i != e; ++i) {
88 const CXXBasePathElement& Element = Path[i];
89 if (Element.Base->isVirtual()) {
90 Start = i+1;
91 QualType VBaseType = Element.Base->getType();
92 VBase = cast<CXXRecordDecl>(VBaseType->getAs<RecordType>()->getDecl());
Anders Carlsson2f1986b2009-10-06 22:43:30 +000093 }
94 }
Eli Friedman8432f252009-11-28 03:31:34 +000095 if (VBase)
96 VirtualOffset =
Anders Carlssonbb7e17b2010-01-31 01:36:53 +000097 CGF.GetVirtualBaseClassOffset(BaseValue, ClassDecl, VBase);
Anders Carlsson2f1986b2009-10-06 22:43:30 +000098
99 uint64_t Offset =
100 ComputeNonVirtualBaseClassOffset(CGF.getContext(), Paths, Start);
101
102 if (!Offset)
103 return VirtualOffset;
104
105 const llvm::Type *PtrDiffTy =
106 CGF.ConvertType(CGF.getContext().getPointerDiffType());
107 llvm::Value *NonVirtualOffset = llvm::ConstantInt::get(PtrDiffTy, Offset);
108
109 if (VirtualOffset)
110 return CGF.Builder.CreateAdd(VirtualOffset, NonVirtualOffset);
111
112 return NonVirtualOffset;
113}
114
Anders Carlsson9fcfc422009-12-03 03:06:55 +0000115// FIXME: This probably belongs in CGVtable, but it relies on
116// the static function ComputeNonVirtualBaseClassOffset, so we should make that
117// a CodeGenModule member function as well.
118ThunkAdjustment
119CodeGenModule::ComputeThunkAdjustment(const CXXRecordDecl *ClassDecl,
120 const CXXRecordDecl *BaseClassDecl) {
121 CXXBasePaths Paths(/*FindAmbiguities=*/false,
122 /*RecordPaths=*/true, /*DetectVirtual=*/false);
123 if (!const_cast<CXXRecordDecl *>(ClassDecl)->
124 isDerivedFrom(const_cast<CXXRecordDecl *>(BaseClassDecl), Paths)) {
125 assert(false && "Class must be derived from the passed in base class!");
126 return ThunkAdjustment();
127 }
128
129 unsigned Start = 0;
130 uint64_t VirtualOffset = 0;
131
132 const CXXBasePath &Path = Paths.front();
133 const CXXRecordDecl *VBase = 0;
134 for (unsigned i = 0, e = Path.size(); i != e; ++i) {
135 const CXXBasePathElement& Element = Path[i];
136 if (Element.Base->isVirtual()) {
137 Start = i+1;
138 QualType VBaseType = Element.Base->getType();
139 VBase = cast<CXXRecordDecl>(VBaseType->getAs<RecordType>()->getDecl());
140 }
141 }
142 if (VBase)
143 VirtualOffset =
144 getVtableInfo().getVirtualBaseOffsetIndex(ClassDecl, BaseClassDecl);
145
146 uint64_t Offset =
147 ComputeNonVirtualBaseClassOffset(getContext(), Paths, Start);
148 return ThunkAdjustment(Offset, VirtualOffset);
149}
150
Anders Carlsson5d58a1d2009-09-12 04:27:24 +0000151llvm::Value *
Anders Carlssona3697c92009-11-23 17:57:54 +0000152CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value,
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000153 const CXXRecordDecl *Class,
154 const CXXRecordDecl *BaseClass,
Anders Carlssona3697c92009-11-23 17:57:54 +0000155 bool NullCheckValue) {
Anders Carlssondfd03302009-09-22 21:58:22 +0000156 QualType BTy =
157 getContext().getCanonicalType(
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000158 getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(BaseClass)));
Anders Carlssondfd03302009-09-22 21:58:22 +0000159 const llvm::Type *BasePtrTy = llvm::PointerType::getUnqual(ConvertType(BTy));
Anders Carlsson5d58a1d2009-09-12 04:27:24 +0000160
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000161 if (Class == BaseClass) {
Anders Carlssondfd03302009-09-22 21:58:22 +0000162 // Just cast back.
Anders Carlssona3697c92009-11-23 17:57:54 +0000163 return Builder.CreateBitCast(Value, BasePtrTy);
Anders Carlssondfd03302009-09-22 21:58:22 +0000164 }
Eli Friedman4a5dc242009-11-10 22:48:10 +0000165
Anders Carlsson32baf622009-09-12 06:04:24 +0000166 llvm::BasicBlock *CastNull = 0;
167 llvm::BasicBlock *CastNotNull = 0;
168 llvm::BasicBlock *CastEnd = 0;
169
170 if (NullCheckValue) {
171 CastNull = createBasicBlock("cast.null");
172 CastNotNull = createBasicBlock("cast.notnull");
173 CastEnd = createBasicBlock("cast.end");
174
175 llvm::Value *IsNull =
Anders Carlssona3697c92009-11-23 17:57:54 +0000176 Builder.CreateICmpEQ(Value,
177 llvm::Constant::getNullValue(Value->getType()));
Anders Carlsson32baf622009-09-12 06:04:24 +0000178 Builder.CreateCondBr(IsNull, CastNull, CastNotNull);
179 EmitBlock(CastNotNull);
180 }
181
Benjamin Kramer3c0ef8c2009-10-13 10:07:13 +0000182 const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(VMContext);
Eli Friedman4a5dc242009-11-10 22:48:10 +0000183
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000184 llvm::Value *Offset = GetBaseClassOffset(*this, Value, Class, BaseClass);
Anders Carlsson5d58a1d2009-09-12 04:27:24 +0000185
Eli Friedman4a5dc242009-11-10 22:48:10 +0000186 if (Offset) {
187 // Apply the offset.
Anders Carlssona3697c92009-11-23 17:57:54 +0000188 Value = Builder.CreateBitCast(Value, Int8PtrTy);
189 Value = Builder.CreateGEP(Value, Offset, "add.ptr");
Eli Friedman4a5dc242009-11-10 22:48:10 +0000190 }
Anders Carlsson5d58a1d2009-09-12 04:27:24 +0000191
Anders Carlsson5d58a1d2009-09-12 04:27:24 +0000192 // Cast back.
Anders Carlssona3697c92009-11-23 17:57:54 +0000193 Value = Builder.CreateBitCast(Value, BasePtrTy);
Anders Carlsson32baf622009-09-12 06:04:24 +0000194
195 if (NullCheckValue) {
196 Builder.CreateBr(CastEnd);
197 EmitBlock(CastNull);
198 Builder.CreateBr(CastEnd);
199 EmitBlock(CastEnd);
200
Anders Carlssona3697c92009-11-23 17:57:54 +0000201 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType());
Anders Carlsson32baf622009-09-12 06:04:24 +0000202 PHI->reserveOperandSpace(2);
Anders Carlssona3697c92009-11-23 17:57:54 +0000203 PHI->addIncoming(Value, CastNotNull);
204 PHI->addIncoming(llvm::Constant::getNullValue(Value->getType()),
Anders Carlsson32baf622009-09-12 06:04:24 +0000205 CastNull);
Anders Carlssona3697c92009-11-23 17:57:54 +0000206 Value = PHI;
Anders Carlsson32baf622009-09-12 06:04:24 +0000207 }
Anders Carlsson5d58a1d2009-09-12 04:27:24 +0000208
Anders Carlssona3697c92009-11-23 17:57:54 +0000209 return Value;
210}
211
212llvm::Value *
213CodeGenFunction::GetAddressOfDerivedClass(llvm::Value *Value,
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000214 const CXXRecordDecl *Class,
215 const CXXRecordDecl *DerivedClass,
Anders Carlssona3697c92009-11-23 17:57:54 +0000216 bool NullCheckValue) {
217 QualType DerivedTy =
218 getContext().getCanonicalType(
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000219 getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(DerivedClass)));
Anders Carlssona3697c92009-11-23 17:57:54 +0000220 const llvm::Type *DerivedPtrTy = ConvertType(DerivedTy)->getPointerTo();
221
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000222 if (Class == DerivedClass) {
Anders Carlssona3697c92009-11-23 17:57:54 +0000223 // Just cast back.
224 return Builder.CreateBitCast(Value, DerivedPtrTy);
225 }
226
227 llvm::BasicBlock *CastNull = 0;
228 llvm::BasicBlock *CastNotNull = 0;
229 llvm::BasicBlock *CastEnd = 0;
230
231 if (NullCheckValue) {
232 CastNull = createBasicBlock("cast.null");
233 CastNotNull = createBasicBlock("cast.notnull");
234 CastEnd = createBasicBlock("cast.end");
235
236 llvm::Value *IsNull =
237 Builder.CreateICmpEQ(Value,
238 llvm::Constant::getNullValue(Value->getType()));
239 Builder.CreateCondBr(IsNull, CastNull, CastNotNull);
240 EmitBlock(CastNotNull);
241 }
242
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000243 if (llvm::Value *NonVirtualOffset =
244 CGM.GetNonVirtualBaseClassOffset(DerivedClass, Class)) {
Anders Carlssona3697c92009-11-23 17:57:54 +0000245 // Apply the offset.
Anders Carlssonbb7e17b2010-01-31 01:36:53 +0000246 Value = Builder.CreatePtrToInt(Value, NonVirtualOffset->getType());
247 Value = Builder.CreateSub(Value, NonVirtualOffset);
Anders Carlssona3697c92009-11-23 17:57:54 +0000248 Value = Builder.CreateIntToPtr(Value, DerivedPtrTy);
249 } else {
250 // Just cast.
251 Value = Builder.CreateBitCast(Value, DerivedPtrTy);
252 }
253
254 if (NullCheckValue) {
255 Builder.CreateBr(CastEnd);
256 EmitBlock(CastNull);
257 Builder.CreateBr(CastEnd);
258 EmitBlock(CastEnd);
259
260 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType());
261 PHI->reserveOperandSpace(2);
262 PHI->addIncoming(Value, CastNotNull);
263 PHI->addIncoming(llvm::Constant::getNullValue(Value->getType()),
264 CastNull);
265 Value = PHI;
266 }
267
268 return Value;
Anders Carlsson5d58a1d2009-09-12 04:27:24 +0000269}
Anders Carlsson607d0372009-12-24 22:46:43 +0000270
271/// EmitClassAggrMemberwiseCopy - This routine generates code to copy a class
272/// array of objects from SrcValue to DestValue. Copying can be either a bitwise
273/// copy or via a copy constructor call.
274// FIXME. Consolidate this with EmitCXXAggrConstructorCall.
275void CodeGenFunction::EmitClassAggrMemberwiseCopy(llvm::Value *Dest,
276 llvm::Value *Src,
277 const ArrayType *Array,
278 const CXXRecordDecl *BaseClassDecl,
279 QualType Ty) {
280 const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
281 assert(CA && "VLA cannot be copied over");
282 bool BitwiseCopy = BaseClassDecl->hasTrivialCopyConstructor();
283
284 // Create a temporary for the loop index and initialize it with 0.
285 llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),
286 "loop.index");
287 llvm::Value* zeroConstant =
288 llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext));
289 Builder.CreateStore(zeroConstant, IndexPtr);
290 // Start the loop with a block that tests the condition.
291 llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
292 llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
293
294 EmitBlock(CondBlock);
295
296 llvm::BasicBlock *ForBody = createBasicBlock("for.body");
297 // Generate: if (loop-index < number-of-elements fall to the loop body,
298 // otherwise, go to the block after the for-loop.
299 uint64_t NumElements = getContext().getConstantArrayElementCount(CA);
300 llvm::Value * NumElementsPtr =
301 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), NumElements);
302 llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
303 llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElementsPtr,
304 "isless");
305 // If the condition is true, execute the body.
306 Builder.CreateCondBr(IsLess, ForBody, AfterFor);
307
308 EmitBlock(ForBody);
309 llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
310 // Inside the loop body, emit the constructor call on the array element.
311 Counter = Builder.CreateLoad(IndexPtr);
312 Src = Builder.CreateInBoundsGEP(Src, Counter, "srcaddress");
313 Dest = Builder.CreateInBoundsGEP(Dest, Counter, "destaddress");
314 if (BitwiseCopy)
315 EmitAggregateCopy(Dest, Src, Ty);
316 else if (CXXConstructorDecl *BaseCopyCtor =
317 BaseClassDecl->getCopyConstructor(getContext(), 0)) {
318 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(BaseCopyCtor,
319 Ctor_Complete);
320 CallArgList CallArgs;
321 // Push the this (Dest) ptr.
322 CallArgs.push_back(std::make_pair(RValue::get(Dest),
323 BaseCopyCtor->getThisType(getContext())));
324
325 // Push the Src ptr.
326 CallArgs.push_back(std::make_pair(RValue::get(Src),
327 BaseCopyCtor->getParamDecl(0)->getType()));
328 QualType ResultType =
329 BaseCopyCtor->getType()->getAs<FunctionType>()->getResultType();
330 EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
331 Callee, ReturnValueSlot(), CallArgs, BaseCopyCtor);
332 }
333 EmitBlock(ContinueBlock);
334
335 // Emit the increment of the loop counter.
336 llvm::Value *NextVal = llvm::ConstantInt::get(Counter->getType(), 1);
337 Counter = Builder.CreateLoad(IndexPtr);
338 NextVal = Builder.CreateAdd(Counter, NextVal, "inc");
339 Builder.CreateStore(NextVal, IndexPtr);
340
341 // Finally, branch back up to the condition for the next iteration.
342 EmitBranch(CondBlock);
343
344 // Emit the fall-through block.
345 EmitBlock(AfterFor, true);
346}
347
348/// EmitClassAggrCopyAssignment - This routine generates code to assign a class
349/// array of objects from SrcValue to DestValue. Assignment can be either a
350/// bitwise assignment or via a copy assignment operator function call.
351/// FIXME. This can be consolidated with EmitClassAggrMemberwiseCopy
352void CodeGenFunction::EmitClassAggrCopyAssignment(llvm::Value *Dest,
353 llvm::Value *Src,
354 const ArrayType *Array,
355 const CXXRecordDecl *BaseClassDecl,
356 QualType Ty) {
357 const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
358 assert(CA && "VLA cannot be asssigned");
359 bool BitwiseAssign = BaseClassDecl->hasTrivialCopyAssignment();
360
361 // Create a temporary for the loop index and initialize it with 0.
362 llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),
363 "loop.index");
364 llvm::Value* zeroConstant =
365 llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext));
366 Builder.CreateStore(zeroConstant, IndexPtr);
367 // Start the loop with a block that tests the condition.
368 llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
369 llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
370
371 EmitBlock(CondBlock);
372
373 llvm::BasicBlock *ForBody = createBasicBlock("for.body");
374 // Generate: if (loop-index < number-of-elements fall to the loop body,
375 // otherwise, go to the block after the for-loop.
376 uint64_t NumElements = getContext().getConstantArrayElementCount(CA);
377 llvm::Value * NumElementsPtr =
378 llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), NumElements);
379 llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
380 llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElementsPtr,
381 "isless");
382 // If the condition is true, execute the body.
383 Builder.CreateCondBr(IsLess, ForBody, AfterFor);
384
385 EmitBlock(ForBody);
386 llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
387 // Inside the loop body, emit the assignment operator call on array element.
388 Counter = Builder.CreateLoad(IndexPtr);
389 Src = Builder.CreateInBoundsGEP(Src, Counter, "srcaddress");
390 Dest = Builder.CreateInBoundsGEP(Dest, Counter, "destaddress");
391 const CXXMethodDecl *MD = 0;
392 if (BitwiseAssign)
393 EmitAggregateCopy(Dest, Src, Ty);
394 else {
Eli Friedman8a850ba2010-01-15 20:06:11 +0000395 BaseClassDecl->hasConstCopyAssignment(getContext(), MD);
396 assert(MD && "EmitClassAggrCopyAssignment - No user assign");
Anders Carlsson607d0372009-12-24 22:46:43 +0000397 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
398 const llvm::Type *LTy =
399 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
400 FPT->isVariadic());
401 llvm::Constant *Callee = CGM.GetAddrOfFunction(MD, LTy);
402
403 CallArgList CallArgs;
404 // Push the this (Dest) ptr.
405 CallArgs.push_back(std::make_pair(RValue::get(Dest),
406 MD->getThisType(getContext())));
407
408 // Push the Src ptr.
Eli Friedman8a850ba2010-01-15 20:06:11 +0000409 QualType SrcTy = MD->getParamDecl(0)->getType();
410 RValue SrcValue = SrcTy->isReferenceType() ? RValue::get(Src) :
411 RValue::getAggregate(Src);
412 CallArgs.push_back(std::make_pair(SrcValue, SrcTy));
Anders Carlsson607d0372009-12-24 22:46:43 +0000413 QualType ResultType = MD->getType()->getAs<FunctionType>()->getResultType();
414 EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
415 Callee, ReturnValueSlot(), CallArgs, MD);
416 }
417 EmitBlock(ContinueBlock);
418
419 // Emit the increment of the loop counter.
420 llvm::Value *NextVal = llvm::ConstantInt::get(Counter->getType(), 1);
421 Counter = Builder.CreateLoad(IndexPtr);
422 NextVal = Builder.CreateAdd(Counter, NextVal, "inc");
423 Builder.CreateStore(NextVal, IndexPtr);
424
425 // Finally, branch back up to the condition for the next iteration.
426 EmitBranch(CondBlock);
427
428 // Emit the fall-through block.
429 EmitBlock(AfterFor, true);
430}
431
Anders Carlssonc997d422010-01-02 01:01:18 +0000432/// GetVTTParameter - Return the VTT parameter that should be passed to a
433/// base constructor/destructor with virtual bases.
434static llvm::Value *GetVTTParameter(CodeGenFunction &CGF, GlobalDecl GD) {
435 if (!CGVtableInfo::needsVTTParameter(GD)) {
436 // This constructor/destructor does not need a VTT parameter.
437 return 0;
438 }
439
440 const CXXRecordDecl *RD = cast<CXXMethodDecl>(CGF.CurFuncDecl)->getParent();
441 const CXXRecordDecl *Base = cast<CXXMethodDecl>(GD.getDecl())->getParent();
442
443 llvm::Value *VTT;
444
445 uint64_t SubVTTIndex =
446 CGF.CGM.getVtableInfo().getSubVTTIndex(RD, Base);
447 assert(SubVTTIndex != 0 && "Sub-VTT index must be greater than zero!");
448
449 if (CGVtableInfo::needsVTTParameter(CGF.CurGD)) {
450 // A VTT parameter was passed to the constructor, use it.
451 VTT = CGF.LoadCXXVTT();
452 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, SubVTTIndex);
453 } else {
454 // We're the complete constructor, so get the VTT by name.
455 VTT = CGF.CGM.getVtableInfo().getVTT(RD);
456 VTT = CGF.Builder.CreateConstInBoundsGEP2_64(VTT, 0, SubVTTIndex);
457 }
458
459 return VTT;
460}
461
462
Anders Carlsson607d0372009-12-24 22:46:43 +0000463/// EmitClassMemberwiseCopy - This routine generates code to copy a class
464/// object from SrcValue to DestValue. Copying can be either a bitwise copy
465/// or via a copy constructor call.
466void CodeGenFunction::EmitClassMemberwiseCopy(
467 llvm::Value *Dest, llvm::Value *Src,
468 const CXXRecordDecl *ClassDecl,
469 const CXXRecordDecl *BaseClassDecl, QualType Ty) {
Anders Carlssonc997d422010-01-02 01:01:18 +0000470 CXXCtorType CtorType = Ctor_Complete;
471
Anders Carlsson607d0372009-12-24 22:46:43 +0000472 if (ClassDecl) {
473 Dest = GetAddressOfBaseClass(Dest, ClassDecl, BaseClassDecl,
474 /*NullCheckValue=*/false);
475 Src = GetAddressOfBaseClass(Src, ClassDecl, BaseClassDecl,
476 /*NullCheckValue=*/false);
Anders Carlssonc997d422010-01-02 01:01:18 +0000477
478 // We want to call the base constructor.
479 CtorType = Ctor_Base;
Anders Carlsson607d0372009-12-24 22:46:43 +0000480 }
481 if (BaseClassDecl->hasTrivialCopyConstructor()) {
482 EmitAggregateCopy(Dest, Src, Ty);
483 return;
484 }
485
486 if (CXXConstructorDecl *BaseCopyCtor =
487 BaseClassDecl->getCopyConstructor(getContext(), 0)) {
Anders Carlssonc997d422010-01-02 01:01:18 +0000488 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(BaseCopyCtor, CtorType);
Anders Carlsson607d0372009-12-24 22:46:43 +0000489 CallArgList CallArgs;
490 // Push the this (Dest) ptr.
491 CallArgs.push_back(std::make_pair(RValue::get(Dest),
492 BaseCopyCtor->getThisType(getContext())));
493
Anders Carlssonc997d422010-01-02 01:01:18 +0000494 // Push the VTT parameter, if necessary.
495 if (llvm::Value *VTT =
496 GetVTTParameter(*this, GlobalDecl(BaseCopyCtor, CtorType))) {
497 QualType T = getContext().getPointerType(getContext().VoidPtrTy);
498 CallArgs.push_back(std::make_pair(RValue::get(VTT), T));
499 }
500
Anders Carlsson607d0372009-12-24 22:46:43 +0000501 // Push the Src ptr.
502 CallArgs.push_back(std::make_pair(RValue::get(Src),
503 BaseCopyCtor->getParamDecl(0)->getType()));
504 QualType ResultType =
505 BaseCopyCtor->getType()->getAs<FunctionType>()->getResultType();
506 EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
507 Callee, ReturnValueSlot(), CallArgs, BaseCopyCtor);
508 }
509}
510
511/// EmitClassCopyAssignment - This routine generates code to copy assign a class
512/// object from SrcValue to DestValue. Assignment can be either a bitwise
513/// assignment of via an assignment operator call.
514// FIXME. Consolidate this with EmitClassMemberwiseCopy as they share a lot.
515void CodeGenFunction::EmitClassCopyAssignment(
516 llvm::Value *Dest, llvm::Value *Src,
517 const CXXRecordDecl *ClassDecl,
518 const CXXRecordDecl *BaseClassDecl,
519 QualType Ty) {
520 if (ClassDecl) {
521 Dest = GetAddressOfBaseClass(Dest, ClassDecl, BaseClassDecl,
522 /*NullCheckValue=*/false);
523 Src = GetAddressOfBaseClass(Src, ClassDecl, BaseClassDecl,
524 /*NullCheckValue=*/false);
525 }
526 if (BaseClassDecl->hasTrivialCopyAssignment()) {
527 EmitAggregateCopy(Dest, Src, Ty);
528 return;
529 }
530
531 const CXXMethodDecl *MD = 0;
Eli Friedman8a850ba2010-01-15 20:06:11 +0000532 BaseClassDecl->hasConstCopyAssignment(getContext(), MD);
533 assert(MD && "EmitClassCopyAssignment - missing copy assign");
Anders Carlsson607d0372009-12-24 22:46:43 +0000534
535 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>();
536 const llvm::Type *LTy =
537 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
538 FPT->isVariadic());
539 llvm::Constant *Callee = CGM.GetAddrOfFunction(MD, LTy);
540
541 CallArgList CallArgs;
542 // Push the this (Dest) ptr.
543 CallArgs.push_back(std::make_pair(RValue::get(Dest),
544 MD->getThisType(getContext())));
545
546 // Push the Src ptr.
Eli Friedman8a850ba2010-01-15 20:06:11 +0000547 QualType SrcTy = MD->getParamDecl(0)->getType();
548 RValue SrcValue = SrcTy->isReferenceType() ? RValue::get(Src) :
549 RValue::getAggregate(Src);
550 CallArgs.push_back(std::make_pair(SrcValue, SrcTy));
Anders Carlsson607d0372009-12-24 22:46:43 +0000551 QualType ResultType =
552 MD->getType()->getAs<FunctionType>()->getResultType();
553 EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
554 Callee, ReturnValueSlot(), CallArgs, MD);
555}
556
557/// SynthesizeDefaultConstructor - synthesize a default constructor
558void
559CodeGenFunction::SynthesizeDefaultConstructor(const CXXConstructorDecl *Ctor,
560 CXXCtorType Type,
561 llvm::Function *Fn,
562 const FunctionArgList &Args) {
563 assert(!Ctor->isTrivial() && "shouldn't need to generate trivial ctor");
564 StartFunction(GlobalDecl(Ctor, Type), Ctor->getResultType(), Fn, Args,
565 SourceLocation());
566 EmitCtorPrologue(Ctor, Type);
567 FinishFunction();
568}
569
570/// SynthesizeCXXCopyConstructor - This routine implicitly defines body of a
571/// copy constructor, in accordance with section 12.8 (p7 and p8) of C++03
572/// The implicitly-defined copy constructor for class X performs a memberwise
573/// copy of its subobjects. The order of copying is the same as the order of
574/// initialization of bases and members in a user-defined constructor
575/// Each subobject is copied in the manner appropriate to its type:
576/// if the subobject is of class type, the copy constructor for the class is
577/// used;
578/// if the subobject is an array, each element is copied, in the manner
579/// appropriate to the element type;
580/// if the subobject is of scalar type, the built-in assignment operator is
581/// used.
582/// Virtual base class subobjects shall be copied only once by the
583/// implicitly-defined copy constructor
584
585void
586CodeGenFunction::SynthesizeCXXCopyConstructor(const CXXConstructorDecl *Ctor,
587 CXXCtorType Type,
588 llvm::Function *Fn,
589 const FunctionArgList &Args) {
590 const CXXRecordDecl *ClassDecl = Ctor->getParent();
591 assert(!ClassDecl->hasUserDeclaredCopyConstructor() &&
592 "SynthesizeCXXCopyConstructor - copy constructor has definition already");
593 assert(!Ctor->isTrivial() && "shouldn't need to generate trivial ctor");
594 StartFunction(GlobalDecl(Ctor, Type), Ctor->getResultType(), Fn, Args,
595 SourceLocation());
596
597 FunctionArgList::const_iterator i = Args.begin();
598 const VarDecl *ThisArg = i->first;
599 llvm::Value *ThisObj = GetAddrOfLocalVar(ThisArg);
600 llvm::Value *LoadOfThis = Builder.CreateLoad(ThisObj, "this");
601 const VarDecl *SrcArg = (i+1)->first;
602 llvm::Value *SrcObj = GetAddrOfLocalVar(SrcArg);
603 llvm::Value *LoadOfSrc = Builder.CreateLoad(SrcObj);
604
605 for (CXXRecordDecl::base_class_const_iterator Base = ClassDecl->bases_begin();
606 Base != ClassDecl->bases_end(); ++Base) {
607 // FIXME. copy constrution of virtual base NYI
608 if (Base->isVirtual())
609 continue;
610
611 CXXRecordDecl *BaseClassDecl
612 = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
613 EmitClassMemberwiseCopy(LoadOfThis, LoadOfSrc, ClassDecl, BaseClassDecl,
614 Base->getType());
615 }
616
617 for (CXXRecordDecl::field_iterator I = ClassDecl->field_begin(),
618 E = ClassDecl->field_end(); I != E; ++I) {
619 const FieldDecl *Field = *I;
620
621 QualType FieldType = getContext().getCanonicalType(Field->getType());
622 const ConstantArrayType *Array =
623 getContext().getAsConstantArrayType(FieldType);
624 if (Array)
625 FieldType = getContext().getBaseElementType(FieldType);
626
627 if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) {
628 CXXRecordDecl *FieldClassDecl
629 = cast<CXXRecordDecl>(FieldClassType->getDecl());
Anders Carlssone6d2a532010-01-29 05:05:36 +0000630 LValue LHS = EmitLValueForField(LoadOfThis, Field, 0);
631 LValue RHS = EmitLValueForField(LoadOfSrc, Field, 0);
Anders Carlsson607d0372009-12-24 22:46:43 +0000632 if (Array) {
633 const llvm::Type *BasePtr = ConvertType(FieldType);
634 BasePtr = llvm::PointerType::getUnqual(BasePtr);
635 llvm::Value *DestBaseAddrPtr =
636 Builder.CreateBitCast(LHS.getAddress(), BasePtr);
637 llvm::Value *SrcBaseAddrPtr =
638 Builder.CreateBitCast(RHS.getAddress(), BasePtr);
639 EmitClassAggrMemberwiseCopy(DestBaseAddrPtr, SrcBaseAddrPtr, Array,
640 FieldClassDecl, FieldType);
641 }
642 else
643 EmitClassMemberwiseCopy(LHS.getAddress(), RHS.getAddress(),
644 0 /*ClassDecl*/, FieldClassDecl, FieldType);
645 continue;
646 }
647
Anders Carlsson607d0372009-12-24 22:46:43 +0000648 // Do a built-in assignment of scalar data members.
Anders Carlsson9cfe0ec2010-01-29 05:41:25 +0000649 LValue LHS = EmitLValueForFieldInitialization(LoadOfThis, Field, 0);
650 LValue RHS = EmitLValueForFieldInitialization(LoadOfSrc, Field, 0);
Anders Carlsson607d0372009-12-24 22:46:43 +0000651
652 if (!hasAggregateLLVMType(Field->getType())) {
653 RValue RVRHS = EmitLoadOfLValue(RHS, Field->getType());
654 EmitStoreThroughLValue(RVRHS, LHS, Field->getType());
655 } else if (Field->getType()->isAnyComplexType()) {
656 ComplexPairTy Pair = LoadComplexFromAddr(RHS.getAddress(),
657 RHS.isVolatileQualified());
658 StoreComplexToAddr(Pair, LHS.getAddress(), LHS.isVolatileQualified());
659 } else {
660 EmitAggregateCopy(LHS.getAddress(), RHS.getAddress(), Field->getType());
661 }
662 }
663
664 InitializeVtablePtrs(ClassDecl);
665 FinishFunction();
666}
667
668/// SynthesizeCXXCopyAssignment - Implicitly define copy assignment operator.
669/// Before the implicitly-declared copy assignment operator for a class is
670/// implicitly defined, all implicitly- declared copy assignment operators for
671/// its direct base classes and its nonstatic data members shall have been
672/// implicitly defined. [12.8-p12]
673/// The implicitly-defined copy assignment operator for class X performs
674/// memberwise assignment of its subob- jects. The direct base classes of X are
675/// assigned first, in the order of their declaration in
676/// the base-specifier-list, and then the immediate nonstatic data members of X
677/// are assigned, in the order in which they were declared in the class
678/// definition.Each subobject is assigned in the manner appropriate to its type:
679/// if the subobject is of class type, the copy assignment operator for the
680/// class is used (as if by explicit qualification; that is, ignoring any
681/// possible virtual overriding functions in more derived classes);
682///
683/// if the subobject is an array, each element is assigned, in the manner
684/// appropriate to the element type;
685///
686/// if the subobject is of scalar type, the built-in assignment operator is
687/// used.
688void CodeGenFunction::SynthesizeCXXCopyAssignment(const CXXMethodDecl *CD,
689 llvm::Function *Fn,
690 const FunctionArgList &Args) {
691
692 const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
693 assert(!ClassDecl->hasUserDeclaredCopyAssignment() &&
694 "SynthesizeCXXCopyAssignment - copy assignment has user declaration");
695 StartFunction(CD, CD->getResultType(), Fn, Args, SourceLocation());
696
697 FunctionArgList::const_iterator i = Args.begin();
698 const VarDecl *ThisArg = i->first;
699 llvm::Value *ThisObj = GetAddrOfLocalVar(ThisArg);
700 llvm::Value *LoadOfThis = Builder.CreateLoad(ThisObj, "this");
701 const VarDecl *SrcArg = (i+1)->first;
702 llvm::Value *SrcObj = GetAddrOfLocalVar(SrcArg);
703 llvm::Value *LoadOfSrc = Builder.CreateLoad(SrcObj);
704
705 for (CXXRecordDecl::base_class_const_iterator Base = ClassDecl->bases_begin();
706 Base != ClassDecl->bases_end(); ++Base) {
707 // FIXME. copy assignment of virtual base NYI
708 if (Base->isVirtual())
709 continue;
710
711 CXXRecordDecl *BaseClassDecl
712 = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
713 EmitClassCopyAssignment(LoadOfThis, LoadOfSrc, ClassDecl, BaseClassDecl,
714 Base->getType());
715 }
716
717 for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
718 FieldEnd = ClassDecl->field_end();
719 Field != FieldEnd; ++Field) {
720 QualType FieldType = getContext().getCanonicalType((*Field)->getType());
721 const ConstantArrayType *Array =
722 getContext().getAsConstantArrayType(FieldType);
723 if (Array)
724 FieldType = getContext().getBaseElementType(FieldType);
725
726 if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) {
727 CXXRecordDecl *FieldClassDecl
728 = cast<CXXRecordDecl>(FieldClassType->getDecl());
Anders Carlssone6d2a532010-01-29 05:05:36 +0000729 LValue LHS = EmitLValueForField(LoadOfThis, *Field, 0);
730 LValue RHS = EmitLValueForField(LoadOfSrc, *Field, 0);
Anders Carlsson607d0372009-12-24 22:46:43 +0000731 if (Array) {
732 const llvm::Type *BasePtr = ConvertType(FieldType);
733 BasePtr = llvm::PointerType::getUnqual(BasePtr);
734 llvm::Value *DestBaseAddrPtr =
735 Builder.CreateBitCast(LHS.getAddress(), BasePtr);
736 llvm::Value *SrcBaseAddrPtr =
737 Builder.CreateBitCast(RHS.getAddress(), BasePtr);
738 EmitClassAggrCopyAssignment(DestBaseAddrPtr, SrcBaseAddrPtr, Array,
739 FieldClassDecl, FieldType);
740 }
741 else
742 EmitClassCopyAssignment(LHS.getAddress(), RHS.getAddress(),
743 0 /*ClassDecl*/, FieldClassDecl, FieldType);
744 continue;
745 }
746 // Do a built-in assignment of scalar data members.
Anders Carlssone6d2a532010-01-29 05:05:36 +0000747 LValue LHS = EmitLValueForField(LoadOfThis, *Field, 0);
748 LValue RHS = EmitLValueForField(LoadOfSrc, *Field, 0);
Anders Carlsson607d0372009-12-24 22:46:43 +0000749 if (!hasAggregateLLVMType(Field->getType())) {
750 RValue RVRHS = EmitLoadOfLValue(RHS, Field->getType());
751 EmitStoreThroughLValue(RVRHS, LHS, Field->getType());
752 } else if (Field->getType()->isAnyComplexType()) {
753 ComplexPairTy Pair = LoadComplexFromAddr(RHS.getAddress(),
754 RHS.isVolatileQualified());
755 StoreComplexToAddr(Pair, LHS.getAddress(), LHS.isVolatileQualified());
756 } else {
757 EmitAggregateCopy(LHS.getAddress(), RHS.getAddress(), Field->getType());
758 }
759 }
760
761 // return *this;
762 Builder.CreateStore(LoadOfThis, ReturnValue);
763
764 FinishFunction();
765}
766
767static void EmitBaseInitializer(CodeGenFunction &CGF,
768 const CXXRecordDecl *ClassDecl,
769 CXXBaseOrMemberInitializer *BaseInit,
770 CXXCtorType CtorType) {
771 assert(BaseInit->isBaseInitializer() &&
772 "Must have base initializer!");
773
774 llvm::Value *ThisPtr = CGF.LoadCXXThis();
775
776 const Type *BaseType = BaseInit->getBaseClass();
777 CXXRecordDecl *BaseClassDecl =
778 cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
779
780 // FIXME: This method of determining whether a base is virtual is ridiculous;
781 // it should be part of BaseInit.
782 bool isBaseVirtual = false;
783 for (CXXRecordDecl::base_class_const_iterator I = ClassDecl->vbases_begin(),
784 E = ClassDecl->vbases_end(); I != E; ++I)
785 if (I->getType()->getAs<RecordType>()->getDecl() == BaseClassDecl) {
786 isBaseVirtual = true;
787 break;
788 }
789
790 // The base constructor doesn't construct virtual bases.
791 if (CtorType == Ctor_Base && isBaseVirtual)
792 return;
793
794 // Compute the offset to the base; we do this directly instead of using
795 // GetAddressOfBaseClass because the class doesn't have a vtable pointer
796 // at this point.
797 // FIXME: This could be refactored back into GetAddressOfBaseClass if it took
798 // an extra parameter for whether the derived class is the complete object
799 // class.
800 const ASTRecordLayout &Layout =
801 CGF.getContext().getASTRecordLayout(ClassDecl);
802 uint64_t Offset;
803 if (isBaseVirtual)
804 Offset = Layout.getVBaseClassOffset(BaseClassDecl);
805 else
806 Offset = Layout.getBaseClassOffset(BaseClassDecl);
807 const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext());
808 const llvm::Type *BaseClassType = CGF.ConvertType(QualType(BaseType, 0));
809 llvm::Value *V = CGF.Builder.CreateBitCast(ThisPtr, Int8PtrTy);
810 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, Offset/8);
811 V = CGF.Builder.CreateBitCast(V, BaseClassType->getPointerTo());
812
Anders Carlsson607d0372009-12-24 22:46:43 +0000813 CGF.EmitCXXConstructorCall(BaseInit->getConstructor(),
Anders Carlssonc997d422010-01-02 01:01:18 +0000814 Ctor_Base, V,
Anders Carlsson607d0372009-12-24 22:46:43 +0000815 BaseInit->const_arg_begin(),
816 BaseInit->const_arg_end());
817}
818
819static void EmitMemberInitializer(CodeGenFunction &CGF,
820 const CXXRecordDecl *ClassDecl,
821 CXXBaseOrMemberInitializer *MemberInit) {
822 assert(MemberInit->isMemberInitializer() &&
823 "Must have member initializer!");
824
825 // non-static data member initializers.
826 FieldDecl *Field = MemberInit->getMember();
827 QualType FieldType = CGF.getContext().getCanonicalType(Field->getType());
828
829 llvm::Value *ThisPtr = CGF.LoadCXXThis();
Anders Carlsson06a29702010-01-29 05:24:29 +0000830 LValue LHS = CGF.EmitLValueForFieldInitialization(ThisPtr, Field, 0);
831
Anders Carlsson607d0372009-12-24 22:46:43 +0000832 // If we are initializing an anonymous union field, drill down to the field.
833 if (MemberInit->getAnonUnionMember()) {
834 Field = MemberInit->getAnonUnionMember();
Anders Carlssone6d2a532010-01-29 05:05:36 +0000835 LHS = CGF.EmitLValueForField(LHS.getAddress(), Field, 0);
Anders Carlsson607d0372009-12-24 22:46:43 +0000836 FieldType = Field->getType();
837 }
838
839 // If the field is an array, branch based on the element type.
840 const ConstantArrayType *Array =
841 CGF.getContext().getAsConstantArrayType(FieldType);
842 if (Array)
843 FieldType = CGF.getContext().getBaseElementType(FieldType);
844
845 // We lose the constructor for anonymous union members, so handle them
846 // explicitly.
847 // FIXME: This is somwhat ugly.
848 if (MemberInit->getAnonUnionMember() && FieldType->getAs<RecordType>()) {
849 if (MemberInit->getNumArgs())
850 CGF.EmitAggExpr(*MemberInit->arg_begin(), LHS.getAddress(),
851 LHS.isVolatileQualified());
852 else
853 CGF.EmitAggregateClear(LHS.getAddress(), Field->getType());
854 return;
855 }
856
857 if (FieldType->getAs<RecordType>()) {
858 assert(MemberInit->getConstructor() &&
859 "EmitCtorPrologue - no constructor to initialize member");
860 if (Array) {
861 const llvm::Type *BasePtr = CGF.ConvertType(FieldType);
862 BasePtr = llvm::PointerType::getUnqual(BasePtr);
863 llvm::Value *BaseAddrPtr =
864 CGF.Builder.CreateBitCast(LHS.getAddress(), BasePtr);
865 CGF.EmitCXXAggrConstructorCall(MemberInit->getConstructor(),
866 Array, BaseAddrPtr,
867 MemberInit->const_arg_begin(),
868 MemberInit->const_arg_end());
869 }
870 else
871 CGF.EmitCXXConstructorCall(MemberInit->getConstructor(),
872 Ctor_Complete, LHS.getAddress(),
873 MemberInit->const_arg_begin(),
874 MemberInit->const_arg_end());
875 return;
876 }
877
878 assert(MemberInit->getNumArgs() == 1 && "Initializer count must be 1 only");
879 Expr *RhsExpr = *MemberInit->arg_begin();
880 RValue RHS;
881 if (FieldType->isReferenceType()) {
882 RHS = CGF.EmitReferenceBindingToExpr(RhsExpr, FieldType,
883 /*IsInitializer=*/true);
884 CGF.EmitStoreThroughLValue(RHS, LHS, FieldType);
885 } else if (Array) {
886 CGF.EmitMemSetToZero(LHS.getAddress(), Field->getType());
887 } else if (!CGF.hasAggregateLLVMType(RhsExpr->getType())) {
888 RHS = RValue::get(CGF.EmitScalarExpr(RhsExpr, true));
889 CGF.EmitStoreThroughLValue(RHS, LHS, FieldType);
890 } else if (RhsExpr->getType()->isAnyComplexType()) {
891 CGF.EmitComplexExprIntoAddr(RhsExpr, LHS.getAddress(),
892 LHS.isVolatileQualified());
893 } else {
894 // Handle member function pointers; other aggregates shouldn't get this far.
895 CGF.EmitAggExpr(RhsExpr, LHS.getAddress(), LHS.isVolatileQualified());
896 }
897}
898
899/// EmitCtorPrologue - This routine generates necessary code to initialize
900/// base classes and non-static data members belonging to this constructor.
901/// FIXME: This needs to take a CXXCtorType.
902void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD,
903 CXXCtorType CtorType) {
904 const CXXRecordDecl *ClassDecl = CD->getParent();
905
906 // FIXME: Add vbase initialization
907
908 for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(),
909 E = CD->init_end();
910 B != E; ++B) {
911 CXXBaseOrMemberInitializer *Member = (*B);
912
913 assert(LiveTemporaries.empty() &&
914 "Should not have any live temporaries at initializer start!");
915
916 if (Member->isBaseInitializer())
917 EmitBaseInitializer(*this, ClassDecl, Member, CtorType);
918 else
919 EmitMemberInitializer(*this, ClassDecl, Member);
920
921 // Pop any live temporaries that the initializers might have pushed.
922 while (!LiveTemporaries.empty())
923 PopCXXTemporary();
924 }
925
926 InitializeVtablePtrs(ClassDecl);
927}
928
929/// EmitDtorEpilogue - Emit all code that comes at the end of class's
930/// destructor. This is to call destructors on members and base classes
931/// in reverse order of their construction.
932/// FIXME: This needs to take a CXXDtorType.
933void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD,
934 CXXDtorType DtorType) {
935 assert(!DD->isTrivial() &&
936 "Should not emit dtor epilogue for trivial dtor!");
937
938 const CXXRecordDecl *ClassDecl = DD->getParent();
939
940 // Collect the fields.
941 llvm::SmallVector<const FieldDecl *, 16> FieldDecls;
942 for (CXXRecordDecl::field_iterator I = ClassDecl->field_begin(),
943 E = ClassDecl->field_end(); I != E; ++I) {
944 const FieldDecl *Field = *I;
945
946 QualType FieldType = getContext().getCanonicalType(Field->getType());
947 FieldType = getContext().getBaseElementType(FieldType);
948
949 const RecordType *RT = FieldType->getAs<RecordType>();
950 if (!RT)
951 continue;
952
953 CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
954 if (FieldClassDecl->hasTrivialDestructor())
955 continue;
956
957 FieldDecls.push_back(Field);
958 }
959
960 // Now destroy the fields.
961 for (size_t i = FieldDecls.size(); i > 0; --i) {
962 const FieldDecl *Field = FieldDecls[i - 1];
963
964 QualType FieldType = Field->getType();
965 const ConstantArrayType *Array =
966 getContext().getAsConstantArrayType(FieldType);
967 if (Array)
968 FieldType = getContext().getBaseElementType(FieldType);
969
970 const RecordType *RT = FieldType->getAs<RecordType>();
971 CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
972
973 llvm::Value *ThisPtr = LoadCXXThis();
974
975 LValue LHS = EmitLValueForField(ThisPtr, Field,
Anders Carlsson607d0372009-12-24 22:46:43 +0000976 // FIXME: Qualifiers?
977 /*CVRQualifiers=*/0);
978 if (Array) {
979 const llvm::Type *BasePtr = ConvertType(FieldType);
980 BasePtr = llvm::PointerType::getUnqual(BasePtr);
981 llvm::Value *BaseAddrPtr =
982 Builder.CreateBitCast(LHS.getAddress(), BasePtr);
983 EmitCXXAggrDestructorCall(FieldClassDecl->getDestructor(getContext()),
984 Array, BaseAddrPtr);
985 } else
986 EmitCXXDestructorCall(FieldClassDecl->getDestructor(getContext()),
987 Dtor_Complete, LHS.getAddress());
988 }
989
990 // Destroy non-virtual bases.
991 for (CXXRecordDecl::reverse_base_class_const_iterator I =
992 ClassDecl->bases_rbegin(), E = ClassDecl->bases_rend(); I != E; ++I) {
993 const CXXBaseSpecifier &Base = *I;
994
995 // Ignore virtual bases.
996 if (Base.isVirtual())
997 continue;
998
999 CXXRecordDecl *BaseClassDecl
1000 = cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
1001
1002 // Ignore trivial destructors.
1003 if (BaseClassDecl->hasTrivialDestructor())
1004 continue;
1005 const CXXDestructorDecl *D = BaseClassDecl->getDestructor(getContext());
1006
1007 llvm::Value *V = GetAddressOfBaseClass(LoadCXXThis(),
1008 ClassDecl, BaseClassDecl,
1009 /*NullCheckValue=*/false);
1010 EmitCXXDestructorCall(D, Dtor_Base, V);
1011 }
1012
1013 // If we're emitting a base destructor, we don't want to emit calls to the
1014 // virtual bases.
1015 if (DtorType == Dtor_Base)
1016 return;
1017
1018 // Handle virtual bases.
1019 for (CXXRecordDecl::reverse_base_class_const_iterator I =
1020 ClassDecl->vbases_rbegin(), E = ClassDecl->vbases_rend(); I != E; ++I) {
1021 const CXXBaseSpecifier &Base = *I;
1022 CXXRecordDecl *BaseClassDecl
1023 = cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
1024
1025 // Ignore trivial destructors.
1026 if (BaseClassDecl->hasTrivialDestructor())
1027 continue;
1028 const CXXDestructorDecl *D = BaseClassDecl->getDestructor(getContext());
1029 llvm::Value *V = GetAddressOfBaseClass(LoadCXXThis(),
1030 ClassDecl, BaseClassDecl,
1031 /*NullCheckValue=*/false);
1032 EmitCXXDestructorCall(D, Dtor_Base, V);
1033 }
1034
1035 // If we have a deleting destructor, emit a call to the delete operator.
1036 if (DtorType == Dtor_Deleting) {
1037 assert(DD->getOperatorDelete() &&
1038 "operator delete missing - EmitDtorEpilogue");
1039 EmitDeleteCall(DD->getOperatorDelete(), LoadCXXThis(),
1040 getContext().getTagDeclType(ClassDecl));
1041 }
1042}
1043
1044void CodeGenFunction::SynthesizeDefaultDestructor(const CXXDestructorDecl *Dtor,
1045 CXXDtorType DtorType,
1046 llvm::Function *Fn,
1047 const FunctionArgList &Args) {
1048 assert(!Dtor->getParent()->hasUserDeclaredDestructor() &&
1049 "SynthesizeDefaultDestructor - destructor has user declaration");
1050
1051 StartFunction(GlobalDecl(Dtor, DtorType), Dtor->getResultType(), Fn, Args,
1052 SourceLocation());
1053
1054 EmitDtorEpilogue(Dtor, DtorType);
1055 FinishFunction();
1056}
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001057
1058/// EmitCXXAggrConstructorCall - This routine essentially creates a (nested)
1059/// for-loop to call the default constructor on individual members of the
1060/// array.
1061/// 'D' is the default constructor for elements of the array, 'ArrayTy' is the
1062/// array type and 'ArrayPtr' points to the beginning fo the array.
1063/// It is assumed that all relevant checks have been made by the caller.
1064void
1065CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
1066 const ConstantArrayType *ArrayTy,
1067 llvm::Value *ArrayPtr,
1068 CallExpr::const_arg_iterator ArgBeg,
1069 CallExpr::const_arg_iterator ArgEnd) {
1070
1071 const llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
1072 llvm::Value * NumElements =
1073 llvm::ConstantInt::get(SizeTy,
1074 getContext().getConstantArrayElementCount(ArrayTy));
1075
1076 EmitCXXAggrConstructorCall(D, NumElements, ArrayPtr, ArgBeg, ArgEnd);
1077}
1078
1079void
1080CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
1081 llvm::Value *NumElements,
1082 llvm::Value *ArrayPtr,
1083 CallExpr::const_arg_iterator ArgBeg,
1084 CallExpr::const_arg_iterator ArgEnd) {
1085 const llvm::Type *SizeTy = ConvertType(getContext().getSizeType());
1086
1087 // Create a temporary for the loop index and initialize it with 0.
1088 llvm::Value *IndexPtr = CreateTempAlloca(SizeTy, "loop.index");
1089 llvm::Value *Zero = llvm::Constant::getNullValue(SizeTy);
1090 Builder.CreateStore(Zero, IndexPtr);
1091
1092 // Start the loop with a block that tests the condition.
1093 llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
1094 llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
1095
1096 EmitBlock(CondBlock);
1097
1098 llvm::BasicBlock *ForBody = createBasicBlock("for.body");
1099
1100 // Generate: if (loop-index < number-of-elements fall to the loop body,
1101 // otherwise, go to the block after the for-loop.
1102 llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
1103 llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElements, "isless");
1104 // If the condition is true, execute the body.
1105 Builder.CreateCondBr(IsLess, ForBody, AfterFor);
1106
1107 EmitBlock(ForBody);
1108
1109 llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
1110 // Inside the loop body, emit the constructor call on the array element.
1111 Counter = Builder.CreateLoad(IndexPtr);
1112 llvm::Value *Address = Builder.CreateInBoundsGEP(ArrayPtr, Counter,
1113 "arrayidx");
1114
1115 // C++ [class.temporary]p4:
1116 // There are two contexts in which temporaries are destroyed at a different
1117 // point than the end of the full-expression. The first context is when a
1118 // default constructor is called to initialize an element of an array.
1119 // If the constructor has one or more default arguments, the destruction of
1120 // every temporary created in a default argument expression is sequenced
1121 // before the construction of the next array element, if any.
1122
1123 // Keep track of the current number of live temporaries.
1124 unsigned OldNumLiveTemporaries = LiveTemporaries.size();
1125
1126 EmitCXXConstructorCall(D, Ctor_Complete, Address, ArgBeg, ArgEnd);
1127
1128 // Pop temporaries.
1129 while (LiveTemporaries.size() > OldNumLiveTemporaries)
1130 PopCXXTemporary();
1131
1132 EmitBlock(ContinueBlock);
1133
1134 // Emit the increment of the loop counter.
1135 llvm::Value *NextVal = llvm::ConstantInt::get(SizeTy, 1);
1136 Counter = Builder.CreateLoad(IndexPtr);
1137 NextVal = Builder.CreateAdd(Counter, NextVal, "inc");
1138 Builder.CreateStore(NextVal, IndexPtr);
1139
1140 // Finally, branch back up to the condition for the next iteration.
1141 EmitBranch(CondBlock);
1142
1143 // Emit the fall-through block.
1144 EmitBlock(AfterFor, true);
1145}
1146
1147/// EmitCXXAggrDestructorCall - calls the default destructor on array
1148/// elements in reverse order of construction.
1149void
1150CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
1151 const ArrayType *Array,
1152 llvm::Value *This) {
1153 const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
1154 assert(CA && "Do we support VLA for destruction ?");
1155 uint64_t ElementCount = getContext().getConstantArrayElementCount(CA);
1156
1157 const llvm::Type *SizeLTy = ConvertType(getContext().getSizeType());
1158 llvm::Value* ElementCountPtr = llvm::ConstantInt::get(SizeLTy, ElementCount);
1159 EmitCXXAggrDestructorCall(D, ElementCountPtr, This);
1160}
1161
1162/// EmitCXXAggrDestructorCall - calls the default destructor on array
1163/// elements in reverse order of construction.
1164void
1165CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
1166 llvm::Value *UpperCount,
1167 llvm::Value *This) {
1168 const llvm::Type *SizeLTy = ConvertType(getContext().getSizeType());
1169 llvm::Value *One = llvm::ConstantInt::get(SizeLTy, 1);
1170
1171 // Create a temporary for the loop index and initialize it with count of
1172 // array elements.
1173 llvm::Value *IndexPtr = CreateTempAlloca(SizeLTy, "loop.index");
1174
1175 // Store the number of elements in the index pointer.
1176 Builder.CreateStore(UpperCount, IndexPtr);
1177
1178 // Start the loop with a block that tests the condition.
1179 llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
1180 llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
1181
1182 EmitBlock(CondBlock);
1183
1184 llvm::BasicBlock *ForBody = createBasicBlock("for.body");
1185
1186 // Generate: if (loop-index != 0 fall to the loop body,
1187 // otherwise, go to the block after the for-loop.
1188 llvm::Value* zeroConstant =
1189 llvm::Constant::getNullValue(SizeLTy);
1190 llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
1191 llvm::Value *IsNE = Builder.CreateICmpNE(Counter, zeroConstant,
1192 "isne");
1193 // If the condition is true, execute the body.
1194 Builder.CreateCondBr(IsNE, ForBody, AfterFor);
1195
1196 EmitBlock(ForBody);
1197
1198 llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
1199 // Inside the loop body, emit the constructor call on the array element.
1200 Counter = Builder.CreateLoad(IndexPtr);
1201 Counter = Builder.CreateSub(Counter, One);
1202 llvm::Value *Address = Builder.CreateInBoundsGEP(This, Counter, "arrayidx");
1203 EmitCXXDestructorCall(D, Dtor_Complete, Address);
1204
1205 EmitBlock(ContinueBlock);
1206
1207 // Emit the decrement of the loop counter.
1208 Counter = Builder.CreateLoad(IndexPtr);
1209 Counter = Builder.CreateSub(Counter, One, "dec");
1210 Builder.CreateStore(Counter, IndexPtr);
1211
1212 // Finally, branch back up to the condition for the next iteration.
1213 EmitBranch(CondBlock);
1214
1215 // Emit the fall-through block.
1216 EmitBlock(AfterFor, true);
1217}
1218
1219/// GenerateCXXAggrDestructorHelper - Generates a helper function which when
1220/// invoked, calls the default destructor on array elements in reverse order of
1221/// construction.
1222llvm::Constant *
1223CodeGenFunction::GenerateCXXAggrDestructorHelper(const CXXDestructorDecl *D,
1224 const ArrayType *Array,
1225 llvm::Value *This) {
1226 FunctionArgList Args;
1227 ImplicitParamDecl *Dst =
1228 ImplicitParamDecl::Create(getContext(), 0,
1229 SourceLocation(), 0,
1230 getContext().getPointerType(getContext().VoidTy));
1231 Args.push_back(std::make_pair(Dst, Dst->getType()));
1232
1233 llvm::SmallString<16> Name;
1234 llvm::raw_svector_ostream(Name) << "__tcf_" << (++UniqueAggrDestructorCount);
1235 QualType R = getContext().VoidTy;
1236 const CGFunctionInfo &FI = CGM.getTypes().getFunctionInfo(R, Args);
1237 const llvm::FunctionType *FTy = CGM.getTypes().GetFunctionType(FI, false);
1238 llvm::Function *Fn =
1239 llvm::Function::Create(FTy, llvm::GlobalValue::InternalLinkage,
1240 Name.str(),
1241 &CGM.getModule());
1242 IdentifierInfo *II = &CGM.getContext().Idents.get(Name.str());
1243 FunctionDecl *FD = FunctionDecl::Create(getContext(),
1244 getContext().getTranslationUnitDecl(),
1245 SourceLocation(), II, R, 0,
1246 FunctionDecl::Static,
1247 false, true);
1248 StartFunction(FD, R, Fn, Args, SourceLocation());
1249 QualType BaseElementTy = getContext().getBaseElementType(Array);
1250 const llvm::Type *BasePtr = ConvertType(BaseElementTy);
1251 BasePtr = llvm::PointerType::getUnqual(BasePtr);
1252 llvm::Value *BaseAddrPtr = Builder.CreateBitCast(This, BasePtr);
1253 EmitCXXAggrDestructorCall(D, Array, BaseAddrPtr);
1254 FinishFunction();
1255 llvm::Type *Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext),
1256 0);
1257 llvm::Constant *m = llvm::ConstantExpr::getBitCast(Fn, Ptr8Ty);
1258 return m;
1259}
1260
Anders Carlssonc997d422010-01-02 01:01:18 +00001261
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001262void
1263CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
1264 CXXCtorType Type,
1265 llvm::Value *This,
1266 CallExpr::const_arg_iterator ArgBeg,
1267 CallExpr::const_arg_iterator ArgEnd) {
1268 if (D->isCopyConstructor()) {
1269 const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(D->getDeclContext());
1270 if (ClassDecl->hasTrivialCopyConstructor()) {
1271 assert(!ClassDecl->hasUserDeclaredCopyConstructor() &&
1272 "EmitCXXConstructorCall - user declared copy constructor");
1273 const Expr *E = (*ArgBeg);
1274 QualType Ty = E->getType();
1275 llvm::Value *Src = EmitLValue(E).getAddress();
1276 EmitAggregateCopy(This, Src, Ty);
1277 return;
1278 }
1279 } else if (D->isTrivial()) {
1280 // FIXME: Track down why we're trying to generate calls to the trivial
1281 // default constructor!
1282 return;
1283 }
1284
Anders Carlssonc997d422010-01-02 01:01:18 +00001285 llvm::Value *VTT = GetVTTParameter(*this, GlobalDecl(D, Type));
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001286 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type);
1287
Anders Carlssonc997d422010-01-02 01:01:18 +00001288 EmitCXXMemberCall(D, Callee, ReturnValueSlot(), This, VTT, ArgBeg, ArgEnd);
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001289}
1290
1291void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *DD,
1292 CXXDtorType Type,
1293 llvm::Value *This) {
Anders Carlssonc997d422010-01-02 01:01:18 +00001294 llvm::Value *VTT = GetVTTParameter(*this, GlobalDecl(DD, Type));
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001295 llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(DD, Type);
1296
Anders Carlssonc997d422010-01-02 01:01:18 +00001297 EmitCXXMemberCall(DD, Callee, ReturnValueSlot(), This, VTT, 0, 0);
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001298}
1299
1300llvm::Value *
Anders Carlssonbb7e17b2010-01-31 01:36:53 +00001301CodeGenFunction::GetVirtualBaseClassOffset(llvm::Value *This,
1302 const CXXRecordDecl *ClassDecl,
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001303 const CXXRecordDecl *BaseClassDecl) {
1304 const llvm::Type *Int8PtrTy =
1305 llvm::Type::getInt8Ty(VMContext)->getPointerTo();
1306
1307 llvm::Value *VTablePtr = Builder.CreateBitCast(This,
1308 Int8PtrTy->getPointerTo());
1309 VTablePtr = Builder.CreateLoad(VTablePtr, "vtable");
1310
1311 int64_t VBaseOffsetIndex =
1312 CGM.getVtableInfo().getVirtualBaseOffsetIndex(ClassDecl, BaseClassDecl);
1313
1314 llvm::Value *VBaseOffsetPtr =
1315 Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetIndex, "vbase.offset.ptr");
1316 const llvm::Type *PtrDiffTy =
1317 ConvertType(getContext().getPointerDiffType());
1318
1319 VBaseOffsetPtr = Builder.CreateBitCast(VBaseOffsetPtr,
1320 PtrDiffTy->getPointerTo());
1321
1322 llvm::Value *VBaseOffset = Builder.CreateLoad(VBaseOffsetPtr, "vbase.offset");
1323
1324 return VBaseOffset;
1325}
1326
1327void CodeGenFunction::InitializeVtablePtrs(const CXXRecordDecl *ClassDecl) {
1328 if (!ClassDecl->isDynamicClass())
1329 return;
1330
1331 llvm::Constant *Vtable = CGM.getVtableInfo().getVtable(ClassDecl);
Anders Carlsson21431c52010-01-02 18:02:32 +00001332 CGVtableInfo::AddrSubMap_t& AddressPoints =
1333 *(*CGM.getVtableInfo().AddressPoints[ClassDecl])[ClassDecl];
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001334 llvm::Value *ThisPtr = LoadCXXThis();
1335 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(ClassDecl);
1336
1337 // Store address points for virtual bases
1338 for (CXXRecordDecl::base_class_const_iterator I =
1339 ClassDecl->vbases_begin(), E = ClassDecl->vbases_end(); I != E; ++I) {
1340 const CXXBaseSpecifier &Base = *I;
1341 CXXRecordDecl *BaseClassDecl
1342 = cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
1343 uint64_t Offset = Layout.getVBaseClassOffset(BaseClassDecl);
1344 InitializeVtablePtrsRecursive(BaseClassDecl, Vtable, AddressPoints,
1345 ThisPtr, Offset);
1346 }
1347
1348 // Store address points for non-virtual bases and current class
1349 InitializeVtablePtrsRecursive(ClassDecl, Vtable, AddressPoints, ThisPtr, 0);
1350}
1351
1352void CodeGenFunction::InitializeVtablePtrsRecursive(
1353 const CXXRecordDecl *ClassDecl,
1354 llvm::Constant *Vtable,
Anders Carlsson21431c52010-01-02 18:02:32 +00001355 CGVtableInfo::AddrSubMap_t& AddressPoints,
Anders Carlsson3b5ad222010-01-01 20:29:01 +00001356 llvm::Value *ThisPtr,
1357 uint64_t Offset) {
1358 if (!ClassDecl->isDynamicClass())
1359 return;
1360
1361 // Store address points for non-virtual bases
1362 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(ClassDecl);
1363 for (CXXRecordDecl::base_class_const_iterator I =
1364 ClassDecl->bases_begin(), E = ClassDecl->bases_end(); I != E; ++I) {
1365 const CXXBaseSpecifier &Base = *I;
1366 if (Base.isVirtual())
1367 continue;
1368 CXXRecordDecl *BaseClassDecl
1369 = cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl());
1370 uint64_t NewOffset = Offset + Layout.getBaseClassOffset(BaseClassDecl);
1371 InitializeVtablePtrsRecursive(BaseClassDecl, Vtable, AddressPoints,
1372 ThisPtr, NewOffset);
1373 }
1374
1375 // Compute the address point
1376 assert(AddressPoints.count(std::make_pair(ClassDecl, Offset)) &&
1377 "Missing address point for class");
1378 uint64_t AddressPoint = AddressPoints[std::make_pair(ClassDecl, Offset)];
1379 llvm::Value *VtableAddressPoint =
1380 Builder.CreateConstInBoundsGEP2_64(Vtable, 0, AddressPoint);
1381
1382 // Compute the address to store the address point
1383 const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
1384 llvm::Value *VtableField = Builder.CreateBitCast(ThisPtr, Int8PtrTy);
1385 VtableField = Builder.CreateConstInBoundsGEP1_64(VtableField, Offset/8);
1386 const llvm::Type *AddressPointPtrTy =
1387 VtableAddressPoint->getType()->getPointerTo();
1388 VtableField = Builder.CreateBitCast(VtableField, AddressPointPtrTy);
1389
1390 // Store address point
1391 Builder.CreateStore(VtableAddressPoint, VtableField);
1392}
Anders Carlssonc997d422010-01-02 01:01:18 +00001393
1394llvm::Value *CodeGenFunction::LoadCXXVTT() {
1395 assert((isa<CXXConstructorDecl>(CurFuncDecl) ||
1396 isa<CXXDestructorDecl>(CurFuncDecl)) &&
1397 "Must be in a C++ ctor or dtor to load the vtt parameter");
1398
1399 return Builder.CreateLoad(LocalDeclMap[CXXVTTDecl], "vtt");
1400}