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:
parent
1827509176
commit
22f5720c27
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue