diff options
author | Mike Stump <mrs@apple.com> | 2009-11-11 03:08:24 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-11-11 03:08:24 +0000 |
commit | aee8de30e194e494d2be1651ed54eda38e6a16bd (patch) | |
tree | 67523238aef8eb1be1839428b6efbb1d44650182 /lib/CodeGen/CGVtable.cpp | |
parent | 37acf5a57f87abdbb4ac6115c5f3f09295ec2dc3 (diff) |
More VTT work. We now track offsets and use the ctor vtable builder
interface. WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86793 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index d98d40c0ec..4d3c3a595d 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -724,9 +724,13 @@ class VTTBuilder { 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 @@ class VTTBuilder { 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 @@ class VTTBuilder { } 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 @@ llvm::Constant *CodeGenModule::GenerateVTT(const CXXRecordDecl *RD) { 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; |