Baby steps towards using only CharUnits for base class offsets in ASTRecordLayout. Start by storing the offsets in CharUnits in the ASTRecordLayout object.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@117869 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h
index 17fe4ad..875e314 100644
--- a/include/clang/AST/RecordLayout.h
+++ b/include/clang/AST/RecordLayout.h
@@ -119,7 +119,7 @@
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 @@
~ASTRecordLayout() {}
void Destroy(ASTContext &Ctx);
-
+
ASTRecordLayout(const ASTRecordLayout&); // DO NOT IMPLEMENT
void operator=(const ASTRecordLayout&); // DO NOT IMPLEMENT
public:
@@ -218,7 +218,8 @@
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 @@
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;
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index 35f6d99..73d5343 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -565,7 +565,7 @@
/// 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 @@
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 @@
// 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 @@
// 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);
}