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