Store the entire base subobject in SubVTTIndices.

llvm-svn: 102890
This commit is contained in:
Anders Carlsson 2010-05-03 00:55:11 +00:00
parent f4da2cf20a
commit 8bdbb5be19
2 changed files with 13 additions and 16 deletions

View File

@ -43,7 +43,7 @@ class VTTBuilder {
/// SubVTTIndicies - The sub-VTT indices for the bases of the most derived
/// class.
llvm::DenseMap<const CXXRecordDecl *, uint64_t> SubVTTIndicies;
llvm::DenseMap<BaseSubobject, uint64_t> SubVTTIndicies;
/// SecondaryVirtualPointerIndices - The secondary virtual pointer indices of
/// all subobjects of the most derived class.
@ -116,8 +116,7 @@ public:
}
/// getSubVTTIndicies - Returns a reference to the sub-VTT indices.
const llvm::DenseMap<const CXXRecordDecl *, uint64_t> &
getSubVTTIndicies() const {
const llvm::DenseMap<BaseSubobject, uint64_t> &getSubVTTIndicies() const {
return SubVTTIndicies;
}
@ -341,7 +340,7 @@ void VTTBuilder::LayoutVTT(BaseSubobject Base, bool BaseIsVirtual) {
if (!IsPrimaryVTT) {
// Remember the sub-VTT index.
SubVTTIndicies[RD] = VTTComponents.size();
SubVTTIndicies[Base] = VTTComponents.size();
}
AddressPointsMapTy AddressPoints;
@ -436,24 +435,24 @@ bool CodeGenVTables::needsVTTParameter(GlobalDecl GD) {
uint64_t CodeGenVTables::getSubVTTIndex(const CXXRecordDecl *RD,
BaseSubobject Base) {
ClassPairTy ClassPair(RD, Base.getBase());
BaseSubobjectPairTy ClassSubobjectPair(RD, Base);
SubVTTIndiciesMapTy::iterator I = SubVTTIndicies.find(ClassPair);
SubVTTIndiciesMapTy::iterator I = SubVTTIndicies.find(ClassSubobjectPair);
if (I != SubVTTIndicies.end())
return I->second;
VTTBuilder Builder(CGM, RD, /*GenerateDefinition=*/false);
for (llvm::DenseMap<const CXXRecordDecl *, uint64_t>::const_iterator I =
for (llvm::DenseMap<BaseSubobject, uint64_t>::const_iterator I =
Builder.getSubVTTIndicies().begin(),
E = Builder.getSubVTTIndicies().end(); I != E; ++I) {
// Insert all indices.
ClassPairTy ClassPair(RD, I->first);
BaseSubobjectPairTy ClassSubobjectPair(RD, I->first);
SubVTTIndicies.insert(std::make_pair(ClassPair, I->second));
SubVTTIndicies.insert(std::make_pair(ClassSubobjectPair, I->second));
}
I = SubVTTIndicies.find(ClassPair);
I = SubVTTIndicies.find(ClassSubobjectPair);
assert(I != SubVTTIndicies.end() && "Did not find index!");
return I->second;

View File

@ -216,8 +216,8 @@ class CodeGenVTables {
/// integers are the vtable components.
VTableLayoutMapTy VTableLayoutMap;
typedef llvm::DenseMap<std::pair<const CXXRecordDecl *,
BaseSubobject>, uint64_t> AddressPointsMapTy;
typedef std::pair<const CXXRecordDecl *, BaseSubobject> BaseSubobjectPairTy;
typedef llvm::DenseMap<BaseSubobjectPairTy, uint64_t> AddressPointsMapTy;
/// Address points - Address points for all vtables.
AddressPointsMapTy AddressPoints;
@ -247,14 +247,12 @@ class CodeGenVTables {
return &Components[1];
}
typedef llvm::DenseMap<ClassPairTy, uint64_t> SubVTTIndiciesMapTy;
typedef llvm::DenseMap<BaseSubobjectPairTy, uint64_t> SubVTTIndiciesMapTy;
/// SubVTTIndicies - Contains indices into the various sub-VTTs.
SubVTTIndiciesMapTy SubVTTIndicies;
typedef llvm::DenseMap<std::pair<const CXXRecordDecl *,
BaseSubobject>, uint64_t>
typedef llvm::DenseMap<BaseSubobjectPairTy, uint64_t>
SecondaryVirtualPointerIndicesMapTy;
/// SecondaryVirtualPointerIndices - Contains the secondary virtual pointer