aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-12-05 20:42:53 +0000
committerAnders Carlsson <andersca@mac.com>2009-12-05 20:42:53 +0000
commitbe58b390ebaf64ffc455916a11fe231bcfa5a648 (patch)
treed83e4a9d48d00ec9359161f1aae9dacc9ab03e44 /lib/CodeGen/CGVtable.cpp
parent9428b67b065816247b50d438948841fe0521fc08 (diff)
Change getCtorVtable to not return the address point offset, but the global variable.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@90671 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r--lib/CodeGen/CGVtable.cpp12
1 files changed, 10 insertions, 2 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp
index 6600a24131..6408853df3 100644
--- a/lib/CodeGen/CGVtable.cpp
+++ b/lib/CodeGen/CGVtable.cpp
@@ -1233,8 +1233,11 @@ class VTTBuilder {
init = BuildVtablePtr(vtbl, VtblClass, RD, Offset);
else {
init = CGM.getVtableInfo().getCtorVtable(Class, Base, BaseOffset);
- subvtbl = dyn_cast<llvm::Constant>(init->getOperand(0));
+
+ subvtbl = init;
subVtblClass = Base;
+
+ init = BuildVtablePtr(init, Class, Base, BaseOffset);
}
Inits.push_back(init);
}
@@ -1257,6 +1260,8 @@ class VTTBuilder {
VtblClass = Class;
} else {
init = CGM.getVtableInfo().getCtorVtable(Class, RD, Offset);
+ init = BuildVtablePtr(init, RD, RD, Offset);
+
VtblClass = RD;
}
llvm::Constant *vtbl = dyn_cast<llvm::Constant>(init->getOperand(0));
@@ -1301,6 +1306,7 @@ class VTTBuilder {
VirtualVTTs(Base);
}
}
+
public:
VTTBuilder(std::vector<llvm::Constant *> &inits, const CXXRecordDecl *c,
CodeGenModule &cgm)
@@ -1412,7 +1418,9 @@ llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD) {
llvm::Constant *CGVtableInfo::getCtorVtable(const CXXRecordDecl *LayoutClass,
const CXXRecordDecl *RD,
uint64_t Offset) {
- return CGM.GenerateVtable(LayoutClass, RD, Offset);
+ llvm::Constant *Vtable = CGM.GenerateVtable(LayoutClass, RD, Offset);
+
+ return cast<llvm::Constant>(Vtable->getOperand(0));
}
void CGVtableInfo::MaybeEmitVtable(GlobalDecl GD) {