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