Baby steps towards using only CharUnits for base class offsets in ASTRecordLayout. Start by storing the offsets in CharUnits in the ASTRecordLayout object.

llvm-svn: 117869
This commit is contained in:
Anders Carlsson 2010-10-31 21:01:46 +00:00
parent 1827509176
commit 22f5720c27
2 changed files with 17 additions and 9 deletions

View File

@ -119,7 +119,7 @@ private:
PrimaryBaseInfo PrimaryBase;
/// FIXME: This should really use a SmallPtrMap, once we have one in LLVM :)
typedef llvm::DenseMap<const CXXRecordDecl *, uint64_t> BaseOffsetsMapTy;
typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
/// BaseOffsets - Contains a map from base classes to their offset.
BaseOffsetsMapTy BaseOffsets;
@ -153,7 +153,7 @@ private:
~ASTRecordLayout() {}
void Destroy(ASTContext &Ctx);
ASTRecordLayout(const ASTRecordLayout&); // DO NOT IMPLEMENT
void operator=(const ASTRecordLayout&); // DO NOT IMPLEMENT
public:
@ -218,7 +218,8 @@ public:
assert(CXXInfo && "Record layout does not have C++ specific info!");
assert(CXXInfo->BaseOffsets.count(Base) && "Did not find base!");
return CXXInfo->BaseOffsets[Base];
return CXXInfo->BaseOffsets[Base].getQuantity() *
Base->getASTContext().getCharWidth();
}
/// getVBaseClassOffset - Get the offset, in bits, for the given base class.
@ -226,9 +227,10 @@ public:
assert(CXXInfo && "Record layout does not have C++ specific info!");
assert(CXXInfo->VBaseOffsets.count(VBase) && "Did not find base!");
return CXXInfo->VBaseOffsets[VBase];
return CXXInfo->VBaseOffsets[VBase].getQuantity() *
VBase->getASTContext().getCharWidth();
}
uint64_t getSizeOfLargestEmptySubobject() const {
assert(CXXInfo && "Record layout does not have C++ specific info!");
return CXXInfo->SizeOfLargestEmptySubobject;

View File

@ -565,7 +565,7 @@ protected:
/// out is virtual.
bool PrimaryBaseIsVirtual;
typedef llvm::DenseMap<const CXXRecordDecl *, uint64_t> BaseOffsetsMapTy;
typedef llvm::DenseMap<const CXXRecordDecl *, CharUnits> BaseOffsetsMapTy;
/// Bases - base classes and their offsets in the record.
BaseOffsetsMapTy Bases;
@ -992,10 +992,12 @@ RecordLayoutBuilder::LayoutNonVirtualBases(const CXXRecordDecl *RD) {
void RecordLayoutBuilder::LayoutNonVirtualBase(const BaseSubobjectInfo *Base) {
// Layout the base.
uint64_t Offset = LayoutBase(Base);
CharUnits OffsetInChars =
CharUnits::fromQuantity(Offset / Context.getCharWidth());
// Add its base class offset.
assert(!Bases.count(Base->Class) && "base offset already exists!");
Bases.insert(std::make_pair(Base->Class, Offset));
Bases.insert(std::make_pair(Base->Class, OffsetInChars));
AddPrimaryVirtualBaseOffsets(Base, Offset);
}
@ -1015,8 +1017,10 @@ RecordLayoutBuilder::AddPrimaryVirtualBaseOffsets(const BaseSubobjectInfo *Info,
// Add the offset.
assert(!VBases.count(Info->PrimaryVirtualBaseInfo->Class) &&
"primary vbase offset already exists!");
CharUnits OffsetInChars =
CharUnits::fromQuantity(Offset / Context.getCharWidth());
VBases.insert(std::make_pair(Info->PrimaryVirtualBaseInfo->Class,
Offset));
OffsetInChars));
// Traverse the primary virtual base.
AddPrimaryVirtualBaseOffsets(Info->PrimaryVirtualBaseInfo, Offset);
@ -1089,10 +1093,12 @@ void RecordLayoutBuilder::LayoutVirtualBase(const BaseSubobjectInfo *Base) {
// Layout the base.
uint64_t Offset = LayoutBase(Base);
CharUnits OffsetInChars =
CharUnits::fromQuantity(Offset / Context.getCharWidth());
// Add its base class offset.
assert(!VBases.count(Base->Class) && "vbase offset already exists!");
VBases.insert(std::make_pair(Base->Class, Offset));
VBases.insert(std::make_pair(Base->Class, OffsetInChars));
AddPrimaryVirtualBaseOffsets(Base, Offset);
}