aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen
diff options
context:
space:
mode:
authorMike Stump <mrs@apple.com>2009-11-11 20:26:26 +0000
committerMike Stump <mrs@apple.com>2009-11-11 20:26:26 +0000
commit8cfcb52059d5ff8596cc7a92d856800b9f0da1dc (patch)
tree54e68064d233d8503536828e8d0680ba55ec22c7 /lib/CodeGen
parent10f51e8785e43d5a22acc2d2a638307c582949c2 (diff)
Push ctor vtable construction down further. WIP.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@86878 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen')
-rw-r--r--lib/CodeGen/CGVtable.cpp24
-rw-r--r--lib/CodeGen/CGVtable.h5
-rw-r--r--lib/CodeGen/CodeGenModule.h4
3 files changed, 22 insertions, 11 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp
index 4d3c3a595d..233bdafd4f 100644
--- a/lib/CodeGen/CGVtable.cpp
+++ b/lib/CodeGen/CGVtable.cpp
@@ -681,10 +681,15 @@ int64_t CGVtableInfo::getVirtualBaseOffsetIndex(const CXXRecordDecl *RD,
return I->second;
}
-llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *RD) {
+llvm::Constant *CodeGenModule::GenerateVtable(const CXXRecordDecl *RD,
+ const CXXRecordDecl *LayoutClass,
+ uint64_t Offset) {
llvm::SmallString<256> OutName;
llvm::raw_svector_ostream Out(OutName);
- mangleCXXVtable(getMangleContext(), RD, Out);
+ if (LayoutClass)
+ mangleCXXCtorVtable(getMangleContext(), RD, Offset, LayoutClass, Out);
+ else
+ mangleCXXVtable(getMangleContext(), RD, Out);
llvm::GlobalVariable::LinkageTypes linktype;
linktype = llvm::GlobalValue::LinkOnceODRLinkage;
@@ -754,7 +759,7 @@ class VTTBuilder {
&& !NonVirtualPrimaryBase) {
// FIXME: Slightly too many of these for __ZTT8test8_B2
llvm::Constant *vtbl;
- vtbl = CGM.getVtableInfo().getVtable(Base, Class, BaseOffset/8);
+ vtbl = CGM.getVtableInfo().getCtorVtable(Base, Class, BaseOffset/8);
Inits.push_back(vtbl);
}
Secondary(Base, BaseOffset, BaseMorallyVirtual);
@@ -768,7 +773,7 @@ class VTTBuilder {
return;
// First comes the primary virtual table pointer...
- Inits.push_back(CGM.getVtableInfo().getVtable(RD, Class, Offset));
+ Inits.push_back(CGM.getVtableInfo().getCtorVtable(RD, Class, Offset));
// then the secondary VTTs....
SecondaryVTTs(RD, MorallyVirtual);
@@ -852,10 +857,7 @@ llvm::Constant *CodeGenModule::GenerateVTT(const CXXRecordDecl *RD) {
return vtt;
}
-llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD,
- const CXXRecordDecl *Class,
- uint64_t Offset) {
- // FIXME: Add ctor vtable support
+llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD) {
llvm::Constant *&vtbl = Vtables[RD];
if (vtbl)
return vtbl;
@@ -863,3 +865,9 @@ llvm::Constant *CGVtableInfo::getVtable(const CXXRecordDecl *RD,
CGM.GenerateVTT(RD);
return vtbl;
}
+
+llvm::Constant *CGVtableInfo::getCtorVtable(const CXXRecordDecl *RD,
+ const CXXRecordDecl *Class,
+ uint64_t Offset) {
+ return CGM.GenerateVtable(RD, Class, Offset);
+}
diff --git a/lib/CodeGen/CGVtable.h b/lib/CodeGen/CGVtable.h
index 9620e42aab..7ad42b59fb 100644
--- a/lib/CodeGen/CGVtable.h
+++ b/lib/CodeGen/CGVtable.h
@@ -57,8 +57,9 @@ public:
int64_t getVirtualBaseOffsetIndex(const CXXRecordDecl *RD,
const CXXRecordDecl *VBase);
- llvm::Constant *getVtable(const CXXRecordDecl *RD,
- const CXXRecordDecl *Class=0, uint64_t Offset=0);
+ llvm::Constant *getVtable(const CXXRecordDecl *RD);
+ llvm::Constant *getCtorVtable(const CXXRecordDecl *RD,
+ const CXXRecordDecl *Class, uint64_t Offset);
};
}
diff --git a/lib/CodeGen/CodeGenModule.h b/lib/CodeGen/CodeGenModule.h
index 6c433d9d66..990706d11f 100644
--- a/lib/CodeGen/CodeGenModule.h
+++ b/lib/CodeGen/CodeGenModule.h
@@ -253,7 +253,9 @@ public:
const llvm::Type *Ty = 0);
/// GenerateVtable - Generate the vtable for the given type.
- llvm::Constant *GenerateVtable(const CXXRecordDecl *RD);
+ llvm::Constant *GenerateVtable(const CXXRecordDecl *RD,
+ const CXXRecordDecl *Class=0,
+ uint64_t Offset=0);
/// GenerateVTT - Generate the VTT for the given type.
llvm::Constant *GenerateVTT(const CXXRecordDecl *RD);