CGCXX.cpp revision 4f68d537c3f072366b25f3137f052eee36fddfcd
1//===--- CGDecl.cpp - Emit LLVM Code for declarations ---------------------===//
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//
10// This contains code dealing with C++ code generation.
11//
12//===----------------------------------------------------------------------===//
13
14// We might split this into multiple files if it gets too unwieldy
15
16#include "CodeGenFunction.h"
17#include "CodeGenModule.h"
18#include "Mangle.h"
19#include "clang/AST/ASTContext.h"
20#include "clang/AST/RecordLayout.h"
21#include "clang/AST/Decl.h"
22#include "clang/AST/DeclCXX.h"
23#include "clang/AST/DeclObjC.h"
24#include "llvm/ADT/StringExtras.h"
25using namespace clang;
26using namespace CodeGen;
27
28void
29CodeGenFunction::EmitCXXGlobalDtorRegistration(const CXXDestructorDecl *Dtor,
30                                               llvm::Constant *DeclPtr) {
31  // FIXME: This is ABI dependent and we use the Itanium ABI.
32
33  const llvm::Type *Int8PtrTy =
34    llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(VMContext));
35
36  std::vector<const llvm::Type *> Params;
37  Params.push_back(Int8PtrTy);
38
39  // Get the destructor function type
40  const llvm::Type *DtorFnTy =
41    llvm::FunctionType::get(llvm::Type::getVoidTy(VMContext), Params, false);
42  DtorFnTy = llvm::PointerType::getUnqual(DtorFnTy);
43
44  Params.clear();
45  Params.push_back(DtorFnTy);
46  Params.push_back(Int8PtrTy);
47  Params.push_back(Int8PtrTy);
48
49  // Get the __cxa_atexit function type
50  // extern "C" int __cxa_atexit ( void (*f)(void *), void *p, void *d );
51  const llvm::FunctionType *AtExitFnTy =
52    llvm::FunctionType::get(ConvertType(getContext().IntTy), Params, false);
53
54  llvm::Constant *AtExitFn = CGM.CreateRuntimeFunction(AtExitFnTy,
55                                                       "__cxa_atexit");
56
57  llvm::Constant *Handle = CGM.CreateRuntimeVariable(Int8PtrTy,
58                                                     "__dso_handle");
59
60  llvm::Constant *DtorFn = CGM.GetAddrOfCXXDestructor(Dtor, Dtor_Complete);
61
62  llvm::Value *Args[3] = { llvm::ConstantExpr::getBitCast(DtorFn, DtorFnTy),
63                           llvm::ConstantExpr::getBitCast(DeclPtr, Int8PtrTy),
64                           llvm::ConstantExpr::getBitCast(Handle, Int8PtrTy) };
65  Builder.CreateCall(AtExitFn, &Args[0], llvm::array_endof(Args));
66}
67
68void CodeGenFunction::EmitCXXGlobalVarDeclInit(const VarDecl &D,
69                                               llvm::Constant *DeclPtr) {
70  assert(D.hasGlobalStorage() &&
71         "VarDecl must have global storage!");
72
73  const Expr *Init = D.getInit();
74  QualType T = D.getType();
75
76  if (T->isReferenceType()) {
77    ErrorUnsupported(Init, "global variable that binds to a reference");
78  } else if (!hasAggregateLLVMType(T)) {
79    llvm::Value *V = EmitScalarExpr(Init);
80    EmitStoreOfScalar(V, DeclPtr, T.isVolatileQualified(), T);
81  } else if (T->isAnyComplexType()) {
82    EmitComplexExprIntoAddr(Init, DeclPtr, T.isVolatileQualified());
83  } else {
84    EmitAggExpr(Init, DeclPtr, T.isVolatileQualified());
85
86    if (const RecordType *RT = T->getAs<RecordType>()) {
87      CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl());
88      if (!RD->hasTrivialDestructor())
89        EmitCXXGlobalDtorRegistration(RD->getDestructor(getContext()), DeclPtr);
90    }
91  }
92}
93
94void
95CodeGenModule::EmitCXXGlobalInitFunc() {
96  if (CXXGlobalInits.empty())
97    return;
98
99  const llvm::FunctionType *FTy = llvm::FunctionType::get(llvm::Type::getVoidTy(VMContext),
100                                                          false);
101
102  // Create our global initialization function.
103  // FIXME: Should this be tweakable by targets?
104  llvm::Function *Fn =
105    llvm::Function::Create(FTy, llvm::GlobalValue::InternalLinkage,
106                           "__cxx_global_initialization", &TheModule);
107
108  CodeGenFunction(*this).GenerateCXXGlobalInitFunc(Fn,
109                                                   &CXXGlobalInits[0],
110                                                   CXXGlobalInits.size());
111  AddGlobalCtor(Fn);
112}
113
114void CodeGenFunction::GenerateCXXGlobalInitFunc(llvm::Function *Fn,
115                                                const VarDecl **Decls,
116                                                unsigned NumDecls) {
117  StartFunction(0, getContext().VoidTy, Fn, FunctionArgList(),
118                SourceLocation());
119
120  for (unsigned i = 0; i != NumDecls; ++i) {
121    const VarDecl *D = Decls[i];
122
123    llvm::Constant *DeclPtr = CGM.GetAddrOfGlobalVar(D);
124    EmitCXXGlobalVarDeclInit(*D, DeclPtr);
125  }
126  FinishFunction();
127}
128
129void
130CodeGenFunction::EmitStaticCXXBlockVarDeclInit(const VarDecl &D,
131                                               llvm::GlobalVariable *GV) {
132  // FIXME: This should use __cxa_guard_{acquire,release}?
133
134  assert(!getContext().getLangOptions().ThreadsafeStatics &&
135         "thread safe statics are currently not supported!");
136
137  llvm::SmallString<256> GuardVName;
138  llvm::raw_svector_ostream GuardVOut(GuardVName);
139  mangleGuardVariable(&D, getContext(), GuardVOut);
140
141  // Create the guard variable.
142  llvm::GlobalValue *GuardV =
143    new llvm::GlobalVariable(CGM.getModule(), llvm::Type::getInt64Ty(VMContext), false,
144                             GV->getLinkage(),
145                             llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext)),
146                             GuardVName.str());
147
148  // Load the first byte of the guard variable.
149  const llvm::Type *PtrTy = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext), 0);
150  llvm::Value *V = Builder.CreateLoad(Builder.CreateBitCast(GuardV, PtrTy),
151                                      "tmp");
152
153  // Compare it against 0.
154  llvm::Value *nullValue = llvm::Constant::getNullValue(llvm::Type::getInt8Ty(VMContext));
155  llvm::Value *ICmp = Builder.CreateICmpEQ(V, nullValue , "tobool");
156
157  llvm::BasicBlock *InitBlock = createBasicBlock("init");
158  llvm::BasicBlock *EndBlock = createBasicBlock("init.end");
159
160  // If the guard variable is 0, jump to the initializer code.
161  Builder.CreateCondBr(ICmp, InitBlock, EndBlock);
162
163  EmitBlock(InitBlock);
164
165  EmitCXXGlobalVarDeclInit(D, GV);
166
167  Builder.CreateStore(llvm::ConstantInt::get(llvm::Type::getInt8Ty(VMContext), 1),
168                      Builder.CreateBitCast(GuardV, PtrTy));
169
170  EmitBlock(EndBlock);
171}
172
173RValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD,
174                                          llvm::Value *Callee,
175                                          llvm::Value *This,
176                                          CallExpr::const_arg_iterator ArgBeg,
177                                          CallExpr::const_arg_iterator ArgEnd) {
178  assert(MD->isInstance() &&
179         "Trying to emit a member call expr on a static method!");
180
181  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
182
183  CallArgList Args;
184
185  // Push the this ptr.
186  Args.push_back(std::make_pair(RValue::get(This),
187                                MD->getThisType(getContext())));
188
189  // And the rest of the call args
190  EmitCallArgs(Args, FPT, ArgBeg, ArgEnd);
191
192  QualType ResultType = MD->getType()->getAsFunctionType()->getResultType();
193  return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args),
194                  Callee, Args, MD);
195}
196
197RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
198  const MemberExpr *ME = cast<MemberExpr>(CE->getCallee());
199  const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
200
201  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
202
203  if (MD->isVirtual()) {
204    ErrorUnsupported(CE, "virtual dispatch");
205  }
206
207  const llvm::Type *Ty =
208    CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
209                                   FPT->isVariadic());
210  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
211
212  llvm::Value *This;
213
214  if (ME->isArrow())
215    This = EmitScalarExpr(ME->getBase());
216  else {
217    LValue BaseLV = EmitLValue(ME->getBase());
218    This = BaseLV.getAddress();
219  }
220
221  return EmitCXXMemberCall(MD, Callee, This,
222                           CE->arg_begin(), CE->arg_end());
223}
224
225RValue
226CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
227                                               const CXXMethodDecl *MD) {
228  assert(MD->isInstance() &&
229         "Trying to emit a member call expr on a static method!");
230
231  if (MD->isCopyAssignment()) {
232    const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(MD->getDeclContext());
233    if (ClassDecl->hasTrivialCopyAssignment()) {
234      assert(!ClassDecl->hasUserDeclaredCopyAssignment() &&
235             "EmitCXXOperatorMemberCallExpr - user declared copy assignment");
236      llvm::Value *This = EmitLValue(E->getArg(0)).getAddress();
237      llvm::Value *Src = EmitLValue(E->getArg(1)).getAddress();
238      QualType Ty = E->getType();
239      EmitAggregateCopy(This, Src, Ty);
240      return RValue::get(This);
241    }
242  }
243
244  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
245  const llvm::Type *Ty =
246  CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
247                                 FPT->isVariadic());
248  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
249
250  llvm::Value *This = EmitLValue(E->getArg(0)).getAddress();
251
252  return EmitCXXMemberCall(MD, Callee, This,
253                           E->arg_begin() + 1, E->arg_end());
254}
255
256llvm::Value *CodeGenFunction::LoadCXXThis() {
257  assert(isa<CXXMethodDecl>(CurFuncDecl) &&
258         "Must be in a C++ member function decl to load 'this'");
259  assert(cast<CXXMethodDecl>(CurFuncDecl)->isInstance() &&
260         "Must be in a C++ member function decl to load 'this'");
261
262  // FIXME: What if we're inside a block?
263  // ans: See how CodeGenFunction::LoadObjCSelf() uses
264  // CodeGenFunction::BlockForwardSelf() for how to do this.
265  return Builder.CreateLoad(LocalDeclMap[CXXThisDecl], "this");
266}
267
268static bool
269GetNestedPaths(llvm::SmallVectorImpl<const CXXRecordDecl *> &NestedBasePaths,
270               const CXXRecordDecl *ClassDecl,
271               const CXXRecordDecl *BaseClassDecl) {
272  for (CXXRecordDecl::base_class_const_iterator i = ClassDecl->bases_begin(),
273      e = ClassDecl->bases_end(); i != e; ++i) {
274    if (i->isVirtual())
275      continue;
276    const CXXRecordDecl *Base =
277      cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
278    if (Base == BaseClassDecl) {
279      NestedBasePaths.push_back(BaseClassDecl);
280      return true;
281    }
282  }
283  // BaseClassDecl not an immediate base of ClassDecl.
284  for (CXXRecordDecl::base_class_const_iterator i = ClassDecl->bases_begin(),
285       e = ClassDecl->bases_end(); i != e; ++i) {
286    if (i->isVirtual())
287      continue;
288    const CXXRecordDecl *Base =
289      cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
290    if (GetNestedPaths(NestedBasePaths, Base, BaseClassDecl)) {
291      NestedBasePaths.push_back(Base);
292      return true;
293    }
294  }
295  return false;
296}
297
298llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value *BaseValue,
299                                          const CXXRecordDecl *ClassDecl,
300                                          const CXXRecordDecl *BaseClassDecl) {
301  if (ClassDecl == BaseClassDecl)
302    return BaseValue;
303
304  llvm::Type *I8Ptr = llvm::PointerType::getUnqual(llvm::Type::getInt8Ty(VMContext));
305  llvm::SmallVector<const CXXRecordDecl *, 16> NestedBasePaths;
306  GetNestedPaths(NestedBasePaths, ClassDecl, BaseClassDecl);
307  assert(NestedBasePaths.size() > 0 &&
308         "AddressCXXOfBaseClass - inheritence path failed");
309  NestedBasePaths.push_back(ClassDecl);
310  uint64_t Offset = 0;
311
312  // Accessing a member of the base class. Must add delata to
313  // the load of 'this'.
314  for (unsigned i = NestedBasePaths.size()-1; i > 0; i--) {
315    const CXXRecordDecl *DerivedClass = NestedBasePaths[i];
316    const CXXRecordDecl *BaseClass = NestedBasePaths[i-1];
317    const ASTRecordLayout &Layout =
318      getContext().getASTRecordLayout(DerivedClass);
319    Offset += Layout.getBaseClassOffset(BaseClass) / 8;
320  }
321  llvm::Value *OffsetVal =
322    llvm::ConstantInt::get(
323                  CGM.getTypes().ConvertType(CGM.getContext().LongTy), Offset);
324  BaseValue = Builder.CreateBitCast(BaseValue, I8Ptr);
325  BaseValue = Builder.CreateGEP(BaseValue, OffsetVal, "add.ptr");
326  QualType BTy =
327    getContext().getCanonicalType(
328      getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(BaseClassDecl)));
329  const llvm::Type *BasePtr = ConvertType(BTy);
330  BasePtr = llvm::PointerType::getUnqual(BasePtr);
331  BaseValue = Builder.CreateBitCast(BaseValue, BasePtr);
332  return BaseValue;
333}
334
335/// EmitCXXAggrConstructorCall - This routine essentially creates a (nested)
336/// for-loop to call the default constructor on individual members of the
337/// array. 'Array' is the array type, 'This' is llvm pointer of the start
338/// of the array and 'D' is the default costructor Decl for elements of the
339/// array. It is assumed that all relevant checks have been made by the
340/// caller.
341void
342CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D,
343                                            const ArrayType *Array,
344                                            llvm::Value *This) {
345  const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
346  assert(CA && "Do we support VLA for construction ?");
347
348  // Create a temporary for the loop index and initialize it with 0.
349  llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),
350                                           "loop.index");
351  llvm::Value* zeroConstant =
352    llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext));
353  Builder.CreateStore(zeroConstant, IndexPtr, false);
354
355  // Start the loop with a block that tests the condition.
356  llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
357  llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
358
359  EmitBlock(CondBlock);
360
361  llvm::BasicBlock *ForBody = createBasicBlock("for.body");
362
363  // Generate: if (loop-index < number-of-elements fall to the loop body,
364  // otherwise, go to the block after the for-loop.
365  uint64_t NumElements = getContext().getConstantArrayElementCount(CA);
366  llvm::Value * NumElementsPtr =
367    llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), NumElements);
368  llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
369  llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElementsPtr,
370                                              "isless");
371  // If the condition is true, execute the body.
372  Builder.CreateCondBr(IsLess, ForBody, AfterFor);
373
374  EmitBlock(ForBody);
375
376  llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
377  // Inside the loop body, emit the constructor call on the array element.
378  Counter = Builder.CreateLoad(IndexPtr);
379  llvm::Value *Address = Builder.CreateInBoundsGEP(This, Counter, "arrayidx");
380  EmitCXXConstructorCall(D, Ctor_Complete, Address, 0, 0);
381
382  EmitBlock(ContinueBlock);
383
384  // Emit the increment of the loop counter.
385  llvm::Value *NextVal = llvm::ConstantInt::get(Counter->getType(), 1);
386  Counter = Builder.CreateLoad(IndexPtr);
387  NextVal = Builder.CreateAdd(Counter, NextVal, "inc");
388  Builder.CreateStore(NextVal, IndexPtr, false);
389
390  // Finally, branch back up to the condition for the next iteration.
391  EmitBranch(CondBlock);
392
393  // Emit the fall-through block.
394  EmitBlock(AfterFor, true);
395}
396
397/// EmitCXXAggrDestructorCall - calls the default destructor on array
398/// elements in reverse order of construction.
399void
400CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D,
401                                           const ArrayType *Array,
402                                           llvm::Value *This) {
403  const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
404  assert(CA && "Do we support VLA for destruction ?");
405  llvm::Value *One = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
406                                            1);
407  uint64_t ElementCount = getContext().getConstantArrayElementCount(CA);
408  // Create a temporary for the loop index and initialize it with count of
409  // array elements.
410  llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),
411                                           "loop.index");
412  // Index = ElementCount;
413  llvm::Value* UpperCount =
414    llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), ElementCount);
415  Builder.CreateStore(UpperCount, IndexPtr, false);
416
417  // Start the loop with a block that tests the condition.
418  llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
419  llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
420
421  EmitBlock(CondBlock);
422
423  llvm::BasicBlock *ForBody = createBasicBlock("for.body");
424
425  // Generate: if (loop-index != 0 fall to the loop body,
426  // otherwise, go to the block after the for-loop.
427  llvm::Value* zeroConstant =
428    llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext));
429  llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
430  llvm::Value *IsNE = Builder.CreateICmpNE(Counter, zeroConstant,
431                                            "isne");
432  // If the condition is true, execute the body.
433  Builder.CreateCondBr(IsNE, ForBody, AfterFor);
434
435  EmitBlock(ForBody);
436
437  llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
438  // Inside the loop body, emit the constructor call on the array element.
439  Counter = Builder.CreateLoad(IndexPtr);
440  Counter = Builder.CreateSub(Counter, One);
441  llvm::Value *Address = Builder.CreateInBoundsGEP(This, Counter, "arrayidx");
442  EmitCXXDestructorCall(D, Dtor_Complete, Address);
443
444  EmitBlock(ContinueBlock);
445
446  // Emit the decrement of the loop counter.
447  Counter = Builder.CreateLoad(IndexPtr);
448  Counter = Builder.CreateSub(Counter, One, "dec");
449  Builder.CreateStore(Counter, IndexPtr, false);
450
451  // Finally, branch back up to the condition for the next iteration.
452  EmitBranch(CondBlock);
453
454  // Emit the fall-through block.
455  EmitBlock(AfterFor, true);
456}
457
458void
459CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
460                                        CXXCtorType Type,
461                                        llvm::Value *This,
462                                        CallExpr::const_arg_iterator ArgBeg,
463                                        CallExpr::const_arg_iterator ArgEnd) {
464  if (D->isCopyConstructor(getContext())) {
465    const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(D->getDeclContext());
466    if (ClassDecl->hasTrivialCopyConstructor()) {
467      assert(!ClassDecl->hasUserDeclaredCopyConstructor() &&
468             "EmitCXXConstructorCall - user declared copy constructor");
469      const Expr *E = (*ArgBeg);
470      QualType Ty = E->getType();
471      llvm::Value *Src = EmitLValue(E).getAddress();
472      EmitAggregateCopy(This, Src, Ty);
473      return;
474    }
475  }
476
477  llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type);
478
479  EmitCXXMemberCall(D, Callee, This, ArgBeg, ArgEnd);
480}
481
482void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *D,
483                                            CXXDtorType Type,
484                                            llvm::Value *This) {
485  llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(D, Type);
486
487  EmitCXXMemberCall(D, Callee, This, 0, 0);
488}
489
490void
491CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest,
492                                      const CXXConstructExpr *E) {
493  assert(Dest && "Must have a destination!");
494
495  const CXXRecordDecl *RD =
496  cast<CXXRecordDecl>(E->getType()->getAs<RecordType>()->getDecl());
497  if (RD->hasTrivialConstructor())
498    return;
499
500  // Code gen optimization to eliminate copy constructor and return
501  // its first argument instead.
502  if (getContext().getLangOptions().ElideConstructors && E->isElidable()) {
503    CXXConstructExpr::const_arg_iterator i = E->arg_begin();
504    EmitAggExpr((*i), Dest, false);
505    return;
506  }
507  // Call the constructor.
508  EmitCXXConstructorCall(E->getConstructor(), Ctor_Complete, Dest,
509                         E->arg_begin(), E->arg_end());
510}
511
512llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
513  if (E->isArray()) {
514    ErrorUnsupported(E, "new[] expression");
515    return llvm::UndefValue::get(ConvertType(E->getType()));
516  }
517
518  QualType AllocType = E->getAllocatedType();
519  FunctionDecl *NewFD = E->getOperatorNew();
520  const FunctionProtoType *NewFTy = NewFD->getType()->getAsFunctionProtoType();
521
522  CallArgList NewArgs;
523
524  // The allocation size is the first argument.
525  QualType SizeTy = getContext().getSizeType();
526  llvm::Value *AllocSize =
527    llvm::ConstantInt::get(ConvertType(SizeTy),
528                           getContext().getTypeSize(AllocType) / 8);
529
530  NewArgs.push_back(std::make_pair(RValue::get(AllocSize), SizeTy));
531
532  // Emit the rest of the arguments.
533  // FIXME: Ideally, this should just use EmitCallArgs.
534  CXXNewExpr::const_arg_iterator NewArg = E->placement_arg_begin();
535
536  // First, use the types from the function type.
537  // We start at 1 here because the first argument (the allocation size)
538  // has already been emitted.
539  for (unsigned i = 1, e = NewFTy->getNumArgs(); i != e; ++i, ++NewArg) {
540    QualType ArgType = NewFTy->getArgType(i);
541
542    assert(getContext().getCanonicalType(ArgType.getNonReferenceType()).
543           getTypePtr() ==
544           getContext().getCanonicalType(NewArg->getType()).getTypePtr() &&
545           "type mismatch in call argument!");
546
547    NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType),
548                                     ArgType));
549
550  }
551
552  // Either we've emitted all the call args, or we have a call to a
553  // variadic function.
554  assert((NewArg == E->placement_arg_end() || NewFTy->isVariadic()) &&
555         "Extra arguments in non-variadic function!");
556
557  // If we still have any arguments, emit them using the type of the argument.
558  for (CXXNewExpr::const_arg_iterator NewArgEnd = E->placement_arg_end();
559       NewArg != NewArgEnd; ++NewArg) {
560    QualType ArgType = NewArg->getType();
561    NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType),
562                                     ArgType));
563  }
564
565  // Emit the call to new.
566  RValue RV =
567    EmitCall(CGM.getTypes().getFunctionInfo(NewFTy->getResultType(), NewArgs),
568             CGM.GetAddrOfFunction(GlobalDecl(NewFD)),
569             NewArgs, NewFD);
570
571  // If an allocation function is declared with an empty exception specification
572  // it returns null to indicate failure to allocate storage. [expr.new]p13.
573  // (We don't need to check for null when there's no new initializer and
574  // we're allocating a POD type).
575  bool NullCheckResult = NewFTy->hasEmptyExceptionSpec() &&
576    !(AllocType->isPODType() && !E->hasInitializer());
577
578  llvm::BasicBlock *NewNull = 0;
579  llvm::BasicBlock *NewNotNull = 0;
580  llvm::BasicBlock *NewEnd = 0;
581
582  llvm::Value *NewPtr = RV.getScalarVal();
583
584  if (NullCheckResult) {
585    NewNull = createBasicBlock("new.null");
586    NewNotNull = createBasicBlock("new.notnull");
587    NewEnd = createBasicBlock("new.end");
588
589    llvm::Value *IsNull =
590      Builder.CreateICmpEQ(NewPtr,
591                           llvm::Constant::getNullValue(NewPtr->getType()),
592                           "isnull");
593
594    Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
595    EmitBlock(NewNotNull);
596  }
597
598  NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
599
600  if (AllocType->isPODType()) {
601    if (E->getNumConstructorArgs() > 0) {
602      assert(E->getNumConstructorArgs() == 1 &&
603             "Can only have one argument to initializer of POD type.");
604
605      const Expr *Init = E->getConstructorArg(0);
606
607      if (!hasAggregateLLVMType(AllocType))
608        Builder.CreateStore(EmitScalarExpr(Init), NewPtr);
609      else if (AllocType->isAnyComplexType())
610        EmitComplexExprIntoAddr(Init, NewPtr, AllocType.isVolatileQualified());
611      else
612        EmitAggExpr(Init, NewPtr, AllocType.isVolatileQualified());
613    }
614  } else {
615    // Call the constructor.
616    CXXConstructorDecl *Ctor = E->getConstructor();
617
618    EmitCXXConstructorCall(Ctor, Ctor_Complete, NewPtr,
619                           E->constructor_arg_begin(),
620                           E->constructor_arg_end());
621  }
622
623  if (NullCheckResult) {
624    Builder.CreateBr(NewEnd);
625    EmitBlock(NewNull);
626    Builder.CreateBr(NewEnd);
627    EmitBlock(NewEnd);
628
629    llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
630    PHI->reserveOperandSpace(2);
631    PHI->addIncoming(NewPtr, NewNotNull);
632    PHI->addIncoming(llvm::Constant::getNullValue(NewPtr->getType()), NewNull);
633
634    NewPtr = PHI;
635  }
636
637  return NewPtr;
638}
639
640void CodeGenFunction::EmitCXXDeleteExpr(const CXXDeleteExpr *E) {
641  if (E->isArrayForm()) {
642    ErrorUnsupported(E, "delete[] expression");
643    return;
644  };
645
646  QualType DeleteTy =
647    E->getArgument()->getType()->getAs<PointerType>()->getPointeeType();
648
649  llvm::Value *Ptr = EmitScalarExpr(E->getArgument());
650
651  // Null check the pointer.
652  llvm::BasicBlock *DeleteNotNull = createBasicBlock("delete.notnull");
653  llvm::BasicBlock *DeleteEnd = createBasicBlock("delete.end");
654
655  llvm::Value *IsNull =
656    Builder.CreateICmpEQ(Ptr, llvm::Constant::getNullValue(Ptr->getType()),
657                         "isnull");
658
659  Builder.CreateCondBr(IsNull, DeleteEnd, DeleteNotNull);
660  EmitBlock(DeleteNotNull);
661
662  // Call the destructor if necessary.
663  if (const RecordType *RT = DeleteTy->getAs<RecordType>()) {
664    if (CXXRecordDecl *RD = dyn_cast<CXXRecordDecl>(RT->getDecl())) {
665      if (!RD->hasTrivialDestructor()) {
666        const CXXDestructorDecl *Dtor = RD->getDestructor(getContext());
667        if (Dtor->isVirtual()) {
668          ErrorUnsupported(E, "delete expression with virtual destructor");
669          return;
670        }
671
672        EmitCXXDestructorCall(Dtor, Dtor_Complete, Ptr);
673      }
674    }
675  }
676
677  // Call delete.
678  FunctionDecl *DeleteFD = E->getOperatorDelete();
679  const FunctionProtoType *DeleteFTy =
680    DeleteFD->getType()->getAsFunctionProtoType();
681
682  CallArgList DeleteArgs;
683
684  QualType ArgTy = DeleteFTy->getArgType(0);
685  llvm::Value *DeletePtr = Builder.CreateBitCast(Ptr, ConvertType(ArgTy));
686  DeleteArgs.push_back(std::make_pair(RValue::get(DeletePtr), ArgTy));
687
688  // Emit the call to delete.
689  EmitCall(CGM.getTypes().getFunctionInfo(DeleteFTy->getResultType(),
690                                          DeleteArgs),
691           CGM.GetAddrOfFunction(GlobalDecl(DeleteFD)),
692           DeleteArgs, DeleteFD);
693
694  EmitBlock(DeleteEnd);
695}
696
697static bool canGenerateCXXstructor(const CXXRecordDecl *RD,
698                                   ASTContext &Context) {
699  // The class has base classes - we don't support that right now.
700  if (RD->getNumBases() > 0)
701    return false;
702
703  for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
704         I != E; ++I) {
705    // We don't support ctors for fields that aren't POD.
706    if (!I->getType()->isPODType())
707      return false;
708  }
709
710  return true;
711}
712
713void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
714  if (!canGenerateCXXstructor(D->getParent(), getContext())) {
715    ErrorUnsupported(D, "C++ constructor", true);
716    return;
717  }
718
719  EmitGlobal(GlobalDecl(D, Ctor_Complete));
720  EmitGlobal(GlobalDecl(D, Ctor_Base));
721}
722
723void CodeGenModule::EmitCXXConstructor(const CXXConstructorDecl *D,
724                                       CXXCtorType Type) {
725
726  llvm::Function *Fn = GetAddrOfCXXConstructor(D, Type);
727
728  CodeGenFunction(*this).GenerateCode(D, Fn);
729
730  SetFunctionDefinitionAttributes(D, Fn);
731  SetLLVMFunctionAttributesForDefinition(D, Fn);
732}
733
734llvm::Function *
735CodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D,
736                                       CXXCtorType Type) {
737  const llvm::FunctionType *FTy =
738    getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
739
740  const char *Name = getMangledCXXCtorName(D, Type);
741  return cast<llvm::Function>(
742                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
743}
744
745const char *CodeGenModule::getMangledCXXCtorName(const CXXConstructorDecl *D,
746                                                 CXXCtorType Type) {
747  llvm::SmallString<256> Name;
748  llvm::raw_svector_ostream Out(Name);
749  mangleCXXCtor(D, Type, Context, Out);
750
751  Name += '\0';
752  return UniqueMangledName(Name.begin(), Name.end());
753}
754
755void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
756  if (!canGenerateCXXstructor(D->getParent(), getContext())) {
757    ErrorUnsupported(D, "C++ destructor", true);
758    return;
759  }
760
761  EmitCXXDestructor(D, Dtor_Complete);
762  EmitCXXDestructor(D, Dtor_Base);
763}
764
765void CodeGenModule::EmitCXXDestructor(const CXXDestructorDecl *D,
766                                      CXXDtorType Type) {
767  llvm::Function *Fn = GetAddrOfCXXDestructor(D, Type);
768
769  CodeGenFunction(*this).GenerateCode(D, Fn);
770
771  SetFunctionDefinitionAttributes(D, Fn);
772  SetLLVMFunctionAttributesForDefinition(D, Fn);
773}
774
775llvm::Function *
776CodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D,
777                                      CXXDtorType Type) {
778  const llvm::FunctionType *FTy =
779    getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
780
781  const char *Name = getMangledCXXDtorName(D, Type);
782  return cast<llvm::Function>(
783                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
784}
785
786const char *CodeGenModule::getMangledCXXDtorName(const CXXDestructorDecl *D,
787                                                 CXXDtorType Type) {
788  llvm::SmallString<256> Name;
789  llvm::raw_svector_ostream Out(Name);
790  mangleCXXDtor(D, Type, Context, Out);
791
792  Name += '\0';
793  return UniqueMangledName(Name.begin(), Name.end());
794}
795
796llvm::Constant *CodeGenModule::GenerateRtti(const CXXRecordDecl *RD) {
797  llvm::Type *Ptr8Ty;
798  Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext), 0);
799  llvm::Constant *Rtti = llvm::Constant::getNullValue(Ptr8Ty);
800
801  if (!getContext().getLangOptions().Rtti)
802    return Rtti;
803
804  llvm::SmallString<256> OutName;
805  llvm::raw_svector_ostream Out(OutName);
806  QualType ClassTy;
807  ClassTy = getContext().getTagDeclType(RD);
808  mangleCXXRtti(ClassTy, getContext(), Out);
809  llvm::GlobalVariable::LinkageTypes linktype;
810  linktype = llvm::GlobalValue::WeakAnyLinkage;
811  std::vector<llvm::Constant *> info;
812  // assert(0 && "FIXME: implement rtti descriptor");
813  // FIXME: descriptor
814  info.push_back(llvm::Constant::getNullValue(Ptr8Ty));
815  // assert(0 && "FIXME: implement rtti ts");
816  // FIXME: TS
817  info.push_back(llvm::Constant::getNullValue(Ptr8Ty));
818
819  llvm::Constant *C;
820  llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, info.size());
821  C = llvm::ConstantArray::get(type, info);
822  Rtti = new llvm::GlobalVariable(getModule(), type, true, linktype, C,
823                                  Out.str());
824  Rtti = llvm::ConstantExpr::getBitCast(Rtti, Ptr8Ty);
825  return Rtti;
826}
827
828class VtableBuilder {
829  std::vector<llvm::Constant *> &methods;
830  llvm::Type *Ptr8Ty;
831  /// Class - The most derived class that this vtable is being built for.
832  const CXXRecordDecl *Class;
833  /// BLayout - Layout for the most derived class that this vtable is being
834  /// built for.
835  const ASTRecordLayout &BLayout;
836  llvm::SmallSet<const CXXRecordDecl *, 32> IndirectPrimary;
837  llvm::SmallSet<const CXXRecordDecl *, 32> SeenVBase;
838  llvm::Constant *rtti;
839  llvm::LLVMContext &VMContext;
840  CodeGenModule &CGM;  // Per-module state.
841  /// Index - Maps a method decl into a vtable index.  Useful for virtual
842  /// dispatch codegen.
843  llvm::DenseMap<const CXXMethodDecl *, int32_t> Index;
844  typedef CXXRecordDecl::method_iterator method_iter;
845public:
846  VtableBuilder(std::vector<llvm::Constant *> &meth,
847                const CXXRecordDecl *c,
848                CodeGenModule &cgm)
849    : methods(meth), Class(c), BLayout(cgm.getContext().getASTRecordLayout(c)),
850      rtti(cgm.GenerateRtti(c)), VMContext(cgm.getModule().getContext()),
851      CGM(cgm) {
852    Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext), 0);
853  }
854
855  llvm::Constant *GenerateVcall(const CXXMethodDecl *MD,
856                                const CXXRecordDecl *RD,
857                                bool VBoundary,
858                                bool SecondaryVirtual) {
859    typedef CXXMethodDecl::method_iterator meth_iter;
860    // No vcall for methods that don't override in primary vtables.
861    llvm::Constant *m = 0;
862
863    if (SecondaryVirtual || VBoundary)
864      m = llvm::Constant::getNullValue(Ptr8Ty);
865
866    int64_t Offset = 0;
867    int64_t BaseOffset = 0;
868    for (meth_iter mi = MD->begin_overridden_methods(),
869           me = MD->end_overridden_methods();
870         mi != me; ++mi) {
871      const CXXRecordDecl *DefBase = (*mi)->getParent();
872      // FIXME: vcall: offset for virtual base for this function
873      // m = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), 900);
874      // m = llvm::Constant::getNullValue(Ptr8Ty);
875      for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
876             e = RD->bases_end(); i != e; ++i) {
877        const CXXRecordDecl *Base =
878          cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
879        if (DefBase == Base) {
880          if (!i->isVirtual())
881            break;
882
883          // FIXME: drop the 700-, just for debugging
884          BaseOffset = 700- -(BLayout.getVBaseClassOffset(Base) / 8);
885          m = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
886                                     BaseOffset);
887          m = llvm::ConstantExpr::getIntToPtr(m, Ptr8Ty);
888          break;
889        } else {
890          // FIXME: more searching.
891          (void)Offset;
892        }
893      }
894    }
895
896    return m;
897  }
898
899  void GenerateVcalls(const CXXRecordDecl *RD, bool VBoundary,
900                      bool SecondaryVirtual) {
901    llvm::Constant *m;
902
903    for (method_iter mi = RD->method_begin(),
904           me = RD->method_end(); mi != me; ++mi) {
905      if (mi->isVirtual()) {
906        m = GenerateVcall(*mi, RD, VBoundary, SecondaryVirtual);
907        if (m)
908          methods.push_back(m);
909      }
910    }
911  }
912
913  void GenerateVBaseOffsets(std::vector<llvm::Constant *> &offsets,
914                            const CXXRecordDecl *RD, uint64_t Offset) {
915    for (CXXRecordDecl::base_class_const_iterator i =RD->bases_begin(),
916           e = RD->bases_end(); i != e; ++i) {
917      const CXXRecordDecl *Base =
918        cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
919      if (i->isVirtual() && !SeenVBase.count(Base)) {
920        SeenVBase.insert(Base);
921        int64_t BaseOffset = -(Offset/8) + BLayout.getVBaseClassOffset(Base)/8;
922        llvm::Constant *m;
923        m = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),BaseOffset);
924        m = llvm::ConstantExpr::getIntToPtr(m, Ptr8Ty);
925        offsets.push_back(m);
926      }
927      GenerateVBaseOffsets(offsets, Base, Offset);
928    }
929  }
930
931  void StartNewTable() {
932    SeenVBase.clear();
933  }
934
935  inline uint32_t nottoobig(uint64_t t) {
936    assert(t < (uint32_t)-1ULL || "vtable too big");
937    return t;
938  }
939#if 0
940  inline uint32_t nottoobig(uint32_t t) {
941    return t;
942  }
943#endif
944
945  void AddMethod(const CXXMethodDecl *MD, int32_t FirstIndex) {
946    typedef CXXMethodDecl::method_iterator meth_iter;
947
948    llvm::Constant *m;
949    m = CGM.GetAddrOfFunction(GlobalDecl(MD), Ptr8Ty);
950    m = llvm::ConstantExpr::getBitCast(m, Ptr8Ty);
951
952    // FIXME: Don't like the nested loops.  For very large inheritance
953    // heirarchies we could have a table on the side with the final overridder
954    // and just replace each instance of an overridden method once.  Would be
955    // nice to measure the cost/benefit on real code.
956
957    // If we can find a previously allocated slot for this, reuse it.
958    for (meth_iter mi = MD->begin_overridden_methods(),
959           e = MD->end_overridden_methods();
960         mi != e; ++mi) {
961      const CXXMethodDecl *OMD = *mi;
962      llvm::Constant *om;
963      om = CGM.GetAddrOfFunction(GlobalDecl(OMD), Ptr8Ty);
964      om = llvm::ConstantExpr::getBitCast(om, Ptr8Ty);
965
966      for (int32_t i = FirstIndex, e = nottoobig(methods.size()); i != e; ++i) {
967        // FIXME: begin_overridden_methods might be too lax, covariance */
968        if (methods[i] == om) {
969          methods[i] = m;
970          Index[MD] = i;
971          return;
972        }
973      }
974    }
975
976    // else allocate a new slot.
977    Index[MD] = methods.size();
978    methods.push_back(m);
979  }
980
981  void GenerateMethods(const CXXRecordDecl *RD, int32_t FirstIndex) {
982    for (method_iter mi = RD->method_begin(), me = RD->method_end(); mi != me;
983         ++mi)
984      if (mi->isVirtual())
985        AddMethod(*mi, FirstIndex);
986  }
987
988  int64_t GenerateVtableForBase(const CXXRecordDecl *RD,
989                                bool forPrimary,
990                                bool VBoundary,
991                                int64_t Offset,
992                                bool ForVirtualBase,
993                                int32_t FirstIndex) {
994    llvm::Constant *m = llvm::Constant::getNullValue(Ptr8Ty);
995    int64_t AddressPoint=0;
996
997    if (RD && !RD->isDynamicClass())
998      return 0;
999
1000    const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
1001    const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase();
1002    const bool PrimaryBaseWasVirtual = Layout.getPrimaryBaseWasVirtual();
1003
1004    if (VBoundary || forPrimary || ForVirtualBase) {
1005      // then comes the the vcall offsets for all our functions...
1006      GenerateVcalls(RD, VBoundary, !forPrimary && ForVirtualBase);
1007    }
1008
1009    // The virtual base offsets come first...
1010    // FIXME: Audit, is this right?
1011    if (PrimaryBase == 0 || forPrimary || !PrimaryBaseWasVirtual) {
1012      std::vector<llvm::Constant *> offsets;
1013      GenerateVBaseOffsets(offsets, RD, Offset);
1014      for (std::vector<llvm::Constant *>::reverse_iterator i = offsets.rbegin(),
1015             e = offsets.rend(); i != e; ++i)
1016        methods.push_back(*i);
1017    }
1018
1019    bool Top = true;
1020
1021    // vtables are composed from the chain of primaries.
1022    if (PrimaryBase) {
1023      if (PrimaryBaseWasVirtual)
1024        IndirectPrimary.insert(PrimaryBase);
1025      Top = false;
1026      AddressPoint = GenerateVtableForBase(PrimaryBase, true, PrimaryBaseWasVirtual|VBoundary,
1027                                           Offset, PrimaryBaseWasVirtual, FirstIndex);
1028    }
1029
1030    if (Top) {
1031      int64_t BaseOffset;
1032      if (ForVirtualBase) {
1033        BaseOffset = -(BLayout.getVBaseClassOffset(RD) / 8);
1034      } else
1035        BaseOffset = -Offset/8;
1036      m = llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), BaseOffset);
1037      m = llvm::ConstantExpr::getIntToPtr(m, Ptr8Ty);
1038      methods.push_back(m);
1039      methods.push_back(rtti);
1040      AddressPoint = methods.size();
1041    }
1042
1043    // And add the virtuals for the class to the primary vtable.
1044    GenerateMethods(RD, FirstIndex);
1045
1046    // and then the non-virtual bases.
1047    for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
1048           e = RD->bases_end(); i != e; ++i) {
1049      if (i->isVirtual())
1050        continue;
1051      const CXXRecordDecl *Base =
1052        cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
1053      if (Base != PrimaryBase || PrimaryBaseWasVirtual) {
1054        uint64_t o = Offset + Layout.getBaseClassOffset(Base);
1055        StartNewTable();
1056        FirstIndex = methods.size();
1057        GenerateVtableForBase(Base, true, false, o, false, FirstIndex);
1058      }
1059    }
1060    return AddressPoint;
1061  }
1062
1063  void GenerateVtableForVBases(const CXXRecordDecl *RD,
1064                               const CXXRecordDecl *Class) {
1065    for (CXXRecordDecl::base_class_const_iterator i = RD->bases_begin(),
1066           e = RD->bases_end(); i != e; ++i) {
1067      const CXXRecordDecl *Base =
1068        cast<CXXRecordDecl>(i->getType()->getAs<RecordType>()->getDecl());
1069      if (i->isVirtual() && !IndirectPrimary.count(Base)) {
1070        // Mark it so we don't output it twice.
1071        IndirectPrimary.insert(Base);
1072        StartNewTable();
1073        int64_t BaseOffset = BLayout.getVBaseClassOffset(Base);
1074        int32_t FirstIndex = methods.size();
1075        GenerateVtableForBase(Base, false, true, BaseOffset, true, FirstIndex);
1076      }
1077      if (Base->getNumVBases())
1078        GenerateVtableForVBases(Base, Class);
1079    }
1080  }
1081};
1082
1083llvm::Value *CodeGenFunction::GenerateVtable(const CXXRecordDecl *RD) {
1084  llvm::SmallString<256> OutName;
1085  llvm::raw_svector_ostream Out(OutName);
1086  QualType ClassTy;
1087  ClassTy = getContext().getTagDeclType(RD);
1088  mangleCXXVtable(ClassTy, getContext(), Out);
1089  llvm::GlobalVariable::LinkageTypes linktype;
1090  linktype = llvm::GlobalValue::WeakAnyLinkage;
1091  std::vector<llvm::Constant *> methods;
1092  llvm::Type *Ptr8Ty=llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext),0);
1093  int64_t Offset;
1094
1095  VtableBuilder b(methods, RD, CGM);
1096
1097  // First comes the vtables for all the non-virtual bases...
1098  Offset = b.GenerateVtableForBase(RD, true, false, 0, false, 0);
1099
1100  // then the vtables for all the virtual bases.
1101  b.GenerateVtableForVBases(RD, RD);
1102
1103  llvm::Constant *C;
1104  llvm::ArrayType *type = llvm::ArrayType::get(Ptr8Ty, methods.size());
1105  C = llvm::ConstantArray::get(type, methods);
1106  llvm::Value *vtable = new llvm::GlobalVariable(CGM.getModule(), type, true,
1107                                                 linktype, C, Out.str());
1108  vtable = Builder.CreateBitCast(vtable, Ptr8Ty);
1109  vtable = Builder.CreateGEP(vtable,
1110                       llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext),
1111                                              Offset*LLVMPointerWidth/8));
1112  return vtable;
1113}
1114
1115/// EmitClassAggrMemberwiseCopy - This routine generates code to copy a class
1116/// array of objects from SrcValue to DestValue. Copying can be either a bitwise
1117/// copy or via a copy constructor call.
1118//  FIXME. Consolidate this with EmitCXXAggrConstructorCall.
1119void CodeGenFunction::EmitClassAggrMemberwiseCopy(llvm::Value *Dest,
1120                                            llvm::Value *Src,
1121                                            const ArrayType *Array,
1122                                            const CXXRecordDecl *BaseClassDecl,
1123                                            QualType Ty) {
1124  const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
1125  assert(CA && "VLA cannot be copied over");
1126  bool BitwiseCopy = BaseClassDecl->hasTrivialCopyConstructor();
1127
1128  // Create a temporary for the loop index and initialize it with 0.
1129  llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),
1130                                           "loop.index");
1131  llvm::Value* zeroConstant =
1132    llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext));
1133    Builder.CreateStore(zeroConstant, IndexPtr, false);
1134  // Start the loop with a block that tests the condition.
1135  llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
1136  llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
1137
1138  EmitBlock(CondBlock);
1139
1140  llvm::BasicBlock *ForBody = createBasicBlock("for.body");
1141  // Generate: if (loop-index < number-of-elements fall to the loop body,
1142  // otherwise, go to the block after the for-loop.
1143  uint64_t NumElements = getContext().getConstantArrayElementCount(CA);
1144  llvm::Value * NumElementsPtr =
1145    llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), NumElements);
1146  llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
1147  llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElementsPtr,
1148                                              "isless");
1149  // If the condition is true, execute the body.
1150  Builder.CreateCondBr(IsLess, ForBody, AfterFor);
1151
1152  EmitBlock(ForBody);
1153  llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
1154  // Inside the loop body, emit the constructor call on the array element.
1155  Counter = Builder.CreateLoad(IndexPtr);
1156  Src = Builder.CreateInBoundsGEP(Src, Counter, "srcaddress");
1157  Dest = Builder.CreateInBoundsGEP(Dest, Counter, "destaddress");
1158  if (BitwiseCopy)
1159    EmitAggregateCopy(Dest, Src, Ty);
1160  else if (CXXConstructorDecl *BaseCopyCtor =
1161           BaseClassDecl->getCopyConstructor(getContext(), 0)) {
1162    llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(BaseCopyCtor,
1163                                                      Ctor_Complete);
1164    CallArgList CallArgs;
1165    // Push the this (Dest) ptr.
1166    CallArgs.push_back(std::make_pair(RValue::get(Dest),
1167                                      BaseCopyCtor->getThisType(getContext())));
1168
1169    // Push the Src ptr.
1170    CallArgs.push_back(std::make_pair(RValue::get(Src),
1171                                      BaseCopyCtor->getParamDecl(0)->getType()));
1172    QualType ResultType =
1173      BaseCopyCtor->getType()->getAsFunctionType()->getResultType();
1174    EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
1175             Callee, CallArgs, BaseCopyCtor);
1176  }
1177  EmitBlock(ContinueBlock);
1178
1179  // Emit the increment of the loop counter.
1180  llvm::Value *NextVal = llvm::ConstantInt::get(Counter->getType(), 1);
1181  Counter = Builder.CreateLoad(IndexPtr);
1182  NextVal = Builder.CreateAdd(Counter, NextVal, "inc");
1183  Builder.CreateStore(NextVal, IndexPtr, false);
1184
1185  // Finally, branch back up to the condition for the next iteration.
1186  EmitBranch(CondBlock);
1187
1188  // Emit the fall-through block.
1189  EmitBlock(AfterFor, true);
1190}
1191
1192/// EmitClassAggrCopyAssignment - This routine generates code to assign a class
1193/// array of objects from SrcValue to DestValue. Assignment can be either a
1194/// bitwise assignment or via a copy assignment operator function call.
1195/// FIXME. This can be consolidated with EmitClassAggrMemberwiseCopy
1196void CodeGenFunction::EmitClassAggrCopyAssignment(llvm::Value *Dest,
1197                                            llvm::Value *Src,
1198                                            const ArrayType *Array,
1199                                            const CXXRecordDecl *BaseClassDecl,
1200                                            QualType Ty) {
1201  const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array);
1202  assert(CA && "VLA cannot be asssigned");
1203  bool BitwiseAssign = BaseClassDecl->hasTrivialCopyAssignment();
1204
1205  // Create a temporary for the loop index and initialize it with 0.
1206  llvm::Value *IndexPtr = CreateTempAlloca(llvm::Type::getInt64Ty(VMContext),
1207                                           "loop.index");
1208  llvm::Value* zeroConstant =
1209  llvm::Constant::getNullValue(llvm::Type::getInt64Ty(VMContext));
1210  Builder.CreateStore(zeroConstant, IndexPtr, false);
1211  // Start the loop with a block that tests the condition.
1212  llvm::BasicBlock *CondBlock = createBasicBlock("for.cond");
1213  llvm::BasicBlock *AfterFor = createBasicBlock("for.end");
1214
1215  EmitBlock(CondBlock);
1216
1217  llvm::BasicBlock *ForBody = createBasicBlock("for.body");
1218  // Generate: if (loop-index < number-of-elements fall to the loop body,
1219  // otherwise, go to the block after the for-loop.
1220  uint64_t NumElements = getContext().getConstantArrayElementCount(CA);
1221  llvm::Value * NumElementsPtr =
1222  llvm::ConstantInt::get(llvm::Type::getInt64Ty(VMContext), NumElements);
1223  llvm::Value *Counter = Builder.CreateLoad(IndexPtr);
1224  llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElementsPtr,
1225                                              "isless");
1226  // If the condition is true, execute the body.
1227  Builder.CreateCondBr(IsLess, ForBody, AfterFor);
1228
1229  EmitBlock(ForBody);
1230  llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc");
1231  // Inside the loop body, emit the assignment operator call on array element.
1232  Counter = Builder.CreateLoad(IndexPtr);
1233  Src = Builder.CreateInBoundsGEP(Src, Counter, "srcaddress");
1234  Dest = Builder.CreateInBoundsGEP(Dest, Counter, "destaddress");
1235  const CXXMethodDecl *MD = 0;
1236  if (BitwiseAssign)
1237    EmitAggregateCopy(Dest, Src, Ty);
1238  else {
1239    bool hasCopyAssign = BaseClassDecl->hasConstCopyAssignment(getContext(),
1240                                                               MD);
1241    assert(hasCopyAssign && "EmitClassAggrCopyAssignment - No user assign");
1242    (void)hasCopyAssign;
1243    const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
1244    const llvm::Type *LTy =
1245    CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
1246                                   FPT->isVariadic());
1247    llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), LTy);
1248
1249    CallArgList CallArgs;
1250    // Push the this (Dest) ptr.
1251    CallArgs.push_back(std::make_pair(RValue::get(Dest),
1252                                      MD->getThisType(getContext())));
1253
1254    // Push the Src ptr.
1255    CallArgs.push_back(std::make_pair(RValue::get(Src),
1256                                      MD->getParamDecl(0)->getType()));
1257    QualType ResultType =
1258    MD->getType()->getAsFunctionType()->getResultType();
1259    EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
1260             Callee, CallArgs, MD);
1261  }
1262  EmitBlock(ContinueBlock);
1263
1264  // Emit the increment of the loop counter.
1265  llvm::Value *NextVal = llvm::ConstantInt::get(Counter->getType(), 1);
1266  Counter = Builder.CreateLoad(IndexPtr);
1267  NextVal = Builder.CreateAdd(Counter, NextVal, "inc");
1268  Builder.CreateStore(NextVal, IndexPtr, false);
1269
1270  // Finally, branch back up to the condition for the next iteration.
1271  EmitBranch(CondBlock);
1272
1273  // Emit the fall-through block.
1274  EmitBlock(AfterFor, true);
1275}
1276
1277/// EmitClassMemberwiseCopy - This routine generates code to copy a class
1278/// object from SrcValue to DestValue. Copying can be either a bitwise copy
1279/// or via a copy constructor call.
1280void CodeGenFunction::EmitClassMemberwiseCopy(
1281                        llvm::Value *Dest, llvm::Value *Src,
1282                        const CXXRecordDecl *ClassDecl,
1283                        const CXXRecordDecl *BaseClassDecl, QualType Ty) {
1284  if (ClassDecl) {
1285    Dest = AddressCXXOfBaseClass(Dest, ClassDecl, BaseClassDecl);
1286    Src = AddressCXXOfBaseClass(Src, ClassDecl, BaseClassDecl) ;
1287  }
1288  if (BaseClassDecl->hasTrivialCopyConstructor()) {
1289    EmitAggregateCopy(Dest, Src, Ty);
1290    return;
1291  }
1292
1293  if (CXXConstructorDecl *BaseCopyCtor =
1294      BaseClassDecl->getCopyConstructor(getContext(), 0)) {
1295    llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(BaseCopyCtor,
1296                                                      Ctor_Complete);
1297    CallArgList CallArgs;
1298    // Push the this (Dest) ptr.
1299    CallArgs.push_back(std::make_pair(RValue::get(Dest),
1300                                      BaseCopyCtor->getThisType(getContext())));
1301
1302    // Push the Src ptr.
1303    CallArgs.push_back(std::make_pair(RValue::get(Src),
1304                       BaseCopyCtor->getParamDecl(0)->getType()));
1305    QualType ResultType =
1306    BaseCopyCtor->getType()->getAsFunctionType()->getResultType();
1307    EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
1308             Callee, CallArgs, BaseCopyCtor);
1309  }
1310}
1311
1312/// EmitClassCopyAssignment - This routine generates code to copy assign a class
1313/// object from SrcValue to DestValue. Assignment can be either a bitwise
1314/// assignment of via an assignment operator call.
1315// FIXME. Consolidate this with EmitClassMemberwiseCopy as they share a lot.
1316void CodeGenFunction::EmitClassCopyAssignment(
1317                                        llvm::Value *Dest, llvm::Value *Src,
1318                                        const CXXRecordDecl *ClassDecl,
1319                                        const CXXRecordDecl *BaseClassDecl,
1320                                        QualType Ty) {
1321  if (ClassDecl) {
1322    Dest = AddressCXXOfBaseClass(Dest, ClassDecl, BaseClassDecl);
1323    Src = AddressCXXOfBaseClass(Src, ClassDecl, BaseClassDecl) ;
1324  }
1325  if (BaseClassDecl->hasTrivialCopyAssignment()) {
1326    EmitAggregateCopy(Dest, Src, Ty);
1327    return;
1328  }
1329
1330  const CXXMethodDecl *MD = 0;
1331  bool ConstCopyAssignOp = BaseClassDecl->hasConstCopyAssignment(getContext(),
1332                                                                 MD);
1333  assert(ConstCopyAssignOp && "EmitClassCopyAssignment - missing copy assign");
1334  (void)ConstCopyAssignOp;
1335
1336  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
1337  const llvm::Type *LTy =
1338    CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
1339                                   FPT->isVariadic());
1340  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), LTy);
1341
1342  CallArgList CallArgs;
1343  // Push the this (Dest) ptr.
1344  CallArgs.push_back(std::make_pair(RValue::get(Dest),
1345                                    MD->getThisType(getContext())));
1346
1347  // Push the Src ptr.
1348  CallArgs.push_back(std::make_pair(RValue::get(Src),
1349                                    MD->getParamDecl(0)->getType()));
1350  QualType ResultType =
1351    MD->getType()->getAsFunctionType()->getResultType();
1352  EmitCall(CGM.getTypes().getFunctionInfo(ResultType, CallArgs),
1353           Callee, CallArgs, MD);
1354}
1355
1356/// SynthesizeDefaultConstructor - synthesize a default constructor
1357void
1358CodeGenFunction::SynthesizeDefaultConstructor(const CXXConstructorDecl *CD,
1359                                              const FunctionDecl *FD,
1360                                              llvm::Function *Fn,
1361                                              const FunctionArgList &Args) {
1362  StartFunction(FD, FD->getResultType(), Fn, Args, SourceLocation());
1363  EmitCtorPrologue(CD);
1364  FinishFunction();
1365}
1366
1367/// SynthesizeCXXCopyConstructor - This routine implicitly defines body of a copy
1368/// constructor, in accordance with section 12.8 (p7 and p8) of C++03
1369/// The implicitly-defined copy constructor for class X performs a memberwise
1370/// copy of its subobjects. The order of copying is the same as the order
1371/// of initialization of bases and members in a user-defined constructor
1372/// Each subobject is copied in the manner appropriate to its type:
1373///  if the subobject is of class type, the copy constructor for the class is
1374///  used;
1375///  if the subobject is an array, each element is copied, in the manner
1376///  appropriate to the element type;
1377///  if the subobject is of scalar type, the built-in assignment operator is
1378///  used.
1379/// Virtual base class subobjects shall be copied only once by the
1380/// implicitly-defined copy constructor
1381
1382void CodeGenFunction::SynthesizeCXXCopyConstructor(const CXXConstructorDecl *CD,
1383                                       const FunctionDecl *FD,
1384                                       llvm::Function *Fn,
1385                                       const FunctionArgList &Args) {
1386  const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
1387  assert(!ClassDecl->hasUserDeclaredCopyConstructor() &&
1388         "SynthesizeCXXCopyConstructor - copy constructor has definition already");
1389  StartFunction(FD, FD->getResultType(), Fn, Args, SourceLocation());
1390
1391  FunctionArgList::const_iterator i = Args.begin();
1392  const VarDecl *ThisArg = i->first;
1393  llvm::Value *ThisObj = GetAddrOfLocalVar(ThisArg);
1394  llvm::Value *LoadOfThis = Builder.CreateLoad(ThisObj, "this");
1395  const VarDecl *SrcArg = (i+1)->first;
1396  llvm::Value *SrcObj = GetAddrOfLocalVar(SrcArg);
1397  llvm::Value *LoadOfSrc = Builder.CreateLoad(SrcObj);
1398
1399  for (CXXRecordDecl::base_class_const_iterator Base = ClassDecl->bases_begin();
1400       Base != ClassDecl->bases_end(); ++Base) {
1401    // FIXME. copy constrution of virtual base NYI
1402    if (Base->isVirtual())
1403      continue;
1404
1405    CXXRecordDecl *BaseClassDecl
1406      = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
1407    EmitClassMemberwiseCopy(LoadOfThis, LoadOfSrc, ClassDecl, BaseClassDecl,
1408                            Base->getType());
1409  }
1410
1411  for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
1412       FieldEnd = ClassDecl->field_end();
1413       Field != FieldEnd; ++Field) {
1414    QualType FieldType = getContext().getCanonicalType((*Field)->getType());
1415    const ConstantArrayType *Array =
1416      getContext().getAsConstantArrayType(FieldType);
1417    if (Array)
1418      FieldType = getContext().getBaseElementType(FieldType);
1419
1420    if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) {
1421      CXXRecordDecl *FieldClassDecl
1422        = cast<CXXRecordDecl>(FieldClassType->getDecl());
1423      LValue LHS = EmitLValueForField(LoadOfThis, *Field, false, 0);
1424      LValue RHS = EmitLValueForField(LoadOfSrc, *Field, false, 0);
1425      if (Array) {
1426        const llvm::Type *BasePtr = ConvertType(FieldType);
1427        BasePtr = llvm::PointerType::getUnqual(BasePtr);
1428        llvm::Value *DestBaseAddrPtr =
1429          Builder.CreateBitCast(LHS.getAddress(), BasePtr);
1430        llvm::Value *SrcBaseAddrPtr =
1431          Builder.CreateBitCast(RHS.getAddress(), BasePtr);
1432        EmitClassAggrMemberwiseCopy(DestBaseAddrPtr, SrcBaseAddrPtr, Array,
1433                                    FieldClassDecl, FieldType);
1434      }
1435      else
1436        EmitClassMemberwiseCopy(LHS.getAddress(), RHS.getAddress(),
1437                                0 /*ClassDecl*/, FieldClassDecl, FieldType);
1438      continue;
1439    }
1440    // Do a built-in assignment of scalar data members.
1441    LValue LHS = EmitLValueForField(LoadOfThis, *Field, false, 0);
1442    LValue RHS = EmitLValueForField(LoadOfSrc, *Field, false, 0);
1443    RValue RVRHS = EmitLoadOfLValue(RHS, FieldType);
1444    EmitStoreThroughLValue(RVRHS, LHS, FieldType);
1445  }
1446  FinishFunction();
1447}
1448
1449/// SynthesizeCXXCopyAssignment - Implicitly define copy assignment operator.
1450/// Before the implicitly-declared copy assignment operator for a class is
1451/// implicitly defined, all implicitly- declared copy assignment operators for
1452/// its direct base classes and its nonstatic data members shall have been
1453/// implicitly defined. [12.8-p12]
1454/// The implicitly-defined copy assignment operator for class X performs
1455/// memberwise assignment of its subob- jects. The direct base classes of X are
1456/// assigned first, in the order of their declaration in
1457/// the base-specifier-list, and then the immediate nonstatic data members of X
1458/// are assigned, in the order in which they were declared in the class
1459/// definition.Each subobject is assigned in the manner appropriate to its type:
1460///   if the subobject is of class type, the copy assignment operator for the
1461///   class is used (as if by explicit qualification; that is, ignoring any
1462///   possible virtual overriding functions in more derived classes);
1463///
1464///   if the subobject is an array, each element is assigned, in the manner
1465///   appropriate to the element type;
1466///
1467///   if the subobject is of scalar type, the built-in assignment operator is
1468///   used.
1469void CodeGenFunction::SynthesizeCXXCopyAssignment(const CXXMethodDecl *CD,
1470                                                  const FunctionDecl *FD,
1471                                                  llvm::Function *Fn,
1472                                                  const FunctionArgList &Args) {
1473
1474  const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
1475  assert(!ClassDecl->hasUserDeclaredCopyAssignment() &&
1476         "SynthesizeCXXCopyAssignment - copy assignment has user declaration");
1477  StartFunction(FD, FD->getResultType(), Fn, Args, SourceLocation());
1478
1479  FunctionArgList::const_iterator i = Args.begin();
1480  const VarDecl *ThisArg = i->first;
1481  llvm::Value *ThisObj = GetAddrOfLocalVar(ThisArg);
1482  llvm::Value *LoadOfThis = Builder.CreateLoad(ThisObj, "this");
1483  const VarDecl *SrcArg = (i+1)->first;
1484  llvm::Value *SrcObj = GetAddrOfLocalVar(SrcArg);
1485  llvm::Value *LoadOfSrc = Builder.CreateLoad(SrcObj);
1486
1487  for (CXXRecordDecl::base_class_const_iterator Base = ClassDecl->bases_begin();
1488       Base != ClassDecl->bases_end(); ++Base) {
1489    // FIXME. copy assignment of virtual base NYI
1490    if (Base->isVirtual())
1491      continue;
1492
1493    CXXRecordDecl *BaseClassDecl
1494      = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
1495    EmitClassCopyAssignment(LoadOfThis, LoadOfSrc, ClassDecl, BaseClassDecl,
1496                            Base->getType());
1497  }
1498
1499  for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
1500       FieldEnd = ClassDecl->field_end();
1501       Field != FieldEnd; ++Field) {
1502    QualType FieldType = getContext().getCanonicalType((*Field)->getType());
1503    const ConstantArrayType *Array =
1504      getContext().getAsConstantArrayType(FieldType);
1505    if (Array)
1506      FieldType = getContext().getBaseElementType(FieldType);
1507
1508    if (const RecordType *FieldClassType = FieldType->getAs<RecordType>()) {
1509      CXXRecordDecl *FieldClassDecl
1510      = cast<CXXRecordDecl>(FieldClassType->getDecl());
1511      LValue LHS = EmitLValueForField(LoadOfThis, *Field, false, 0);
1512      LValue RHS = EmitLValueForField(LoadOfSrc, *Field, false, 0);
1513      if (Array) {
1514        const llvm::Type *BasePtr = ConvertType(FieldType);
1515        BasePtr = llvm::PointerType::getUnqual(BasePtr);
1516        llvm::Value *DestBaseAddrPtr =
1517          Builder.CreateBitCast(LHS.getAddress(), BasePtr);
1518        llvm::Value *SrcBaseAddrPtr =
1519          Builder.CreateBitCast(RHS.getAddress(), BasePtr);
1520        EmitClassAggrCopyAssignment(DestBaseAddrPtr, SrcBaseAddrPtr, Array,
1521                                    FieldClassDecl, FieldType);
1522      }
1523      else
1524        EmitClassCopyAssignment(LHS.getAddress(), RHS.getAddress(),
1525                               0 /*ClassDecl*/, FieldClassDecl, FieldType);
1526      continue;
1527    }
1528    // Do a built-in assignment of scalar data members.
1529    LValue LHS = EmitLValueForField(LoadOfThis, *Field, false, 0);
1530    LValue RHS = EmitLValueForField(LoadOfSrc, *Field, false, 0);
1531    RValue RVRHS = EmitLoadOfLValue(RHS, FieldType);
1532    EmitStoreThroughLValue(RVRHS, LHS, FieldType);
1533  }
1534
1535  // return *this;
1536  Builder.CreateStore(LoadOfThis, ReturnValue);
1537
1538  FinishFunction();
1539}
1540
1541/// EmitCtorPrologue - This routine generates necessary code to initialize
1542/// base classes and non-static data members belonging to this constructor.
1543void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
1544  const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
1545  // FIXME: Add vbase initialization
1546  llvm::Value *LoadOfThis = 0;
1547
1548  for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(),
1549       E = CD->init_end();
1550       B != E; ++B) {
1551    CXXBaseOrMemberInitializer *Member = (*B);
1552    if (Member->isBaseInitializer()) {
1553      LoadOfThis = LoadCXXThis();
1554      Type *BaseType = Member->getBaseClass();
1555      CXXRecordDecl *BaseClassDecl =
1556        cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl());
1557      llvm::Value *V = AddressCXXOfBaseClass(LoadOfThis, ClassDecl,
1558                                             BaseClassDecl);
1559      EmitCXXConstructorCall(Member->getConstructor(),
1560                             Ctor_Complete, V,
1561                             Member->const_arg_begin(),
1562                             Member->const_arg_end());
1563    } else {
1564      // non-static data member initilaizers.
1565      FieldDecl *Field = Member->getMember();
1566      QualType FieldType = getContext().getCanonicalType((Field)->getType());
1567      const ConstantArrayType *Array =
1568        getContext().getAsConstantArrayType(FieldType);
1569      if (Array)
1570        FieldType = getContext().getBaseElementType(FieldType);
1571
1572      LoadOfThis = LoadCXXThis();
1573      LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0);
1574      if (FieldType->getAs<RecordType>()) {
1575        if (!Field->isAnonymousStructOrUnion()) {
1576          assert(Member->getConstructor() &&
1577                 "EmitCtorPrologue - no constructor to initialize member");
1578          if (Array) {
1579            const llvm::Type *BasePtr = ConvertType(FieldType);
1580            BasePtr = llvm::PointerType::getUnqual(BasePtr);
1581            llvm::Value *BaseAddrPtr =
1582            Builder.CreateBitCast(LHS.getAddress(), BasePtr);
1583            EmitCXXAggrConstructorCall(Member->getConstructor(),
1584                                       Array, BaseAddrPtr);
1585          }
1586          else
1587            EmitCXXConstructorCall(Member->getConstructor(),
1588                                   Ctor_Complete, LHS.getAddress(),
1589                                   Member->const_arg_begin(),
1590                                   Member->const_arg_end());
1591          continue;
1592        }
1593        else {
1594          // Initializing an anonymous union data member.
1595          FieldDecl *anonMember = Member->getAnonUnionMember();
1596          LHS = EmitLValueForField(LHS.getAddress(), anonMember, false, 0);
1597          FieldType = anonMember->getType();
1598        }
1599      }
1600
1601      assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only");
1602      Expr *RhsExpr = *Member->arg_begin();
1603      llvm::Value *RHS = EmitScalarExpr(RhsExpr, true);
1604      EmitStoreThroughLValue(RValue::get(RHS), LHS, FieldType);
1605    }
1606  }
1607
1608  if (!CD->getNumBaseOrMemberInitializers() && !CD->isTrivial()) {
1609    // Nontrivial default constructor with no initializer list. It may still
1610    // have bases classes and/or contain non-static data members which require
1611    // construction.
1612    for (CXXRecordDecl::base_class_const_iterator Base =
1613          ClassDecl->bases_begin();
1614          Base != ClassDecl->bases_end(); ++Base) {
1615      // FIXME. copy assignment of virtual base NYI
1616      if (Base->isVirtual())
1617        continue;
1618
1619      CXXRecordDecl *BaseClassDecl
1620        = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
1621      if (BaseClassDecl->hasTrivialConstructor())
1622        continue;
1623      if (CXXConstructorDecl *BaseCX =
1624            BaseClassDecl->getDefaultConstructor(getContext())) {
1625        LoadOfThis = LoadCXXThis();
1626        llvm::Value *V = AddressCXXOfBaseClass(LoadOfThis, ClassDecl,
1627                                               BaseClassDecl);
1628        EmitCXXConstructorCall(BaseCX, Ctor_Complete, V, 0, 0);
1629      }
1630    }
1631
1632    for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
1633         FieldEnd = ClassDecl->field_end();
1634         Field != FieldEnd; ++Field) {
1635      QualType FieldType = getContext().getCanonicalType((*Field)->getType());
1636      const ConstantArrayType *Array =
1637        getContext().getAsConstantArrayType(FieldType);
1638      if (Array)
1639        FieldType = getContext().getBaseElementType(FieldType);
1640      if (!FieldType->getAs<RecordType>() || Field->isAnonymousStructOrUnion())
1641        continue;
1642      const RecordType *ClassRec = FieldType->getAs<RecordType>();
1643      CXXRecordDecl *MemberClassDecl =
1644        dyn_cast<CXXRecordDecl>(ClassRec->getDecl());
1645      if (!MemberClassDecl || MemberClassDecl->hasTrivialConstructor())
1646        continue;
1647      if (CXXConstructorDecl *MamberCX =
1648            MemberClassDecl->getDefaultConstructor(getContext())) {
1649        LoadOfThis = LoadCXXThis();
1650        LValue LHS = EmitLValueForField(LoadOfThis, *Field, false, 0);
1651        if (Array) {
1652          const llvm::Type *BasePtr = ConvertType(FieldType);
1653          BasePtr = llvm::PointerType::getUnqual(BasePtr);
1654          llvm::Value *BaseAddrPtr =
1655            Builder.CreateBitCast(LHS.getAddress(), BasePtr);
1656          EmitCXXAggrConstructorCall(MamberCX, Array, BaseAddrPtr);
1657        }
1658        else
1659          EmitCXXConstructorCall(MamberCX, Ctor_Complete, LHS.getAddress(),
1660                                 0, 0);
1661      }
1662    }
1663  }
1664
1665  // Initialize the vtable pointer
1666  if (ClassDecl->isDynamicClass()) {
1667    if (!LoadOfThis)
1668      LoadOfThis = LoadCXXThis();
1669    llvm::Value *VtableField;
1670    llvm::Type *Ptr8Ty, *PtrPtr8Ty;
1671    Ptr8Ty = llvm::PointerType::get(llvm::Type::getInt8Ty(VMContext), 0);
1672    PtrPtr8Ty = llvm::PointerType::get(Ptr8Ty, 0);
1673    VtableField = Builder.CreateBitCast(LoadOfThis, PtrPtr8Ty);
1674    llvm::Value *vtable = GenerateVtable(ClassDecl);
1675    Builder.CreateStore(vtable, VtableField);
1676  }
1677}
1678
1679/// EmitDtorEpilogue - Emit all code that comes at the end of class's
1680/// destructor. This is to call destructors on members and base classes
1681/// in reverse order of their construction.
1682void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD) {
1683  const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(DD->getDeclContext());
1684  assert(!ClassDecl->isPolymorphic() &&
1685         "FIXME. polymorphic destruction not supported");
1686  (void)ClassDecl;  // prevent warning.
1687
1688  for (CXXDestructorDecl::destr_const_iterator *B = DD->destr_begin(),
1689       *E = DD->destr_end(); B != E; ++B) {
1690    uintptr_t BaseOrMember = (*B);
1691    if (DD->isMemberToDestroy(BaseOrMember)) {
1692      FieldDecl *FD = DD->getMemberToDestroy(BaseOrMember);
1693      QualType FieldType = getContext().getCanonicalType((FD)->getType());
1694      const ConstantArrayType *Array =
1695        getContext().getAsConstantArrayType(FieldType);
1696      if (Array)
1697        FieldType = getContext().getBaseElementType(FieldType);
1698      const RecordType *RT = FieldType->getAs<RecordType>();
1699      CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
1700      if (FieldClassDecl->hasTrivialDestructor())
1701        continue;
1702      llvm::Value *LoadOfThis = LoadCXXThis();
1703      LValue LHS = EmitLValueForField(LoadOfThis, FD, false, 0);
1704      if (Array) {
1705        const llvm::Type *BasePtr = ConvertType(FieldType);
1706        BasePtr = llvm::PointerType::getUnqual(BasePtr);
1707        llvm::Value *BaseAddrPtr =
1708          Builder.CreateBitCast(LHS.getAddress(), BasePtr);
1709        EmitCXXAggrDestructorCall(FieldClassDecl->getDestructor(getContext()),
1710                                  Array, BaseAddrPtr);
1711      }
1712      else
1713        EmitCXXDestructorCall(FieldClassDecl->getDestructor(getContext()),
1714                              Dtor_Complete, LHS.getAddress());
1715    } else {
1716      const RecordType *RT =
1717        DD->getAnyBaseClassToDestroy(BaseOrMember)->getAs<RecordType>();
1718      CXXRecordDecl *BaseClassDecl = cast<CXXRecordDecl>(RT->getDecl());
1719      if (BaseClassDecl->hasTrivialDestructor())
1720        continue;
1721      llvm::Value *V = AddressCXXOfBaseClass(LoadCXXThis(),
1722                                             ClassDecl,BaseClassDecl);
1723      EmitCXXDestructorCall(BaseClassDecl->getDestructor(getContext()),
1724                            Dtor_Complete, V);
1725    }
1726  }
1727  if (DD->getNumBaseOrMemberDestructions() || DD->isTrivial())
1728    return;
1729  // Case of destructor synthesis with fields and base classes
1730  // which have non-trivial destructors. They must be destructed in
1731  // reverse order of their construction.
1732  llvm::SmallVector<FieldDecl *, 16> DestructedFields;
1733
1734  for (CXXRecordDecl::field_iterator Field = ClassDecl->field_begin(),
1735       FieldEnd = ClassDecl->field_end();
1736       Field != FieldEnd; ++Field) {
1737    QualType FieldType = getContext().getCanonicalType((*Field)->getType());
1738    if (getContext().getAsConstantArrayType(FieldType))
1739      FieldType = getContext().getBaseElementType(FieldType);
1740    if (const RecordType *RT = FieldType->getAs<RecordType>()) {
1741      CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
1742      if (FieldClassDecl->hasTrivialDestructor())
1743        continue;
1744      DestructedFields.push_back(*Field);
1745    }
1746  }
1747  if (!DestructedFields.empty())
1748    for (int i = DestructedFields.size() -1; i >= 0; --i) {
1749      FieldDecl *Field = DestructedFields[i];
1750      QualType FieldType = Field->getType();
1751      const ConstantArrayType *Array =
1752        getContext().getAsConstantArrayType(FieldType);
1753        if (Array)
1754          FieldType = getContext().getBaseElementType(FieldType);
1755      const RecordType *RT = FieldType->getAs<RecordType>();
1756      CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl());
1757      llvm::Value *LoadOfThis = LoadCXXThis();
1758      LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0);
1759      if (Array) {
1760        const llvm::Type *BasePtr = ConvertType(FieldType);
1761        BasePtr = llvm::PointerType::getUnqual(BasePtr);
1762        llvm::Value *BaseAddrPtr =
1763        Builder.CreateBitCast(LHS.getAddress(), BasePtr);
1764        EmitCXXAggrDestructorCall(FieldClassDecl->getDestructor(getContext()),
1765                                  Array, BaseAddrPtr);
1766      }
1767      else
1768        EmitCXXDestructorCall(FieldClassDecl->getDestructor(getContext()),
1769                              Dtor_Complete, LHS.getAddress());
1770    }
1771
1772  llvm::SmallVector<CXXRecordDecl*, 4> DestructedBases;
1773  for (CXXRecordDecl::base_class_const_iterator Base = ClassDecl->bases_begin();
1774       Base != ClassDecl->bases_end(); ++Base) {
1775    // FIXME. copy assignment of virtual base NYI
1776    if (Base->isVirtual())
1777      continue;
1778
1779    CXXRecordDecl *BaseClassDecl
1780      = cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl());
1781    if (BaseClassDecl->hasTrivialDestructor())
1782      continue;
1783    DestructedBases.push_back(BaseClassDecl);
1784  }
1785  if (DestructedBases.empty())
1786    return;
1787  for (int i = DestructedBases.size() -1; i >= 0; --i) {
1788    CXXRecordDecl *BaseClassDecl = DestructedBases[i];
1789    llvm::Value *V = AddressCXXOfBaseClass(LoadCXXThis(),
1790                                           ClassDecl,BaseClassDecl);
1791    EmitCXXDestructorCall(BaseClassDecl->getDestructor(getContext()),
1792                          Dtor_Complete, V);
1793  }
1794}
1795
1796void CodeGenFunction::SynthesizeDefaultDestructor(const CXXDestructorDecl *CD,
1797                                                  const FunctionDecl *FD,
1798                                                  llvm::Function *Fn,
1799                                                  const FunctionArgList &Args) {
1800
1801  const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
1802  assert(!ClassDecl->hasUserDeclaredDestructor() &&
1803         "SynthesizeDefaultDestructor - destructor has user declaration");
1804  (void) ClassDecl;
1805
1806  StartFunction(FD, FD->getResultType(), Fn, Args, SourceLocation());
1807  EmitDtorEpilogue(CD);
1808  FinishFunction();
1809}
1810