20 #include "llvm/Support/Format.h"
24 using namespace clang;
26 #define DUMP_OVERRIDERS 0
30 bool GenerateDefinition)
31 : Ctx(Ctx), MostDerivedClass(MostDerivedClass),
32 MostDerivedClassLayout(Ctx.getASTRecordLayout(MostDerivedClass)),
33 GenerateDefinition(GenerateDefinition) {
42 if (VTableClass == MostDerivedClass) {
43 assert(!SecondaryVirtualPointerIndices.count(Base) &&
44 "A virtual pointer index already exists for this base subobject!");
45 SecondaryVirtualPointerIndices[Base] = VTTComponents.size();
48 if (!GenerateDefinition) {
53 VTTComponents.push_back(
VTTComponent(VTableIndex, Base));
59 for (
const auto &I : RD->
bases()) {
65 cast<CXXRecordDecl>(I.getType()->getAs<
RecordType>()->getDecl());
69 Layout.getBaseClassOffset(BaseDecl);
77 VTTBuilder::LayoutSecondaryVirtualPointers(
BaseSubobject Base,
78 bool BaseIsMorallyVirtual,
81 VisitedVirtualBasesSetTy &VBases) {
89 for (
const auto &I : RD->
bases()) {
91 cast<CXXRecordDecl>(I.getType()->getAs<
RecordType>()->getDecl());
103 bool BaseDeclIsMorallyVirtual = BaseIsMorallyVirtual;
104 bool BaseDeclIsNonVirtualPrimaryBase =
false;
108 if (!VBases.insert(BaseDecl).second)
112 BaseDeclIsMorallyVirtual =
true;
121 BaseDeclIsNonVirtualPrimaryBase =
true;
129 if (!BaseDeclIsNonVirtualPrimaryBase &&
130 (BaseDecl->
getNumVBases() || BaseDeclIsMorallyVirtual)) {
132 AddVTablePointer(
BaseSubobject(BaseDecl, BaseOffset), VTableIndex,
137 LayoutSecondaryVirtualPointers(
BaseSubobject(BaseDecl, BaseOffset),
138 BaseDeclIsMorallyVirtual, VTableIndex,
139 VTableClass, VBases);
144 VTTBuilder::LayoutSecondaryVirtualPointers(
BaseSubobject Base,
145 uint64_t VTableIndex) {
146 VisitedVirtualBasesSetTy VBases;
147 LayoutSecondaryVirtualPointers(Base,
false,
148 VTableIndex, Base.
getBase(), VBases);
152 VisitedVirtualBasesSetTy &VBases) {
153 for (
const auto &I : RD->
bases()) {
155 cast<CXXRecordDecl>(I.getType()->getAs<
RecordType>()->getDecl());
160 if (!VBases.insert(BaseDecl).second)
172 LayoutVirtualVTTs(BaseDecl, VBases);
176 void VTTBuilder::LayoutVTT(
BaseSubobject Base,
bool BaseIsVirtual) {
185 bool IsPrimaryVTT = Base.
getBase() == MostDerivedClass;
189 SubVTTIndicies[Base] = VTTComponents.size();
192 uint64_t VTableIndex = VTTVTables.size();
193 VTTVTables.push_back(
VTTVTable(Base, BaseIsVirtual));
196 AddVTablePointer(Base, VTableIndex, RD);
199 LayoutSecondaryVTTs(Base);
202 LayoutSecondaryVirtualPointers(Base, VTableIndex);
206 VisitedVirtualBasesSetTy VBases;
207 LayoutVirtualVTTs(Base.
getBase(), VBases);
Defines the clang::ASTContext interface.
CharUnits getVBaseClassOffset(const CXXRecordDecl *VBase) const
getVBaseClassOffset - Get the offset, in chars, for the given base class.
bool isPrimaryBaseVirtual() const
Holds long-lived AST nodes (such as types and decls) that can be referred to throughout the semantic ...
static CharUnits Zero()
Zero - Construct a CharUnits quantity of zero.
const ASTRecordLayout & getASTRecordLayout(const RecordDecl *D) const
Get or compute information about the layout of the specified record (struct/union/class) D...
const CXXRecordDecl * getBase() const
getBase - Returns the base class declaration.
CharUnits getBaseClassOffset(const CXXRecordDecl *Base) const
getBaseClassOffset - Get the offset, in chars, for the given base class.
const CXXRecordDecl * getPrimaryBase() const
getPrimaryBase - Get the primary base for this record.
bool isDynamicClass() const
VTTBuilder(ASTContext &Ctx, const CXXRecordDecl *MostDerivedClass, bool GenerateDefinition)
Represents a C++ struct/union/class.
Defines the clang::TargetInfo interface.
CharUnits getBaseOffset() const
getBaseOffset - Returns the base class offset.
unsigned getNumVBases() const
Retrieves the number of virtual base classes of this class.