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