1 //===--- VTTBuilder.h - C++ VTT layout builder --------------------*- C++ -*-=//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This contains code dealing with generation of the layout of virtual table
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_AST_VTTBUILDER_H
16 #define LLVM_CLANG_AST_VTTBUILDER_H
18 #include "clang/AST/BaseSubobject.h"
19 #include "clang/AST/CXXInheritance.h"
20 #include "clang/AST/GlobalDecl.h"
21 #include "clang/AST/RecordLayout.h"
22 #include "clang/Basic/ABI.h"
23 #include "llvm/ADT/SetVector.h"
29 llvm::PointerIntPair<const CXXRecordDecl *, 1, bool> BaseAndIsVirtual;
34 VTTVTable(const CXXRecordDecl *Base, CharUnits BaseOffset, bool BaseIsVirtual)
35 : BaseAndIsVirtual(Base, BaseIsVirtual), BaseOffset(BaseOffset) {}
36 VTTVTable(BaseSubobject Base, bool BaseIsVirtual)
37 : BaseAndIsVirtual(Base.getBase(), BaseIsVirtual),
38 BaseOffset(Base.getBaseOffset()) {}
40 const CXXRecordDecl *getBase() const {
41 return BaseAndIsVirtual.getPointer();
44 CharUnits getBaseOffset() const {
48 bool isVirtual() const {
49 return BaseAndIsVirtual.getInt();
52 BaseSubobject getBaseSubobject() const {
53 return BaseSubobject(getBase(), getBaseOffset());
59 BaseSubobject VTableBase;
62 VTTComponent(uint64_t VTableIndex, BaseSubobject VTableBase)
63 : VTableIndex(VTableIndex), VTableBase(VTableBase) {}
66 /// VTT builder - Class for building VTT layout information.
71 /// MostDerivedClass - The most derived class for which we're building this
73 const CXXRecordDecl *MostDerivedClass;
75 typedef SmallVector<VTTVTable, 64> VTTVTablesVectorTy;
77 /// VTTVTables - The VTT vtables.
78 VTTVTablesVectorTy VTTVTables;
80 typedef SmallVector<VTTComponent, 64> VTTComponentsVectorTy;
82 /// VTTComponents - The VTT components.
83 VTTComponentsVectorTy VTTComponents;
85 /// MostDerivedClassLayout - the AST record layout of the most derived class.
86 const ASTRecordLayout &MostDerivedClassLayout;
88 typedef llvm::SmallPtrSet<const CXXRecordDecl *, 4> VisitedVirtualBasesSetTy;
90 typedef llvm::DenseMap<BaseSubobject, uint64_t> AddressPointsMapTy;
92 /// SubVTTIndicies - The sub-VTT indices for the bases of the most derived
94 llvm::DenseMap<BaseSubobject, uint64_t> SubVTTIndicies;
96 /// SecondaryVirtualPointerIndices - The secondary virtual pointer indices of
97 /// all subobjects of the most derived class.
98 llvm::DenseMap<BaseSubobject, uint64_t> SecondaryVirtualPointerIndices;
100 /// GenerateDefinition - Whether the VTT builder should generate LLVM IR for
102 bool GenerateDefinition;
104 /// AddVTablePointer - Add a vtable pointer to the VTT currently being built.
106 /// \param AddressPoints - If the vtable is a construction vtable, this has
107 /// the address points for it.
108 void AddVTablePointer(BaseSubobject Base, uint64_t VTableIndex,
109 const CXXRecordDecl *VTableClass);
111 /// LayoutSecondaryVTTs - Lay out the secondary VTTs of the given base
113 void LayoutSecondaryVTTs(BaseSubobject Base);
115 /// LayoutSecondaryVirtualPointers - Lay out the secondary virtual pointers
116 /// for the given base subobject.
118 /// \param BaseIsMorallyVirtual whether the base subobject is a virtual base
119 /// or a direct or indirect base of a virtual base.
121 /// \param AddressPoints - If the vtable is a construction vtable, this has
122 /// the address points for it.
123 void LayoutSecondaryVirtualPointers(BaseSubobject Base,
124 bool BaseIsMorallyVirtual,
125 uint64_t VTableIndex,
126 const CXXRecordDecl *VTableClass,
127 VisitedVirtualBasesSetTy &VBases);
129 /// LayoutSecondaryVirtualPointers - Lay out the secondary virtual pointers
130 /// for the given base subobject.
132 /// \param AddressPoints - If the vtable is a construction vtable, this has
133 /// the address points for it.
134 void LayoutSecondaryVirtualPointers(BaseSubobject Base,
135 uint64_t VTableIndex);
137 /// LayoutVirtualVTTs - Lay out the VTTs for the virtual base classes of the
138 /// given record decl.
139 void LayoutVirtualVTTs(const CXXRecordDecl *RD,
140 VisitedVirtualBasesSetTy &VBases);
142 /// LayoutVTT - Will lay out the VTT for the given subobject, including any
143 /// secondary VTTs, secondary virtual pointers and virtual VTTs.
144 void LayoutVTT(BaseSubobject Base, bool BaseIsVirtual);
147 VTTBuilder(ASTContext &Ctx, const CXXRecordDecl *MostDerivedClass,
148 bool GenerateDefinition);
150 // getVTTComponents - Returns a reference to the VTT components.
151 const VTTComponentsVectorTy &getVTTComponents() const {
152 return VTTComponents;
155 // getVTTVTables - Returns a reference to the VTT vtables.
156 const VTTVTablesVectorTy &getVTTVTables() const {
160 /// getSubVTTIndicies - Returns a reference to the sub-VTT indices.
161 const llvm::DenseMap<BaseSubobject, uint64_t> &getSubVTTIndicies() const {
162 return SubVTTIndicies;
165 /// getSecondaryVirtualPointerIndices - Returns a reference to the secondary
166 /// virtual pointer indices.
167 const llvm::DenseMap<BaseSubobject, uint64_t> &
168 getSecondaryVirtualPointerIndices() const {
169 return SecondaryVirtualPointerIndices;