aboutsummaryrefslogtreecommitdiff
path: root/lib/AST/RecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-10-31 21:01:46 +0000
committerAnders Carlsson <andersca@mac.com>2010-10-31 21:01:46 +0000
commit376bda924ac92462a22d6a22ea65d8c1bb8f26f3 (patch)
tree91acf2577c1690244167115053f46cdaee13d44f /lib/AST/RecordLayoutBuilder.cpp
parent5c5a764fcd256df6f6cfbce5cdd2a2dfb2c45e95 (diff)
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
Diffstat (limited to 'lib/AST/RecordLayoutBuilder.cpp')
-rw-r--r--lib/AST/RecordLayoutBuilder.cpp14
1 files changed, 10 insertions, 4 deletions
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index 35f6d9957e..73d534391c 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -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);
}