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