CGCXX.cpp revision 5a8503b333f50acd6012859853612229f38cb420
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::GenerateStaticCXXBlockVarDeclInit(const VarDecl &D,
30                                                   llvm::GlobalVariable *GV) {
31  // FIXME: This should use __cxa_guard_{acquire,release}?
32
33  assert(!getContext().getLangOptions().ThreadsafeStatics &&
34         "thread safe statics are currently not supported!");
35
36  llvm::SmallString<256> GuardVName;
37  llvm::raw_svector_ostream GuardVOut(GuardVName);
38  mangleGuardVariable(&D, getContext(), GuardVOut);
39
40  // Create the guard variable.
41  llvm::GlobalValue *GuardV =
42    new llvm::GlobalVariable(CGM.getModule(), llvm::Type::Int64Ty, false,
43                             GV->getLinkage(),
44                             VMContext.getNullValue(llvm::Type::Int64Ty),
45                             GuardVName.c_str());
46
47  // Load the first byte of the guard variable.
48  const llvm::Type *PtrTy = VMContext.getPointerType(llvm::Type::Int8Ty, 0);
49  llvm::Value *V = Builder.CreateLoad(Builder.CreateBitCast(GuardV, PtrTy),
50                                      "tmp");
51
52  // Compare it against 0.
53  llvm::Value *nullValue = VMContext.getNullValue(llvm::Type::Int8Ty);
54  llvm::Value *ICmp = Builder.CreateICmpEQ(V, nullValue , "tobool");
55
56  llvm::BasicBlock *InitBlock = createBasicBlock("init");
57  llvm::BasicBlock *EndBlock = createBasicBlock("init.end");
58
59  // If the guard variable is 0, jump to the initializer code.
60  Builder.CreateCondBr(ICmp, InitBlock, EndBlock);
61
62  EmitBlock(InitBlock);
63
64  const Expr *Init = D.getInit();
65  if (!hasAggregateLLVMType(Init->getType())) {
66    llvm::Value *V = EmitScalarExpr(Init);
67    Builder.CreateStore(V, GV, D.getType().isVolatileQualified());
68  } else if (Init->getType()->isAnyComplexType()) {
69    EmitComplexExprIntoAddr(Init, GV, D.getType().isVolatileQualified());
70  } else {
71    EmitAggExpr(Init, GV, D.getType().isVolatileQualified());
72  }
73
74  Builder.CreateStore(llvm::ConstantInt::get(llvm::Type::Int8Ty, 1),
75                      Builder.CreateBitCast(GuardV, PtrTy));
76
77  EmitBlock(EndBlock);
78}
79
80RValue CodeGenFunction::EmitCXXMemberCall(const CXXMethodDecl *MD,
81                                          llvm::Value *Callee,
82                                          llvm::Value *This,
83                                          CallExpr::const_arg_iterator ArgBeg,
84                                          CallExpr::const_arg_iterator ArgEnd) {
85  assert(MD->isInstance() &&
86         "Trying to emit a member call expr on a static method!");
87
88  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
89
90  CallArgList Args;
91
92  // Push the this ptr.
93  Args.push_back(std::make_pair(RValue::get(This),
94                                MD->getThisType(getContext())));
95
96  // And the rest of the call args
97  EmitCallArgs(Args, FPT, ArgBeg, ArgEnd);
98
99  QualType ResultType = MD->getType()->getAsFunctionType()->getResultType();
100  return EmitCall(CGM.getTypes().getFunctionInfo(ResultType, Args),
101                  Callee, Args, MD);
102}
103
104RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE) {
105  const MemberExpr *ME = cast<MemberExpr>(CE->getCallee());
106  const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
107
108  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
109  const llvm::Type *Ty =
110    CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
111                                   FPT->isVariadic());
112  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
113
114  llvm::Value *This;
115
116  if (ME->isArrow())
117    This = EmitScalarExpr(ME->getBase());
118  else {
119    LValue BaseLV = EmitLValue(ME->getBase());
120    This = BaseLV.getAddress();
121  }
122
123  return EmitCXXMemberCall(MD, Callee, This,
124                           CE->arg_begin(), CE->arg_end());
125}
126
127RValue
128CodeGenFunction::EmitCXXOperatorMemberCallExpr(const CXXOperatorCallExpr *E,
129                                               const CXXMethodDecl *MD) {
130  assert(MD->isInstance() &&
131         "Trying to emit a member call expr on a static method!");
132
133
134  const FunctionProtoType *FPT = MD->getType()->getAsFunctionProtoType();
135  const llvm::Type *Ty =
136  CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(MD),
137                                 FPT->isVariadic());
138  llvm::Constant *Callee = CGM.GetAddrOfFunction(GlobalDecl(MD), Ty);
139
140  llvm::Value *This = EmitLValue(E->getArg(0)).getAddress();
141
142  return EmitCXXMemberCall(MD, Callee, This,
143                           E->arg_begin() + 1, E->arg_end());
144}
145
146llvm::Value *CodeGenFunction::LoadCXXThis() {
147  assert(isa<CXXMethodDecl>(CurFuncDecl) &&
148         "Must be in a C++ member function decl to load 'this'");
149  assert(cast<CXXMethodDecl>(CurFuncDecl)->isInstance() &&
150         "Must be in a C++ member function decl to load 'this'");
151
152  // FIXME: What if we're inside a block?
153  // ans: See how CodeGenFunction::LoadObjCSelf() uses
154  // CodeGenFunction::BlockForwardSelf() for how to do this.
155  return Builder.CreateLoad(LocalDeclMap[CXXThisDecl], "this");
156}
157
158llvm::Value *CodeGenFunction::AddressCXXOfBaseClass(llvm::Value *BaseValue,
159                                          const CXXRecordDecl *ClassDecl,
160                                          const CXXRecordDecl *BaseClassDecl) {
161  if (ClassDecl == BaseClassDecl)
162    return BaseValue;
163
164  // Accessing a member of the base class. Must add delata to
165  // the load of 'this'.
166  // FIXME. Once type layout is complete, this will probably change.
167  const ASTRecordLayout &Layout =
168  getContext().getASTRecordLayout(ClassDecl);
169  llvm::Type *I8Ptr = VMContext.getPointerTypeUnqual(llvm::Type::Int8Ty);
170  uint64_t Offset = Layout.getBaseClassOffset(BaseClassDecl) / 8;
171  llvm::Value *OffsetVal =
172    llvm::ConstantInt::get(
173                  CGM.getTypes().ConvertType(CGM.getContext().LongTy), Offset);
174  BaseValue = Builder.CreateBitCast(BaseValue, I8Ptr);
175  BaseValue = Builder.CreateGEP(BaseValue, OffsetVal, "add.ptr");
176  QualType BTy =
177    getContext().getCanonicalType(
178      getContext().getTypeDeclType(const_cast<CXXRecordDecl*>(BaseClassDecl)));
179  const llvm::Type *BasePtr = ConvertType(BTy);
180  BasePtr = VMContext.getPointerTypeUnqual(BasePtr);
181  BaseValue = Builder.CreateBitCast(BaseValue, BasePtr);
182  return BaseValue;
183}
184
185void
186CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
187                                        CXXCtorType Type,
188                                        llvm::Value *This,
189                                        CallExpr::const_arg_iterator ArgBeg,
190                                        CallExpr::const_arg_iterator ArgEnd) {
191  llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type);
192
193  EmitCXXMemberCall(D, Callee, This, ArgBeg, ArgEnd);
194}
195
196void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *D,
197                                            CXXDtorType Type,
198                                            llvm::Value *This) {
199  llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(D, Type);
200
201  EmitCXXMemberCall(D, Callee, This, 0, 0);
202}
203
204void
205CodeGenFunction::EmitCXXConstructExpr(llvm::Value *Dest,
206                                      const CXXConstructExpr *E) {
207  assert(Dest && "Must have a destination!");
208
209  const CXXRecordDecl *RD =
210  cast<CXXRecordDecl>(E->getType()->getAsRecordType()->getDecl());
211  if (RD->hasTrivialConstructor())
212    return;
213
214  // Call the constructor.
215  EmitCXXConstructorCall(E->getConstructor(), Ctor_Complete, Dest,
216                         E->arg_begin(), E->arg_end());
217}
218
219llvm::Value *CodeGenFunction::EmitCXXNewExpr(const CXXNewExpr *E) {
220  if (E->isArray()) {
221    ErrorUnsupported(E, "new[] expression");
222    return VMContext.getUndef(ConvertType(E->getType()));
223  }
224
225  QualType AllocType = E->getAllocatedType();
226  FunctionDecl *NewFD = E->getOperatorNew();
227  const FunctionProtoType *NewFTy = NewFD->getType()->getAsFunctionProtoType();
228
229  CallArgList NewArgs;
230
231  // The allocation size is the first argument.
232  QualType SizeTy = getContext().getSizeType();
233  llvm::Value *AllocSize =
234    llvm::ConstantInt::get(ConvertType(SizeTy),
235                           getContext().getTypeSize(AllocType) / 8);
236
237  NewArgs.push_back(std::make_pair(RValue::get(AllocSize), SizeTy));
238
239  // Emit the rest of the arguments.
240  // FIXME: Ideally, this should just use EmitCallArgs.
241  CXXNewExpr::const_arg_iterator NewArg = E->placement_arg_begin();
242
243  // First, use the types from the function type.
244  // We start at 1 here because the first argument (the allocation size)
245  // has already been emitted.
246  for (unsigned i = 1, e = NewFTy->getNumArgs(); i != e; ++i, ++NewArg) {
247    QualType ArgType = NewFTy->getArgType(i);
248
249    assert(getContext().getCanonicalType(ArgType.getNonReferenceType()).
250           getTypePtr() ==
251           getContext().getCanonicalType(NewArg->getType()).getTypePtr() &&
252           "type mismatch in call argument!");
253
254    NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType),
255                                     ArgType));
256
257  }
258
259  // Either we've emitted all the call args, or we have a call to a
260  // variadic function.
261  assert((NewArg == E->placement_arg_end() || NewFTy->isVariadic()) &&
262         "Extra arguments in non-variadic function!");
263
264  // If we still have any arguments, emit them using the type of the argument.
265  for (CXXNewExpr::const_arg_iterator NewArgEnd = E->placement_arg_end();
266       NewArg != NewArgEnd; ++NewArg) {
267    QualType ArgType = NewArg->getType();
268    NewArgs.push_back(std::make_pair(EmitCallArg(*NewArg, ArgType),
269                                     ArgType));
270  }
271
272  // Emit the call to new.
273  RValue RV =
274    EmitCall(CGM.getTypes().getFunctionInfo(NewFTy->getResultType(), NewArgs),
275             CGM.GetAddrOfFunction(GlobalDecl(NewFD)),
276             NewArgs, NewFD);
277
278  // If an allocation function is declared with an empty exception specification
279  // it returns null to indicate failure to allocate storage. [expr.new]p13.
280  // (We don't need to check for null when there's no new initializer and
281  // we're allocating a POD type).
282  bool NullCheckResult = NewFTy->hasEmptyExceptionSpec() &&
283    !(AllocType->isPODType() && !E->hasInitializer());
284
285  llvm::BasicBlock *NewNull = 0;
286  llvm::BasicBlock *NewNotNull = 0;
287  llvm::BasicBlock *NewEnd = 0;
288
289  llvm::Value *NewPtr = RV.getScalarVal();
290
291  if (NullCheckResult) {
292    NewNull = createBasicBlock("new.null");
293    NewNotNull = createBasicBlock("new.notnull");
294    NewEnd = createBasicBlock("new.end");
295
296    llvm::Value *IsNull =
297      Builder.CreateICmpEQ(NewPtr,
298                           VMContext.getNullValue(NewPtr->getType()),
299                           "isnull");
300
301    Builder.CreateCondBr(IsNull, NewNull, NewNotNull);
302    EmitBlock(NewNotNull);
303  }
304
305  NewPtr = Builder.CreateBitCast(NewPtr, ConvertType(E->getType()));
306
307  if (AllocType->isPODType()) {
308    if (E->getNumConstructorArgs() > 0) {
309      assert(E->getNumConstructorArgs() == 1 &&
310             "Can only have one argument to initializer of POD type.");
311
312      const Expr *Init = E->getConstructorArg(0);
313
314      if (!hasAggregateLLVMType(AllocType))
315        Builder.CreateStore(EmitScalarExpr(Init), NewPtr);
316      else if (AllocType->isAnyComplexType())
317        EmitComplexExprIntoAddr(Init, NewPtr, AllocType.isVolatileQualified());
318      else
319        EmitAggExpr(Init, NewPtr, AllocType.isVolatileQualified());
320    }
321  } else {
322    // Call the constructor.
323    CXXConstructorDecl *Ctor = E->getConstructor();
324
325    EmitCXXConstructorCall(Ctor, Ctor_Complete, NewPtr,
326                           E->constructor_arg_begin(),
327                           E->constructor_arg_end());
328  }
329
330  if (NullCheckResult) {
331    Builder.CreateBr(NewEnd);
332    EmitBlock(NewNull);
333    Builder.CreateBr(NewEnd);
334    EmitBlock(NewEnd);
335
336    llvm::PHINode *PHI = Builder.CreatePHI(NewPtr->getType());
337    PHI->reserveOperandSpace(2);
338    PHI->addIncoming(NewPtr, NewNotNull);
339    PHI->addIncoming(VMContext.getNullValue(NewPtr->getType()), NewNull);
340
341    NewPtr = PHI;
342  }
343
344  return NewPtr;
345}
346
347static bool canGenerateCXXstructor(const CXXRecordDecl *RD,
348                                   ASTContext &Context) {
349  // The class has base classes - we don't support that right now.
350  if (RD->getNumBases() > 0)
351    return false;
352
353  for (CXXRecordDecl::field_iterator I = RD->field_begin(), E = RD->field_end();
354         I != E; ++I) {
355    // We don't support ctors for fields that aren't POD.
356    if (!I->getType()->isPODType())
357      return false;
358  }
359
360  return true;
361}
362
363void CodeGenModule::EmitCXXConstructors(const CXXConstructorDecl *D) {
364  if (!canGenerateCXXstructor(D->getParent(), getContext())) {
365    ErrorUnsupported(D, "C++ constructor", true);
366    return;
367  }
368
369  EmitGlobal(GlobalDecl(D, Ctor_Complete));
370  EmitGlobal(GlobalDecl(D, Ctor_Base));
371}
372
373void CodeGenModule::EmitCXXConstructor(const CXXConstructorDecl *D,
374                                       CXXCtorType Type) {
375
376  llvm::Function *Fn = GetAddrOfCXXConstructor(D, Type);
377
378  CodeGenFunction(*this).GenerateCode(D, Fn);
379
380  SetFunctionDefinitionAttributes(D, Fn);
381  SetLLVMFunctionAttributesForDefinition(D, Fn);
382}
383
384llvm::Function *
385CodeGenModule::GetAddrOfCXXConstructor(const CXXConstructorDecl *D,
386                                       CXXCtorType Type) {
387  const llvm::FunctionType *FTy =
388    getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
389
390  const char *Name = getMangledCXXCtorName(D, Type);
391  return cast<llvm::Function>(
392                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
393}
394
395const char *CodeGenModule::getMangledCXXCtorName(const CXXConstructorDecl *D,
396                                                 CXXCtorType Type) {
397  llvm::SmallString<256> Name;
398  llvm::raw_svector_ostream Out(Name);
399  mangleCXXCtor(D, Type, Context, Out);
400
401  Name += '\0';
402  return UniqueMangledName(Name.begin(), Name.end());
403}
404
405void CodeGenModule::EmitCXXDestructors(const CXXDestructorDecl *D) {
406  if (!canGenerateCXXstructor(D->getParent(), getContext())) {
407    ErrorUnsupported(D, "C++ destructor", true);
408    return;
409  }
410
411  EmitCXXDestructor(D, Dtor_Complete);
412  EmitCXXDestructor(D, Dtor_Base);
413}
414
415void CodeGenModule::EmitCXXDestructor(const CXXDestructorDecl *D,
416                                      CXXDtorType Type) {
417  llvm::Function *Fn = GetAddrOfCXXDestructor(D, Type);
418
419  CodeGenFunction(*this).GenerateCode(D, Fn);
420
421  SetFunctionDefinitionAttributes(D, Fn);
422  SetLLVMFunctionAttributesForDefinition(D, Fn);
423}
424
425llvm::Function *
426CodeGenModule::GetAddrOfCXXDestructor(const CXXDestructorDecl *D,
427                                      CXXDtorType Type) {
428  const llvm::FunctionType *FTy =
429    getTypes().GetFunctionType(getTypes().getFunctionInfo(D), false);
430
431  const char *Name = getMangledCXXDtorName(D, Type);
432  return cast<llvm::Function>(
433                      GetOrCreateLLVMFunction(Name, FTy, GlobalDecl(D, Type)));
434}
435
436const char *CodeGenModule::getMangledCXXDtorName(const CXXDestructorDecl *D,
437                                                 CXXDtorType Type) {
438  llvm::SmallString<256> Name;
439  llvm::raw_svector_ostream Out(Name);
440  mangleCXXDtor(D, Type, Context, Out);
441
442  Name += '\0';
443  return UniqueMangledName(Name.begin(), Name.end());
444}
445
446/// EmitCtorPrologue - This routine generates necessary code to initialize
447/// base classes and non-static data members belonging to this constructor.
448void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD) {
449  const CXXRecordDecl *ClassDecl = cast<CXXRecordDecl>(CD->getDeclContext());
450  assert(ClassDecl->vbases_begin() == ClassDecl->vbases_end()
451         && "FIXME. virtual base initialization unsupported");
452
453  for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(),
454       E = CD->init_end();
455       B != E; ++B) {
456    CXXBaseOrMemberInitializer *Member = (*B);
457    if (Member->isBaseInitializer()) {
458      llvm::Value *LoadOfThis = LoadCXXThis();
459      Type *BaseType = Member->getBaseClass();
460      CXXRecordDecl *BaseClassDecl =
461        cast<CXXRecordDecl>(BaseType->getAsRecordType()->getDecl());
462      llvm::Value *V = AddressCXXOfBaseClass(LoadOfThis, ClassDecl,
463                                             BaseClassDecl);
464      EmitCXXConstructorCall(Member->getConstructor(),
465                             Ctor_Complete, V,
466                             Member->const_arg_begin(),
467                             Member->const_arg_end());
468    }
469    else {
470      // non-static data member initilaizers.
471      FieldDecl *Field = Member->getMember();
472      QualType FieldType = getContext().getCanonicalType((Field)->getType());
473      assert(!getContext().getAsArrayType(FieldType)
474             && "FIXME. Field arrays initialization unsupported");
475
476      llvm::Value *LoadOfThis = LoadCXXThis();
477      LValue LHS = EmitLValueForField(LoadOfThis, Field, false, 0);
478      if (FieldType->getAsRecordType()) {
479
480          assert(Member->getConstructor() &&
481                 "EmitCtorPrologue - no constructor to initialize member");
482          EmitCXXConstructorCall(Member->getConstructor(),
483                                 Ctor_Complete, LHS.getAddress(),
484                                 Member->const_arg_begin(),
485                                 Member->const_arg_end());
486        continue;
487      }
488
489      assert(Member->getNumArgs() == 1 && "Initializer count must be 1 only");
490      Expr *RhsExpr = *Member->arg_begin();
491      llvm::Value *RHS = EmitScalarExpr(RhsExpr, true);
492      if (LHS.isBitfield())
493        EmitStoreThroughBitfieldLValue(RValue::get(RHS), LHS, FieldType, 0);
494      else
495        EmitStoreThroughLValue(RValue::get(RHS), LHS, FieldType);
496    }
497  }
498}
499