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;
~ASTRecordLayout() {}
void Destroy(ASTContext &Ctx);
-
+
ASTRecordLayout(const ASTRecordLayout&); // DO NOT IMPLEMENT
void operator=(const ASTRecordLayout&); // DO NOT IMPLEMENT
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.
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;
/// 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;
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);
}
// 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);
// 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);
}