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