1 //===--- CGClass.cpp - Emit LLVM Code for C++ classes ---------------------===// 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 of classes 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CodeGenFunction.h" 15 #include "clang/AST/CXXInheritance.h" 16 #include "clang/AST/RecordLayout.h" 17 #include "clang/AST/StmtCXX.h" 18 19 using namespace clang; 20 using namespace CodeGen; 21 22 static uint64_t 23 ComputeNonVirtualBaseClassOffset(ASTContext &Context, 24 const CXXRecordDecl *DerivedClass, 25 CXXBaseSpecifierArray::iterator Start, 26 CXXBaseSpecifierArray::iterator End) { 27 uint64_t Offset = 0; 28 29 const CXXRecordDecl *RD = DerivedClass; 30 31 for (CXXBaseSpecifierArray::iterator I = Start; I != End; ++I) { 32 const CXXBaseSpecifier *Base = *I; 33 assert(!Base->isVirtual() && "Should not see virtual bases here!"); 34 35 // Get the layout. 36 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 37 38 const CXXRecordDecl *BaseDecl = 39 cast<CXXRecordDecl>(Base->getType()->getAs<RecordType>()->getDecl()); 40 41 // Add the offset. 42 Offset += Layout.getBaseClassOffset(BaseDecl); 43 44 RD = BaseDecl; 45 } 46 47 // FIXME: We should not use / 8 here. 48 return Offset / 8; 49 } 50 51 llvm::Constant * 52 CodeGenModule::GetNonVirtualBaseClassOffset(const CXXRecordDecl *ClassDecl, 53 const CXXBaseSpecifierArray &BasePath) { 54 assert(!BasePath.empty() && "Base path should not be empty!"); 55 56 uint64_t Offset = 57 ComputeNonVirtualBaseClassOffset(getContext(), ClassDecl, 58 BasePath.begin(), BasePath.end()); 59 if (!Offset) 60 return 0; 61 62 const llvm::Type *PtrDiffTy = 63 Types.ConvertType(getContext().getPointerDiffType()); 64 65 return llvm::ConstantInt::get(PtrDiffTy, Offset); 66 } 67 68 /// Gets the address of a direct base class within a complete object. 69 /// This should only be used for (1) non-virtual bases or (2) virtual bases 70 /// when the type is known to be complete (e.g. in complete destructors). 71 /// 72 /// The object pointed to by 'This' is assumed to be non-null. 73 llvm::Value * 74 CodeGenFunction::GetAddressOfDirectBaseInCompleteClass(llvm::Value *This, 75 const CXXRecordDecl *Derived, 76 const CXXRecordDecl *Base, 77 bool BaseIsVirtual) { 78 // 'this' must be a pointer (in some address space) to Derived. 79 assert(This->getType()->isPointerTy() && 80 cast<llvm::PointerType>(This->getType())->getElementType() 81 == ConvertType(Derived)); 82 83 // Compute the offset of the virtual base. 84 uint64_t Offset; 85 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(Derived); 86 if (BaseIsVirtual) 87 Offset = Layout.getVBaseClassOffset(Base); 88 else 89 Offset = Layout.getBaseClassOffset(Base); 90 91 // Shift and cast down to the base type. 92 // TODO: for complete types, this should be possible with a GEP. 93 llvm::Value *V = This; 94 if (Offset) { 95 const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(getLLVMContext()); 96 V = Builder.CreateBitCast(V, Int8PtrTy); 97 V = Builder.CreateConstInBoundsGEP1_64(V, Offset / 8); 98 } 99 V = Builder.CreateBitCast(V, ConvertType(Base)->getPointerTo()); 100 101 return V; 102 } 103 104 static llvm::Value * 105 ApplyNonVirtualAndVirtualOffset(CodeGenFunction &CGF, llvm::Value *ThisPtr, 106 uint64_t NonVirtual, llvm::Value *Virtual) { 107 const llvm::Type *PtrDiffTy = 108 CGF.ConvertType(CGF.getContext().getPointerDiffType()); 109 110 llvm::Value *NonVirtualOffset = 0; 111 if (NonVirtual) 112 NonVirtualOffset = llvm::ConstantInt::get(PtrDiffTy, NonVirtual); 113 114 llvm::Value *BaseOffset; 115 if (Virtual) { 116 if (NonVirtualOffset) 117 BaseOffset = CGF.Builder.CreateAdd(Virtual, NonVirtualOffset); 118 else 119 BaseOffset = Virtual; 120 } else 121 BaseOffset = NonVirtualOffset; 122 123 // Apply the base offset. 124 const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGF.getLLVMContext()); 125 ThisPtr = CGF.Builder.CreateBitCast(ThisPtr, Int8PtrTy); 126 ThisPtr = CGF.Builder.CreateGEP(ThisPtr, BaseOffset, "add.ptr"); 127 128 return ThisPtr; 129 } 130 131 llvm::Value * 132 CodeGenFunction::GetAddressOfBaseClass(llvm::Value *Value, 133 const CXXRecordDecl *Derived, 134 const CXXBaseSpecifierArray &BasePath, 135 bool NullCheckValue) { 136 assert(!BasePath.empty() && "Base path should not be empty!"); 137 138 CXXBaseSpecifierArray::iterator Start = BasePath.begin(); 139 const CXXRecordDecl *VBase = 0; 140 141 // Get the virtual base. 142 if ((*Start)->isVirtual()) { 143 VBase = 144 cast<CXXRecordDecl>((*Start)->getType()->getAs<RecordType>()->getDecl()); 145 ++Start; 146 } 147 148 uint64_t NonVirtualOffset = 149 ComputeNonVirtualBaseClassOffset(getContext(), VBase ? VBase : Derived, 150 Start, BasePath.end()); 151 152 // Get the base pointer type. 153 const llvm::Type *BasePtrTy = 154 ConvertType((BasePath.end()[-1])->getType())->getPointerTo(); 155 156 if (!NonVirtualOffset && !VBase) { 157 // Just cast back. 158 return Builder.CreateBitCast(Value, BasePtrTy); 159 } 160 161 llvm::BasicBlock *CastNull = 0; 162 llvm::BasicBlock *CastNotNull = 0; 163 llvm::BasicBlock *CastEnd = 0; 164 165 if (NullCheckValue) { 166 CastNull = createBasicBlock("cast.null"); 167 CastNotNull = createBasicBlock("cast.notnull"); 168 CastEnd = createBasicBlock("cast.end"); 169 170 llvm::Value *IsNull = 171 Builder.CreateICmpEQ(Value, 172 llvm::Constant::getNullValue(Value->getType())); 173 Builder.CreateCondBr(IsNull, CastNull, CastNotNull); 174 EmitBlock(CastNotNull); 175 } 176 177 llvm::Value *VirtualOffset = 0; 178 179 if (VBase) 180 VirtualOffset = GetVirtualBaseClassOffset(Value, Derived, VBase); 181 182 // Apply the offsets. 183 Value = ApplyNonVirtualAndVirtualOffset(*this, Value, NonVirtualOffset, 184 VirtualOffset); 185 186 // Cast back. 187 Value = Builder.CreateBitCast(Value, BasePtrTy); 188 189 if (NullCheckValue) { 190 Builder.CreateBr(CastEnd); 191 EmitBlock(CastNull); 192 Builder.CreateBr(CastEnd); 193 EmitBlock(CastEnd); 194 195 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType()); 196 PHI->reserveOperandSpace(2); 197 PHI->addIncoming(Value, CastNotNull); 198 PHI->addIncoming(llvm::Constant::getNullValue(Value->getType()), 199 CastNull); 200 Value = PHI; 201 } 202 203 return Value; 204 } 205 206 llvm::Value * 207 CodeGenFunction::GetAddressOfDerivedClass(llvm::Value *Value, 208 const CXXRecordDecl *Derived, 209 const CXXBaseSpecifierArray &BasePath, 210 bool NullCheckValue) { 211 assert(!BasePath.empty() && "Base path should not be empty!"); 212 213 QualType DerivedTy = 214 getContext().getCanonicalType(getContext().getTagDeclType(Derived)); 215 const llvm::Type *DerivedPtrTy = ConvertType(DerivedTy)->getPointerTo(); 216 217 llvm::Value *NonVirtualOffset = 218 CGM.GetNonVirtualBaseClassOffset(Derived, BasePath); 219 220 if (!NonVirtualOffset) { 221 // No offset, we can just cast back. 222 return Builder.CreateBitCast(Value, DerivedPtrTy); 223 } 224 225 llvm::BasicBlock *CastNull = 0; 226 llvm::BasicBlock *CastNotNull = 0; 227 llvm::BasicBlock *CastEnd = 0; 228 229 if (NullCheckValue) { 230 CastNull = createBasicBlock("cast.null"); 231 CastNotNull = createBasicBlock("cast.notnull"); 232 CastEnd = createBasicBlock("cast.end"); 233 234 llvm::Value *IsNull = 235 Builder.CreateICmpEQ(Value, 236 llvm::Constant::getNullValue(Value->getType())); 237 Builder.CreateCondBr(IsNull, CastNull, CastNotNull); 238 EmitBlock(CastNotNull); 239 } 240 241 // Apply the offset. 242 Value = Builder.CreatePtrToInt(Value, NonVirtualOffset->getType()); 243 Value = Builder.CreateSub(Value, NonVirtualOffset); 244 Value = Builder.CreateIntToPtr(Value, DerivedPtrTy); 245 246 // Just cast. 247 Value = Builder.CreateBitCast(Value, DerivedPtrTy); 248 249 if (NullCheckValue) { 250 Builder.CreateBr(CastEnd); 251 EmitBlock(CastNull); 252 Builder.CreateBr(CastEnd); 253 EmitBlock(CastEnd); 254 255 llvm::PHINode *PHI = Builder.CreatePHI(Value->getType()); 256 PHI->reserveOperandSpace(2); 257 PHI->addIncoming(Value, CastNotNull); 258 PHI->addIncoming(llvm::Constant::getNullValue(Value->getType()), 259 CastNull); 260 Value = PHI; 261 } 262 263 return Value; 264 } 265 266 /// GetVTTParameter - Return the VTT parameter that should be passed to a 267 /// base constructor/destructor with virtual bases. 268 static llvm::Value *GetVTTParameter(CodeGenFunction &CGF, GlobalDecl GD, 269 bool ForVirtualBase) { 270 if (!CodeGenVTables::needsVTTParameter(GD)) { 271 // This constructor/destructor does not need a VTT parameter. 272 return 0; 273 } 274 275 const CXXRecordDecl *RD = cast<CXXMethodDecl>(CGF.CurFuncDecl)->getParent(); 276 const CXXRecordDecl *Base = cast<CXXMethodDecl>(GD.getDecl())->getParent(); 277 278 llvm::Value *VTT; 279 280 uint64_t SubVTTIndex; 281 282 // If the record matches the base, this is the complete ctor/dtor 283 // variant calling the base variant in a class with virtual bases. 284 if (RD == Base) { 285 assert(!CodeGenVTables::needsVTTParameter(CGF.CurGD) && 286 "doing no-op VTT offset in base dtor/ctor?"); 287 assert(!ForVirtualBase && "Can't have same class as virtual base!"); 288 SubVTTIndex = 0; 289 } else { 290 const ASTRecordLayout &Layout = 291 CGF.getContext().getASTRecordLayout(RD); 292 uint64_t BaseOffset = ForVirtualBase ? 293 Layout.getVBaseClassOffset(Base) : Layout.getBaseClassOffset(Base); 294 295 SubVTTIndex = 296 CGF.CGM.getVTables().getSubVTTIndex(RD, BaseSubobject(Base, BaseOffset)); 297 assert(SubVTTIndex != 0 && "Sub-VTT index must be greater than zero!"); 298 } 299 300 if (CodeGenVTables::needsVTTParameter(CGF.CurGD)) { 301 // A VTT parameter was passed to the constructor, use it. 302 VTT = CGF.LoadCXXVTT(); 303 VTT = CGF.Builder.CreateConstInBoundsGEP1_64(VTT, SubVTTIndex); 304 } else { 305 // We're the complete constructor, so get the VTT by name. 306 VTT = CGF.CGM.getVTables().getVTT(RD); 307 VTT = CGF.Builder.CreateConstInBoundsGEP2_64(VTT, 0, SubVTTIndex); 308 } 309 310 return VTT; 311 } 312 313 static void EmitBaseInitializer(CodeGenFunction &CGF, 314 const CXXRecordDecl *ClassDecl, 315 CXXBaseOrMemberInitializer *BaseInit, 316 CXXCtorType CtorType) { 317 assert(BaseInit->isBaseInitializer() && 318 "Must have base initializer!"); 319 320 llvm::Value *ThisPtr = CGF.LoadCXXThis(); 321 322 const Type *BaseType = BaseInit->getBaseClass(); 323 CXXRecordDecl *BaseClassDecl = 324 cast<CXXRecordDecl>(BaseType->getAs<RecordType>()->getDecl()); 325 326 bool isBaseVirtual = BaseInit->isBaseVirtual(); 327 328 // The base constructor doesn't construct virtual bases. 329 if (CtorType == Ctor_Base && isBaseVirtual) 330 return; 331 332 // We can pretend to be a complete class because it only matters for 333 // virtual bases, and we only do virtual bases for complete ctors. 334 llvm::Value *V = 335 CGF.GetAddressOfDirectBaseInCompleteClass(ThisPtr, ClassDecl, 336 BaseClassDecl, 337 BaseInit->isBaseVirtual()); 338 339 CGF.EmitAggExpr(BaseInit->getInit(), V, false, false, true); 340 341 if (CGF.Exceptions && !BaseClassDecl->hasTrivialDestructor()) { 342 // FIXME: Is this OK for C++0x delegating constructors? 343 CodeGenFunction::CleanupBlock Cleanup(CGF, EHCleanup); 344 345 CXXDestructorDecl *DD = BaseClassDecl->getDestructor(); 346 CGF.EmitCXXDestructorCall(DD, Dtor_Base, isBaseVirtual, V); 347 } 348 } 349 350 static void EmitAggMemberInitializer(CodeGenFunction &CGF, 351 LValue LHS, 352 llvm::Value *ArrayIndexVar, 353 CXXBaseOrMemberInitializer *MemberInit, 354 QualType T, 355 unsigned Index) { 356 if (Index == MemberInit->getNumArrayIndices()) { 357 CodeGenFunction::RunCleanupsScope Cleanups(CGF); 358 359 llvm::Value *Dest = LHS.getAddress(); 360 if (ArrayIndexVar) { 361 // If we have an array index variable, load it and use it as an offset. 362 // Then, increment the value. 363 llvm::Value *ArrayIndex = CGF.Builder.CreateLoad(ArrayIndexVar); 364 Dest = CGF.Builder.CreateInBoundsGEP(Dest, ArrayIndex, "destaddress"); 365 llvm::Value *Next = llvm::ConstantInt::get(ArrayIndex->getType(), 1); 366 Next = CGF.Builder.CreateAdd(ArrayIndex, Next, "inc"); 367 CGF.Builder.CreateStore(Next, ArrayIndexVar); 368 } 369 370 CGF.EmitAggExpr(MemberInit->getInit(), Dest, 371 LHS.isVolatileQualified(), 372 /*IgnoreResult*/ false, 373 /*IsInitializer*/ true); 374 375 return; 376 } 377 378 const ConstantArrayType *Array = CGF.getContext().getAsConstantArrayType(T); 379 assert(Array && "Array initialization without the array type?"); 380 llvm::Value *IndexVar 381 = CGF.GetAddrOfLocalVar(MemberInit->getArrayIndex(Index)); 382 assert(IndexVar && "Array index variable not loaded"); 383 384 // Initialize this index variable to zero. 385 llvm::Value* Zero 386 = llvm::Constant::getNullValue( 387 CGF.ConvertType(CGF.getContext().getSizeType())); 388 CGF.Builder.CreateStore(Zero, IndexVar); 389 390 // Start the loop with a block that tests the condition. 391 llvm::BasicBlock *CondBlock = CGF.createBasicBlock("for.cond"); 392 llvm::BasicBlock *AfterFor = CGF.createBasicBlock("for.end"); 393 394 CGF.EmitBlock(CondBlock); 395 396 llvm::BasicBlock *ForBody = CGF.createBasicBlock("for.body"); 397 // Generate: if (loop-index < number-of-elements) fall to the loop body, 398 // otherwise, go to the block after the for-loop. 399 uint64_t NumElements = Array->getSize().getZExtValue(); 400 llvm::Value *Counter = CGF.Builder.CreateLoad(IndexVar); 401 llvm::Value *NumElementsPtr = 402 llvm::ConstantInt::get(Counter->getType(), NumElements); 403 llvm::Value *IsLess = CGF.Builder.CreateICmpULT(Counter, NumElementsPtr, 404 "isless"); 405 406 // If the condition is true, execute the body. 407 CGF.Builder.CreateCondBr(IsLess, ForBody, AfterFor); 408 409 CGF.EmitBlock(ForBody); 410 llvm::BasicBlock *ContinueBlock = CGF.createBasicBlock("for.inc"); 411 412 { 413 CodeGenFunction::RunCleanupsScope Cleanups(CGF); 414 415 // Inside the loop body recurse to emit the inner loop or, eventually, the 416 // constructor call. 417 EmitAggMemberInitializer(CGF, LHS, ArrayIndexVar, MemberInit, 418 Array->getElementType(), Index + 1); 419 } 420 421 CGF.EmitBlock(ContinueBlock); 422 423 // Emit the increment of the loop counter. 424 llvm::Value *NextVal = llvm::ConstantInt::get(Counter->getType(), 1); 425 Counter = CGF.Builder.CreateLoad(IndexVar); 426 NextVal = CGF.Builder.CreateAdd(Counter, NextVal, "inc"); 427 CGF.Builder.CreateStore(NextVal, IndexVar); 428 429 // Finally, branch back up to the condition for the next iteration. 430 CGF.EmitBranch(CondBlock); 431 432 // Emit the fall-through block. 433 CGF.EmitBlock(AfterFor, true); 434 } 435 436 static void EmitMemberInitializer(CodeGenFunction &CGF, 437 const CXXRecordDecl *ClassDecl, 438 CXXBaseOrMemberInitializer *MemberInit, 439 const CXXConstructorDecl *Constructor, 440 FunctionArgList &Args) { 441 assert(MemberInit->isMemberInitializer() && 442 "Must have member initializer!"); 443 444 // non-static data member initializers. 445 FieldDecl *Field = MemberInit->getMember(); 446 QualType FieldType = CGF.getContext().getCanonicalType(Field->getType()); 447 448 llvm::Value *ThisPtr = CGF.LoadCXXThis(); 449 LValue LHS; 450 451 // If we are initializing an anonymous union field, drill down to the field. 452 if (MemberInit->getAnonUnionMember()) { 453 Field = MemberInit->getAnonUnionMember(); 454 LHS = CGF.EmitLValueForAnonRecordField(ThisPtr, Field, 0); 455 FieldType = Field->getType(); 456 } else { 457 LHS = CGF.EmitLValueForFieldInitialization(ThisPtr, Field, 0); 458 } 459 460 // FIXME: If there's no initializer and the CXXBaseOrMemberInitializer 461 // was implicitly generated, we shouldn't be zeroing memory. 462 RValue RHS; 463 if (FieldType->isReferenceType()) { 464 RHS = CGF.EmitReferenceBindingToExpr(MemberInit->getInit(), Field); 465 CGF.EmitStoreThroughLValue(RHS, LHS, FieldType); 466 } else if (FieldType->isArrayType() && !MemberInit->getInit()) { 467 CGF.EmitNullInitialization(LHS.getAddress(), Field->getType()); 468 } else if (!CGF.hasAggregateLLVMType(Field->getType())) { 469 RHS = RValue::get(CGF.EmitScalarExpr(MemberInit->getInit())); 470 CGF.EmitStoreThroughLValue(RHS, LHS, FieldType); 471 } else if (MemberInit->getInit()->getType()->isAnyComplexType()) { 472 CGF.EmitComplexExprIntoAddr(MemberInit->getInit(), LHS.getAddress(), 473 LHS.isVolatileQualified()); 474 } else { 475 llvm::Value *ArrayIndexVar = 0; 476 const ConstantArrayType *Array 477 = CGF.getContext().getAsConstantArrayType(FieldType); 478 if (Array && Constructor->isImplicit() && 479 Constructor->isCopyConstructor()) { 480 const llvm::Type *SizeTy 481 = CGF.ConvertType(CGF.getContext().getSizeType()); 482 483 // The LHS is a pointer to the first object we'll be constructing, as 484 // a flat array. 485 QualType BaseElementTy = CGF.getContext().getBaseElementType(Array); 486 const llvm::Type *BasePtr = CGF.ConvertType(BaseElementTy); 487 BasePtr = llvm::PointerType::getUnqual(BasePtr); 488 llvm::Value *BaseAddrPtr = CGF.Builder.CreateBitCast(LHS.getAddress(), 489 BasePtr); 490 LHS = LValue::MakeAddr(BaseAddrPtr, CGF.MakeQualifiers(BaseElementTy)); 491 492 // Create an array index that will be used to walk over all of the 493 // objects we're constructing. 494 ArrayIndexVar = CGF.CreateTempAlloca(SizeTy, "object.index"); 495 llvm::Value *Zero = llvm::Constant::getNullValue(SizeTy); 496 CGF.Builder.CreateStore(Zero, ArrayIndexVar); 497 498 // If we are copying an array of scalars or classes with trivial copy 499 // constructors, perform a single aggregate copy. 500 const RecordType *Record = BaseElementTy->getAs<RecordType>(); 501 if (!Record || 502 cast<CXXRecordDecl>(Record->getDecl())->hasTrivialCopyConstructor()) { 503 // Find the source pointer. We knows it's the last argument because 504 // we know we're in a copy constructor. 505 unsigned SrcArgIndex = Args.size() - 1; 506 llvm::Value *SrcPtr 507 = CGF.Builder.CreateLoad( 508 CGF.GetAddrOfLocalVar(Args[SrcArgIndex].first)); 509 LValue Src = CGF.EmitLValueForFieldInitialization(SrcPtr, Field, 0); 510 511 // Copy the aggregate. 512 CGF.EmitAggregateCopy(LHS.getAddress(), Src.getAddress(), FieldType, 513 LHS.isVolatileQualified()); 514 return; 515 } 516 517 // Emit the block variables for the array indices, if any. 518 for (unsigned I = 0, N = MemberInit->getNumArrayIndices(); I != N; ++I) 519 CGF.EmitLocalBlockVarDecl(*MemberInit->getArrayIndex(I)); 520 } 521 522 EmitAggMemberInitializer(CGF, LHS, ArrayIndexVar, MemberInit, FieldType, 0); 523 524 if (!CGF.Exceptions) 525 return; 526 527 // FIXME: If we have an array of classes w/ non-trivial destructors, 528 // we need to destroy in reverse order of construction along the exception 529 // path. 530 const RecordType *RT = FieldType->getAs<RecordType>(); 531 if (!RT) 532 return; 533 534 CXXRecordDecl *RD = cast<CXXRecordDecl>(RT->getDecl()); 535 if (!RD->hasTrivialDestructor()) { 536 // FIXME: Is this OK for C++0x delegating constructors? 537 CodeGenFunction::CleanupBlock Cleanup(CGF, EHCleanup); 538 539 llvm::Value *ThisPtr = CGF.LoadCXXThis(); 540 LValue LHS = CGF.EmitLValueForField(ThisPtr, Field, 0); 541 542 CXXDestructorDecl *DD = RD->getDestructor(); 543 CGF.EmitCXXDestructorCall(DD, Dtor_Complete, /*ForVirtualBase=*/false, 544 LHS.getAddress()); 545 } 546 } 547 } 548 549 /// Checks whether the given constructor is a valid subject for the 550 /// complete-to-base constructor delegation optimization, i.e. 551 /// emitting the complete constructor as a simple call to the base 552 /// constructor. 553 static bool IsConstructorDelegationValid(const CXXConstructorDecl *Ctor) { 554 555 // Currently we disable the optimization for classes with virtual 556 // bases because (1) the addresses of parameter variables need to be 557 // consistent across all initializers but (2) the delegate function 558 // call necessarily creates a second copy of the parameter variable. 559 // 560 // The limiting example (purely theoretical AFAIK): 561 // struct A { A(int &c) { c++; } }; 562 // struct B : virtual A { 563 // B(int count) : A(count) { printf("%d\n", count); } 564 // }; 565 // ...although even this example could in principle be emitted as a 566 // delegation since the address of the parameter doesn't escape. 567 if (Ctor->getParent()->getNumVBases()) { 568 // TODO: white-list trivial vbase initializers. This case wouldn't 569 // be subject to the restrictions below. 570 571 // TODO: white-list cases where: 572 // - there are no non-reference parameters to the constructor 573 // - the initializers don't access any non-reference parameters 574 // - the initializers don't take the address of non-reference 575 // parameters 576 // - etc. 577 // If we ever add any of the above cases, remember that: 578 // - function-try-blocks will always blacklist this optimization 579 // - we need to perform the constructor prologue and cleanup in 580 // EmitConstructorBody. 581 582 return false; 583 } 584 585 // We also disable the optimization for variadic functions because 586 // it's impossible to "re-pass" varargs. 587 if (Ctor->getType()->getAs<FunctionProtoType>()->isVariadic()) 588 return false; 589 590 return true; 591 } 592 593 /// EmitConstructorBody - Emits the body of the current constructor. 594 void CodeGenFunction::EmitConstructorBody(FunctionArgList &Args) { 595 const CXXConstructorDecl *Ctor = cast<CXXConstructorDecl>(CurGD.getDecl()); 596 CXXCtorType CtorType = CurGD.getCtorType(); 597 598 // Before we go any further, try the complete->base constructor 599 // delegation optimization. 600 if (CtorType == Ctor_Complete && IsConstructorDelegationValid(Ctor)) { 601 EmitDelegateCXXConstructorCall(Ctor, Ctor_Base, Args); 602 return; 603 } 604 605 Stmt *Body = Ctor->getBody(); 606 607 // Enter the function-try-block before the constructor prologue if 608 // applicable. 609 bool IsTryBody = (Body && isa<CXXTryStmt>(Body)); 610 if (IsTryBody) 611 EnterCXXTryStmt(*cast<CXXTryStmt>(Body), true); 612 613 EHScopeStack::stable_iterator CleanupDepth = EHStack.stable_begin(); 614 615 // Emit the constructor prologue, i.e. the base and member 616 // initializers. 617 EmitCtorPrologue(Ctor, CtorType, Args); 618 619 // Emit the body of the statement. 620 if (IsTryBody) 621 EmitStmt(cast<CXXTryStmt>(Body)->getTryBlock()); 622 else if (Body) 623 EmitStmt(Body); 624 625 // Emit any cleanup blocks associated with the member or base 626 // initializers, which includes (along the exceptional path) the 627 // destructors for those members and bases that were fully 628 // constructed. 629 PopCleanupBlocks(CleanupDepth); 630 631 if (IsTryBody) 632 ExitCXXTryStmt(*cast<CXXTryStmt>(Body), true); 633 } 634 635 /// EmitCtorPrologue - This routine generates necessary code to initialize 636 /// base classes and non-static data members belonging to this constructor. 637 void CodeGenFunction::EmitCtorPrologue(const CXXConstructorDecl *CD, 638 CXXCtorType CtorType, 639 FunctionArgList &Args) { 640 const CXXRecordDecl *ClassDecl = CD->getParent(); 641 642 llvm::SmallVector<CXXBaseOrMemberInitializer *, 8> MemberInitializers; 643 644 for (CXXConstructorDecl::init_const_iterator B = CD->init_begin(), 645 E = CD->init_end(); 646 B != E; ++B) { 647 CXXBaseOrMemberInitializer *Member = (*B); 648 649 if (Member->isBaseInitializer()) 650 EmitBaseInitializer(*this, ClassDecl, Member, CtorType); 651 else 652 MemberInitializers.push_back(Member); 653 } 654 655 InitializeVTablePointers(ClassDecl); 656 657 for (unsigned I = 0, E = MemberInitializers.size(); I != E; ++I) 658 EmitMemberInitializer(*this, ClassDecl, MemberInitializers[I], CD, Args); 659 } 660 661 /// EmitDestructorBody - Emits the body of the current destructor. 662 void CodeGenFunction::EmitDestructorBody(FunctionArgList &Args) { 663 const CXXDestructorDecl *Dtor = cast<CXXDestructorDecl>(CurGD.getDecl()); 664 CXXDtorType DtorType = CurGD.getDtorType(); 665 666 Stmt *Body = Dtor->getBody(); 667 668 // If the body is a function-try-block, enter the try before 669 // anything else --- unless we're in a deleting destructor, in which 670 // case we're just going to call the complete destructor and then 671 // call operator delete() on the way out. 672 bool isTryBody = (DtorType != Dtor_Deleting && 673 Body && isa<CXXTryStmt>(Body)); 674 if (isTryBody) 675 EnterCXXTryStmt(*cast<CXXTryStmt>(Body), true); 676 677 // Emit the destructor epilogue now. If this is a complete 678 // destructor with a function-try-block, perform the base epilogue 679 // as well. 680 // 681 // FIXME: This isn't really right, because an exception in the 682 // non-EH epilogue should jump to the appropriate place in the 683 // EH epilogue. 684 { 685 CleanupBlock Cleanup(*this, NormalCleanup); 686 687 if (isTryBody && DtorType == Dtor_Complete) 688 EmitDtorEpilogue(Dtor, Dtor_Base); 689 EmitDtorEpilogue(Dtor, DtorType); 690 691 if (Exceptions) { 692 Cleanup.beginEHCleanup(); 693 694 if (isTryBody && DtorType == Dtor_Complete) 695 EmitDtorEpilogue(Dtor, Dtor_Base); 696 EmitDtorEpilogue(Dtor, DtorType); 697 } 698 } 699 700 bool SkipBody = false; // should get jump-threaded 701 702 // If this is the deleting variant, just invoke the complete 703 // variant, then call the appropriate operator delete() on the way 704 // out. 705 if (DtorType == Dtor_Deleting) { 706 EmitCXXDestructorCall(Dtor, Dtor_Complete, /*ForVirtualBase=*/false, 707 LoadCXXThis()); 708 SkipBody = true; 709 710 // If this is the complete variant, just invoke the base variant; 711 // the epilogue will destruct the virtual bases. But we can't do 712 // this optimization if the body is a function-try-block, because 713 // we'd introduce *two* handler blocks. 714 } else if (!isTryBody && DtorType == Dtor_Complete) { 715 EmitCXXDestructorCall(Dtor, Dtor_Base, /*ForVirtualBase=*/false, 716 LoadCXXThis()); 717 SkipBody = true; 718 719 // Otherwise, we're in the base variant, so we need to ensure the 720 // vtable ptrs are right before emitting the body. 721 } else { 722 InitializeVTablePointers(Dtor->getParent()); 723 } 724 725 // Emit the body of the statement. 726 if (SkipBody) 727 (void) 0; 728 else if (isTryBody) 729 EmitStmt(cast<CXXTryStmt>(Body)->getTryBlock()); 730 else if (Body) 731 EmitStmt(Body); 732 else { 733 assert(Dtor->isImplicit() && "bodyless dtor not implicit"); 734 // nothing to do besides what's in the epilogue 735 } 736 737 // We're done with the epilogue cleanup. 738 PopCleanupBlock(); 739 740 // Exit the try if applicable. 741 if (isTryBody) 742 ExitCXXTryStmt(*cast<CXXTryStmt>(Body), true); 743 } 744 745 /// EmitDtorEpilogue - Emit all code that comes at the end of class's 746 /// destructor. This is to call destructors on members and base classes 747 /// in reverse order of their construction. 748 void CodeGenFunction::EmitDtorEpilogue(const CXXDestructorDecl *DD, 749 CXXDtorType DtorType) { 750 assert(!DD->isTrivial() && 751 "Should not emit dtor epilogue for trivial dtor!"); 752 753 const CXXRecordDecl *ClassDecl = DD->getParent(); 754 755 // In a deleting destructor, we've already called the complete 756 // destructor as a subroutine, so we just have to delete the 757 // appropriate value. 758 if (DtorType == Dtor_Deleting) { 759 assert(DD->getOperatorDelete() && 760 "operator delete missing - EmitDtorEpilogue"); 761 EmitDeleteCall(DD->getOperatorDelete(), LoadCXXThis(), 762 getContext().getTagDeclType(ClassDecl)); 763 return; 764 } 765 766 // For complete destructors, we've already called the base 767 // destructor (in GenerateBody), so we just need to destruct all the 768 // virtual bases. 769 if (DtorType == Dtor_Complete) { 770 // Handle virtual bases. 771 for (CXXRecordDecl::reverse_base_class_const_iterator I = 772 ClassDecl->vbases_rbegin(), E = ClassDecl->vbases_rend(); 773 I != E; ++I) { 774 const CXXBaseSpecifier &Base = *I; 775 CXXRecordDecl *BaseClassDecl 776 = cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl()); 777 778 // Ignore trivial destructors. 779 if (BaseClassDecl->hasTrivialDestructor()) 780 continue; 781 const CXXDestructorDecl *D = BaseClassDecl->getDestructor(); 782 llvm::Value *V = 783 GetAddressOfDirectBaseInCompleteClass(LoadCXXThis(), 784 ClassDecl, BaseClassDecl, 785 /*BaseIsVirtual=*/true); 786 EmitCXXDestructorCall(D, Dtor_Base, /*ForVirtualBase=*/true, V); 787 } 788 return; 789 } 790 791 assert(DtorType == Dtor_Base); 792 793 // Collect the fields. 794 llvm::SmallVector<const FieldDecl *, 16> FieldDecls; 795 for (CXXRecordDecl::field_iterator I = ClassDecl->field_begin(), 796 E = ClassDecl->field_end(); I != E; ++I) { 797 const FieldDecl *Field = *I; 798 799 QualType FieldType = getContext().getCanonicalType(Field->getType()); 800 FieldType = getContext().getBaseElementType(FieldType); 801 802 const RecordType *RT = FieldType->getAs<RecordType>(); 803 if (!RT) 804 continue; 805 806 CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl()); 807 if (FieldClassDecl->hasTrivialDestructor()) 808 continue; 809 810 FieldDecls.push_back(Field); 811 } 812 813 // Now destroy the fields. 814 for (size_t i = FieldDecls.size(); i > 0; --i) { 815 const FieldDecl *Field = FieldDecls[i - 1]; 816 817 QualType FieldType = Field->getType(); 818 const ConstantArrayType *Array = 819 getContext().getAsConstantArrayType(FieldType); 820 if (Array) 821 FieldType = getContext().getBaseElementType(FieldType); 822 823 const RecordType *RT = FieldType->getAs<RecordType>(); 824 CXXRecordDecl *FieldClassDecl = cast<CXXRecordDecl>(RT->getDecl()); 825 826 llvm::Value *ThisPtr = LoadCXXThis(); 827 828 LValue LHS = EmitLValueForField(ThisPtr, Field, 829 // FIXME: Qualifiers? 830 /*CVRQualifiers=*/0); 831 if (Array) { 832 const llvm::Type *BasePtr = ConvertType(FieldType); 833 BasePtr = llvm::PointerType::getUnqual(BasePtr); 834 llvm::Value *BaseAddrPtr = 835 Builder.CreateBitCast(LHS.getAddress(), BasePtr); 836 EmitCXXAggrDestructorCall(FieldClassDecl->getDestructor(), 837 Array, BaseAddrPtr); 838 } else 839 EmitCXXDestructorCall(FieldClassDecl->getDestructor(), 840 Dtor_Complete, /*ForVirtualBase=*/false, 841 LHS.getAddress()); 842 } 843 844 // Destroy non-virtual bases. 845 for (CXXRecordDecl::reverse_base_class_const_iterator I = 846 ClassDecl->bases_rbegin(), E = ClassDecl->bases_rend(); I != E; ++I) { 847 const CXXBaseSpecifier &Base = *I; 848 849 // Ignore virtual bases. 850 if (Base.isVirtual()) 851 continue; 852 853 CXXRecordDecl *BaseClassDecl 854 = cast<CXXRecordDecl>(Base.getType()->getAs<RecordType>()->getDecl()); 855 856 // Ignore trivial destructors. 857 if (BaseClassDecl->hasTrivialDestructor()) 858 continue; 859 860 const CXXDestructorDecl *D = BaseClassDecl->getDestructor(); 861 llvm::Value *V = 862 GetAddressOfDirectBaseInCompleteClass(LoadCXXThis(), ClassDecl, 863 BaseClassDecl, 864 /*BaseIsVirtual=*/false); 865 866 EmitCXXDestructorCall(D, Dtor_Base, /*ForVirtualBase=*/false, V); 867 } 868 } 869 870 /// EmitCXXAggrConstructorCall - This routine essentially creates a (nested) 871 /// for-loop to call the default constructor on individual members of the 872 /// array. 873 /// 'D' is the default constructor for elements of the array, 'ArrayTy' is the 874 /// array type and 'ArrayPtr' points to the beginning fo the array. 875 /// It is assumed that all relevant checks have been made by the caller. 876 void 877 CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D, 878 const ConstantArrayType *ArrayTy, 879 llvm::Value *ArrayPtr, 880 CallExpr::const_arg_iterator ArgBeg, 881 CallExpr::const_arg_iterator ArgEnd) { 882 883 const llvm::Type *SizeTy = ConvertType(getContext().getSizeType()); 884 llvm::Value * NumElements = 885 llvm::ConstantInt::get(SizeTy, 886 getContext().getConstantArrayElementCount(ArrayTy)); 887 888 EmitCXXAggrConstructorCall(D, NumElements, ArrayPtr, ArgBeg, ArgEnd); 889 } 890 891 void 892 CodeGenFunction::EmitCXXAggrConstructorCall(const CXXConstructorDecl *D, 893 llvm::Value *NumElements, 894 llvm::Value *ArrayPtr, 895 CallExpr::const_arg_iterator ArgBeg, 896 CallExpr::const_arg_iterator ArgEnd) { 897 const llvm::Type *SizeTy = ConvertType(getContext().getSizeType()); 898 899 // Create a temporary for the loop index and initialize it with 0. 900 llvm::Value *IndexPtr = CreateTempAlloca(SizeTy, "loop.index"); 901 llvm::Value *Zero = llvm::Constant::getNullValue(SizeTy); 902 Builder.CreateStore(Zero, IndexPtr); 903 904 // Start the loop with a block that tests the condition. 905 llvm::BasicBlock *CondBlock = createBasicBlock("for.cond"); 906 llvm::BasicBlock *AfterFor = createBasicBlock("for.end"); 907 908 EmitBlock(CondBlock); 909 910 llvm::BasicBlock *ForBody = createBasicBlock("for.body"); 911 912 // Generate: if (loop-index < number-of-elements fall to the loop body, 913 // otherwise, go to the block after the for-loop. 914 llvm::Value *Counter = Builder.CreateLoad(IndexPtr); 915 llvm::Value *IsLess = Builder.CreateICmpULT(Counter, NumElements, "isless"); 916 // If the condition is true, execute the body. 917 Builder.CreateCondBr(IsLess, ForBody, AfterFor); 918 919 EmitBlock(ForBody); 920 921 llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc"); 922 // Inside the loop body, emit the constructor call on the array element. 923 Counter = Builder.CreateLoad(IndexPtr); 924 llvm::Value *Address = Builder.CreateInBoundsGEP(ArrayPtr, Counter, 925 "arrayidx"); 926 927 // C++ [class.temporary]p4: 928 // There are two contexts in which temporaries are destroyed at a different 929 // point than the end of the full-expression. The first context is when a 930 // default constructor is called to initialize an element of an array. 931 // If the constructor has one or more default arguments, the destruction of 932 // every temporary created in a default argument expression is sequenced 933 // before the construction of the next array element, if any. 934 935 // Keep track of the current number of live temporaries. 936 { 937 RunCleanupsScope Scope(*this); 938 939 EmitCXXConstructorCall(D, Ctor_Complete, /*ForVirtualBase=*/false, Address, 940 ArgBeg, ArgEnd); 941 } 942 943 EmitBlock(ContinueBlock); 944 945 // Emit the increment of the loop counter. 946 llvm::Value *NextVal = llvm::ConstantInt::get(SizeTy, 1); 947 Counter = Builder.CreateLoad(IndexPtr); 948 NextVal = Builder.CreateAdd(Counter, NextVal, "inc"); 949 Builder.CreateStore(NextVal, IndexPtr); 950 951 // Finally, branch back up to the condition for the next iteration. 952 EmitBranch(CondBlock); 953 954 // Emit the fall-through block. 955 EmitBlock(AfterFor, true); 956 } 957 958 /// EmitCXXAggrDestructorCall - calls the default destructor on array 959 /// elements in reverse order of construction. 960 void 961 CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D, 962 const ArrayType *Array, 963 llvm::Value *This) { 964 const ConstantArrayType *CA = dyn_cast<ConstantArrayType>(Array); 965 assert(CA && "Do we support VLA for destruction ?"); 966 uint64_t ElementCount = getContext().getConstantArrayElementCount(CA); 967 968 const llvm::Type *SizeLTy = ConvertType(getContext().getSizeType()); 969 llvm::Value* ElementCountPtr = llvm::ConstantInt::get(SizeLTy, ElementCount); 970 EmitCXXAggrDestructorCall(D, ElementCountPtr, This); 971 } 972 973 /// EmitCXXAggrDestructorCall - calls the default destructor on array 974 /// elements in reverse order of construction. 975 void 976 CodeGenFunction::EmitCXXAggrDestructorCall(const CXXDestructorDecl *D, 977 llvm::Value *UpperCount, 978 llvm::Value *This) { 979 const llvm::Type *SizeLTy = ConvertType(getContext().getSizeType()); 980 llvm::Value *One = llvm::ConstantInt::get(SizeLTy, 1); 981 982 // Create a temporary for the loop index and initialize it with count of 983 // array elements. 984 llvm::Value *IndexPtr = CreateTempAlloca(SizeLTy, "loop.index"); 985 986 // Store the number of elements in the index pointer. 987 Builder.CreateStore(UpperCount, IndexPtr); 988 989 // Start the loop with a block that tests the condition. 990 llvm::BasicBlock *CondBlock = createBasicBlock("for.cond"); 991 llvm::BasicBlock *AfterFor = createBasicBlock("for.end"); 992 993 EmitBlock(CondBlock); 994 995 llvm::BasicBlock *ForBody = createBasicBlock("for.body"); 996 997 // Generate: if (loop-index != 0 fall to the loop body, 998 // otherwise, go to the block after the for-loop. 999 llvm::Value* zeroConstant = 1000 llvm::Constant::getNullValue(SizeLTy); 1001 llvm::Value *Counter = Builder.CreateLoad(IndexPtr); 1002 llvm::Value *IsNE = Builder.CreateICmpNE(Counter, zeroConstant, 1003 "isne"); 1004 // If the condition is true, execute the body. 1005 Builder.CreateCondBr(IsNE, ForBody, AfterFor); 1006 1007 EmitBlock(ForBody); 1008 1009 llvm::BasicBlock *ContinueBlock = createBasicBlock("for.inc"); 1010 // Inside the loop body, emit the constructor call on the array element. 1011 Counter = Builder.CreateLoad(IndexPtr); 1012 Counter = Builder.CreateSub(Counter, One); 1013 llvm::Value *Address = Builder.CreateInBoundsGEP(This, Counter, "arrayidx"); 1014 EmitCXXDestructorCall(D, Dtor_Complete, /*ForVirtualBase=*/false, Address); 1015 1016 EmitBlock(ContinueBlock); 1017 1018 // Emit the decrement of the loop counter. 1019 Counter = Builder.CreateLoad(IndexPtr); 1020 Counter = Builder.CreateSub(Counter, One, "dec"); 1021 Builder.CreateStore(Counter, IndexPtr); 1022 1023 // Finally, branch back up to the condition for the next iteration. 1024 EmitBranch(CondBlock); 1025 1026 // Emit the fall-through block. 1027 EmitBlock(AfterFor, true); 1028 } 1029 1030 void 1031 CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D, 1032 CXXCtorType Type, bool ForVirtualBase, 1033 llvm::Value *This, 1034 CallExpr::const_arg_iterator ArgBeg, 1035 CallExpr::const_arg_iterator ArgEnd) { 1036 if (D->isTrivial()) { 1037 if (ArgBeg == ArgEnd) { 1038 // Trivial default constructor, no codegen required. 1039 assert(D->isDefaultConstructor() && 1040 "trivial 0-arg ctor not a default ctor"); 1041 return; 1042 } 1043 1044 assert(ArgBeg + 1 == ArgEnd && "unexpected argcount for trivial ctor"); 1045 assert(D->isCopyConstructor() && "trivial 1-arg ctor not a copy ctor"); 1046 1047 const Expr *E = (*ArgBeg); 1048 QualType Ty = E->getType(); 1049 llvm::Value *Src = EmitLValue(E).getAddress(); 1050 EmitAggregateCopy(This, Src, Ty); 1051 return; 1052 } 1053 1054 llvm::Value *VTT = GetVTTParameter(*this, GlobalDecl(D, Type), ForVirtualBase); 1055 llvm::Value *Callee = CGM.GetAddrOfCXXConstructor(D, Type); 1056 1057 EmitCXXMemberCall(D, Callee, ReturnValueSlot(), This, VTT, ArgBeg, ArgEnd); 1058 } 1059 1060 void 1061 CodeGenFunction::EmitDelegateCXXConstructorCall(const CXXConstructorDecl *Ctor, 1062 CXXCtorType CtorType, 1063 const FunctionArgList &Args) { 1064 CallArgList DelegateArgs; 1065 1066 FunctionArgList::const_iterator I = Args.begin(), E = Args.end(); 1067 assert(I != E && "no parameters to constructor"); 1068 1069 // this 1070 DelegateArgs.push_back(std::make_pair(RValue::get(LoadCXXThis()), 1071 I->second)); 1072 ++I; 1073 1074 // vtt 1075 if (llvm::Value *VTT = GetVTTParameter(*this, GlobalDecl(Ctor, CtorType), 1076 /*ForVirtualBase=*/false)) { 1077 QualType VoidPP = getContext().getPointerType(getContext().VoidPtrTy); 1078 DelegateArgs.push_back(std::make_pair(RValue::get(VTT), VoidPP)); 1079 1080 if (CodeGenVTables::needsVTTParameter(CurGD)) { 1081 assert(I != E && "cannot skip vtt parameter, already done with args"); 1082 assert(I->second == VoidPP && "skipping parameter not of vtt type"); 1083 ++I; 1084 } 1085 } 1086 1087 // Explicit arguments. 1088 for (; I != E; ++I) { 1089 const VarDecl *Param = I->first; 1090 QualType ArgType = Param->getType(); // because we're passing it to itself 1091 RValue Arg = EmitDelegateCallArg(Param); 1092 1093 DelegateArgs.push_back(std::make_pair(Arg, ArgType)); 1094 } 1095 1096 EmitCall(CGM.getTypes().getFunctionInfo(Ctor, CtorType), 1097 CGM.GetAddrOfCXXConstructor(Ctor, CtorType), 1098 ReturnValueSlot(), DelegateArgs, Ctor); 1099 } 1100 1101 void CodeGenFunction::EmitCXXDestructorCall(const CXXDestructorDecl *DD, 1102 CXXDtorType Type, 1103 bool ForVirtualBase, 1104 llvm::Value *This) { 1105 llvm::Value *VTT = GetVTTParameter(*this, GlobalDecl(DD, Type), 1106 ForVirtualBase); 1107 llvm::Value *Callee = CGM.GetAddrOfCXXDestructor(DD, Type); 1108 1109 EmitCXXMemberCall(DD, Callee, ReturnValueSlot(), This, VTT, 0, 0); 1110 } 1111 1112 void CodeGenFunction::PushDestructorCleanup(QualType T, llvm::Value *Addr) { 1113 CXXRecordDecl *ClassDecl = T->getAsCXXRecordDecl(); 1114 if (!ClassDecl) return; 1115 if (ClassDecl->hasTrivialDestructor()) return; 1116 1117 const CXXDestructorDecl *D = ClassDecl->getDestructor(); 1118 1119 CleanupBlock Scope(*this, NormalCleanup); 1120 1121 EmitCXXDestructorCall(D, Dtor_Complete, /*ForVirtualBase=*/false, Addr); 1122 1123 if (Exceptions) { 1124 Scope.beginEHCleanup(); 1125 EmitCXXDestructorCall(D, Dtor_Complete, /*ForVirtualBase=*/false, Addr); 1126 } 1127 } 1128 1129 llvm::Value * 1130 CodeGenFunction::GetVirtualBaseClassOffset(llvm::Value *This, 1131 const CXXRecordDecl *ClassDecl, 1132 const CXXRecordDecl *BaseClassDecl) { 1133 const llvm::Type *Int8PtrTy = 1134 llvm::Type::getInt8Ty(VMContext)->getPointerTo(); 1135 1136 llvm::Value *VTablePtr = Builder.CreateBitCast(This, 1137 Int8PtrTy->getPointerTo()); 1138 VTablePtr = Builder.CreateLoad(VTablePtr, "vtable"); 1139 1140 int64_t VBaseOffsetOffset = 1141 CGM.getVTables().getVirtualBaseOffsetOffset(ClassDecl, BaseClassDecl); 1142 1143 llvm::Value *VBaseOffsetPtr = 1144 Builder.CreateConstGEP1_64(VTablePtr, VBaseOffsetOffset, "vbase.offset.ptr"); 1145 const llvm::Type *PtrDiffTy = 1146 ConvertType(getContext().getPointerDiffType()); 1147 1148 VBaseOffsetPtr = Builder.CreateBitCast(VBaseOffsetPtr, 1149 PtrDiffTy->getPointerTo()); 1150 1151 llvm::Value *VBaseOffset = Builder.CreateLoad(VBaseOffsetPtr, "vbase.offset"); 1152 1153 return VBaseOffset; 1154 } 1155 1156 void 1157 CodeGenFunction::InitializeVTablePointer(BaseSubobject Base, 1158 const CXXRecordDecl *NearestVBase, 1159 uint64_t OffsetFromNearestVBase, 1160 llvm::Constant *VTable, 1161 const CXXRecordDecl *VTableClass) { 1162 const CXXRecordDecl *RD = Base.getBase(); 1163 1164 // Compute the address point. 1165 llvm::Value *VTableAddressPoint; 1166 1167 // Check if we need to use a vtable from the VTT. 1168 if (CodeGenVTables::needsVTTParameter(CurGD) && 1169 (RD->getNumVBases() || NearestVBase)) { 1170 // Get the secondary vpointer index. 1171 uint64_t VirtualPointerIndex = 1172 CGM.getVTables().getSecondaryVirtualPointerIndex(VTableClass, Base); 1173 1174 /// Load the VTT. 1175 llvm::Value *VTT = LoadCXXVTT(); 1176 if (VirtualPointerIndex) 1177 VTT = Builder.CreateConstInBoundsGEP1_64(VTT, VirtualPointerIndex); 1178 1179 // And load the address point from the VTT. 1180 VTableAddressPoint = Builder.CreateLoad(VTT); 1181 } else { 1182 uint64_t AddressPoint = CGM.getVTables().getAddressPoint(Base, VTableClass); 1183 VTableAddressPoint = 1184 Builder.CreateConstInBoundsGEP2_64(VTable, 0, AddressPoint); 1185 } 1186 1187 // Compute where to store the address point. 1188 llvm::Value *VirtualOffset = 0; 1189 uint64_t NonVirtualOffset = 0; 1190 1191 if (CodeGenVTables::needsVTTParameter(CurGD) && NearestVBase) { 1192 // We need to use the virtual base offset offset because the virtual base 1193 // might have a different offset in the most derived class. 1194 VirtualOffset = GetVirtualBaseClassOffset(LoadCXXThis(), VTableClass, 1195 NearestVBase); 1196 NonVirtualOffset = OffsetFromNearestVBase / 8; 1197 } else { 1198 // We can just use the base offset in the complete class. 1199 NonVirtualOffset = Base.getBaseOffset() / 8; 1200 } 1201 1202 // Apply the offsets. 1203 llvm::Value *VTableField = LoadCXXThis(); 1204 1205 if (NonVirtualOffset || VirtualOffset) 1206 VTableField = ApplyNonVirtualAndVirtualOffset(*this, VTableField, 1207 NonVirtualOffset, 1208 VirtualOffset); 1209 1210 // Finally, store the address point. 1211 const llvm::Type *AddressPointPtrTy = 1212 VTableAddressPoint->getType()->getPointerTo(); 1213 VTableField = Builder.CreateBitCast(VTableField, AddressPointPtrTy); 1214 Builder.CreateStore(VTableAddressPoint, VTableField); 1215 } 1216 1217 void 1218 CodeGenFunction::InitializeVTablePointers(BaseSubobject Base, 1219 const CXXRecordDecl *NearestVBase, 1220 uint64_t OffsetFromNearestVBase, 1221 bool BaseIsNonVirtualPrimaryBase, 1222 llvm::Constant *VTable, 1223 const CXXRecordDecl *VTableClass, 1224 VisitedVirtualBasesSetTy& VBases) { 1225 // If this base is a non-virtual primary base the address point has already 1226 // been set. 1227 if (!BaseIsNonVirtualPrimaryBase) { 1228 // Initialize the vtable pointer for this base. 1229 InitializeVTablePointer(Base, NearestVBase, OffsetFromNearestVBase, 1230 VTable, VTableClass); 1231 } 1232 1233 const CXXRecordDecl *RD = Base.getBase(); 1234 1235 // Traverse bases. 1236 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 1237 E = RD->bases_end(); I != E; ++I) { 1238 CXXRecordDecl *BaseDecl 1239 = cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 1240 1241 // Ignore classes without a vtable. 1242 if (!BaseDecl->isDynamicClass()) 1243 continue; 1244 1245 uint64_t BaseOffset; 1246 uint64_t BaseOffsetFromNearestVBase; 1247 bool BaseDeclIsNonVirtualPrimaryBase; 1248 1249 if (I->isVirtual()) { 1250 // Check if we've visited this virtual base before. 1251 if (!VBases.insert(BaseDecl)) 1252 continue; 1253 1254 const ASTRecordLayout &Layout = 1255 getContext().getASTRecordLayout(VTableClass); 1256 1257 BaseOffset = Layout.getVBaseClassOffset(BaseDecl); 1258 BaseOffsetFromNearestVBase = 0; 1259 BaseDeclIsNonVirtualPrimaryBase = false; 1260 } else { 1261 const ASTRecordLayout &Layout = getContext().getASTRecordLayout(RD); 1262 1263 BaseOffset = Base.getBaseOffset() + Layout.getBaseClassOffset(BaseDecl); 1264 BaseOffsetFromNearestVBase = 1265 OffsetFromNearestVBase + Layout.getBaseClassOffset(BaseDecl); 1266 BaseDeclIsNonVirtualPrimaryBase = Layout.getPrimaryBase() == BaseDecl; 1267 } 1268 1269 InitializeVTablePointers(BaseSubobject(BaseDecl, BaseOffset), 1270 I->isVirtual() ? BaseDecl : NearestVBase, 1271 BaseOffsetFromNearestVBase, 1272 BaseDeclIsNonVirtualPrimaryBase, 1273 VTable, VTableClass, VBases); 1274 } 1275 } 1276 1277 void CodeGenFunction::InitializeVTablePointers(const CXXRecordDecl *RD) { 1278 // Ignore classes without a vtable. 1279 if (!RD->isDynamicClass()) 1280 return; 1281 1282 // Get the VTable. 1283 llvm::Constant *VTable = CGM.getVTables().GetAddrOfVTable(RD); 1284 1285 // Initialize the vtable pointers for this class and all of its bases. 1286 VisitedVirtualBasesSetTy VBases; 1287 InitializeVTablePointers(BaseSubobject(RD, 0), /*NearestVBase=*/0, 1288 /*OffsetFromNearestVBase=*/0, 1289 /*BaseIsNonVirtualPrimaryBase=*/false, 1290 VTable, RD, VBases); 1291 } 1292