aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGVtable.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-03-24 03:57:14 +0000
committerAnders Carlsson <andersca@mac.com>2010-03-24 03:57:14 +0000
commit5c6c1d9eca7ce932eff011cd3e592f606e60b4be (patch)
tree15066f8809d4c5211084bff7faa3930f69b3925c /lib/CodeGen/CGVtable.cpp
parent05030bb6790b259a169b25665656db2aee30ccda (diff)
More vtable work; preparations for moving over to the new vtable layout code (finally).
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99381 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGVtable.cpp')
-rw-r--r--lib/CodeGen/CGVtable.cpp41
1 files changed, 31 insertions, 10 deletions
diff --git a/lib/CodeGen/CGVtable.cpp b/lib/CodeGen/CGVtable.cpp
index f4921699be..c9b099bcd9 100644
--- a/lib/CodeGen/CGVtable.cpp
+++ b/lib/CodeGen/CGVtable.cpp
@@ -3551,6 +3551,19 @@ int64_t CodeGenVTables::getVirtualBaseOffsetOffset(const CXXRecordDecl *RD,
return I->second;
}
+const CodeGenVTables::AddrSubMap_t &
+CodeGenVTables::getAddressPoints(const CXXRecordDecl *RD) {
+ if (!AddressPoints[RD]) {
+ AddressPointsMapTy AddressPoints;
+ OldVtableBuilder b(RD, RD, 0, CGM, false, AddressPoints);
+
+ b.GenerateVtableForBase(RD, 0);
+ b.GenerateVtableForVBases(RD, 0);
+ }
+
+ return *(*AddressPoints[RD])[RD];
+}
+
llvm::GlobalVariable *
CodeGenVTables::GenerateVtable(llvm::GlobalVariable::LinkageTypes Linkage,
bool GenerateDefinition,
@@ -3583,8 +3596,7 @@ CodeGenVTables::GenerateVtable(llvm::GlobalVariable::LinkageTypes Linkage,
llvm::StringRef Name = OutName.str();
llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
- if (GV == 0 || CGM.getVTables().AddressPoints[LayoutClass] == 0 ||
- GV->isDeclaration()) {
+ if (GV == 0 || GV->isDeclaration()) {
OldVtableBuilder b(RD, LayoutClass, Offset, CGM, GenerateDefinition,
AddressPoints);
@@ -3906,17 +3918,26 @@ CodeGenVTables::GenerateClassData(llvm::GlobalVariable::LinkageTypes Linkage,
GenerateVTT(Linkage, /*GenerateDefinition=*/true, RD);
}
-llvm::GlobalVariable *CodeGenVTables::getVtable(const CXXRecordDecl *RD) {
- llvm::GlobalVariable *Vtable = Vtables.lookup(RD);
+llvm::Constant *CodeGenVTables::getAddrOfVTable(const CXXRecordDecl *RD) {
+ llvm::SmallString<256> OutName;
+ CGM.getMangleContext().mangleCXXVtable(RD, OutName);
+ llvm::StringRef Name = OutName.str();
+
+ const llvm::Type *Int8PtrTy = llvm::Type::getInt8PtrTy(CGM.getLLVMContext());
+ llvm::ArrayType *ArrayType = llvm::ArrayType::get(Int8PtrTy, 0);
- if (!Vtable) {
- AddressPointsMapTy AddressPoints;
- Vtable = GenerateVtable(llvm::GlobalValue::ExternalLinkage,
- /*GenerateDefinition=*/false, RD, RD, 0,
- /*IsVirtual=*/false, AddressPoints);
+ llvm::GlobalVariable *GV = CGM.getModule().getGlobalVariable(Name);
+ if (GV) {
+ if (!GV->isDeclaration() || GV->getType()->getElementType() == ArrayType)
+ return GV;
+
+ return llvm::ConstantExpr::getBitCast(GV, ArrayType->getPointerTo());
}
+
+ GV = new llvm::GlobalVariable(CGM.getModule(), ArrayType, /*isConstant=*/true,
+ llvm::GlobalValue::ExternalLinkage, 0, Name);
- return Vtable;
+ return GV;
}
void CodeGenVTables::EmitVTableRelatedData(GlobalDecl GD) {