diff options
author | Mike Stump <mrs@apple.com> | 2009-11-12 23:36:21 +0000 |
---|---|---|
committer | Mike Stump <mrs@apple.com> | 2009-11-12 23:36:21 +0000 |
commit | 80ac2358bbf3e18a941d54d481d372c7a0155199 (patch) | |
tree | acab5efb73c115b1d422f85a7c87fb48f09c213c /lib/CodeGen/CGVtable.cpp | |
parent | 12e3e4f594c1ed896b7db72527668894434940d2 (diff) |
Refine which vtbl is refernced in VTTs.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@87043 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r-- | lib/CodeGen/CGVtable.cpp | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp index af6ab0041e..f16ca11d65 100644 --- a/lib/CodeGen/CGVtable.cpp +++ b/lib/CodeGen/CGVtable.cpp @@ -105,8 +105,8 @@ public: return llvm::ConstantExpr::getBitCast(m, Ptr8Ty); } -#define D1(x) -//#define D1(X) do { if (getenv("DEBUG")) { X; } } while (0) +//#define D1(x) +#define D1(X) do { if (getenv("DEBUG")) { X; } } while (0) void GenerateVBaseOffsets(const CXXRecordDecl *RD, uint64_t Offset, bool updateVBIndex, Index_t current_vbindex) { @@ -775,6 +775,10 @@ class VTTBuilder { uint64_t Offset) { int64_t AddressPoint; AddressPoint = (*CGM.AddressPoints[Class])[std::make_pair(RD, Offset)]; + // FIXME: We can never have 0 address point. Do this for now so gepping + // retains the same structure. + if (AddressPoint == 0) + AddressPoint = 1; D1(printf("XXX address point for %s in %s at offset %d was %d\n", RD->getNameAsCString(), Class->getNameAsCString(), (int)Offset, (int)AddressPoint)); @@ -809,18 +813,20 @@ class VTTBuilder { BaseOffset = Offset + Layout.getBaseClassOffset(Base); } else BaseOffset = BLayout.getVBaseClassOffset(Base); + llvm::Constant *subvtbl = vtbl; if ((Base->getNumVBases() || BaseMorallyVirtual) && !NonVirtualPrimaryBase) { // FIXME: Slightly too many of these for __ZTT8test8_B2 llvm::Constant *init; - if (MorallyVirtual) + if (BaseMorallyVirtual) init = BuildVtablePtr(vtbl, RD, Offset); - else + else { init = CGM.getVtableInfo().getCtorVtable(Class, Base, BaseOffset); + subvtbl = dyn_cast<llvm::Constant>(init->getOperand(0)); + } Inits.push_back(init); - // vtbl = dyn_cast<llvm::Constant>(init->getOperand(0)); } - Secondary(Base, vtbl, BaseOffset, BaseMorallyVirtual); + Secondary(Base, subvtbl, BaseOffset, BaseMorallyVirtual); } } |