aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKen Dyck <kd@kendyck.com>2011-02-08 02:02:47 +0000
committerKen Dyck <kd@kendyck.com>2011-02-08 02:02:47 +0000
commit68cf1a5a01ba43ed56a8624632fd65e0804430ac (patch)
tree1d4d848c5ee1af7d63a85254aa3391bb18809af4
parentda263795abd39437d73d23fcf34dcd3afc1d7df3 (diff)
Convert RecordLayout::NonVirtualAlign to CharUnits. No change in
functionality intended. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@125069 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/RecordLayout.h10
-rw-r--r--lib/AST/RecordLayout.cpp2
-rw-r--r--lib/AST/RecordLayoutBuilder.cpp8
-rw-r--r--lib/CodeGen/CGRecordLayoutBuilder.cpp15
4 files changed, 21 insertions, 14 deletions
diff --git a/include/clang/AST/RecordLayout.h b/include/clang/AST/RecordLayout.h
index 108fa5147d..d442320042 100644
--- a/include/clang/AST/RecordLayout.h
+++ b/include/clang/AST/RecordLayout.h
@@ -54,9 +54,9 @@ class ASTRecordLayout {
/// the size of the object without virtual bases.
CharUnits NonVirtualSize;
- /// NonVirtualAlign - The non-virtual alignment (in bits) of an object,
+ /// NonVirtualAlign - The non-virtual alignment (in chars) of an object,
/// which is the alignment of the object without virtual bases.
- uint64_t NonVirtualAlign;
+ CharUnits NonVirtualAlign;
/// SizeOfLargestEmptySubobject - The size of the largest empty subobject
/// (either a base or a member). Will be zero if the class doesn't contain
@@ -91,7 +91,7 @@ class ASTRecordLayout {
ASTRecordLayout(const ASTContext &Ctx,
uint64_t size, unsigned alignment, uint64_t datasize,
const uint64_t *fieldoffsets, unsigned fieldcount,
- CharUnits nonvirtualsize, unsigned nonvirtualalign,
+ CharUnits nonvirtualsize, CharUnits nonvirtualalign,
CharUnits SizeOfLargestEmptySubobject,
const CXXRecordDecl *PrimaryBase,
bool IsPrimaryBaseVirtual,
@@ -136,9 +136,9 @@ public:
return CXXInfo->NonVirtualSize;
}
- /// getNonVirtualSize - Get the non-virtual alignment (in bits) of an object,
+ /// getNonVirtualSize - Get the non-virtual alignment (in chars) of an object,
/// which is the alignment of the object without virtual bases.
- unsigned getNonVirtualAlign() const {
+ CharUnits getNonVirtualAlign() const {
assert(CXXInfo && "Record layout does not have C++ specific info!");
return CXXInfo->NonVirtualAlign;
diff --git a/lib/AST/RecordLayout.cpp b/lib/AST/RecordLayout.cpp
index cdecff66f8..32e3821ca2 100644
--- a/lib/AST/RecordLayout.cpp
+++ b/lib/AST/RecordLayout.cpp
@@ -46,7 +46,7 @@ ASTRecordLayout::ASTRecordLayout(const ASTContext &Ctx,
const uint64_t *fieldoffsets,
unsigned fieldcount,
CharUnits nonvirtualsize,
- unsigned nonvirtualalign,
+ CharUnits nonvirtualalign,
CharUnits SizeOfLargestEmptySubobject,
const CXXRecordDecl *PrimaryBase,
bool IsPrimaryBaseVirtual,
diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp
index a871c3d176..6b98ecd87d 100644
--- a/lib/AST/RecordLayoutBuilder.cpp
+++ b/lib/AST/RecordLayoutBuilder.cpp
@@ -1096,7 +1096,8 @@ CharUnits RecordLayoutBuilder::LayoutBase(const BaseSubobjectInfo *Base) {
return CharUnits::Zero();
}
- unsigned UnpackedBaseAlign = Layout.getNonVirtualAlign();
+ unsigned UnpackedBaseAlign =
+ Layout.getNonVirtualAlign().getQuantity() * Context.getCharWidth();
unsigned BaseAlign = (Packed) ? 8 : UnpackedBaseAlign;
// The maximum field alignment overrides base align.
@@ -1684,13 +1685,14 @@ ASTContext::getASTRecordLayout(const RecordDecl *D) const {
IsPODForThePurposeOfLayout ? Builder->Size : Builder->DataSize;
uint64_t NonVirtualSize =
IsPODForThePurposeOfLayout ? DataSize : Builder->NonVirtualSize;
+ uint64_t NonVirtualAlign = Builder->NonVirtualAlignment;
NewEntry =
new (*this) ASTRecordLayout(*this, Builder->Size, Builder->Alignment,
DataSize, Builder->FieldOffsets.data(),
Builder->FieldOffsets.size(),
toCharUnitsFromBits(NonVirtualSize),
- Builder->NonVirtualAlignment,
+ toCharUnitsFromBits(NonVirtualAlign),
EmptySubobjects.SizeOfLargestEmptySubobject,
Builder->PrimaryBase,
Builder->PrimaryBaseIsVirtual,
@@ -1859,7 +1861,7 @@ static void DumpCXXRecordLayout(llvm::raw_ostream &OS,
OS << ", dsize=" << Layout.getDataSize() / 8;
OS << ", align=" << Layout.getAlignment() / 8 << '\n';
OS << " nvsize=" << Layout.getNonVirtualSize().getQuantity();
- OS << ", nvalign=" << Layout.getNonVirtualAlign() / 8 << '\n';
+ OS << ", nvalign=" << Layout.getNonVirtualAlign().getQuantity() << '\n';
OS << '\n';
}
diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp
index b9b8c9d073..e158eed987 100644
--- a/lib/CodeGen/CGRecordLayoutBuilder.cpp
+++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp
@@ -617,9 +617,10 @@ CGRecordLayoutBuilder::ComputeNonVirtualBaseType(const CXXRecordDecl *RD) {
const ASTRecordLayout &Layout = Types.getContext().getASTRecordLayout(RD);
+ CharUnits NonVirtualSize = Layout.getNonVirtualSize();
+ CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
uint64_t AlignedNonVirtualTypeSize =
- llvm::RoundUpToAlignment(Layout.getNonVirtualSize().getQuantity() * 8,
- Layout.getNonVirtualAlign()) / 8;
+ NonVirtualSize.RoundUpToAlignment(NonVirtualAlign).getQuantity();
// First check if we can use the same fields as for the complete class.
@@ -855,9 +856,13 @@ CGRecordLayout *CodeGenTypes::ComputeRecordLayout(const RecordDecl *D) {
"Type size mismatch!");
if (BaseTy) {
- uint64_t AlignedNonVirtualTypeSizeInBits =
- llvm::RoundUpToAlignment(Layout.getNonVirtualSize().getQuantity() * 8,
- Layout.getNonVirtualAlign());
+ CharUnits NonVirtualSize = Layout.getNonVirtualSize();
+ CharUnits NonVirtualAlign = Layout.getNonVirtualAlign();
+ CharUnits AlignedNonVirtualTypeSize =
+ NonVirtualSize.RoundUpToAlignment(NonVirtualAlign);
+
+ uint64_t AlignedNonVirtualTypeSizeInBits =
+ AlignedNonVirtualTypeSize.getQuantity() * getContext().getCharWidth();
assert(AlignedNonVirtualTypeSizeInBits ==
getTargetData().getTypeAllocSizeInBits(BaseTy) &&