[cfe-commits] r86793 - in /cfe/trunk/lib/CodeGen: CGVtable.cpp CGVtable.h
Mike Stump
mrs at apple.com
Tue Nov 10 19:08:24 PST 2009
Author: mrs
Date: Tue Nov 10 21:08:24 2009
New Revision: 86793
URL: http://llvm.org/viewvc/llvm-project?rev=86793&view=rev
Log:
More VTT work. We now track offsets and use the ctor vtable builder
interface. WIP.
Modified:
cfe/trunk/lib/CodeGen/CGVtable.cpp
cfe/trunk/lib/CodeGen/CGVtable.h
Modified: cfe/trunk/lib/CodeGen/CGVtable.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVtable.cpp?rev=86793&r1=86792&r2=86793&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGVtable.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGVtable.cpp Tue Nov 10 21:08:24 2009
@@ -724,9 +724,13 @@
const CXXRecordDecl *Class;
CodeGenModule &CGM; // Per-module state.
llvm::SmallSet<const CXXRecordDecl *, 32> SeenVBase;
+ /// BLayout - Layout for the most derived class that this vtable is being
+ /// built for.
+ const ASTRecordLayout &BLayout;
/// Secondary - Add the secondary vtable pointers to Inits.
- void Secondary(const CXXRecordDecl *RD, bool MorallyVirtual=false) {
+ void Secondary(const CXXRecordDecl *RD, uint64_t Offset=0,
+ bool MorallyVirtual=false) {
if (RD->getNumVBases() == 0 && ! MorallyVirtual)
return;
@@ -740,31 +744,37 @@
bool NonVirtualPrimaryBase;
NonVirtualPrimaryBase = !PrimaryBaseWasVirtual && Base == PrimaryBase;
bool BaseMorallyVirtual = MorallyVirtual | i->isVirtual();
+ uint64_t BaseOffset;
+ if (!i->isVirtual()) {
+ const ASTRecordLayout &Layout = CGM.getContext().getASTRecordLayout(RD);
+ BaseOffset = Offset + Layout.getBaseClassOffset(Base);
+ } else
+ BaseOffset = BLayout.getVBaseClassOffset(Base);
if ((Base->getNumVBases() || BaseMorallyVirtual)
&& !NonVirtualPrimaryBase) {
// FIXME: Slightly too many of these for __ZTT8test8_B2
- // FIXME: ctor vtbl or normal vtable.
- llvm::Constant *vtbl = CGM.getVtableInfo().getVtable(Base);
+ llvm::Constant *vtbl;
+ vtbl = CGM.getVtableInfo().getVtable(Base, Class, BaseOffset/8);
Inits.push_back(vtbl);
}
- Secondary(Base, BaseMorallyVirtual);
+ Secondary(Base, BaseOffset, BaseMorallyVirtual);
}
}
/// BuiltVTT - Add the VTT to Inits.
- void BuildVTT(const CXXRecordDecl *RD, bool MorallyVirtual=false) {
+ void BuildVTT(const CXXRecordDecl *RD, uint64_t Offset,
+ bool MorallyVirtual=false) {
if (RD->getNumVBases() == 0 && !MorallyVirtual)
return;
// First comes the primary virtual table pointer...
- // FIXME: ctor vtable instead
- Inits.push_back(CGM.getVtableInfo().getVtable(RD));
+ Inits.push_back(CGM.getVtableInfo().getVtable(RD, Class, Offset));
// then the secondary VTTs....
SecondaryVTTs(RD, MorallyVirtual);
// and last the secondary vtable pointers.
- Secondary(RD, MorallyVirtual);
+ Secondary(RD, MorallyVirtual, Offset);
}
/// SecondaryVTTs - Add the secondary VTTs to Inits. The secondary VTTs are
@@ -797,7 +807,9 @@
}
public:
VTTBuilder(std::vector<llvm::Constant *> &inits, const CXXRecordDecl *c,
- CodeGenModule &cgm) : Inits(inits), Class(c), CGM(cgm) {
+ CodeGenModule &cgm)
+ : Inits(inits), Class(c), CGM(cgm),
+ BLayout(cgm.getContext().getASTRecordLayout(c)) {
// First comes the primary virtual table pointer for the complete class...
Inits.push_back(CGM.getVtableInfo().getVtable(Class));
@@ -840,7 +852,10 @@
return vtt;
}
-llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD) {
+llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD,
+ const CXXRecordDecl *Class,
+ uint64_t Offset) {
+ // FIXME: Add ctor vtable support
llvm::Constant *&vtbl = Vtables[RD];
if (vtbl)
return vtbl;
Modified: cfe/trunk/lib/CodeGen/CGVtable.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGVtable.h?rev=86793&r1=86792&r2=86793&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGVtable.h (original)
+++ cfe/trunk/lib/CodeGen/CGVtable.h Tue Nov 10 21:08:24 2009
@@ -57,7 +57,8 @@
int64_t getVirtualBaseOffsetIndex(const CXXRecordDecl *RD,
const CXXRecordDecl *VBase);
- llvm::Constant *getVtable(const CXXRecordDecl *RD);
+ llvm::Constant *getVtable(const CXXRecordDecl *RD,
+ const CXXRecordDecl *Class=0, uint64_t Offset=0);
};
}
More information about the cfe-commits
mailing list