summaryrefslogtreecommitdiffstats
path: root/clang/lib/AST
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/AST')
-rw-r--r--clang/lib/AST/ASTContext.cpp9
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp20
2 files changed, 13 insertions, 16 deletions
diff --git a/clang/lib/AST/ASTContext.cpp b/clang/lib/AST/ASTContext.cpp
index 6b267432586..03c0abd3c62 100644
--- a/clang/lib/AST/ASTContext.cpp
+++ b/clang/lib/AST/ASTContext.cpp
@@ -847,7 +847,7 @@ ASTContext::getTypeInfo(const Type *T) const {
case Type::ObjCInterface: {
const ObjCInterfaceType *ObjCI = cast<ObjCInterfaceType>(T);
const ASTRecordLayout &Layout = getASTObjCInterfaceLayout(ObjCI->getDecl());
- Width = Layout.getSize().getQuantity() * getCharWidth();
+ Width = toBits(Layout.getSize());
Align = Layout.getAlignment();
break;
}
@@ -866,7 +866,7 @@ ASTContext::getTypeInfo(const Type *T) const {
const RecordType *RT = cast<RecordType>(TT);
const ASTRecordLayout &Layout = getASTRecordLayout(RT->getDecl());
- Width = Layout.getSize().getQuantity() * getCharWidth();
+ Width = toBits(Layout.getSize());
Align = Layout.getAlignment();
break;
}
@@ -923,6 +923,11 @@ CharUnits ASTContext::toCharUnitsFromBits(int64_t BitSize) const {
return CharUnits::fromQuantity(BitSize / getCharWidth());
}
+/// toBits - Convert a size in characters to a size in characters.
+int64_t ASTContext::toBits(CharUnits CharSize) const {
+ return CharSize.getQuantity() * getCharWidth();
+}
+
/// getTypeSizeInChars - Return the size of the specified type, in characters.
/// This method does not work on incomplete types.
CharUnits ASTContext::getTypeSizeInChars(QualType T) const {
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index 62306894ab6..9e7c9e5feb8 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -616,11 +616,6 @@ protected:
DataSize(0), NonVirtualSize(0), NonVirtualAlignment(8), PrimaryBase(0),
PrimaryBaseIsVirtual(false), FirstNearlyEmptyVBase(0) { }
- // FIXME: Remove this.
- uint64_t toOffset(CharUnits Offset) const {
- return Offset.getQuantity() * Context.getCharWidth();
- }
-
void Layout(const RecordDecl *D);
void Layout(const CXXRecordDecl *D);
void Layout(const ObjCInterfaceDecl *D);
@@ -1091,14 +1086,13 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
// If we have an empty base class, try to place it at offset 0.
if (Base->Class->isEmpty() &&
EmptySubobjects->CanPlaceBaseAtOffset(Base, CharUnits::Zero())) {
- Size = std::max(Size,
- Layout.getSize().getQuantity() * Context.getCharWidth());
+ uint64_t RecordSizeInBits = Context.toBits(Layout.getSize());
+ Size = std::max(Size, RecordSizeInBits);
return CharUnits::Zero();
}
- unsigned UnpackedBaseAlign =
- Layout.getNonVirtualAlign().getQuantity() * Context.getCharWidth();
+ unsigned UnpackedBaseAlign = Context.toBits(Layout.getNonVirtualAlign());
unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign;
// The maximum field alignment overrides base align.
@@ -1117,13 +1111,11 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
if (!Base->Class->isEmpty()) {
// Update the data size.
- DataSize = Offset +
- (Layout.getNonVirtualSize().getQuantity() * Context.getCharWidth());
+ DataSize = Offset + Context.toBits(Layout.getNonVirtualSize());
Size = std::max(Size, DataSize);
} else
- Size = std::max(Size,
- Offset + (Layout.getSize().getQuantity() * Context.getCharWidth()));
+ Size = std::max(Size, Offset + Context.toBits(Layout.getSize()));
// Remember max struct/class alignment.
UpdateAlignment(BaseAlign, UnpackedBaseAlign);
@@ -1885,7 +1877,7 @@ void ASTContext::DumpRecordLayout(const RecordDecl *RD,
RD->dump();
OS << "\nLayout: ";
OS << "<ASTRecordLayout\n";
- OS << " Size:" << Info.getSize().getQuantity() * getCharWidth() << "\n";
+ OS << " Size:" << toBits(Info.getSize()) << "\n";
OS << " DataSize:" << Info.getDataSize() << "\n";
OS << " Alignment:" << Info.getAlignment() << "\n";
OS << " FieldOffsets: [";
OpenPOWER on IntegriCloud