1 //===--- CGVTables.cpp - Emit LLVM Code for C++ vtables -------------------===// 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 virtual tables. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #include "CodeGenModule.h" 15 #include "CodeGenFunction.h" 16 #include "CGCXXABI.h" 17 #include "clang/AST/CXXInheritance.h" 18 #include "clang/AST/RecordLayout.h" 19 #include "clang/Frontend/CodeGenOptions.h" 20 #include "llvm/ADT/DenseSet.h" 21 #include "llvm/ADT/SetVector.h" 22 #include "llvm/Support/Compiler.h" 23 #include "llvm/Support/Format.h" 24 #include "llvm/Transforms/Utils/Cloning.h" 25 #include <algorithm> 26 #include <cstdio> 27 28 using namespace clang; 29 using namespace CodeGen; 30 31 namespace { 32 33 /// BaseOffset - Represents an offset from a derived class to a direct or 34 /// indirect base class. 35 struct BaseOffset { 36 /// DerivedClass - The derived class. 37 const CXXRecordDecl *DerivedClass; 38 39 /// VirtualBase - If the path from the derived class to the base class 40 /// involves a virtual base class, this holds its declaration. 41 const CXXRecordDecl *VirtualBase; 42 43 /// NonVirtualOffset - The offset from the derived class to the base class. 44 /// (Or the offset from the virtual base class to the base class, if the 45 /// path from the derived class to the base class involves a virtual base 46 /// class. 47 CharUnits NonVirtualOffset; 48 49 BaseOffset() : DerivedClass(0), VirtualBase(0), 50 NonVirtualOffset(CharUnits::Zero()) { } 51 BaseOffset(const CXXRecordDecl *DerivedClass, 52 const CXXRecordDecl *VirtualBase, CharUnits NonVirtualOffset) 53 : DerivedClass(DerivedClass), VirtualBase(VirtualBase), 54 NonVirtualOffset(NonVirtualOffset) { } 55 56 bool isEmpty() const { return NonVirtualOffset.isZero() && !VirtualBase; } 57 }; 58 59 /// FinalOverriders - Contains the final overrider member functions for all 60 /// member functions in the base subobjects of a class. 61 class FinalOverriders { 62 public: 63 /// OverriderInfo - Information about a final overrider. 64 struct OverriderInfo { 65 /// Method - The method decl of the overrider. 66 const CXXMethodDecl *Method; 67 68 /// Offset - the base offset of the overrider in the layout class. 69 CharUnits Offset; 70 71 OverriderInfo() : Method(0), Offset(CharUnits::Zero()) { } 72 }; 73 74 private: 75 /// MostDerivedClass - The most derived class for which the final overriders 76 /// are stored. 77 const CXXRecordDecl *MostDerivedClass; 78 79 /// MostDerivedClassOffset - If we're building final overriders for a 80 /// construction vtable, this holds the offset from the layout class to the 81 /// most derived class. 82 const CharUnits MostDerivedClassOffset; 83 84 /// LayoutClass - The class we're using for layout information. Will be 85 /// different than the most derived class if the final overriders are for a 86 /// construction vtable. 87 const CXXRecordDecl *LayoutClass; 88 89 ASTContext &Context; 90 91 /// MostDerivedClassLayout - the AST record layout of the most derived class. 92 const ASTRecordLayout &MostDerivedClassLayout; 93 94 /// MethodBaseOffsetPairTy - Uniquely identifies a member function 95 /// in a base subobject. 96 typedef std::pair<const CXXMethodDecl *, CharUnits> MethodBaseOffsetPairTy; 97 98 typedef llvm::DenseMap<MethodBaseOffsetPairTy, 99 OverriderInfo> OverridersMapTy; 100 101 /// OverridersMap - The final overriders for all virtual member functions of 102 /// all the base subobjects of the most derived class. 103 OverridersMapTy OverridersMap; 104 105 /// SubobjectsToOffsetsMapTy - A mapping from a base subobject (represented 106 /// as a record decl and a subobject number) and its offsets in the most 107 /// derived class as well as the layout class. 108 typedef llvm::DenseMap<std::pair<const CXXRecordDecl *, unsigned>, 109 CharUnits> SubobjectOffsetMapTy; 110 111 typedef llvm::DenseMap<const CXXRecordDecl *, unsigned> SubobjectCountMapTy; 112 113 /// ComputeBaseOffsets - Compute the offsets for all base subobjects of the 114 /// given base. 115 void ComputeBaseOffsets(BaseSubobject Base, bool IsVirtual, 116 CharUnits OffsetInLayoutClass, 117 SubobjectOffsetMapTy &SubobjectOffsets, 118 SubobjectOffsetMapTy &SubobjectLayoutClassOffsets, 119 SubobjectCountMapTy &SubobjectCounts); 120 121 typedef llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBasesSetTy; 122 123 /// dump - dump the final overriders for a base subobject, and all its direct 124 /// and indirect base subobjects. 125 void dump(llvm::raw_ostream &Out, BaseSubobject Base, 126 VisitedVirtualBasesSetTy& VisitedVirtualBases); 127 128 public: 129 FinalOverriders(const CXXRecordDecl *MostDerivedClass, 130 CharUnits MostDerivedClassOffset, 131 const CXXRecordDecl *LayoutClass); 132 133 /// getOverrider - Get the final overrider for the given method declaration in 134 /// the subobject with the given base offset. 135 OverriderInfo getOverrider(const CXXMethodDecl *MD, 136 CharUnits BaseOffset) const { 137 assert(OverridersMap.count(std::make_pair(MD, BaseOffset)) && 138 "Did not find overrider!"); 139 140 return OverridersMap.lookup(std::make_pair(MD, BaseOffset)); 141 } 142 143 /// dump - dump the final overriders. 144 void dump() { 145 VisitedVirtualBasesSetTy VisitedVirtualBases; 146 dump(llvm::errs(), BaseSubobject(MostDerivedClass, CharUnits::Zero()), 147 VisitedVirtualBases); 148 } 149 150 }; 151 152 #define DUMP_OVERRIDERS 0 153 154 FinalOverriders::FinalOverriders(const CXXRecordDecl *MostDerivedClass, 155 CharUnits MostDerivedClassOffset, 156 const CXXRecordDecl *LayoutClass) 157 : MostDerivedClass(MostDerivedClass), 158 MostDerivedClassOffset(MostDerivedClassOffset), LayoutClass(LayoutClass), 159 Context(MostDerivedClass->getASTContext()), 160 MostDerivedClassLayout(Context.getASTRecordLayout(MostDerivedClass)) { 161 162 // Compute base offsets. 163 SubobjectOffsetMapTy SubobjectOffsets; 164 SubobjectOffsetMapTy SubobjectLayoutClassOffsets; 165 SubobjectCountMapTy SubobjectCounts; 166 ComputeBaseOffsets(BaseSubobject(MostDerivedClass, CharUnits::Zero()), 167 /*IsVirtual=*/false, 168 MostDerivedClassOffset, 169 SubobjectOffsets, SubobjectLayoutClassOffsets, 170 SubobjectCounts); 171 172 // Get the the final overriders. 173 CXXFinalOverriderMap FinalOverriders; 174 MostDerivedClass->getFinalOverriders(FinalOverriders); 175 176 for (CXXFinalOverriderMap::const_iterator I = FinalOverriders.begin(), 177 E = FinalOverriders.end(); I != E; ++I) { 178 const CXXMethodDecl *MD = I->first; 179 const OverridingMethods& Methods = I->second; 180 181 for (OverridingMethods::const_iterator I = Methods.begin(), 182 E = Methods.end(); I != E; ++I) { 183 unsigned SubobjectNumber = I->first; 184 assert(SubobjectOffsets.count(std::make_pair(MD->getParent(), 185 SubobjectNumber)) && 186 "Did not find subobject offset!"); 187 188 CharUnits BaseOffset = SubobjectOffsets[std::make_pair(MD->getParent(), 189 SubobjectNumber)]; 190 191 assert(I->second.size() == 1 && "Final overrider is not unique!"); 192 const UniqueVirtualMethod &Method = I->second.front(); 193 194 const CXXRecordDecl *OverriderRD = Method.Method->getParent(); 195 assert(SubobjectLayoutClassOffsets.count( 196 std::make_pair(OverriderRD, Method.Subobject)) 197 && "Did not find subobject offset!"); 198 CharUnits OverriderOffset = 199 SubobjectLayoutClassOffsets[std::make_pair(OverriderRD, 200 Method.Subobject)]; 201 202 OverriderInfo& Overrider = OverridersMap[std::make_pair(MD, BaseOffset)]; 203 assert(!Overrider.Method && "Overrider should not exist yet!"); 204 205 Overrider.Offset = OverriderOffset; 206 Overrider.Method = Method.Method; 207 } 208 } 209 210 #if DUMP_OVERRIDERS 211 // And dump them (for now). 212 dump(); 213 #endif 214 } 215 216 static BaseOffset ComputeBaseOffset(ASTContext &Context, 217 const CXXRecordDecl *DerivedRD, 218 const CXXBasePath &Path) { 219 CharUnits NonVirtualOffset = CharUnits::Zero(); 220 221 unsigned NonVirtualStart = 0; 222 const CXXRecordDecl *VirtualBase = 0; 223 224 // First, look for the virtual base class. 225 for (unsigned I = 0, E = Path.size(); I != E; ++I) { 226 const CXXBasePathElement &Element = Path[I]; 227 228 if (Element.Base->isVirtual()) { 229 // FIXME: Can we break when we find the first virtual base? 230 // (If we can't, can't we just iterate over the path in reverse order?) 231 NonVirtualStart = I + 1; 232 QualType VBaseType = Element.Base->getType(); 233 VirtualBase = 234 cast<CXXRecordDecl>(VBaseType->getAs<RecordType>()->getDecl()); 235 } 236 } 237 238 // Now compute the non-virtual offset. 239 for (unsigned I = NonVirtualStart, E = Path.size(); I != E; ++I) { 240 const CXXBasePathElement &Element = Path[I]; 241 242 // Check the base class offset. 243 const ASTRecordLayout &Layout = Context.getASTRecordLayout(Element.Class); 244 245 const RecordType *BaseType = Element.Base->getType()->getAs<RecordType>(); 246 const CXXRecordDecl *Base = cast<CXXRecordDecl>(BaseType->getDecl()); 247 248 NonVirtualOffset += Layout.getBaseClassOffset(Base); 249 } 250 251 // FIXME: This should probably use CharUnits or something. Maybe we should 252 // even change the base offsets in ASTRecordLayout to be specified in 253 // CharUnits. 254 return BaseOffset(DerivedRD, VirtualBase, NonVirtualOffset); 255 256 } 257 258 static BaseOffset ComputeBaseOffset(ASTContext &Context, 259 const CXXRecordDecl *BaseRD, 260 const CXXRecordDecl *DerivedRD) { 261 CXXBasePaths Paths(/*FindAmbiguities=*/false, 262 /*RecordPaths=*/true, /*DetectVirtual=*/false); 263 264 if (!const_cast<CXXRecordDecl *>(DerivedRD)-> 265 isDerivedFrom(const_cast<CXXRecordDecl *>(BaseRD), Paths)) { 266 assert(false && "Class must be derived from the passed in base class!"); 267 return BaseOffset(); 268 } 269 270 return ComputeBaseOffset(Context, DerivedRD, Paths.front()); 271 } 272 273 static BaseOffset 274 ComputeReturnAdjustmentBaseOffset(ASTContext &Context, 275 const CXXMethodDecl *DerivedMD, 276 const CXXMethodDecl *BaseMD) { 277 const FunctionType *BaseFT = BaseMD->getType()->getAs<FunctionType>(); 278 const FunctionType *DerivedFT = DerivedMD->getType()->getAs<FunctionType>(); 279 280 // Canonicalize the return types. 281 CanQualType CanDerivedReturnType = 282 Context.getCanonicalType(DerivedFT->getResultType()); 283 CanQualType CanBaseReturnType = 284 Context.getCanonicalType(BaseFT->getResultType()); 285 286 assert(CanDerivedReturnType->getTypeClass() == 287 CanBaseReturnType->getTypeClass() && 288 "Types must have same type class!"); 289 290 if (CanDerivedReturnType == CanBaseReturnType) { 291 // No adjustment needed. 292 return BaseOffset(); 293 } 294 295 if (isa<ReferenceType>(CanDerivedReturnType)) { 296 CanDerivedReturnType = 297 CanDerivedReturnType->getAs<ReferenceType>()->getPointeeType(); 298 CanBaseReturnType = 299 CanBaseReturnType->getAs<ReferenceType>()->getPointeeType(); 300 } else if (isa<PointerType>(CanDerivedReturnType)) { 301 CanDerivedReturnType = 302 CanDerivedReturnType->getAs<PointerType>()->getPointeeType(); 303 CanBaseReturnType = 304 CanBaseReturnType->getAs<PointerType>()->getPointeeType(); 305 } else { 306 assert(false && "Unexpected return type!"); 307 } 308 309 // We need to compare unqualified types here; consider 310 // const T *Base::foo(); 311 // T *Derived::foo(); 312 if (CanDerivedReturnType.getUnqualifiedType() == 313 CanBaseReturnType.getUnqualifiedType()) { 314 // No adjustment needed. 315 return BaseOffset(); 316 } 317 318 const CXXRecordDecl *DerivedRD = 319 cast<CXXRecordDecl>(cast<RecordType>(CanDerivedReturnType)->getDecl()); 320 321 const CXXRecordDecl *BaseRD = 322 cast<CXXRecordDecl>(cast<RecordType>(CanBaseReturnType)->getDecl()); 323 324 return ComputeBaseOffset(Context, BaseRD, DerivedRD); 325 } 326 327 void 328 FinalOverriders::ComputeBaseOffsets(BaseSubobject Base, bool IsVirtual, 329 CharUnits OffsetInLayoutClass, 330 SubobjectOffsetMapTy &SubobjectOffsets, 331 SubobjectOffsetMapTy &SubobjectLayoutClassOffsets, 332 SubobjectCountMapTy &SubobjectCounts) { 333 const CXXRecordDecl *RD = Base.getBase(); 334 335 unsigned SubobjectNumber = 0; 336 if (!IsVirtual) 337 SubobjectNumber = ++SubobjectCounts[RD]; 338 339 // Set up the subobject to offset mapping. 340 assert(!SubobjectOffsets.count(std::make_pair(RD, SubobjectNumber)) 341 && "Subobject offset already exists!"); 342 assert(!SubobjectLayoutClassOffsets.count(std::make_pair(RD, SubobjectNumber)) 343 && "Subobject offset already exists!"); 344 345 SubobjectOffsets[std::make_pair(RD, SubobjectNumber)] = Base.getBaseOffset(); 346 SubobjectLayoutClassOffsets[std::make_pair(RD, SubobjectNumber)] = 347 OffsetInLayoutClass; 348 349 // Traverse our bases. 350 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 351 E = RD->bases_end(); I != E; ++I) { 352 const CXXRecordDecl *BaseDecl = 353 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 354 355 CharUnits BaseOffset; 356 CharUnits BaseOffsetInLayoutClass; 357 if (I->isVirtual()) { 358 // Check if we've visited this virtual base before. 359 if (SubobjectOffsets.count(std::make_pair(BaseDecl, 0))) 360 continue; 361 362 const ASTRecordLayout &LayoutClassLayout = 363 Context.getASTRecordLayout(LayoutClass); 364 365 BaseOffset = MostDerivedClassLayout.getVBaseClassOffset(BaseDecl); 366 BaseOffsetInLayoutClass = 367 LayoutClassLayout.getVBaseClassOffset(BaseDecl); 368 } else { 369 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 370 CharUnits Offset = Layout.getBaseClassOffset(BaseDecl); 371 372 BaseOffset = Base.getBaseOffset() + Offset; 373 BaseOffsetInLayoutClass = OffsetInLayoutClass + Offset; 374 } 375 376 ComputeBaseOffsets(BaseSubobject(BaseDecl, BaseOffset), 377 I->isVirtual(), BaseOffsetInLayoutClass, 378 SubobjectOffsets, SubobjectLayoutClassOffsets, 379 SubobjectCounts); 380 } 381 } 382 383 void FinalOverriders::dump(llvm::raw_ostream &Out, BaseSubobject Base, 384 VisitedVirtualBasesSetTy &VisitedVirtualBases) { 385 const CXXRecordDecl *RD = Base.getBase(); 386 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 387 388 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 389 E = RD->bases_end(); I != E; ++I) { 390 const CXXRecordDecl *BaseDecl = 391 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 392 393 // Ignore bases that don't have any virtual member functions. 394 if (!BaseDecl->isPolymorphic()) 395 continue; 396 397 CharUnits BaseOffset; 398 if (I->isVirtual()) { 399 if (!VisitedVirtualBases.insert(BaseDecl)) { 400 // We've visited this base before. 401 continue; 402 } 403 404 BaseOffset = MostDerivedClassLayout.getVBaseClassOffset(BaseDecl); 405 } else { 406 BaseOffset = Layout.getBaseClassOffset(BaseDecl) + Base.getBaseOffset(); 407 } 408 409 dump(Out, BaseSubobject(BaseDecl, BaseOffset), VisitedVirtualBases); 410 } 411 412 Out << "Final overriders for (" << RD->getQualifiedNameAsString() << ", "; 413 Out << Base.getBaseOffset().getQuantity() << ")\n"; 414 415 // Now dump the overriders for this base subobject. 416 for (CXXRecordDecl::method_iterator I = RD->method_begin(), 417 E = RD->method_end(); I != E; ++I) { 418 const CXXMethodDecl *MD = *I; 419 420 if (!MD->isVirtual()) 421 continue; 422 423 OverriderInfo Overrider = getOverrider(MD, Base.getBaseOffset()); 424 425 Out << " " << MD->getQualifiedNameAsString() << " - ("; 426 Out << Overrider.Method->getQualifiedNameAsString(); 427 Out << ", " << ", " << Overrider.Offset.getQuantity() << ')'; 428 429 BaseOffset Offset; 430 if (!Overrider.Method->isPure()) 431 Offset = ComputeReturnAdjustmentBaseOffset(Context, Overrider.Method, MD); 432 433 if (!Offset.isEmpty()) { 434 Out << " [ret-adj: "; 435 if (Offset.VirtualBase) 436 Out << Offset.VirtualBase->getQualifiedNameAsString() << " vbase, "; 437 438 Out << Offset.NonVirtualOffset.getQuantity() << " nv]"; 439 } 440 441 Out << "\n"; 442 } 443 } 444 445 /// VTableComponent - Represents a single component in a vtable. 446 class VTableComponent { 447 public: 448 enum Kind { 449 CK_VCallOffset, 450 CK_VBaseOffset, 451 CK_OffsetToTop, 452 CK_RTTI, 453 CK_FunctionPointer, 454 455 /// CK_CompleteDtorPointer - A pointer to the complete destructor. 456 CK_CompleteDtorPointer, 457 458 /// CK_DeletingDtorPointer - A pointer to the deleting destructor. 459 CK_DeletingDtorPointer, 460 461 /// CK_UnusedFunctionPointer - In some cases, a vtable function pointer 462 /// will end up never being called. Such vtable function pointers are 463 /// represented as a CK_UnusedFunctionPointer. 464 CK_UnusedFunctionPointer 465 }; 466 467 static VTableComponent MakeVCallOffset(CharUnits Offset) { 468 return VTableComponent(CK_VCallOffset, Offset); 469 } 470 471 static VTableComponent MakeVBaseOffset(CharUnits Offset) { 472 return VTableComponent(CK_VBaseOffset, Offset); 473 } 474 475 static VTableComponent MakeOffsetToTop(CharUnits Offset) { 476 return VTableComponent(CK_OffsetToTop, Offset); 477 } 478 479 static VTableComponent MakeRTTI(const CXXRecordDecl *RD) { 480 return VTableComponent(CK_RTTI, reinterpret_cast<uintptr_t>(RD)); 481 } 482 483 static VTableComponent MakeFunction(const CXXMethodDecl *MD) { 484 assert(!isa<CXXDestructorDecl>(MD) && 485 "Don't use MakeFunction with destructors!"); 486 487 return VTableComponent(CK_FunctionPointer, 488 reinterpret_cast<uintptr_t>(MD)); 489 } 490 491 static VTableComponent MakeCompleteDtor(const CXXDestructorDecl *DD) { 492 return VTableComponent(CK_CompleteDtorPointer, 493 reinterpret_cast<uintptr_t>(DD)); 494 } 495 496 static VTableComponent MakeDeletingDtor(const CXXDestructorDecl *DD) { 497 return VTableComponent(CK_DeletingDtorPointer, 498 reinterpret_cast<uintptr_t>(DD)); 499 } 500 501 static VTableComponent MakeUnusedFunction(const CXXMethodDecl *MD) { 502 assert(!isa<CXXDestructorDecl>(MD) && 503 "Don't use MakeUnusedFunction with destructors!"); 504 return VTableComponent(CK_UnusedFunctionPointer, 505 reinterpret_cast<uintptr_t>(MD)); 506 } 507 508 static VTableComponent getFromOpaqueInteger(uint64_t I) { 509 return VTableComponent(I); 510 } 511 512 /// getKind - Get the kind of this vtable component. 513 Kind getKind() const { 514 return (Kind)(Value & 0x7); 515 } 516 517 CharUnits getVCallOffset() const { 518 assert(getKind() == CK_VCallOffset && "Invalid component kind!"); 519 520 return getOffset(); 521 } 522 523 CharUnits getVBaseOffset() const { 524 assert(getKind() == CK_VBaseOffset && "Invalid component kind!"); 525 526 return getOffset(); 527 } 528 529 CharUnits getOffsetToTop() const { 530 assert(getKind() == CK_OffsetToTop && "Invalid component kind!"); 531 532 return getOffset(); 533 } 534 535 const CXXRecordDecl *getRTTIDecl() const { 536 assert(getKind() == CK_RTTI && "Invalid component kind!"); 537 538 return reinterpret_cast<CXXRecordDecl *>(getPointer()); 539 } 540 541 const CXXMethodDecl *getFunctionDecl() const { 542 assert(getKind() == CK_FunctionPointer); 543 544 return reinterpret_cast<CXXMethodDecl *>(getPointer()); 545 } 546 547 const CXXDestructorDecl *getDestructorDecl() const { 548 assert((getKind() == CK_CompleteDtorPointer || 549 getKind() == CK_DeletingDtorPointer) && "Invalid component kind!"); 550 551 return reinterpret_cast<CXXDestructorDecl *>(getPointer()); 552 } 553 554 const CXXMethodDecl *getUnusedFunctionDecl() const { 555 assert(getKind() == CK_UnusedFunctionPointer); 556 557 return reinterpret_cast<CXXMethodDecl *>(getPointer()); 558 } 559 560 private: 561 VTableComponent(Kind ComponentKind, CharUnits Offset) { 562 assert((ComponentKind == CK_VCallOffset || 563 ComponentKind == CK_VBaseOffset || 564 ComponentKind == CK_OffsetToTop) && "Invalid component kind!"); 565 assert(Offset.getQuantity() <= ((1LL << 56) - 1) && "Offset is too big!"); 566 567 Value = ((Offset.getQuantity() << 3) | ComponentKind); 568 } 569 570 VTableComponent(Kind ComponentKind, uintptr_t Ptr) { 571 assert((ComponentKind == CK_RTTI || 572 ComponentKind == CK_FunctionPointer || 573 ComponentKind == CK_CompleteDtorPointer || 574 ComponentKind == CK_DeletingDtorPointer || 575 ComponentKind == CK_UnusedFunctionPointer) && 576 "Invalid component kind!"); 577 578 assert((Ptr & 7) == 0 && "Pointer not sufficiently aligned!"); 579 580 Value = Ptr | ComponentKind; 581 } 582 583 CharUnits getOffset() const { 584 assert((getKind() == CK_VCallOffset || getKind() == CK_VBaseOffset || 585 getKind() == CK_OffsetToTop) && "Invalid component kind!"); 586 587 return CharUnits::fromQuantity(Value >> 3); 588 } 589 590 uintptr_t getPointer() const { 591 assert((getKind() == CK_RTTI || 592 getKind() == CK_FunctionPointer || 593 getKind() == CK_CompleteDtorPointer || 594 getKind() == CK_DeletingDtorPointer || 595 getKind() == CK_UnusedFunctionPointer) && 596 "Invalid component kind!"); 597 598 return static_cast<uintptr_t>(Value & ~7ULL); 599 } 600 601 explicit VTableComponent(uint64_t Value) 602 : Value(Value) { } 603 604 /// The kind is stored in the lower 3 bits of the value. For offsets, we 605 /// make use of the facts that classes can't be larger than 2^55 bytes, 606 /// so we store the offset in the lower part of the 61 bytes that remain. 607 /// (The reason that we're not simply using a PointerIntPair here is that we 608 /// need the offsets to be 64-bit, even when on a 32-bit machine). 609 int64_t Value; 610 }; 611 612 /// VCallOffsetMap - Keeps track of vcall offsets when building a vtable. 613 struct VCallOffsetMap { 614 615 typedef std::pair<const CXXMethodDecl *, CharUnits> MethodAndOffsetPairTy; 616 617 /// Offsets - Keeps track of methods and their offsets. 618 // FIXME: This should be a real map and not a vector. 619 llvm::SmallVector<MethodAndOffsetPairTy, 16> Offsets; 620 621 /// MethodsCanShareVCallOffset - Returns whether two virtual member functions 622 /// can share the same vcall offset. 623 static bool MethodsCanShareVCallOffset(const CXXMethodDecl *LHS, 624 const CXXMethodDecl *RHS); 625 626 public: 627 /// AddVCallOffset - Adds a vcall offset to the map. Returns true if the 628 /// add was successful, or false if there was already a member function with 629 /// the same signature in the map. 630 bool AddVCallOffset(const CXXMethodDecl *MD, CharUnits OffsetOffset); 631 632 /// getVCallOffsetOffset - Returns the vcall offset offset (relative to the 633 /// vtable address point) for the given virtual member function. 634 CharUnits getVCallOffsetOffset(const CXXMethodDecl *MD); 635 636 // empty - Return whether the offset map is empty or not. 637 bool empty() const { return Offsets.empty(); } 638 }; 639 640 static bool HasSameVirtualSignature(const CXXMethodDecl *LHS, 641 const CXXMethodDecl *RHS) { 642 ASTContext &C = LHS->getASTContext(); // TODO: thread this down 643 CanQual<FunctionProtoType> 644 LT = C.getCanonicalType(LHS->getType()).getAs<FunctionProtoType>(), 645 RT = C.getCanonicalType(RHS->getType()).getAs<FunctionProtoType>(); 646 647 // Fast-path matches in the canonical types. 648 if (LT == RT) return true; 649 650 // Force the signatures to match. We can't rely on the overrides 651 // list here because there isn't necessarily an inheritance 652 // relationship between the two methods. 653 if (LT.getQualifiers() != RT.getQualifiers() || 654 LT->getNumArgs() != RT->getNumArgs()) 655 return false; 656 for (unsigned I = 0, E = LT->getNumArgs(); I != E; ++I) 657 if (LT->getArgType(I) != RT->getArgType(I)) 658 return false; 659 return true; 660 } 661 662 bool VCallOffsetMap::MethodsCanShareVCallOffset(const CXXMethodDecl *LHS, 663 const CXXMethodDecl *RHS) { 664 assert(LHS->isVirtual() && "LHS must be virtual!"); 665 assert(RHS->isVirtual() && "LHS must be virtual!"); 666 667 // A destructor can share a vcall offset with another destructor. 668 if (isa<CXXDestructorDecl>(LHS)) 669 return isa<CXXDestructorDecl>(RHS); 670 671 // FIXME: We need to check more things here. 672 673 // The methods must have the same name. 674 DeclarationName LHSName = LHS->getDeclName(); 675 DeclarationName RHSName = RHS->getDeclName(); 676 if (LHSName != RHSName) 677 return false; 678 679 // And the same signatures. 680 return HasSameVirtualSignature(LHS, RHS); 681 } 682 683 bool VCallOffsetMap::AddVCallOffset(const CXXMethodDecl *MD, 684 CharUnits OffsetOffset) { 685 // Check if we can reuse an offset. 686 for (unsigned I = 0, E = Offsets.size(); I != E; ++I) { 687 if (MethodsCanShareVCallOffset(Offsets[I].first, MD)) 688 return false; 689 } 690 691 // Add the offset. 692 Offsets.push_back(MethodAndOffsetPairTy(MD, OffsetOffset)); 693 return true; 694 } 695 696 CharUnits VCallOffsetMap::getVCallOffsetOffset(const CXXMethodDecl *MD) { 697 // Look for an offset. 698 for (unsigned I = 0, E = Offsets.size(); I != E; ++I) { 699 if (MethodsCanShareVCallOffset(Offsets[I].first, MD)) 700 return Offsets[I].second; 701 } 702 703 assert(false && "Should always find a vcall offset offset!"); 704 return CharUnits::Zero(); 705 } 706 707 /// VCallAndVBaseOffsetBuilder - Class for building vcall and vbase offsets. 708 class VCallAndVBaseOffsetBuilder { 709 public: 710 typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> 711 VBaseOffsetOffsetsMapTy; 712 713 private: 714 /// MostDerivedClass - The most derived class for which we're building vcall 715 /// and vbase offsets. 716 const CXXRecordDecl *MostDerivedClass; 717 718 /// LayoutClass - The class we're using for layout information. Will be 719 /// different than the most derived class if we're building a construction 720 /// vtable. 721 const CXXRecordDecl *LayoutClass; 722 723 /// Context - The ASTContext which we will use for layout information. 724 ASTContext &Context; 725 726 /// Components - vcall and vbase offset components 727 typedef llvm::SmallVector<VTableComponent, 64> VTableComponentVectorTy; 728 VTableComponentVectorTy Components; 729 730 /// VisitedVirtualBases - Visited virtual bases. 731 llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBases; 732 733 /// VCallOffsets - Keeps track of vcall offsets. 734 VCallOffsetMap VCallOffsets; 735 736 737 /// VBaseOffsetOffsets - Contains the offsets of the virtual base offsets, 738 /// relative to the address point. 739 VBaseOffsetOffsetsMapTy VBaseOffsetOffsets; 740 741 /// FinalOverriders - The final overriders of the most derived class. 742 /// (Can be null when we're not building a vtable of the most derived class). 743 const FinalOverriders *Overriders; 744 745 /// AddVCallAndVBaseOffsets - Add vcall offsets and vbase offsets for the 746 /// given base subobject. 747 void AddVCallAndVBaseOffsets(BaseSubobject Base, bool BaseIsVirtual, 748 CharUnits RealBaseOffset); 749 750 /// AddVCallOffsets - Add vcall offsets for the given base subobject. 751 void AddVCallOffsets(BaseSubobject Base, CharUnits VBaseOffset); 752 753 /// AddVBaseOffsets - Add vbase offsets for the given class. 754 void AddVBaseOffsets(const CXXRecordDecl *Base, 755 CharUnits OffsetInLayoutClass); 756 757 /// getCurrentOffsetOffset - Get the current vcall or vbase offset offset in 758 /// chars, relative to the vtable address point. 759 CharUnits getCurrentOffsetOffset() const; 760 761 public: 762 VCallAndVBaseOffsetBuilder(const CXXRecordDecl *MostDerivedClass, 763 const CXXRecordDecl *LayoutClass, 764 const FinalOverriders *Overriders, 765 BaseSubobject Base, bool BaseIsVirtual, 766 CharUnits OffsetInLayoutClass) 767 : MostDerivedClass(MostDerivedClass), LayoutClass(LayoutClass), 768 Context(MostDerivedClass->getASTContext()), Overriders(Overriders) { 769 770 // Add vcall and vbase offsets. 771 AddVCallAndVBaseOffsets(Base, BaseIsVirtual, OffsetInLayoutClass); 772 } 773 774 /// Methods for iterating over the components. 775 typedef VTableComponentVectorTy::const_reverse_iterator const_iterator; 776 const_iterator components_begin() const { return Components.rbegin(); } 777 const_iterator components_end() const { return Components.rend(); } 778 779 const VCallOffsetMap &getVCallOffsets() const { return VCallOffsets; } 780 const VBaseOffsetOffsetsMapTy &getVBaseOffsetOffsets() const { 781 return VBaseOffsetOffsets; 782 } 783 }; 784 785 void 786 VCallAndVBaseOffsetBuilder::AddVCallAndVBaseOffsets(BaseSubobject Base, 787 bool BaseIsVirtual, 788 CharUnits RealBaseOffset) { 789 const ASTRecordLayout &Layout = Context.getASTRecordLayout(Base.getBase()); 790 791 // Itanium C++ ABI 2.5.2: 792 // ..in classes sharing a virtual table with a primary base class, the vcall 793 // and vbase offsets added by the derived class all come before the vcall 794 // and vbase offsets required by the base class, so that the latter may be 795 // laid out as required by the base class without regard to additions from 796 // the derived class(es). 797 798 // (Since we're emitting the vcall and vbase offsets in reverse order, we'll 799 // emit them for the primary base first). 800 if (const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase()) { 801 bool PrimaryBaseIsVirtual = Layout.isPrimaryBaseVirtual(); 802 803 CharUnits PrimaryBaseOffset; 804 805 // Get the base offset of the primary base. 806 if (PrimaryBaseIsVirtual) { 807 assert(Layout.getVBaseClassOffsetInBits(PrimaryBase) == 0 && 808 "Primary vbase should have a zero offset!"); 809 810 const ASTRecordLayout &MostDerivedClassLayout = 811 Context.getASTRecordLayout(MostDerivedClass); 812 813 PrimaryBaseOffset = 814 MostDerivedClassLayout.getVBaseClassOffset(PrimaryBase); 815 } else { 816 assert(Layout.getBaseClassOffsetInBits(PrimaryBase) == 0 && 817 "Primary base should have a zero offset!"); 818 819 PrimaryBaseOffset = Base.getBaseOffset(); 820 } 821 822 AddVCallAndVBaseOffsets( 823 BaseSubobject(PrimaryBase,PrimaryBaseOffset), 824 PrimaryBaseIsVirtual, RealBaseOffset); 825 } 826 827 AddVBaseOffsets(Base.getBase(), RealBaseOffset); 828 829 // We only want to add vcall offsets for virtual bases. 830 if (BaseIsVirtual) 831 AddVCallOffsets(Base, RealBaseOffset); 832 } 833 834 CharUnits VCallAndVBaseOffsetBuilder::getCurrentOffsetOffset() const { 835 // OffsetIndex is the index of this vcall or vbase offset, relative to the 836 // vtable address point. (We subtract 3 to account for the information just 837 // above the address point, the RTTI info, the offset to top, and the 838 // vcall offset itself). 839 int64_t OffsetIndex = -(int64_t)(3 + Components.size()); 840 841 CharUnits PointerWidth = 842 Context.toCharUnitsFromBits(Context.Target.getPointerWidth(0)); 843 CharUnits OffsetOffset = PointerWidth * OffsetIndex; 844 return OffsetOffset; 845 } 846 847 void VCallAndVBaseOffsetBuilder::AddVCallOffsets(BaseSubobject Base, 848 CharUnits VBaseOffset) { 849 const CXXRecordDecl *RD = Base.getBase(); 850 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 851 852 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 853 854 // Handle the primary base first. 855 // We only want to add vcall offsets if the base is non-virtual; a virtual 856 // primary base will have its vcall and vbase offsets emitted already. 857 if (PrimaryBase && !Layout.isPrimaryBaseVirtual()) { 858 // Get the base offset of the primary base. 859 assert(Layout.getBaseClassOffsetInBits(PrimaryBase) == 0 && 860 "Primary base should have a zero offset!"); 861 862 AddVCallOffsets(BaseSubobject(PrimaryBase, Base.getBaseOffset()), 863 VBaseOffset); 864 } 865 866 // Add the vcall offsets. 867 for (CXXRecordDecl::method_iterator I = RD->method_begin(), 868 E = RD->method_end(); I != E; ++I) { 869 const CXXMethodDecl *MD = *I; 870 871 if (!MD->isVirtual()) 872 continue; 873 874 CharUnits OffsetOffset = getCurrentOffsetOffset(); 875 876 // Don't add a vcall offset if we already have one for this member function 877 // signature. 878 if (!VCallOffsets.AddVCallOffset(MD, OffsetOffset)) 879 continue; 880 881 CharUnits Offset = CharUnits::Zero(); 882 883 if (Overriders) { 884 // Get the final overrider. 885 FinalOverriders::OverriderInfo Overrider = 886 Overriders->getOverrider(MD, Base.getBaseOffset()); 887 888 /// The vcall offset is the offset from the virtual base to the object 889 /// where the function was overridden. 890 Offset = Overrider.Offset - VBaseOffset; 891 } 892 893 Components.push_back( 894 VTableComponent::MakeVCallOffset(Offset)); 895 } 896 897 // And iterate over all non-virtual bases (ignoring the primary base). 898 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 899 E = RD->bases_end(); I != E; ++I) { 900 901 if (I->isVirtual()) 902 continue; 903 904 const CXXRecordDecl *BaseDecl = 905 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 906 if (BaseDecl == PrimaryBase) 907 continue; 908 909 // Get the base offset of this base. 910 CharUnits BaseOffset = Base.getBaseOffset() + 911 Layout.getBaseClassOffset(BaseDecl); 912 913 AddVCallOffsets(BaseSubobject(BaseDecl, BaseOffset), 914 VBaseOffset); 915 } 916 } 917 918 void 919 VCallAndVBaseOffsetBuilder::AddVBaseOffsets(const CXXRecordDecl *RD, 920 CharUnits OffsetInLayoutClass) { 921 const ASTRecordLayout &LayoutClassLayout = 922 Context.getASTRecordLayout(LayoutClass); 923 924 // Add vbase offsets. 925 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 926 E = RD->bases_end(); I != E; ++I) { 927 const CXXRecordDecl *BaseDecl = 928 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 929 930 // Check if this is a virtual base that we haven't visited before. 931 if (I->isVirtual() && VisitedVirtualBases.insert(BaseDecl)) { 932 CharUnits Offset = 933 LayoutClassLayout.getVBaseClassOffset(BaseDecl) - OffsetInLayoutClass; 934 935 // Add the vbase offset offset. 936 assert(!VBaseOffsetOffsets.count(BaseDecl) && 937 "vbase offset offset already exists!"); 938 939 CharUnits VBaseOffsetOffset = getCurrentOffsetOffset(); 940 VBaseOffsetOffsets.insert( 941 std::make_pair(BaseDecl, VBaseOffsetOffset)); 942 943 Components.push_back( 944 VTableComponent::MakeVBaseOffset(Offset)); 945 } 946 947 // Check the base class looking for more vbase offsets. 948 AddVBaseOffsets(BaseDecl, OffsetInLayoutClass); 949 } 950 } 951 952 /// VTableBuilder - Class for building vtable layout information. 953 class VTableBuilder { 954 public: 955 /// PrimaryBasesSetVectorTy - A set vector of direct and indirect 956 /// primary bases. 957 typedef llvm::SmallSetVector<const CXXRecordDecl *, 8> 958 PrimaryBasesSetVectorTy; 959 960 typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> 961 VBaseOffsetOffsetsMapTy; 962 963 typedef llvm::DenseMap<BaseSubobject, uint64_t> 964 AddressPointsMapTy; 965 966 private: 967 /// VTables - Global vtable information. 968 CodeGenVTables &VTables; 969 970 /// MostDerivedClass - The most derived class for which we're building this 971 /// vtable. 972 const CXXRecordDecl *MostDerivedClass; 973 974 /// MostDerivedClassOffset - If we're building a construction vtable, this 975 /// holds the offset from the layout class to the most derived class. 976 const CharUnits MostDerivedClassOffset; 977 978 /// MostDerivedClassIsVirtual - Whether the most derived class is a virtual 979 /// base. (This only makes sense when building a construction vtable). 980 bool MostDerivedClassIsVirtual; 981 982 /// LayoutClass - The class we're using for layout information. Will be 983 /// different than the most derived class if we're building a construction 984 /// vtable. 985 const CXXRecordDecl *LayoutClass; 986 987 /// Context - The ASTContext which we will use for layout information. 988 ASTContext &Context; 989 990 /// FinalOverriders - The final overriders of the most derived class. 991 const FinalOverriders Overriders; 992 993 /// VCallOffsetsForVBases - Keeps track of vcall offsets for the virtual 994 /// bases in this vtable. 995 llvm::DenseMap<const CXXRecordDecl *, VCallOffsetMap> VCallOffsetsForVBases; 996 997 /// VBaseOffsetOffsets - Contains the offsets of the virtual base offsets for 998 /// the most derived class. 999 VBaseOffsetOffsetsMapTy VBaseOffsetOffsets; 1000 1001 /// Components - The components of the vtable being built. 1002 llvm::SmallVector<VTableComponent, 64> Components; 1003 1004 /// AddressPoints - Address points for the vtable being built. 1005 AddressPointsMapTy AddressPoints; 1006 1007 /// MethodInfo - Contains information about a method in a vtable. 1008 /// (Used for computing 'this' pointer adjustment thunks. 1009 struct MethodInfo { 1010 /// BaseOffset - The base offset of this method. 1011 const CharUnits BaseOffset; 1012 1013 /// BaseOffsetInLayoutClass - The base offset in the layout class of this 1014 /// method. 1015 const CharUnits BaseOffsetInLayoutClass; 1016 1017 /// VTableIndex - The index in the vtable that this method has. 1018 /// (For destructors, this is the index of the complete destructor). 1019 const uint64_t VTableIndex; 1020 1021 MethodInfo(CharUnits BaseOffset, CharUnits BaseOffsetInLayoutClass, 1022 uint64_t VTableIndex) 1023 : BaseOffset(BaseOffset), 1024 BaseOffsetInLayoutClass(BaseOffsetInLayoutClass), 1025 VTableIndex(VTableIndex) { } 1026 1027 MethodInfo() 1028 : BaseOffset(CharUnits::Zero()), 1029 BaseOffsetInLayoutClass(CharUnits::Zero()), 1030 VTableIndex(0) { } 1031 }; 1032 1033 typedef llvm::DenseMap<const CXXMethodDecl *, MethodInfo> MethodInfoMapTy; 1034 1035 /// MethodInfoMap - The information for all methods in the vtable we're 1036 /// currently building. 1037 MethodInfoMapTy MethodInfoMap; 1038 1039 typedef llvm::DenseMap<uint64_t, ThunkInfo> VTableThunksMapTy; 1040 1041 /// VTableThunks - The thunks by vtable index in the vtable currently being 1042 /// built. 1043 VTableThunksMapTy VTableThunks; 1044 1045 typedef llvm::SmallVector<ThunkInfo, 1> ThunkInfoVectorTy; 1046 typedef llvm::DenseMap<const CXXMethodDecl *, ThunkInfoVectorTy> ThunksMapTy; 1047 1048 /// Thunks - A map that contains all the thunks needed for all methods in the 1049 /// most derived class for which the vtable is currently being built. 1050 ThunksMapTy Thunks; 1051 1052 /// AddThunk - Add a thunk for the given method. 1053 void AddThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk); 1054 1055 /// ComputeThisAdjustments - Compute the 'this' pointer adjustments for the 1056 /// part of the vtable we're currently building. 1057 void ComputeThisAdjustments(); 1058 1059 typedef llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBasesSetTy; 1060 1061 /// PrimaryVirtualBases - All known virtual bases who are a primary base of 1062 /// some other base. 1063 VisitedVirtualBasesSetTy PrimaryVirtualBases; 1064 1065 /// ComputeReturnAdjustment - Compute the return adjustment given a return 1066 /// adjustment base offset. 1067 ReturnAdjustment ComputeReturnAdjustment(BaseOffset Offset); 1068 1069 /// ComputeThisAdjustmentBaseOffset - Compute the base offset for adjusting 1070 /// the 'this' pointer from the base subobject to the derived subobject. 1071 BaseOffset ComputeThisAdjustmentBaseOffset(BaseSubobject Base, 1072 BaseSubobject Derived) const; 1073 1074 /// ComputeThisAdjustment - Compute the 'this' pointer adjustment for the 1075 /// given virtual member function, its offset in the layout class and its 1076 /// final overrider. 1077 ThisAdjustment 1078 ComputeThisAdjustment(const CXXMethodDecl *MD, 1079 CharUnits BaseOffsetInLayoutClass, 1080 FinalOverriders::OverriderInfo Overrider); 1081 1082 /// AddMethod - Add a single virtual member function to the vtable 1083 /// components vector. 1084 void AddMethod(const CXXMethodDecl *MD, ReturnAdjustment ReturnAdjustment); 1085 1086 /// IsOverriderUsed - Returns whether the overrider will ever be used in this 1087 /// part of the vtable. 1088 /// 1089 /// Itanium C++ ABI 2.5.2: 1090 /// 1091 /// struct A { virtual void f(); }; 1092 /// struct B : virtual public A { int i; }; 1093 /// struct C : virtual public A { int j; }; 1094 /// struct D : public B, public C {}; 1095 /// 1096 /// When B and C are declared, A is a primary base in each case, so although 1097 /// vcall offsets are allocated in the A-in-B and A-in-C vtables, no this 1098 /// adjustment is required and no thunk is generated. However, inside D 1099 /// objects, A is no longer a primary base of C, so if we allowed calls to 1100 /// C::f() to use the copy of A's vtable in the C subobject, we would need 1101 /// to adjust this from C* to B::A*, which would require a third-party 1102 /// thunk. Since we require that a call to C::f() first convert to A*, 1103 /// C-in-D's copy of A's vtable is never referenced, so this is not 1104 /// necessary. 1105 bool IsOverriderUsed(const CXXMethodDecl *Overrider, 1106 CharUnits BaseOffsetInLayoutClass, 1107 const CXXRecordDecl *FirstBaseInPrimaryBaseChain, 1108 CharUnits FirstBaseOffsetInLayoutClass) const; 1109 1110 1111 /// AddMethods - Add the methods of this base subobject and all its 1112 /// primary bases to the vtable components vector. 1113 void AddMethods(BaseSubobject Base, CharUnits BaseOffsetInLayoutClass, 1114 const CXXRecordDecl *FirstBaseInPrimaryBaseChain, 1115 CharUnits FirstBaseOffsetInLayoutClass, 1116 PrimaryBasesSetVectorTy &PrimaryBases); 1117 1118 // LayoutVTable - Layout the vtable for the given base class, including its 1119 // secondary vtables and any vtables for virtual bases. 1120 void LayoutVTable(); 1121 1122 /// LayoutPrimaryAndSecondaryVTables - Layout the primary vtable for the 1123 /// given base subobject, as well as all its secondary vtables. 1124 /// 1125 /// \param BaseIsMorallyVirtual whether the base subobject is a virtual base 1126 /// or a direct or indirect base of a virtual base. 1127 /// 1128 /// \param BaseIsVirtualInLayoutClass - Whether the base subobject is virtual 1129 /// in the layout class. 1130 void LayoutPrimaryAndSecondaryVTables(BaseSubobject Base, 1131 bool BaseIsMorallyVirtual, 1132 bool BaseIsVirtualInLayoutClass, 1133 CharUnits OffsetInLayoutClass); 1134 1135 /// LayoutSecondaryVTables - Layout the secondary vtables for the given base 1136 /// subobject. 1137 /// 1138 /// \param BaseIsMorallyVirtual whether the base subobject is a virtual base 1139 /// or a direct or indirect base of a virtual base. 1140 void LayoutSecondaryVTables(BaseSubobject Base, bool BaseIsMorallyVirtual, 1141 CharUnits OffsetInLayoutClass); 1142 1143 /// DeterminePrimaryVirtualBases - Determine the primary virtual bases in this 1144 /// class hierarchy. 1145 void DeterminePrimaryVirtualBases(const CXXRecordDecl *RD, 1146 CharUnits OffsetInLayoutClass, 1147 VisitedVirtualBasesSetTy &VBases); 1148 1149 /// LayoutVTablesForVirtualBases - Layout vtables for all virtual bases of the 1150 /// given base (excluding any primary bases). 1151 void LayoutVTablesForVirtualBases(const CXXRecordDecl *RD, 1152 VisitedVirtualBasesSetTy &VBases); 1153 1154 /// isBuildingConstructionVTable - Return whether this vtable builder is 1155 /// building a construction vtable. 1156 bool isBuildingConstructorVTable() const { 1157 return MostDerivedClass != LayoutClass; 1158 } 1159 1160 public: 1161 VTableBuilder(CodeGenVTables &VTables, const CXXRecordDecl *MostDerivedClass, 1162 CharUnits MostDerivedClassOffset, 1163 bool MostDerivedClassIsVirtual, const 1164 CXXRecordDecl *LayoutClass) 1165 : VTables(VTables), MostDerivedClass(MostDerivedClass), 1166 MostDerivedClassOffset(MostDerivedClassOffset), 1167 MostDerivedClassIsVirtual(MostDerivedClassIsVirtual), 1168 LayoutClass(LayoutClass), Context(MostDerivedClass->getASTContext()), 1169 Overriders(MostDerivedClass, MostDerivedClassOffset, LayoutClass) { 1170 1171 LayoutVTable(); 1172 } 1173 1174 ThunksMapTy::const_iterator thunks_begin() const { 1175 return Thunks.begin(); 1176 } 1177 1178 ThunksMapTy::const_iterator thunks_end() const { 1179 return Thunks.end(); 1180 } 1181 1182 const VBaseOffsetOffsetsMapTy &getVBaseOffsetOffsets() const { 1183 return VBaseOffsetOffsets; 1184 } 1185 1186 /// getNumVTableComponents - Return the number of components in the vtable 1187 /// currently built. 1188 uint64_t getNumVTableComponents() const { 1189 return Components.size(); 1190 } 1191 1192 const uint64_t *vtable_components_data_begin() const { 1193 return reinterpret_cast<const uint64_t *>(Components.begin()); 1194 } 1195 1196 const uint64_t *vtable_components_data_end() const { 1197 return reinterpret_cast<const uint64_t *>(Components.end()); 1198 } 1199 1200 AddressPointsMapTy::const_iterator address_points_begin() const { 1201 return AddressPoints.begin(); 1202 } 1203 1204 AddressPointsMapTy::const_iterator address_points_end() const { 1205 return AddressPoints.end(); 1206 } 1207 1208 VTableThunksMapTy::const_iterator vtable_thunks_begin() const { 1209 return VTableThunks.begin(); 1210 } 1211 1212 VTableThunksMapTy::const_iterator vtable_thunks_end() const { 1213 return VTableThunks.end(); 1214 } 1215 1216 /// dumpLayout - Dump the vtable layout. 1217 void dumpLayout(llvm::raw_ostream&); 1218 }; 1219 1220 void VTableBuilder::AddThunk(const CXXMethodDecl *MD, const ThunkInfo &Thunk) { 1221 assert(!isBuildingConstructorVTable() && 1222 "Can't add thunks for construction vtable"); 1223 1224 llvm::SmallVector<ThunkInfo, 1> &ThunksVector = Thunks[MD]; 1225 1226 // Check if we have this thunk already. 1227 if (std::find(ThunksVector.begin(), ThunksVector.end(), Thunk) != 1228 ThunksVector.end()) 1229 return; 1230 1231 ThunksVector.push_back(Thunk); 1232 } 1233 1234 typedef llvm::SmallPtrSet<const CXXMethodDecl *, 8> OverriddenMethodsSetTy; 1235 1236 /// ComputeAllOverriddenMethods - Given a method decl, will return a set of all 1237 /// the overridden methods that the function decl overrides. 1238 static void 1239 ComputeAllOverriddenMethods(const CXXMethodDecl *MD, 1240 OverriddenMethodsSetTy& OverriddenMethods) { 1241 assert(MD->isVirtual() && "Method is not virtual!"); 1242 1243 for (CXXMethodDecl::method_iterator I = MD->begin_overridden_methods(), 1244 E = MD->end_overridden_methods(); I != E; ++I) { 1245 const CXXMethodDecl *OverriddenMD = *I; 1246 1247 OverriddenMethods.insert(OverriddenMD); 1248 1249 ComputeAllOverriddenMethods(OverriddenMD, OverriddenMethods); 1250 } 1251 } 1252 1253 void VTableBuilder::ComputeThisAdjustments() { 1254 // Now go through the method info map and see if any of the methods need 1255 // 'this' pointer adjustments. 1256 for (MethodInfoMapTy::const_iterator I = MethodInfoMap.begin(), 1257 E = MethodInfoMap.end(); I != E; ++I) { 1258 const CXXMethodDecl *MD = I->first; 1259 const MethodInfo &MethodInfo = I->second; 1260 1261 // Ignore adjustments for unused function pointers. 1262 uint64_t VTableIndex = MethodInfo.VTableIndex; 1263 if (Components[VTableIndex].getKind() == 1264 VTableComponent::CK_UnusedFunctionPointer) 1265 continue; 1266 1267 // Get the final overrider for this method. 1268 FinalOverriders::OverriderInfo Overrider = 1269 Overriders.getOverrider(MD, MethodInfo.BaseOffset); 1270 1271 // Check if we need an adjustment at all. 1272 if (MethodInfo.BaseOffsetInLayoutClass == Overrider.Offset) { 1273 // When a return thunk is needed by a derived class that overrides a 1274 // virtual base, gcc uses a virtual 'this' adjustment as well. 1275 // While the thunk itself might be needed by vtables in subclasses or 1276 // in construction vtables, there doesn't seem to be a reason for using 1277 // the thunk in this vtable. Still, we do so to match gcc. 1278 if (VTableThunks.lookup(VTableIndex).Return.isEmpty()) 1279 continue; 1280 } 1281 1282 ThisAdjustment ThisAdjustment = 1283 ComputeThisAdjustment(MD, MethodInfo.BaseOffsetInLayoutClass, Overrider); 1284 1285 if (ThisAdjustment.isEmpty()) 1286 continue; 1287 1288 // Add it. 1289 VTableThunks[VTableIndex].This = ThisAdjustment; 1290 1291 if (isa<CXXDestructorDecl>(MD)) { 1292 // Add an adjustment for the deleting destructor as well. 1293 VTableThunks[VTableIndex + 1].This = ThisAdjustment; 1294 } 1295 } 1296 1297 /// Clear the method info map. 1298 MethodInfoMap.clear(); 1299 1300 if (isBuildingConstructorVTable()) { 1301 // We don't need to store thunk information for construction vtables. 1302 return; 1303 } 1304 1305 for (VTableThunksMapTy::const_iterator I = VTableThunks.begin(), 1306 E = VTableThunks.end(); I != E; ++I) { 1307 const VTableComponent &Component = Components[I->first]; 1308 const ThunkInfo &Thunk = I->second; 1309 const CXXMethodDecl *MD; 1310 1311 switch (Component.getKind()) { 1312 default: 1313 llvm_unreachable("Unexpected vtable component kind!"); 1314 case VTableComponent::CK_FunctionPointer: 1315 MD = Component.getFunctionDecl(); 1316 break; 1317 case VTableComponent::CK_CompleteDtorPointer: 1318 MD = Component.getDestructorDecl(); 1319 break; 1320 case VTableComponent::CK_DeletingDtorPointer: 1321 // We've already added the thunk when we saw the complete dtor pointer. 1322 continue; 1323 } 1324 1325 if (MD->getParent() == MostDerivedClass) 1326 AddThunk(MD, Thunk); 1327 } 1328 } 1329 1330 ReturnAdjustment VTableBuilder::ComputeReturnAdjustment(BaseOffset Offset) { 1331 ReturnAdjustment Adjustment; 1332 1333 if (!Offset.isEmpty()) { 1334 if (Offset.VirtualBase) { 1335 // Get the virtual base offset offset. 1336 if (Offset.DerivedClass == MostDerivedClass) { 1337 // We can get the offset offset directly from our map. 1338 Adjustment.VBaseOffsetOffset = 1339 VBaseOffsetOffsets.lookup(Offset.VirtualBase).getQuantity(); 1340 } else { 1341 Adjustment.VBaseOffsetOffset = 1342 VTables.getVirtualBaseOffsetOffset(Offset.DerivedClass, 1343 Offset.VirtualBase).getQuantity(); 1344 } 1345 } 1346 1347 Adjustment.NonVirtual = Offset.NonVirtualOffset.getQuantity(); 1348 } 1349 1350 return Adjustment; 1351 } 1352 1353 BaseOffset 1354 VTableBuilder::ComputeThisAdjustmentBaseOffset(BaseSubobject Base, 1355 BaseSubobject Derived) const { 1356 const CXXRecordDecl *BaseRD = Base.getBase(); 1357 const CXXRecordDecl *DerivedRD = Derived.getBase(); 1358 1359 CXXBasePaths Paths(/*FindAmbiguities=*/true, 1360 /*RecordPaths=*/true, /*DetectVirtual=*/true); 1361 1362 if (!const_cast<CXXRecordDecl *>(DerivedRD)-> 1363 isDerivedFrom(const_cast<CXXRecordDecl *>(BaseRD), Paths)) { 1364 assert(false && "Class must be derived from the passed in base class!"); 1365 return BaseOffset(); 1366 } 1367 1368 // We have to go through all the paths, and see which one leads us to the 1369 // right base subobject. 1370 for (CXXBasePaths::const_paths_iterator I = Paths.begin(), E = Paths.end(); 1371 I != E; ++I) { 1372 BaseOffset Offset = ComputeBaseOffset(Context, DerivedRD, *I); 1373 1374 CharUnits OffsetToBaseSubobject = Offset.NonVirtualOffset; 1375 1376 if (Offset.VirtualBase) { 1377 // If we have a virtual base class, the non-virtual offset is relative 1378 // to the virtual base class offset. 1379 const ASTRecordLayout &LayoutClassLayout = 1380 Context.getASTRecordLayout(LayoutClass); 1381 1382 /// Get the virtual base offset, relative to the most derived class 1383 /// layout. 1384 OffsetToBaseSubobject += 1385 LayoutClassLayout.getVBaseClassOffset(Offset.VirtualBase); 1386 } else { 1387 // Otherwise, the non-virtual offset is relative to the derived class 1388 // offset. 1389 OffsetToBaseSubobject += Derived.getBaseOffset(); 1390 } 1391 1392 // Check if this path gives us the right base subobject. 1393 if (OffsetToBaseSubobject == Base.getBaseOffset()) { 1394 // Since we're going from the base class _to_ the derived class, we'll 1395 // invert the non-virtual offset here. 1396 Offset.NonVirtualOffset = -Offset.NonVirtualOffset; 1397 return Offset; 1398 } 1399 } 1400 1401 return BaseOffset(); 1402 } 1403 1404 ThisAdjustment 1405 VTableBuilder::ComputeThisAdjustment(const CXXMethodDecl *MD, 1406 CharUnits BaseOffsetInLayoutClass, 1407 FinalOverriders::OverriderInfo Overrider) { 1408 // Ignore adjustments for pure virtual member functions. 1409 if (Overrider.Method->isPure()) 1410 return ThisAdjustment(); 1411 1412 BaseSubobject OverriddenBaseSubobject(MD->getParent(), 1413 BaseOffsetInLayoutClass); 1414 1415 BaseSubobject OverriderBaseSubobject(Overrider.Method->getParent(), 1416 Overrider.Offset); 1417 1418 // Compute the adjustment offset. 1419 BaseOffset Offset = ComputeThisAdjustmentBaseOffset(OverriddenBaseSubobject, 1420 OverriderBaseSubobject); 1421 if (Offset.isEmpty()) 1422 return ThisAdjustment(); 1423 1424 ThisAdjustment Adjustment; 1425 1426 if (Offset.VirtualBase) { 1427 // Get the vcall offset map for this virtual base. 1428 VCallOffsetMap &VCallOffsets = VCallOffsetsForVBases[Offset.VirtualBase]; 1429 1430 if (VCallOffsets.empty()) { 1431 // We don't have vcall offsets for this virtual base, go ahead and 1432 // build them. 1433 VCallAndVBaseOffsetBuilder Builder(MostDerivedClass, MostDerivedClass, 1434 /*FinalOverriders=*/0, 1435 BaseSubobject(Offset.VirtualBase, 1436 CharUnits::Zero()), 1437 /*BaseIsVirtual=*/true, 1438 /*OffsetInLayoutClass=*/ 1439 CharUnits::Zero()); 1440 1441 VCallOffsets = Builder.getVCallOffsets(); 1442 } 1443 1444 Adjustment.VCallOffsetOffset = 1445 VCallOffsets.getVCallOffsetOffset(MD).getQuantity(); 1446 } 1447 1448 // Set the non-virtual part of the adjustment. 1449 Adjustment.NonVirtual = Offset.NonVirtualOffset.getQuantity(); 1450 1451 return Adjustment; 1452 } 1453 1454 void 1455 VTableBuilder::AddMethod(const CXXMethodDecl *MD, 1456 ReturnAdjustment ReturnAdjustment) { 1457 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) { 1458 assert(ReturnAdjustment.isEmpty() && 1459 "Destructor can't have return adjustment!"); 1460 1461 // Add both the complete destructor and the deleting destructor. 1462 Components.push_back(VTableComponent::MakeCompleteDtor(DD)); 1463 Components.push_back(VTableComponent::MakeDeletingDtor(DD)); 1464 } else { 1465 // Add the return adjustment if necessary. 1466 if (!ReturnAdjustment.isEmpty()) 1467 VTableThunks[Components.size()].Return = ReturnAdjustment; 1468 1469 // Add the function. 1470 Components.push_back(VTableComponent::MakeFunction(MD)); 1471 } 1472 } 1473 1474 /// OverridesIndirectMethodInBase - Return whether the given member function 1475 /// overrides any methods in the set of given bases. 1476 /// Unlike OverridesMethodInBase, this checks "overriders of overriders". 1477 /// For example, if we have: 1478 /// 1479 /// struct A { virtual void f(); } 1480 /// struct B : A { virtual void f(); } 1481 /// struct C : B { virtual void f(); } 1482 /// 1483 /// OverridesIndirectMethodInBase will return true if given C::f as the method 1484 /// and { A } as the set of bases. 1485 static bool 1486 OverridesIndirectMethodInBases(const CXXMethodDecl *MD, 1487 VTableBuilder::PrimaryBasesSetVectorTy &Bases) { 1488 if (Bases.count(MD->getParent())) 1489 return true; 1490 1491 for (CXXMethodDecl::method_iterator I = MD->begin_overridden_methods(), 1492 E = MD->end_overridden_methods(); I != E; ++I) { 1493 const CXXMethodDecl *OverriddenMD = *I; 1494 1495 // Check "indirect overriders". 1496 if (OverridesIndirectMethodInBases(OverriddenMD, Bases)) 1497 return true; 1498 } 1499 1500 return false; 1501 } 1502 1503 bool 1504 VTableBuilder::IsOverriderUsed(const CXXMethodDecl *Overrider, 1505 CharUnits BaseOffsetInLayoutClass, 1506 const CXXRecordDecl *FirstBaseInPrimaryBaseChain, 1507 CharUnits FirstBaseOffsetInLayoutClass) const { 1508 // If the base and the first base in the primary base chain have the same 1509 // offsets, then this overrider will be used. 1510 if (BaseOffsetInLayoutClass == FirstBaseOffsetInLayoutClass) 1511 return true; 1512 1513 // We know now that Base (or a direct or indirect base of it) is a primary 1514 // base in part of the class hierarchy, but not a primary base in the most 1515 // derived class. 1516 1517 // If the overrider is the first base in the primary base chain, we know 1518 // that the overrider will be used. 1519 if (Overrider->getParent() == FirstBaseInPrimaryBaseChain) 1520 return true; 1521 1522 VTableBuilder::PrimaryBasesSetVectorTy PrimaryBases; 1523 1524 const CXXRecordDecl *RD = FirstBaseInPrimaryBaseChain; 1525 PrimaryBases.insert(RD); 1526 1527 // Now traverse the base chain, starting with the first base, until we find 1528 // the base that is no longer a primary base. 1529 while (true) { 1530 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 1531 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 1532 1533 if (!PrimaryBase) 1534 break; 1535 1536 if (Layout.isPrimaryBaseVirtual()) { 1537 assert(Layout.getVBaseClassOffsetInBits(PrimaryBase) == 0 && 1538 "Primary base should always be at offset 0!"); 1539 1540 const ASTRecordLayout &LayoutClassLayout = 1541 Context.getASTRecordLayout(LayoutClass); 1542 1543 // Now check if this is the primary base that is not a primary base in the 1544 // most derived class. 1545 if (LayoutClassLayout.getVBaseClassOffset(PrimaryBase) != 1546 FirstBaseOffsetInLayoutClass) { 1547 // We found it, stop walking the chain. 1548 break; 1549 } 1550 } else { 1551 assert(Layout.getBaseClassOffsetInBits(PrimaryBase) == 0 && 1552 "Primary base should always be at offset 0!"); 1553 } 1554 1555 if (!PrimaryBases.insert(PrimaryBase)) 1556 assert(false && "Found a duplicate primary base!"); 1557 1558 RD = PrimaryBase; 1559 } 1560 1561 // If the final overrider is an override of one of the primary bases, 1562 // then we know that it will be used. 1563 return OverridesIndirectMethodInBases(Overrider, PrimaryBases); 1564 } 1565 1566 /// FindNearestOverriddenMethod - Given a method, returns the overridden method 1567 /// from the nearest base. Returns null if no method was found. 1568 static const CXXMethodDecl * 1569 FindNearestOverriddenMethod(const CXXMethodDecl *MD, 1570 VTableBuilder::PrimaryBasesSetVectorTy &Bases) { 1571 OverriddenMethodsSetTy OverriddenMethods; 1572 ComputeAllOverriddenMethods(MD, OverriddenMethods); 1573 1574 for (int I = Bases.size(), E = 0; I != E; --I) { 1575 const CXXRecordDecl *PrimaryBase = Bases[I - 1]; 1576 1577 // Now check the overriden methods. 1578 for (OverriddenMethodsSetTy::const_iterator I = OverriddenMethods.begin(), 1579 E = OverriddenMethods.end(); I != E; ++I) { 1580 const CXXMethodDecl *OverriddenMD = *I; 1581 1582 // We found our overridden method. 1583 if (OverriddenMD->getParent() == PrimaryBase) 1584 return OverriddenMD; 1585 } 1586 } 1587 1588 return 0; 1589 } 1590 1591 void 1592 VTableBuilder::AddMethods(BaseSubobject Base, CharUnits BaseOffsetInLayoutClass, 1593 const CXXRecordDecl *FirstBaseInPrimaryBaseChain, 1594 CharUnits FirstBaseOffsetInLayoutClass, 1595 PrimaryBasesSetVectorTy &PrimaryBases) { 1596 const CXXRecordDecl *RD = Base.getBase(); 1597 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 1598 1599 if (const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase()) { 1600 CharUnits PrimaryBaseOffset; 1601 CharUnits PrimaryBaseOffsetInLayoutClass; 1602 if (Layout.isPrimaryBaseVirtual()) { 1603 assert(Layout.getVBaseClassOffsetInBits(PrimaryBase) == 0 && 1604 "Primary vbase should have a zero offset!"); 1605 1606 const ASTRecordLayout &MostDerivedClassLayout = 1607 Context.getASTRecordLayout(MostDerivedClass); 1608 1609 PrimaryBaseOffset = 1610 MostDerivedClassLayout.getVBaseClassOffset(PrimaryBase); 1611 1612 const ASTRecordLayout &LayoutClassLayout = 1613 Context.getASTRecordLayout(LayoutClass); 1614 1615 PrimaryBaseOffsetInLayoutClass = 1616 LayoutClassLayout.getVBaseClassOffset(PrimaryBase); 1617 } else { 1618 assert(Layout.getBaseClassOffsetInBits(PrimaryBase) == 0 && 1619 "Primary base should have a zero offset!"); 1620 1621 PrimaryBaseOffset = Base.getBaseOffset(); 1622 PrimaryBaseOffsetInLayoutClass = BaseOffsetInLayoutClass; 1623 } 1624 1625 AddMethods(BaseSubobject(PrimaryBase, PrimaryBaseOffset), 1626 PrimaryBaseOffsetInLayoutClass, FirstBaseInPrimaryBaseChain, 1627 FirstBaseOffsetInLayoutClass, PrimaryBases); 1628 1629 if (!PrimaryBases.insert(PrimaryBase)) 1630 assert(false && "Found a duplicate primary base!"); 1631 } 1632 1633 // Now go through all virtual member functions and add them. 1634 for (CXXRecordDecl::method_iterator I = RD->method_begin(), 1635 E = RD->method_end(); I != E; ++I) { 1636 const CXXMethodDecl *MD = *I; 1637 1638 if (!MD->isVirtual()) 1639 continue; 1640 1641 // Get the final overrider. 1642 FinalOverriders::OverriderInfo Overrider = 1643 Overriders.getOverrider(MD, Base.getBaseOffset()); 1644 1645 // Check if this virtual member function overrides a method in a primary 1646 // base. If this is the case, and the return type doesn't require adjustment 1647 // then we can just use the member function from the primary base. 1648 if (const CXXMethodDecl *OverriddenMD = 1649 FindNearestOverriddenMethod(MD, PrimaryBases)) { 1650 if (ComputeReturnAdjustmentBaseOffset(Context, MD, 1651 OverriddenMD).isEmpty()) { 1652 // Replace the method info of the overridden method with our own 1653 // method. 1654 assert(MethodInfoMap.count(OverriddenMD) && 1655 "Did not find the overridden method!"); 1656 MethodInfo &OverriddenMethodInfo = MethodInfoMap[OverriddenMD]; 1657 1658 MethodInfo MethodInfo(Base.getBaseOffset(), BaseOffsetInLayoutClass, 1659 OverriddenMethodInfo.VTableIndex); 1660 1661 assert(!MethodInfoMap.count(MD) && 1662 "Should not have method info for this method yet!"); 1663 1664 MethodInfoMap.insert(std::make_pair(MD, MethodInfo)); 1665 MethodInfoMap.erase(OverriddenMD); 1666 1667 // If the overridden method exists in a virtual base class or a direct 1668 // or indirect base class of a virtual base class, we need to emit a 1669 // thunk if we ever have a class hierarchy where the base class is not 1670 // a primary base in the complete object. 1671 if (!isBuildingConstructorVTable() && OverriddenMD != MD) { 1672 // Compute the this adjustment. 1673 ThisAdjustment ThisAdjustment = 1674 ComputeThisAdjustment(OverriddenMD, BaseOffsetInLayoutClass, 1675 Overrider); 1676 1677 if (ThisAdjustment.VCallOffsetOffset && 1678 Overrider.Method->getParent() == MostDerivedClass) { 1679 1680 // There's no return adjustment from OverriddenMD and MD, 1681 // but that doesn't mean there isn't one between MD and 1682 // the final overrider. 1683 BaseOffset ReturnAdjustmentOffset = 1684 ComputeReturnAdjustmentBaseOffset(Context, Overrider.Method, MD); 1685 ReturnAdjustment ReturnAdjustment = 1686 ComputeReturnAdjustment(ReturnAdjustmentOffset); 1687 1688 // This is a virtual thunk for the most derived class, add it. 1689 AddThunk(Overrider.Method, 1690 ThunkInfo(ThisAdjustment, ReturnAdjustment)); 1691 } 1692 } 1693 1694 continue; 1695 } 1696 } 1697 1698 // Insert the method info for this method. 1699 MethodInfo MethodInfo(Base.getBaseOffset(), BaseOffsetInLayoutClass, 1700 Components.size()); 1701 1702 assert(!MethodInfoMap.count(MD) && 1703 "Should not have method info for this method yet!"); 1704 MethodInfoMap.insert(std::make_pair(MD, MethodInfo)); 1705 1706 // Check if this overrider is going to be used. 1707 const CXXMethodDecl *OverriderMD = Overrider.Method; 1708 if (!IsOverriderUsed(OverriderMD, BaseOffsetInLayoutClass, 1709 FirstBaseInPrimaryBaseChain, 1710 FirstBaseOffsetInLayoutClass)) { 1711 Components.push_back(VTableComponent::MakeUnusedFunction(OverriderMD)); 1712 continue; 1713 } 1714 1715 // Check if this overrider needs a return adjustment. 1716 // We don't want to do this for pure virtual member functions. 1717 BaseOffset ReturnAdjustmentOffset; 1718 if (!OverriderMD->isPure()) { 1719 ReturnAdjustmentOffset = 1720 ComputeReturnAdjustmentBaseOffset(Context, OverriderMD, MD); 1721 } 1722 1723 ReturnAdjustment ReturnAdjustment = 1724 ComputeReturnAdjustment(ReturnAdjustmentOffset); 1725 1726 AddMethod(Overrider.Method, ReturnAdjustment); 1727 } 1728 } 1729 1730 void VTableBuilder::LayoutVTable() { 1731 LayoutPrimaryAndSecondaryVTables(BaseSubobject(MostDerivedClass, 1732 CharUnits::Zero()), 1733 /*BaseIsMorallyVirtual=*/false, 1734 MostDerivedClassIsVirtual, 1735 MostDerivedClassOffset); 1736 1737 VisitedVirtualBasesSetTy VBases; 1738 1739 // Determine the primary virtual bases. 1740 DeterminePrimaryVirtualBases(MostDerivedClass, MostDerivedClassOffset, 1741 VBases); 1742 VBases.clear(); 1743 1744 LayoutVTablesForVirtualBases(MostDerivedClass, VBases); 1745 } 1746 1747 void 1748 VTableBuilder::LayoutPrimaryAndSecondaryVTables(BaseSubobject Base, 1749 bool BaseIsMorallyVirtual, 1750 bool BaseIsVirtualInLayoutClass, 1751 CharUnits OffsetInLayoutClass) { 1752 assert(Base.getBase()->isDynamicClass() && "class does not have a vtable!"); 1753 1754 // Add vcall and vbase offsets for this vtable. 1755 VCallAndVBaseOffsetBuilder Builder(MostDerivedClass, LayoutClass, &Overriders, 1756 Base, BaseIsVirtualInLayoutClass, 1757 OffsetInLayoutClass); 1758 Components.append(Builder.components_begin(), Builder.components_end()); 1759 1760 // Check if we need to add these vcall offsets. 1761 if (BaseIsVirtualInLayoutClass && !Builder.getVCallOffsets().empty()) { 1762 VCallOffsetMap &VCallOffsets = VCallOffsetsForVBases[Base.getBase()]; 1763 1764 if (VCallOffsets.empty()) 1765 VCallOffsets = Builder.getVCallOffsets(); 1766 } 1767 1768 // If we're laying out the most derived class we want to keep track of the 1769 // virtual base class offset offsets. 1770 if (Base.getBase() == MostDerivedClass) 1771 VBaseOffsetOffsets = Builder.getVBaseOffsetOffsets(); 1772 1773 // Add the offset to top. 1774 CharUnits OffsetToTop = MostDerivedClassOffset - OffsetInLayoutClass; 1775 Components.push_back( 1776 VTableComponent::MakeOffsetToTop(OffsetToTop)); 1777 1778 // Next, add the RTTI. 1779 Components.push_back(VTableComponent::MakeRTTI(MostDerivedClass)); 1780 1781 uint64_t AddressPoint = Components.size(); 1782 1783 // Now go through all virtual member functions and add them. 1784 PrimaryBasesSetVectorTy PrimaryBases; 1785 AddMethods(Base, OffsetInLayoutClass, 1786 Base.getBase(), OffsetInLayoutClass, 1787 PrimaryBases); 1788 1789 // Compute 'this' pointer adjustments. 1790 ComputeThisAdjustments(); 1791 1792 // Add all address points. 1793 const CXXRecordDecl *RD = Base.getBase(); 1794 while (true) { 1795 AddressPoints.insert(std::make_pair( 1796 BaseSubobject(RD, OffsetInLayoutClass), 1797 AddressPoint)); 1798 1799 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 1800 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 1801 1802 if (!PrimaryBase) 1803 break; 1804 1805 if (Layout.isPrimaryBaseVirtual()) { 1806 // Check if this virtual primary base is a primary base in the layout 1807 // class. If it's not, we don't want to add it. 1808 const ASTRecordLayout &LayoutClassLayout = 1809 Context.getASTRecordLayout(LayoutClass); 1810 1811 if (LayoutClassLayout.getVBaseClassOffset(PrimaryBase) != 1812 OffsetInLayoutClass) { 1813 // We don't want to add this class (or any of its primary bases). 1814 break; 1815 } 1816 } 1817 1818 RD = PrimaryBase; 1819 } 1820 1821 // Layout secondary vtables. 1822 LayoutSecondaryVTables(Base, BaseIsMorallyVirtual, OffsetInLayoutClass); 1823 } 1824 1825 void VTableBuilder::LayoutSecondaryVTables(BaseSubobject Base, 1826 bool BaseIsMorallyVirtual, 1827 CharUnits OffsetInLayoutClass) { 1828 // Itanium C++ ABI 2.5.2: 1829 // Following the primary virtual table of a derived class are secondary 1830 // virtual tables for each of its proper base classes, except any primary 1831 // base(s) with which it shares its primary virtual table. 1832 1833 const CXXRecordDecl *RD = Base.getBase(); 1834 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 1835 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 1836 1837 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 1838 E = RD->bases_end(); I != E; ++I) { 1839 // Ignore virtual bases, we'll emit them later. 1840 if (I->isVirtual()) 1841 continue; 1842 1843 const CXXRecordDecl *BaseDecl = 1844 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 1845 1846 // Ignore bases that don't have a vtable. 1847 if (!BaseDecl->isDynamicClass()) 1848 continue; 1849 1850 if (isBuildingConstructorVTable()) { 1851 // Itanium C++ ABI 2.6.4: 1852 // Some of the base class subobjects may not need construction virtual 1853 // tables, which will therefore not be present in the construction 1854 // virtual table group, even though the subobject virtual tables are 1855 // present in the main virtual table group for the complete object. 1856 if (!BaseIsMorallyVirtual && !BaseDecl->getNumVBases()) 1857 continue; 1858 } 1859 1860 // Get the base offset of this base. 1861 CharUnits RelativeBaseOffset = Layout.getBaseClassOffset(BaseDecl); 1862 CharUnits BaseOffset = Base.getBaseOffset() + RelativeBaseOffset; 1863 1864 CharUnits BaseOffsetInLayoutClass = 1865 OffsetInLayoutClass + RelativeBaseOffset; 1866 1867 // Don't emit a secondary vtable for a primary base. We might however want 1868 // to emit secondary vtables for other bases of this base. 1869 if (BaseDecl == PrimaryBase) { 1870 LayoutSecondaryVTables(BaseSubobject(BaseDecl, BaseOffset), 1871 BaseIsMorallyVirtual, BaseOffsetInLayoutClass); 1872 continue; 1873 } 1874 1875 // Layout the primary vtable (and any secondary vtables) for this base. 1876 LayoutPrimaryAndSecondaryVTables( 1877 BaseSubobject(BaseDecl, BaseOffset), 1878 BaseIsMorallyVirtual, 1879 /*BaseIsVirtualInLayoutClass=*/false, 1880 BaseOffsetInLayoutClass); 1881 } 1882 } 1883 1884 void 1885 VTableBuilder::DeterminePrimaryVirtualBases(const CXXRecordDecl *RD, 1886 CharUnits OffsetInLayoutClass, 1887 VisitedVirtualBasesSetTy &VBases) { 1888 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 1889 1890 // Check if this base has a primary base. 1891 if (const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase()) { 1892 1893 // Check if it's virtual. 1894 if (Layout.isPrimaryBaseVirtual()) { 1895 bool IsPrimaryVirtualBase = true; 1896 1897 if (isBuildingConstructorVTable()) { 1898 // Check if the base is actually a primary base in the class we use for 1899 // layout. 1900 const ASTRecordLayout &LayoutClassLayout = 1901 Context.getASTRecordLayout(LayoutClass); 1902 1903 CharUnits PrimaryBaseOffsetInLayoutClass = 1904 LayoutClassLayout.getVBaseClassOffset(PrimaryBase); 1905 1906 // We know that the base is not a primary base in the layout class if 1907 // the base offsets are different. 1908 if (PrimaryBaseOffsetInLayoutClass != OffsetInLayoutClass) 1909 IsPrimaryVirtualBase = false; 1910 } 1911 1912 if (IsPrimaryVirtualBase) 1913 PrimaryVirtualBases.insert(PrimaryBase); 1914 } 1915 } 1916 1917 // Traverse bases, looking for more primary virtual bases. 1918 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 1919 E = RD->bases_end(); I != E; ++I) { 1920 const CXXRecordDecl *BaseDecl = 1921 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 1922 1923 CharUnits BaseOffsetInLayoutClass; 1924 1925 if (I->isVirtual()) { 1926 if (!VBases.insert(BaseDecl)) 1927 continue; 1928 1929 const ASTRecordLayout &LayoutClassLayout = 1930 Context.getASTRecordLayout(LayoutClass); 1931 1932 BaseOffsetInLayoutClass = 1933 LayoutClassLayout.getVBaseClassOffset(BaseDecl); 1934 } else { 1935 BaseOffsetInLayoutClass = 1936 OffsetInLayoutClass + Layout.getBaseClassOffset(BaseDecl); 1937 } 1938 1939 DeterminePrimaryVirtualBases(BaseDecl, BaseOffsetInLayoutClass, VBases); 1940 } 1941 } 1942 1943 void 1944 VTableBuilder::LayoutVTablesForVirtualBases(const CXXRecordDecl *RD, 1945 VisitedVirtualBasesSetTy &VBases) { 1946 // Itanium C++ ABI 2.5.2: 1947 // Then come the virtual base virtual tables, also in inheritance graph 1948 // order, and again excluding primary bases (which share virtual tables with 1949 // the classes for which they are primary). 1950 for (CXXRecordDecl::base_class_const_iterator I = RD->bases_begin(), 1951 E = RD->bases_end(); I != E; ++I) { 1952 const CXXRecordDecl *BaseDecl = 1953 cast<CXXRecordDecl>(I->getType()->getAs<RecordType>()->getDecl()); 1954 1955 // Check if this base needs a vtable. (If it's virtual, not a primary base 1956 // of some other class, and we haven't visited it before). 1957 if (I->isVirtual() && BaseDecl->isDynamicClass() && 1958 !PrimaryVirtualBases.count(BaseDecl) && VBases.insert(BaseDecl)) { 1959 const ASTRecordLayout &MostDerivedClassLayout = 1960 Context.getASTRecordLayout(MostDerivedClass); 1961 CharUnits BaseOffset = 1962 MostDerivedClassLayout.getVBaseClassOffset(BaseDecl); 1963 1964 const ASTRecordLayout &LayoutClassLayout = 1965 Context.getASTRecordLayout(LayoutClass); 1966 CharUnits BaseOffsetInLayoutClass = 1967 LayoutClassLayout.getVBaseClassOffset(BaseDecl); 1968 1969 LayoutPrimaryAndSecondaryVTables( 1970 BaseSubobject(BaseDecl, BaseOffset), 1971 /*BaseIsMorallyVirtual=*/true, 1972 /*BaseIsVirtualInLayoutClass=*/true, 1973 BaseOffsetInLayoutClass); 1974 } 1975 1976 // We only need to check the base for virtual base vtables if it actually 1977 // has virtual bases. 1978 if (BaseDecl->getNumVBases()) 1979 LayoutVTablesForVirtualBases(BaseDecl, VBases); 1980 } 1981 } 1982 1983 /// dumpLayout - Dump the vtable layout. 1984 void VTableBuilder::dumpLayout(llvm::raw_ostream& Out) { 1985 1986 if (isBuildingConstructorVTable()) { 1987 Out << "Construction vtable for ('"; 1988 Out << MostDerivedClass->getQualifiedNameAsString() << "', "; 1989 Out << MostDerivedClassOffset.getQuantity() << ") in '"; 1990 Out << LayoutClass->getQualifiedNameAsString(); 1991 } else { 1992 Out << "Vtable for '"; 1993 Out << MostDerivedClass->getQualifiedNameAsString(); 1994 } 1995 Out << "' (" << Components.size() << " entries).\n"; 1996 1997 // Iterate through the address points and insert them into a new map where 1998 // they are keyed by the index and not the base object. 1999 // Since an address point can be shared by multiple subobjects, we use an 2000 // STL multimap. 2001 std::multimap<uint64_t, BaseSubobject> AddressPointsByIndex; 2002 for (AddressPointsMapTy::const_iterator I = AddressPoints.begin(), 2003 E = AddressPoints.end(); I != E; ++I) { 2004 const BaseSubobject& Base = I->first; 2005 uint64_t Index = I->second; 2006 2007 AddressPointsByIndex.insert(std::make_pair(Index, Base)); 2008 } 2009 2010 for (unsigned I = 0, E = Components.size(); I != E; ++I) { 2011 uint64_t Index = I; 2012 2013 Out << llvm::format("%4d | ", I); 2014 2015 const VTableComponent &Component = Components[I]; 2016 2017 // Dump the component. 2018 switch (Component.getKind()) { 2019 2020 case VTableComponent::CK_VCallOffset: 2021 Out << "vcall_offset (" 2022 << Component.getVCallOffset().getQuantity() 2023 << ")"; 2024 break; 2025 2026 case VTableComponent::CK_VBaseOffset: 2027 Out << "vbase_offset (" 2028 << Component.getVBaseOffset().getQuantity() 2029 << ")"; 2030 break; 2031 2032 case VTableComponent::CK_OffsetToTop: 2033 Out << "offset_to_top (" 2034 << Component.getOffsetToTop().getQuantity() 2035 << ")"; 2036 break; 2037 2038 case VTableComponent::CK_RTTI: 2039 Out << Component.getRTTIDecl()->getQualifiedNameAsString() << " RTTI"; 2040 break; 2041 2042 case VTableComponent::CK_FunctionPointer: { 2043 const CXXMethodDecl *MD = Component.getFunctionDecl(); 2044 2045 std::string Str = 2046 PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual, 2047 MD); 2048 Out << Str; 2049 if (MD->isPure()) 2050 Out << " [pure]"; 2051 2052 ThunkInfo Thunk = VTableThunks.lookup(I); 2053 if (!Thunk.isEmpty()) { 2054 // If this function pointer has a return adjustment, dump it. 2055 if (!Thunk.Return.isEmpty()) { 2056 Out << "\n [return adjustment: "; 2057 Out << Thunk.Return.NonVirtual << " non-virtual"; 2058 2059 if (Thunk.Return.VBaseOffsetOffset) { 2060 Out << ", " << Thunk.Return.VBaseOffsetOffset; 2061 Out << " vbase offset offset"; 2062 } 2063 2064 Out << ']'; 2065 } 2066 2067 // If this function pointer has a 'this' pointer adjustment, dump it. 2068 if (!Thunk.This.isEmpty()) { 2069 Out << "\n [this adjustment: "; 2070 Out << Thunk.This.NonVirtual << " non-virtual"; 2071 2072 if (Thunk.This.VCallOffsetOffset) { 2073 Out << ", " << Thunk.This.VCallOffsetOffset; 2074 Out << " vcall offset offset"; 2075 } 2076 2077 Out << ']'; 2078 } 2079 } 2080 2081 break; 2082 } 2083 2084 case VTableComponent::CK_CompleteDtorPointer: 2085 case VTableComponent::CK_DeletingDtorPointer: { 2086 bool IsComplete = 2087 Component.getKind() == VTableComponent::CK_CompleteDtorPointer; 2088 2089 const CXXDestructorDecl *DD = Component.getDestructorDecl(); 2090 2091 Out << DD->getQualifiedNameAsString(); 2092 if (IsComplete) 2093 Out << "() [complete]"; 2094 else 2095 Out << "() [deleting]"; 2096 2097 if (DD->isPure()) 2098 Out << " [pure]"; 2099 2100 ThunkInfo Thunk = VTableThunks.lookup(I); 2101 if (!Thunk.isEmpty()) { 2102 // If this destructor has a 'this' pointer adjustment, dump it. 2103 if (!Thunk.This.isEmpty()) { 2104 Out << "\n [this adjustment: "; 2105 Out << Thunk.This.NonVirtual << " non-virtual"; 2106 2107 if (Thunk.This.VCallOffsetOffset) { 2108 Out << ", " << Thunk.This.VCallOffsetOffset; 2109 Out << " vcall offset offset"; 2110 } 2111 2112 Out << ']'; 2113 } 2114 } 2115 2116 break; 2117 } 2118 2119 case VTableComponent::CK_UnusedFunctionPointer: { 2120 const CXXMethodDecl *MD = Component.getUnusedFunctionDecl(); 2121 2122 std::string Str = 2123 PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual, 2124 MD); 2125 Out << "[unused] " << Str; 2126 if (MD->isPure()) 2127 Out << " [pure]"; 2128 } 2129 2130 } 2131 2132 Out << '\n'; 2133 2134 // Dump the next address point. 2135 uint64_t NextIndex = Index + 1; 2136 if (AddressPointsByIndex.count(NextIndex)) { 2137 if (AddressPointsByIndex.count(NextIndex) == 1) { 2138 const BaseSubobject &Base = 2139 AddressPointsByIndex.find(NextIndex)->second; 2140 2141 Out << " -- (" << Base.getBase()->getQualifiedNameAsString(); 2142 Out << ", " << Base.getBaseOffset().getQuantity(); 2143 Out << ") vtable address --\n"; 2144 } else { 2145 CharUnits BaseOffset = 2146 AddressPointsByIndex.lower_bound(NextIndex)->second.getBaseOffset(); 2147 2148 // We store the class names in a set to get a stable order. 2149 std::set<std::string> ClassNames; 2150 for (std::multimap<uint64_t, BaseSubobject>::const_iterator I = 2151 AddressPointsByIndex.lower_bound(NextIndex), E = 2152 AddressPointsByIndex.upper_bound(NextIndex); I != E; ++I) { 2153 assert(I->second.getBaseOffset() == BaseOffset && 2154 "Invalid base offset!"); 2155 const CXXRecordDecl *RD = I->second.getBase(); 2156 ClassNames.insert(RD->getQualifiedNameAsString()); 2157 } 2158 2159 for (std::set<std::string>::const_iterator I = ClassNames.begin(), 2160 E = ClassNames.end(); I != E; ++I) { 2161 Out << " -- (" << *I; 2162 Out << ", " << BaseOffset.getQuantity() << ") vtable address --\n"; 2163 } 2164 } 2165 } 2166 } 2167 2168 Out << '\n'; 2169 2170 if (isBuildingConstructorVTable()) 2171 return; 2172 2173 if (MostDerivedClass->getNumVBases()) { 2174 // We store the virtual base class names and their offsets in a map to get 2175 // a stable order. 2176 2177 std::map<std::string, CharUnits> ClassNamesAndOffsets; 2178 for (VBaseOffsetOffsetsMapTy::const_iterator I = VBaseOffsetOffsets.begin(), 2179 E = VBaseOffsetOffsets.end(); I != E; ++I) { 2180 std::string ClassName = I->first->getQualifiedNameAsString(); 2181 CharUnits OffsetOffset = I->second; 2182 ClassNamesAndOffsets.insert( 2183 std::make_pair(ClassName, OffsetOffset)); 2184 } 2185 2186 Out << "Virtual base offset offsets for '"; 2187 Out << MostDerivedClass->getQualifiedNameAsString() << "' ("; 2188 Out << ClassNamesAndOffsets.size(); 2189 Out << (ClassNamesAndOffsets.size() == 1 ? " entry" : " entries") << ").\n"; 2190 2191 for (std::map<std::string, CharUnits>::const_iterator I = 2192 ClassNamesAndOffsets.begin(), E = ClassNamesAndOffsets.end(); 2193 I != E; ++I) 2194 Out << " " << I->first << " | " << I->second.getQuantity() << '\n'; 2195 2196 Out << "\n"; 2197 } 2198 2199 if (!Thunks.empty()) { 2200 // We store the method names in a map to get a stable order. 2201 std::map<std::string, const CXXMethodDecl *> MethodNamesAndDecls; 2202 2203 for (ThunksMapTy::const_iterator I = Thunks.begin(), E = Thunks.end(); 2204 I != E; ++I) { 2205 const CXXMethodDecl *MD = I->first; 2206 std::string MethodName = 2207 PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual, 2208 MD); 2209 2210 MethodNamesAndDecls.insert(std::make_pair(MethodName, MD)); 2211 } 2212 2213 for (std::map<std::string, const CXXMethodDecl *>::const_iterator I = 2214 MethodNamesAndDecls.begin(), E = MethodNamesAndDecls.end(); 2215 I != E; ++I) { 2216 const std::string &MethodName = I->first; 2217 const CXXMethodDecl *MD = I->second; 2218 2219 ThunkInfoVectorTy ThunksVector = Thunks[MD]; 2220 std::sort(ThunksVector.begin(), ThunksVector.end()); 2221 2222 Out << "Thunks for '" << MethodName << "' (" << ThunksVector.size(); 2223 Out << (ThunksVector.size() == 1 ? " entry" : " entries") << ").\n"; 2224 2225 for (unsigned I = 0, E = ThunksVector.size(); I != E; ++I) { 2226 const ThunkInfo &Thunk = ThunksVector[I]; 2227 2228 Out << llvm::format("%4d | ", I); 2229 2230 // If this function pointer has a return pointer adjustment, dump it. 2231 if (!Thunk.Return.isEmpty()) { 2232 Out << "return adjustment: " << Thunk.This.NonVirtual; 2233 Out << " non-virtual"; 2234 if (Thunk.Return.VBaseOffsetOffset) { 2235 Out << ", " << Thunk.Return.VBaseOffsetOffset; 2236 Out << " vbase offset offset"; 2237 } 2238 2239 if (!Thunk.This.isEmpty()) 2240 Out << "\n "; 2241 } 2242 2243 // If this function pointer has a 'this' pointer adjustment, dump it. 2244 if (!Thunk.This.isEmpty()) { 2245 Out << "this adjustment: "; 2246 Out << Thunk.This.NonVirtual << " non-virtual"; 2247 2248 if (Thunk.This.VCallOffsetOffset) { 2249 Out << ", " << Thunk.This.VCallOffsetOffset; 2250 Out << " vcall offset offset"; 2251 } 2252 } 2253 2254 Out << '\n'; 2255 } 2256 2257 Out << '\n'; 2258 } 2259 } 2260 2261 // Compute the vtable indices for all the member functions. 2262 // Store them in a map keyed by the index so we'll get a sorted table. 2263 std::map<uint64_t, std::string> IndicesMap; 2264 2265 for (CXXRecordDecl::method_iterator i = MostDerivedClass->method_begin(), 2266 e = MostDerivedClass->method_end(); i != e; ++i) { 2267 const CXXMethodDecl *MD = *i; 2268 2269 // We only want virtual member functions. 2270 if (!MD->isVirtual()) 2271 continue; 2272 2273 std::string MethodName = 2274 PredefinedExpr::ComputeName(PredefinedExpr::PrettyFunctionNoVirtual, 2275 MD); 2276 2277 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) { 2278 IndicesMap[VTables.getMethodVTableIndex(GlobalDecl(DD, Dtor_Complete))] = 2279 MethodName + " [complete]"; 2280 IndicesMap[VTables.getMethodVTableIndex(GlobalDecl(DD, Dtor_Deleting))] = 2281 MethodName + " [deleting]"; 2282 } else { 2283 IndicesMap[VTables.getMethodVTableIndex(MD)] = MethodName; 2284 } 2285 } 2286 2287 // Print the vtable indices for all the member functions. 2288 if (!IndicesMap.empty()) { 2289 Out << "VTable indices for '"; 2290 Out << MostDerivedClass->getQualifiedNameAsString(); 2291 Out << "' (" << IndicesMap.size() << " entries).\n"; 2292 2293 for (std::map<uint64_t, std::string>::const_iterator I = IndicesMap.begin(), 2294 E = IndicesMap.end(); I != E; ++I) { 2295 uint64_t VTableIndex = I->first; 2296 const std::string &MethodName = I->second; 2297 2298 Out << llvm::format(" %4u | ", VTableIndex) << MethodName << '\n'; 2299 } 2300 } 2301 2302 Out << '\n'; 2303 } 2304 2305 } 2306 2307 static void 2308 CollectPrimaryBases(const CXXRecordDecl *RD, ASTContext &Context, 2309 VTableBuilder::PrimaryBasesSetVectorTy &PrimaryBases) { 2310 const ASTRecordLayout &Layout = Context.getASTRecordLayout(RD); 2311 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 2312 2313 if (!PrimaryBase) 2314 return; 2315 2316 CollectPrimaryBases(PrimaryBase, Context, PrimaryBases); 2317 2318 if (!PrimaryBases.insert(PrimaryBase)) 2319 assert(false && "Found a duplicate primary base!"); 2320 } 2321 2322 void CodeGenVTables::ComputeMethodVTableIndices(const CXXRecordDecl *RD) { 2323 2324 // Itanium C++ ABI 2.5.2: 2325 // The order of the virtual function pointers in a virtual table is the 2326 // order of declaration of the corresponding member functions in the class. 2327 // 2328 // There is an entry for any virtual function declared in a class, 2329 // whether it is a new function or overrides a base class function, 2330 // unless it overrides a function from the primary base, and conversion 2331 // between their return types does not require an adjustment. 2332 2333 int64_t CurrentIndex = 0; 2334 2335 const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD); 2336 const CXXRecordDecl *PrimaryBase = Layout.getPrimaryBase(); 2337 2338 if (PrimaryBase) { 2339 assert(PrimaryBase->isDefinition() && 2340 "Should have the definition decl of the primary base!"); 2341 2342 // Since the record decl shares its vtable pointer with the primary base 2343 // we need to start counting at the end of the primary base's vtable. 2344 CurrentIndex = getNumVirtualFunctionPointers(PrimaryBase); 2345 } 2346 2347 // Collect all the primary bases, so we can check whether methods override 2348 // a method from the base. 2349 VTableBuilder::PrimaryBasesSetVectorTy PrimaryBases; 2350 CollectPrimaryBases(RD, CGM.getContext(), PrimaryBases); 2351 2352 const CXXDestructorDecl *ImplicitVirtualDtor = 0; 2353 2354 for (CXXRecordDecl::method_iterator i = RD->method_begin(), 2355 e = RD->method_end(); i != e; ++i) { 2356 const CXXMethodDecl *MD = *i; 2357 2358 // We only want virtual methods. 2359 if (!MD->isVirtual()) 2360 continue; 2361 2362 // Check if this method overrides a method in the primary base. 2363 if (const CXXMethodDecl *OverriddenMD = 2364 FindNearestOverriddenMethod(MD, PrimaryBases)) { 2365 // Check if converting from the return type of the method to the 2366 // return type of the overridden method requires conversion. 2367 if (ComputeReturnAdjustmentBaseOffset(CGM.getContext(), MD, 2368 OverriddenMD).isEmpty()) { 2369 // This index is shared between the index in the vtable of the primary 2370 // base class. 2371 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) { 2372 const CXXDestructorDecl *OverriddenDD = 2373 cast<CXXDestructorDecl>(OverriddenMD); 2374 2375 // Add both the complete and deleting entries. 2376 MethodVTableIndices[GlobalDecl(DD, Dtor_Complete)] = 2377 getMethodVTableIndex(GlobalDecl(OverriddenDD, Dtor_Complete)); 2378 MethodVTableIndices[GlobalDecl(DD, Dtor_Deleting)] = 2379 getMethodVTableIndex(GlobalDecl(OverriddenDD, Dtor_Deleting)); 2380 } else { 2381 MethodVTableIndices[MD] = getMethodVTableIndex(OverriddenMD); 2382 } 2383 2384 // We don't need to add an entry for this method. 2385 continue; 2386 } 2387 } 2388 2389 if (const CXXDestructorDecl *DD = dyn_cast<CXXDestructorDecl>(MD)) { 2390 if (MD->isImplicit()) { 2391 assert(!ImplicitVirtualDtor && 2392 "Did already see an implicit virtual dtor!"); 2393 ImplicitVirtualDtor = DD; 2394 continue; 2395 } 2396 2397 // Add the complete dtor. 2398 MethodVTableIndices[GlobalDecl(DD, Dtor_Complete)] = CurrentIndex++; 2399 2400 // Add the deleting dtor. 2401 MethodVTableIndices[GlobalDecl(DD, Dtor_Deleting)] = CurrentIndex++; 2402 } else { 2403 // Add the entry. 2404 MethodVTableIndices[MD] = CurrentIndex++; 2405 } 2406 } 2407 2408 if (ImplicitVirtualDtor) { 2409 // Itanium C++ ABI 2.5.2: 2410 // If a class has an implicitly-defined virtual destructor, 2411 // its entries come after the declared virtual function pointers. 2412 2413 // Add the complete dtor. 2414 MethodVTableIndices[GlobalDecl(ImplicitVirtualDtor, Dtor_Complete)] = 2415 CurrentIndex++; 2416 2417 // Add the deleting dtor. 2418 MethodVTableIndices[GlobalDecl(ImplicitVirtualDtor, Dtor_Deleting)] = 2419 CurrentIndex++; 2420 } 2421 2422 NumVirtualFunctionPointers[RD] = CurrentIndex; 2423 } 2424 2425 bool CodeGenVTables::ShouldEmitVTableInThisTU(const CXXRecordDecl *RD) { 2426 assert(RD->isDynamicClass() && "Non dynamic classes have no VTable."); 2427 2428 TemplateSpecializationKind TSK = RD->getTemplateSpecializationKind(); 2429 if (TSK == TSK_ExplicitInstantiationDeclaration) 2430 return false; 2431 2432 const CXXMethodDecl *KeyFunction = CGM.getContext().getKeyFunction(RD); 2433 if (!KeyFunction) 2434 return true; 2435 2436 // Itanium C++ ABI, 5.2.6 Instantiated Templates: 2437 // An instantiation of a class template requires: 2438 // - In the object where instantiated, the virtual table... 2439 if (TSK == TSK_ImplicitInstantiation || 2440 TSK == TSK_ExplicitInstantiationDefinition) 2441 return true; 2442 2443 // If we're building with optimization, we always emit VTables since that 2444 // allows for virtual function calls to be devirtualized. 2445 // (We don't want to do this in -fapple-kext mode however). 2446 if (CGM.getCodeGenOpts().OptimizationLevel && !CGM.getLangOptions().AppleKext) 2447 return true; 2448 2449 return KeyFunction->hasBody(); 2450 } 2451 2452 uint64_t CodeGenVTables::getNumVirtualFunctionPointers(const CXXRecordDecl *RD) { 2453 llvm::DenseMap<const CXXRecordDecl *, uint64_t>::iterator I = 2454 NumVirtualFunctionPointers.find(RD); 2455 if (I != NumVirtualFunctionPointers.end()) 2456 return I->second; 2457 2458 ComputeMethodVTableIndices(RD); 2459 2460 I = NumVirtualFunctionPointers.find(RD); 2461 assert(I != NumVirtualFunctionPointers.end() && "Did not find entry!"); 2462 return I->second; 2463 } 2464 2465 uint64_t CodeGenVTables::getMethodVTableIndex(GlobalDecl GD) { 2466 MethodVTableIndicesTy::iterator I = MethodVTableIndices.find(GD); 2467 if (I != MethodVTableIndices.end()) 2468 return I->second; 2469 2470 const CXXRecordDecl *RD = cast<CXXMethodDecl>(GD.getDecl())->getParent(); 2471 2472 ComputeMethodVTableIndices(RD); 2473 2474 I = MethodVTableIndices.find(GD); 2475 assert(I != MethodVTableIndices.end() && "Did not find index!"); 2476 return I->second; 2477 } 2478 2479 CharUnits 2480 CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD, 2481 const CXXRecordDecl *VBase) { 2482 ClassPairTy ClassPair(RD, VBase); 2483 2484 VirtualBaseClassOffsetOffsetsMapTy::iterator I = 2485 VirtualBaseClassOffsetOffsets.find(ClassPair); 2486 if (I != VirtualBaseClassOffsetOffsets.end()) 2487 return I->second; 2488 2489 VCallAndVBaseOffsetBuilder Builder(RD, RD, /*FinalOverriders=*/0, 2490 BaseSubobject(RD, CharUnits::Zero()), 2491 /*BaseIsVirtual=*/false, 2492 /*OffsetInLayoutClass=*/CharUnits::Zero()); 2493 2494 for (VCallAndVBaseOffsetBuilder::VBaseOffsetOffsetsMapTy::const_iterator I = 2495 Builder.getVBaseOffsetOffsets().begin(), 2496 E = Builder.getVBaseOffsetOffsets().end(); I != E; ++I) { 2497 // Insert all types. 2498 ClassPairTy ClassPair(RD, I->first); 2499 2500 VirtualBaseClassOffsetOffsets.insert( 2501 std::make_pair(ClassPair, I->second)); 2502 } 2503 2504 I = VirtualBaseClassOffsetOffsets.find(ClassPair); 2505 assert(I != VirtualBaseClassOffsetOffsets.end() && "Did not find index!"); 2506 2507 return I->second; 2508 } 2509 2510 uint64_t 2511 CodeGenVTables::getAddressPoint(BaseSubobject Base, const CXXRecordDecl *RD) { 2512 assert(AddressPoints.count(std::make_pair(RD, Base)) && 2513 "Did not find address point!"); 2514 2515 uint64_t AddressPoint = AddressPoints.lookup(std::make_pair(RD, Base)); 2516 assert(AddressPoint && "Address point must not be zero!"); 2517 2518 return AddressPoint; 2519 } 2520 2521 llvm::Constant *CodeGenModule::GetAddrOfThunk(GlobalDecl GD, 2522 const ThunkInfo &Thunk) { 2523 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); 2524 2525 // Compute the mangled name. 2526 llvm::SmallString<256> Name; 2527 llvm::raw_svector_ostream Out(Name); 2528 if (const CXXDestructorDecl* DD = dyn_cast<CXXDestructorDecl>(MD)) 2529 getCXXABI().getMangleContext().mangleCXXDtorThunk(DD, GD.getDtorType(), 2530 Thunk.This, Out); 2531 else 2532 getCXXABI().getMangleContext().mangleThunk(MD, Thunk, Out); 2533 Out.flush(); 2534 2535 llvm::Type *Ty = getTypes().GetFunctionTypeForVTable(GD); 2536 return GetOrCreateLLVMFunction(Name, Ty, GD, /*ForVTable=*/true); 2537 } 2538 2539 static llvm::Value *PerformTypeAdjustment(CodeGenFunction &CGF, 2540 llvm::Value *Ptr, 2541 int64_t NonVirtualAdjustment, 2542 int64_t VirtualAdjustment) { 2543 if (!NonVirtualAdjustment && !VirtualAdjustment) 2544 return Ptr; 2545 2546 llvm::Type *Int8PtrTy = 2547 llvm::Type::getInt8PtrTy(CGF.getLLVMContext()); 2548 2549 llvm::Value *V = CGF.Builder.CreateBitCast(Ptr, Int8PtrTy); 2550 2551 if (NonVirtualAdjustment) { 2552 // Do the non-virtual adjustment. 2553 V = CGF.Builder.CreateConstInBoundsGEP1_64(V, NonVirtualAdjustment); 2554 } 2555 2556 if (VirtualAdjustment) { 2557 llvm::Type *PtrDiffTy = 2558 CGF.ConvertType(CGF.getContext().getPointerDiffType()); 2559 2560 // Do the virtual adjustment. 2561 llvm::Value *VTablePtrPtr = 2562 CGF.Builder.CreateBitCast(V, Int8PtrTy->getPointerTo()); 2563 2564 llvm::Value *VTablePtr = CGF.Builder.CreateLoad(VTablePtrPtr); 2565 2566 llvm::Value *OffsetPtr = 2567 CGF.Builder.CreateConstInBoundsGEP1_64(VTablePtr, VirtualAdjustment); 2568 2569 OffsetPtr = CGF.Builder.CreateBitCast(OffsetPtr, PtrDiffTy->getPointerTo()); 2570 2571 // Load the adjustment offset from the vtable. 2572 llvm::Value *Offset = CGF.Builder.CreateLoad(OffsetPtr); 2573 2574 // Adjust our pointer. 2575 V = CGF.Builder.CreateInBoundsGEP(V, Offset); 2576 } 2577 2578 // Cast back to the original type. 2579 return CGF.Builder.CreateBitCast(V, Ptr->getType()); 2580 } 2581 2582 static void setThunkVisibility(CodeGenModule &CGM, const CXXMethodDecl *MD, 2583 const ThunkInfo &Thunk, llvm::Function *Fn) { 2584 CGM.setGlobalVisibility(Fn, MD); 2585 2586 if (!CGM.getCodeGenOpts().HiddenWeakVTables) 2587 return; 2588 2589 // If the thunk has weak/linkonce linkage, but the function must be 2590 // emitted in every translation unit that references it, then we can 2591 // emit its thunks with hidden visibility, since its thunks must be 2592 // emitted when the function is. 2593 2594 // This follows CodeGenModule::setTypeVisibility; see the comments 2595 // there for explanation. 2596 2597 if ((Fn->getLinkage() != llvm::GlobalVariable::LinkOnceODRLinkage && 2598 Fn->getLinkage() != llvm::GlobalVariable::WeakODRLinkage) || 2599 Fn->getVisibility() != llvm::GlobalVariable::DefaultVisibility) 2600 return; 2601 2602 if (MD->getExplicitVisibility()) 2603 return; 2604 2605 switch (MD->getTemplateSpecializationKind()) { 2606 case TSK_ExplicitInstantiationDefinition: 2607 case TSK_ExplicitInstantiationDeclaration: 2608 return; 2609 2610 case TSK_Undeclared: 2611 break; 2612 2613 case TSK_ExplicitSpecialization: 2614 case TSK_ImplicitInstantiation: 2615 if (!CGM.getCodeGenOpts().HiddenWeakTemplateVTables) 2616 return; 2617 break; 2618 } 2619 2620 // If there's an explicit definition, and that definition is 2621 // out-of-line, then we can't assume that all users will have a 2622 // definition to emit. 2623 const FunctionDecl *Def = 0; 2624 if (MD->hasBody(Def) && Def->isOutOfLine()) 2625 return; 2626 2627 Fn->setVisibility(llvm::GlobalValue::HiddenVisibility); 2628 } 2629 2630 #ifndef NDEBUG 2631 static bool similar(const ABIArgInfo &infoL, CanQualType typeL, 2632 const ABIArgInfo &infoR, CanQualType typeR) { 2633 return (infoL.getKind() == infoR.getKind() && 2634 (typeL == typeR || 2635 (isa<PointerType>(typeL) && isa<PointerType>(typeR)) || 2636 (isa<ReferenceType>(typeL) && isa<ReferenceType>(typeR)))); 2637 } 2638 #endif 2639 2640 static RValue PerformReturnAdjustment(CodeGenFunction &CGF, 2641 QualType ResultType, RValue RV, 2642 const ThunkInfo &Thunk) { 2643 // Emit the return adjustment. 2644 bool NullCheckValue = !ResultType->isReferenceType(); 2645 2646 llvm::BasicBlock *AdjustNull = 0; 2647 llvm::BasicBlock *AdjustNotNull = 0; 2648 llvm::BasicBlock *AdjustEnd = 0; 2649 2650 llvm::Value *ReturnValue = RV.getScalarVal(); 2651 2652 if (NullCheckValue) { 2653 AdjustNull = CGF.createBasicBlock("adjust.null"); 2654 AdjustNotNull = CGF.createBasicBlock("adjust.notnull"); 2655 AdjustEnd = CGF.createBasicBlock("adjust.end"); 2656 2657 llvm::Value *IsNull = CGF.Builder.CreateIsNull(ReturnValue); 2658 CGF.Builder.CreateCondBr(IsNull, AdjustNull, AdjustNotNull); 2659 CGF.EmitBlock(AdjustNotNull); 2660 } 2661 2662 ReturnValue = PerformTypeAdjustment(CGF, ReturnValue, 2663 Thunk.Return.NonVirtual, 2664 Thunk.Return.VBaseOffsetOffset); 2665 2666 if (NullCheckValue) { 2667 CGF.Builder.CreateBr(AdjustEnd); 2668 CGF.EmitBlock(AdjustNull); 2669 CGF.Builder.CreateBr(AdjustEnd); 2670 CGF.EmitBlock(AdjustEnd); 2671 2672 llvm::PHINode *PHI = CGF.Builder.CreatePHI(ReturnValue->getType(), 2); 2673 PHI->addIncoming(ReturnValue, AdjustNotNull); 2674 PHI->addIncoming(llvm::Constant::getNullValue(ReturnValue->getType()), 2675 AdjustNull); 2676 ReturnValue = PHI; 2677 } 2678 2679 return RValue::get(ReturnValue); 2680 } 2681 2682 // This function does roughly the same thing as GenerateThunk, but in a 2683 // very different way, so that va_start and va_end work correctly. 2684 // FIXME: This function assumes "this" is the first non-sret LLVM argument of 2685 // a function, and that there is an alloca built in the entry block 2686 // for all accesses to "this". 2687 // FIXME: This function assumes there is only one "ret" statement per function. 2688 // FIXME: Cloning isn't correct in the presence of indirect goto! 2689 // FIXME: This implementation of thunks bloats codesize by duplicating the 2690 // function definition. There are alternatives: 2691 // 1. Add some sort of stub support to LLVM for cases where we can 2692 // do a this adjustment, then a sibcall. 2693 // 2. We could transform the definition to take a va_list instead of an 2694 // actual variable argument list, then have the thunks (including a 2695 // no-op thunk for the regular definition) call va_start/va_end. 2696 // There's a bit of per-call overhead for this solution, but it's 2697 // better for codesize if the definition is long. 2698 void CodeGenFunction::GenerateVarArgsThunk( 2699 llvm::Function *Fn, 2700 const CGFunctionInfo &FnInfo, 2701 GlobalDecl GD, const ThunkInfo &Thunk) { 2702 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); 2703 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); 2704 QualType ResultType = FPT->getResultType(); 2705 2706 // Get the original function 2707 llvm::Type *Ty = 2708 CGM.getTypes().GetFunctionType(FnInfo, /*IsVariadic*/true); 2709 llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true); 2710 llvm::Function *BaseFn = cast<llvm::Function>(Callee); 2711 2712 // Clone to thunk. 2713 llvm::Function *NewFn = llvm::CloneFunction(BaseFn); 2714 CGM.getModule().getFunctionList().push_back(NewFn); 2715 Fn->replaceAllUsesWith(NewFn); 2716 NewFn->takeName(Fn); 2717 Fn->eraseFromParent(); 2718 Fn = NewFn; 2719 2720 // "Initialize" CGF (minimally). 2721 CurFn = Fn; 2722 2723 // Get the "this" value 2724 llvm::Function::arg_iterator AI = Fn->arg_begin(); 2725 if (CGM.ReturnTypeUsesSRet(FnInfo)) 2726 ++AI; 2727 2728 // Find the first store of "this", which will be to the alloca associated 2729 // with "this". 2730 llvm::Value *ThisPtr = &*AI; 2731 llvm::BasicBlock *EntryBB = Fn->begin(); 2732 llvm::Instruction *ThisStore = 0; 2733 for (llvm::BasicBlock::iterator I = EntryBB->begin(), E = EntryBB->end(); 2734 I != E; I++) { 2735 if (isa<llvm::StoreInst>(I) && I->getOperand(0) == ThisPtr) { 2736 ThisStore = cast<llvm::StoreInst>(I); 2737 break; 2738 } 2739 } 2740 assert(ThisStore && "Store of this should be in entry block?"); 2741 // Adjust "this", if necessary. 2742 Builder.SetInsertPoint(ThisStore); 2743 llvm::Value *AdjustedThisPtr = 2744 PerformTypeAdjustment(*this, ThisPtr, 2745 Thunk.This.NonVirtual, 2746 Thunk.This.VCallOffsetOffset); 2747 ThisStore->setOperand(0, AdjustedThisPtr); 2748 2749 if (!Thunk.Return.isEmpty()) { 2750 // Fix up the returned value, if necessary. 2751 for (llvm::Function::iterator I = Fn->begin(), E = Fn->end(); I != E; I++) { 2752 llvm::Instruction *T = I->getTerminator(); 2753 if (isa<llvm::ReturnInst>(T)) { 2754 RValue RV = RValue::get(T->getOperand(0)); 2755 T->eraseFromParent(); 2756 Builder.SetInsertPoint(&*I); 2757 RV = PerformReturnAdjustment(*this, ResultType, RV, Thunk); 2758 Builder.CreateRet(RV.getScalarVal()); 2759 break; 2760 } 2761 } 2762 } 2763 } 2764 2765 void CodeGenFunction::GenerateThunk(llvm::Function *Fn, 2766 const CGFunctionInfo &FnInfo, 2767 GlobalDecl GD, const ThunkInfo &Thunk) { 2768 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); 2769 const FunctionProtoType *FPT = MD->getType()->getAs<FunctionProtoType>(); 2770 QualType ResultType = FPT->getResultType(); 2771 QualType ThisType = MD->getThisType(getContext()); 2772 2773 FunctionArgList FunctionArgs; 2774 2775 // FIXME: It would be nice if more of this code could be shared with 2776 // CodeGenFunction::GenerateCode. 2777 2778 // Create the implicit 'this' parameter declaration. 2779 CurGD = GD; 2780 CGM.getCXXABI().BuildInstanceFunctionParams(*this, ResultType, FunctionArgs); 2781 2782 // Add the rest of the parameters. 2783 for (FunctionDecl::param_const_iterator I = MD->param_begin(), 2784 E = MD->param_end(); I != E; ++I) { 2785 ParmVarDecl *Param = *I; 2786 2787 FunctionArgs.push_back(Param); 2788 } 2789 2790 StartFunction(GlobalDecl(), ResultType, Fn, FnInfo, FunctionArgs, 2791 SourceLocation()); 2792 2793 CGM.getCXXABI().EmitInstanceFunctionProlog(*this); 2794 2795 // Adjust the 'this' pointer if necessary. 2796 llvm::Value *AdjustedThisPtr = 2797 PerformTypeAdjustment(*this, LoadCXXThis(), 2798 Thunk.This.NonVirtual, 2799 Thunk.This.VCallOffsetOffset); 2800 2801 CallArgList CallArgs; 2802 2803 // Add our adjusted 'this' pointer. 2804 CallArgs.add(RValue::get(AdjustedThisPtr), ThisType); 2805 2806 // Add the rest of the parameters. 2807 for (FunctionDecl::param_const_iterator I = MD->param_begin(), 2808 E = MD->param_end(); I != E; ++I) { 2809 ParmVarDecl *param = *I; 2810 EmitDelegateCallArg(CallArgs, param); 2811 } 2812 2813 // Get our callee. 2814 llvm::Type *Ty = 2815 CGM.getTypes().GetFunctionType(CGM.getTypes().getFunctionInfo(GD), 2816 FPT->isVariadic()); 2817 llvm::Value *Callee = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true); 2818 2819 #ifndef NDEBUG 2820 const CGFunctionInfo &CallFnInfo = 2821 CGM.getTypes().getFunctionInfo(ResultType, CallArgs, FPT->getExtInfo()); 2822 assert(CallFnInfo.getRegParm() == FnInfo.getRegParm() && 2823 CallFnInfo.isNoReturn() == FnInfo.isNoReturn() && 2824 CallFnInfo.getCallingConvention() == FnInfo.getCallingConvention()); 2825 assert(similar(CallFnInfo.getReturnInfo(), CallFnInfo.getReturnType(), 2826 FnInfo.getReturnInfo(), FnInfo.getReturnType())); 2827 assert(CallFnInfo.arg_size() == FnInfo.arg_size()); 2828 for (unsigned i = 0, e = FnInfo.arg_size(); i != e; ++i) 2829 assert(similar(CallFnInfo.arg_begin()[i].info, 2830 CallFnInfo.arg_begin()[i].type, 2831 FnInfo.arg_begin()[i].info, FnInfo.arg_begin()[i].type)); 2832 #endif 2833 2834 // Determine whether we have a return value slot to use. 2835 ReturnValueSlot Slot; 2836 if (!ResultType->isVoidType() && 2837 FnInfo.getReturnInfo().getKind() == ABIArgInfo::Indirect && 2838 hasAggregateLLVMType(CurFnInfo->getReturnType())) 2839 Slot = ReturnValueSlot(ReturnValue, ResultType.isVolatileQualified()); 2840 2841 // Now emit our call. 2842 RValue RV = EmitCall(FnInfo, Callee, Slot, CallArgs, MD); 2843 2844 if (!Thunk.Return.isEmpty()) 2845 RV = PerformReturnAdjustment(*this, ResultType, RV, Thunk); 2846 2847 if (!ResultType->isVoidType() && Slot.isNull()) 2848 CGM.getCXXABI().EmitReturnFromThunk(*this, RV, ResultType); 2849 2850 FinishFunction(); 2851 2852 // Set the right linkage. 2853 CGM.setFunctionLinkage(MD, Fn); 2854 2855 // Set the right visibility. 2856 setThunkVisibility(CGM, MD, Thunk, Fn); 2857 } 2858 2859 void CodeGenVTables::EmitThunk(GlobalDecl GD, const ThunkInfo &Thunk, 2860 bool UseAvailableExternallyLinkage) 2861 { 2862 const CGFunctionInfo &FnInfo = CGM.getTypes().getFunctionInfo(GD); 2863 2864 // FIXME: re-use FnInfo in this computation. 2865 llvm::Constant *Entry = CGM.GetAddrOfThunk(GD, Thunk); 2866 2867 // Strip off a bitcast if we got one back. 2868 if (llvm::ConstantExpr *CE = dyn_cast<llvm::ConstantExpr>(Entry)) { 2869 assert(CE->getOpcode() == llvm::Instruction::BitCast); 2870 Entry = CE->getOperand(0); 2871 } 2872 2873 // There's already a declaration with the same name, check if it has the same 2874 // type or if we need to replace it. 2875 if (cast<llvm::GlobalValue>(Entry)->getType()->getElementType() != 2876 CGM.getTypes().GetFunctionTypeForVTable(GD)) { 2877 llvm::GlobalValue *OldThunkFn = cast<llvm::GlobalValue>(Entry); 2878 2879 // If the types mismatch then we have to rewrite the definition. 2880 assert(OldThunkFn->isDeclaration() && 2881 "Shouldn't replace non-declaration"); 2882 2883 // Remove the name from the old thunk function and get a new thunk. 2884 OldThunkFn->setName(llvm::StringRef()); 2885 Entry = CGM.GetAddrOfThunk(GD, Thunk); 2886 2887 // If needed, replace the old thunk with a bitcast. 2888 if (!OldThunkFn->use_empty()) { 2889 llvm::Constant *NewPtrForOldDecl = 2890 llvm::ConstantExpr::getBitCast(Entry, OldThunkFn->getType()); 2891 OldThunkFn->replaceAllUsesWith(NewPtrForOldDecl); 2892 } 2893 2894 // Remove the old thunk. 2895 OldThunkFn->eraseFromParent(); 2896 } 2897 2898 llvm::Function *ThunkFn = cast<llvm::Function>(Entry); 2899 2900 if (!ThunkFn->isDeclaration()) { 2901 if (UseAvailableExternallyLinkage) { 2902 // There is already a thunk emitted for this function, do nothing. 2903 return; 2904 } 2905 2906 // If a function has a body, it should have available_externally linkage. 2907 assert(ThunkFn->hasAvailableExternallyLinkage() && 2908 "Function should have available_externally linkage!"); 2909 2910 // Change the linkage. 2911 CGM.setFunctionLinkage(cast<CXXMethodDecl>(GD.getDecl()), ThunkFn); 2912 return; 2913 } 2914 2915 if (ThunkFn->isVarArg()) { 2916 // Varargs thunks are special; we can't just generate a call because 2917 // we can't copy the varargs. Our implementation is rather 2918 // expensive/sucky at the moment, so don't generate the thunk unless 2919 // we have to. 2920 // FIXME: Do something better here; GenerateVarArgsThunk is extremely ugly. 2921 if (!UseAvailableExternallyLinkage) 2922 CodeGenFunction(CGM).GenerateVarArgsThunk(ThunkFn, FnInfo, GD, Thunk); 2923 } else { 2924 // Normal thunk body generation. 2925 CodeGenFunction(CGM).GenerateThunk(ThunkFn, FnInfo, GD, Thunk); 2926 } 2927 2928 if (UseAvailableExternallyLinkage) 2929 ThunkFn->setLinkage(llvm::GlobalValue::AvailableExternallyLinkage); 2930 } 2931 2932 void CodeGenVTables::MaybeEmitThunkAvailableExternally(GlobalDecl GD, 2933 const ThunkInfo &Thunk) { 2934 // We only want to do this when building with optimizations. 2935 if (!CGM.getCodeGenOpts().OptimizationLevel) 2936 return; 2937 2938 // We can't emit thunks for member functions with incomplete types. 2939 const CXXMethodDecl *MD = cast<CXXMethodDecl>(GD.getDecl()); 2940 if (!CGM.getTypes().isFuncTypeConvertible( 2941 cast<FunctionType>(MD->getType().getTypePtr()))) 2942 return; 2943 2944 EmitThunk(GD, Thunk, /*UseAvailableExternallyLinkage=*/true); 2945 } 2946 2947 void CodeGenVTables::EmitThunks(GlobalDecl GD) 2948 { 2949 const CXXMethodDecl *MD = 2950 cast<CXXMethodDecl>(GD.getDecl())->getCanonicalDecl(); 2951 2952 // We don't need to generate thunks for the base destructor. 2953 if (isa<CXXDestructorDecl>(MD) && GD.getDtorType() == Dtor_Base) 2954 return; 2955 2956 const CXXRecordDecl *RD = MD->getParent(); 2957 2958 // Compute VTable related info for this class. 2959 ComputeVTableRelatedInformation(RD, false); 2960 2961 ThunksMapTy::const_iterator I = Thunks.find(MD); 2962 if (I == Thunks.end()) { 2963 // We did not find a thunk for this method. 2964 return; 2965 } 2966 2967 const ThunkInfoVectorTy &ThunkInfoVector = I->second; 2968 for (unsigned I = 0, E = ThunkInfoVector.size(); I != E; ++I) 2969 EmitThunk(GD, ThunkInfoVector[I], /*UseAvailableExternallyLinkage=*/false); 2970 } 2971 2972 void CodeGenVTables::ComputeVTableRelatedInformation(const CXXRecordDecl *RD, 2973 bool RequireVTable) { 2974 VTableLayoutData &Entry = VTableLayoutMap[RD]; 2975 2976 // We may need to generate a definition for this vtable. 2977 if (RequireVTable && !Entry.getInt()) { 2978 if (ShouldEmitVTableInThisTU(RD)) 2979 CGM.DeferredVTables.push_back(RD); 2980 2981 Entry.setInt(true); 2982 } 2983 2984 // Check if we've computed this information before. 2985 if (Entry.getPointer()) 2986 return; 2987 2988 VTableBuilder Builder(*this, RD, CharUnits::Zero(), 2989 /*MostDerivedClassIsVirtual=*/0, RD); 2990 2991 // Add the VTable layout. 2992 uint64_t NumVTableComponents = Builder.getNumVTableComponents(); 2993 // -fapple-kext adds an extra entry at end of vtbl. 2994 bool IsAppleKext = CGM.getContext().getLangOptions().AppleKext; 2995 if (IsAppleKext) 2996 NumVTableComponents += 1; 2997 2998 uint64_t *LayoutData = new uint64_t[NumVTableComponents + 1]; 2999 if (IsAppleKext) 3000 LayoutData[NumVTableComponents] = 0; 3001 Entry.setPointer(LayoutData); 3002 3003 // Store the number of components. 3004 LayoutData[0] = NumVTableComponents; 3005 3006 // Store the components. 3007 std::copy(Builder.vtable_components_data_begin(), 3008 Builder.vtable_components_data_end(), 3009 &LayoutData[1]); 3010 3011 // Add the known thunks. 3012 Thunks.insert(Builder.thunks_begin(), Builder.thunks_end()); 3013 3014 // Add the thunks needed in this vtable. 3015 assert(!VTableThunksMap.count(RD) && 3016 "Thunks already exists for this vtable!"); 3017 3018 VTableThunksTy &VTableThunks = VTableThunksMap[RD]; 3019 VTableThunks.append(Builder.vtable_thunks_begin(), 3020 Builder.vtable_thunks_end()); 3021 3022 // Sort them. 3023 std::sort(VTableThunks.begin(), VTableThunks.end()); 3024 3025 // Add the address points. 3026 for (VTableBuilder::AddressPointsMapTy::const_iterator I = 3027 Builder.address_points_begin(), E = Builder.address_points_end(); 3028 I != E; ++I) { 3029 3030 uint64_t &AddressPoint = AddressPoints[std::make_pair(RD, I->first)]; 3031 3032 // Check if we already have the address points for this base. 3033 assert(!AddressPoint && "Address point already exists for this base!"); 3034 3035 AddressPoint = I->second; 3036 } 3037 3038 // If we don't have the vbase information for this class, insert it. 3039 // getVirtualBaseOffsetOffset will compute it separately without computing 3040 // the rest of the vtable related information. 3041 if (!RD->getNumVBases()) 3042 return; 3043 3044 const RecordType *VBaseRT = 3045 RD->vbases_begin()->getType()->getAs<RecordType>(); 3046 const CXXRecordDecl *VBase = cast<CXXRecordDecl>(VBaseRT->getDecl()); 3047 3048 if (VirtualBaseClassOffsetOffsets.count(std::make_pair(RD, VBase))) 3049 return; 3050 3051 for (VTableBuilder::VBaseOffsetOffsetsMapTy::const_iterator I = 3052 Builder.getVBaseOffsetOffsets().begin(), 3053 E = Builder.getVBaseOffsetOffsets().end(); I != E; ++I) { 3054 // Insert all types. 3055 ClassPairTy ClassPair(RD, I->first); 3056 3057 VirtualBaseClassOffsetOffsets.insert( 3058 std::make_pair(ClassPair, I->second)); 3059 } 3060 } 3061 3062 llvm::Constant * 3063 CodeGenVTables::CreateVTableInitializer(const CXXRecordDecl *RD, 3064 const uint64_t *Components, 3065 unsigned NumComponents, 3066 const VTableThunksTy &VTableThunks) { 3067 llvm::SmallVector<llvm::Constant *, 64> Inits; 3068 3069 llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); 3070 3071 llvm::Type *PtrDiffTy = 3072 CGM.getTypes().ConvertType(CGM.getContext().getPointerDiffType()); 3073 3074 QualType ClassType = CGM.getContext().getTagDeclType(RD); 3075 llvm::Constant *RTTI = CGM.GetAddrOfRTTIDescriptor(ClassType); 3076 3077 unsigned NextVTableThunkIndex = 0; 3078 3079 llvm::Constant* PureVirtualFn = 0; 3080 3081 for (unsigned I = 0; I != NumComponents; ++I) { 3082 VTableComponent Component = 3083 VTableComponent::getFromOpaqueInteger(Components[I]); 3084 3085 llvm::Constant *Init = 0; 3086 3087 switch (Component.getKind()) { 3088 case VTableComponent::CK_VCallOffset: 3089 Init = llvm::ConstantInt::get(PtrDiffTy, 3090 Component.getVCallOffset().getQuantity()); 3091 Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy); 3092 break; 3093 case VTableComponent::CK_VBaseOffset: 3094 Init = llvm::ConstantInt::get(PtrDiffTy, 3095 Component.getVBaseOffset().getQuantity()); 3096 Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy); 3097 break; 3098 case VTableComponent::CK_OffsetToTop: 3099 Init = llvm::ConstantInt::get(PtrDiffTy, 3100 Component.getOffsetToTop().getQuantity()); 3101 Init = llvm::ConstantExpr::getIntToPtr(Init, Int8PtrTy); 3102 break; 3103 case VTableComponent::CK_RTTI: 3104 Init = llvm::ConstantExpr::getBitCast(RTTI, Int8PtrTy); 3105 break; 3106 case VTableComponent::CK_FunctionPointer: 3107 case VTableComponent::CK_CompleteDtorPointer: 3108 case VTableComponent::CK_DeletingDtorPointer: { 3109 GlobalDecl GD; 3110 3111 // Get the right global decl. 3112 switch (Component.getKind()) { 3113 default: 3114 llvm_unreachable("Unexpected vtable component kind"); 3115 case VTableComponent::CK_FunctionPointer: 3116 GD = Component.getFunctionDecl(); 3117 break; 3118 case VTableComponent::CK_CompleteDtorPointer: 3119 GD = GlobalDecl(Component.getDestructorDecl(), Dtor_Complete); 3120 break; 3121 case VTableComponent::CK_DeletingDtorPointer: 3122 GD = GlobalDecl(Component.getDestructorDecl(), Dtor_Deleting); 3123 break; 3124 } 3125 3126 if (cast<CXXMethodDecl>(GD.getDecl())->isPure()) { 3127 // We have a pure virtual member function. 3128 if (!PureVirtualFn) { 3129 llvm::FunctionType *Ty = 3130 llvm::FunctionType::get(llvm::Type::getVoidTy(CGM.getLLVMContext()), 3131 /*isVarArg=*/false); 3132 PureVirtualFn = 3133 CGM.CreateRuntimeFunction(Ty, "__cxa_pure_virtual"); 3134 PureVirtualFn = llvm::ConstantExpr::getBitCast(PureVirtualFn, 3135 Int8PtrTy); 3136 } 3137 3138 Init = PureVirtualFn; 3139 } else { 3140 // Check if we should use a thunk. 3141 if (NextVTableThunkIndex < VTableThunks.size() && 3142 VTableThunks[NextVTableThunkIndex].first == I) { 3143 const ThunkInfo &Thunk = VTableThunks[NextVTableThunkIndex].second; 3144 3145 Init = CGM.GetAddrOfThunk(GD, Thunk); 3146 MaybeEmitThunkAvailableExternally(GD, Thunk); 3147 3148 NextVTableThunkIndex++; 3149 } else { 3150 llvm::Type *Ty = CGM.getTypes().GetFunctionTypeForVTable(GD); 3151 3152 Init = CGM.GetAddrOfFunction(GD, Ty, /*ForVTable=*/true); 3153 } 3154 3155 Init = llvm::ConstantExpr::getBitCast(Init, Int8PtrTy); 3156 } 3157 break; 3158 } 3159 3160 case VTableComponent::CK_UnusedFunctionPointer: 3161 Init = llvm::ConstantExpr::getNullValue(Int8PtrTy); 3162 break; 3163 }; 3164 3165 Inits.push_back(Init); 3166 } 3167 3168 llvm::ArrayType *ArrayType = llvm::ArrayType::get(Int8PtrTy, NumComponents); 3169 return llvm::ConstantArray::get(ArrayType, Inits); 3170 } 3171 3172 llvm::GlobalVariable *CodeGenVTables::GetAddrOfVTable(const CXXRecordDecl *RD) { 3173 llvm::SmallString<256> OutName; 3174 llvm::raw_svector_ostream Out(OutName); 3175 CGM.getCXXABI().getMangleContext().mangleCXXVTable(RD, Out); 3176 Out.flush(); 3177 llvm::StringRef Name = OutName.str(); 3178 3179 ComputeVTableRelatedInformation(RD, /*VTableRequired=*/true); 3180 3181 llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); 3182 llvm::ArrayType *ArrayType = 3183 llvm::ArrayType::get(Int8PtrTy, getNumVTableComponents(RD)); 3184 3185 llvm::GlobalVariable *GV = 3186 CGM.CreateOrReplaceCXXRuntimeVariable(Name, ArrayType, 3187 llvm::GlobalValue::ExternalLinkage); 3188 GV->setUnnamedAddr(true); 3189 return GV; 3190 } 3191 3192 void 3193 CodeGenVTables::EmitVTableDefinition(llvm::GlobalVariable *VTable, 3194 llvm::GlobalVariable::LinkageTypes Linkage, 3195 const CXXRecordDecl *RD) { 3196 // Dump the vtable layout if necessary. 3197 if (CGM.getLangOptions().DumpVTableLayouts) { 3198 VTableBuilder Builder(*this, RD, CharUnits::Zero(), 3199 /*MostDerivedClassIsVirtual=*/0, RD); 3200 3201 Builder.dumpLayout(llvm::errs()); 3202 } 3203 3204 assert(VTableThunksMap.count(RD) && 3205 "No thunk status for this record decl!"); 3206 3207 const VTableThunksTy& Thunks = VTableThunksMap[RD]; 3208 3209 // Create and set the initializer. 3210 llvm::Constant *Init = 3211 CreateVTableInitializer(RD, getVTableComponentsData(RD), 3212 getNumVTableComponents(RD), Thunks); 3213 VTable->setInitializer(Init); 3214 3215 // Set the correct linkage. 3216 VTable->setLinkage(Linkage); 3217 3218 // Set the right visibility. 3219 CGM.setTypeVisibility(VTable, RD, CodeGenModule::TVK_ForVTable); 3220 } 3221 3222 llvm::GlobalVariable * 3223 CodeGenVTables::GenerateConstructionVTable(const CXXRecordDecl *RD, 3224 const BaseSubobject &Base, 3225 bool BaseIsVirtual, 3226 llvm::GlobalVariable::LinkageTypes Linkage, 3227 VTableAddressPointsMapTy& AddressPoints) { 3228 VTableBuilder Builder(*this, Base.getBase(), 3229 Base.getBaseOffset(), 3230 /*MostDerivedClassIsVirtual=*/BaseIsVirtual, RD); 3231 3232 // Dump the vtable layout if necessary. 3233 if (CGM.getLangOptions().DumpVTableLayouts) 3234 Builder.dumpLayout(llvm::errs()); 3235 3236 // Add the address points. 3237 AddressPoints.insert(Builder.address_points_begin(), 3238 Builder.address_points_end()); 3239 3240 // Get the mangled construction vtable name. 3241 llvm::SmallString<256> OutName; 3242 llvm::raw_svector_ostream Out(OutName); 3243 CGM.getCXXABI().getMangleContext(). 3244 mangleCXXCtorVTable(RD, Base.getBaseOffset().getQuantity(), Base.getBase(), 3245 Out); 3246 Out.flush(); 3247 llvm::StringRef Name = OutName.str(); 3248 3249 llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext()); 3250 llvm::ArrayType *ArrayType = 3251 llvm::ArrayType::get(Int8PtrTy, Builder.getNumVTableComponents()); 3252 3253 // Create the variable that will hold the construction vtable. 3254 llvm::GlobalVariable *VTable = 3255 CGM.CreateOrReplaceCXXRuntimeVariable(Name, ArrayType, Linkage); 3256 CGM.setTypeVisibility(VTable, RD, CodeGenModule::TVK_ForConstructionVTable); 3257 3258 // V-tables are always unnamed_addr. 3259 VTable->setUnnamedAddr(true); 3260 3261 // Add the thunks. 3262 VTableThunksTy VTableThunks; 3263 VTableThunks.append(Builder.vtable_thunks_begin(), 3264 Builder.vtable_thunks_end()); 3265 3266 // Sort them. 3267 std::sort(VTableThunks.begin(), VTableThunks.end()); 3268 3269 // Create and set the initializer. 3270 llvm::Constant *Init = 3271 CreateVTableInitializer(Base.getBase(), 3272 Builder.vtable_components_data_begin(), 3273 Builder.getNumVTableComponents(), VTableThunks); 3274 VTable->setInitializer(Init); 3275 3276 return VTable; 3277 } 3278 3279 void 3280 CodeGenVTables::GenerateClassData(llvm::GlobalVariable::LinkageTypes Linkage, 3281 const CXXRecordDecl *RD) { 3282 llvm::GlobalVariable *&VTable = VTables[RD]; 3283 if (VTable) { 3284 assert(VTable->getInitializer() && "VTable doesn't have a definition!"); 3285 return; 3286 } 3287 3288 VTable = GetAddrOfVTable(RD); 3289 EmitVTableDefinition(VTable, Linkage, RD); 3290 3291 if (RD->getNumVBases()) { 3292 llvm::GlobalVariable *VTT = GetAddrOfVTT(RD); 3293 EmitVTTDefinition(VTT, Linkage, RD); 3294 } 3295 3296 // If this is the magic class __cxxabiv1::__fundamental_type_info, 3297 // we will emit the typeinfo for the fundamental types. This is the 3298 // same behaviour as GCC. 3299 const DeclContext *DC = RD->getDeclContext(); 3300 if (RD->getIdentifier() && 3301 RD->getIdentifier()->isStr("__fundamental_type_info") && 3302 isa<NamespaceDecl>(DC) && 3303 cast<NamespaceDecl>(DC)->getIdentifier() && 3304 cast<NamespaceDecl>(DC)->getIdentifier()->isStr("__cxxabiv1") && 3305 DC->getParent()->isTranslationUnit()) 3306 CGM.EmitFundamentalRTTIDescriptors(); 3307 } 3308