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