aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-11-12 23:36:21 +0000
committerMike Stump <mrs@apple.com>2009-11-12 23:36:21 +0000
commit80ac2358bbf3e18a941d54d481d372c7a0155199 (patch)
treeacab5efb73c115b1d422f85a7c87fb48f09c213c /lib/CodeGen/CGVtable.cpp
parent12e3e4f594c1ed896b7db72527668894434940d2 (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.cpp18
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);
}
}