diff options
author | Anders Carlsson <andersca@mac.com> | 2010-03-24 03:57:14 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2010-03-24 03:57:14 +0000 |
commit | 5c6c1d9eca7ce932eff011cd3e592f606e60b4be (patch) | |
tree | 15066f8809d4c5211084bff7faa3930f69b3925c /lib/CodeGen/CGVtable.cpp | |
parent | 05030bb6790b259a169b25665656db2aee30ccda (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.cpp | 41 |
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) { |