aboutsummaryrefslogtreecommitdiff
path: root/lib/CodeGen/CGRecordLayoutBuilder.cpp
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-07-28 17:56:36 +0000
committerAnders Carlsson <andersca@mac.com>2009-07-28 17:56:36 +0000
commitc2cc1d5e29596f2ee2f32ca9c06f9119904dd161 (patch)
tree774785669b71798c4b38fa6ac9842c268ede34c7 /lib/CodeGen/CGRecordLayoutBuilder.cpp
parent9e809e7da2448c08aa11f15be4680226754678ce (diff)
More CGRecordLayoutBuilder cleanup.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77335 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/CGRecordLayoutBuilder.cpp')
-rw-r--r--lib/CodeGen/CGRecordLayoutBuilder.cpp26
1 files changed, 8 insertions, 18 deletions
diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp
index ed08d34730..11e1ee36fc 100644
--- a/lib/CodeGen/CGRecordLayoutBuilder.cpp
+++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp
@@ -41,8 +41,8 @@ void CGRecordLayoutBuilder::Layout(const RecordDecl *D) {
// We weren't able to layout the struct. Try again with a packed struct
Packed = true;
AlignmentAsLLVMStruct = 1;
+ NextFieldOffsetInBytes = 0;
FieldTypes.clear();
- FieldInfos.clear();
LLVMFields.clear();
LLVMBitFields.clear();
@@ -57,12 +57,12 @@ void CGRecordLayoutBuilder::LayoutBitField(const FieldDecl *D,
if (FieldSize == 0)
return;
- uint64_t NextFieldOffset = getNextFieldOffsetInBytes() * 8;
+ uint64_t NextFieldOffset = NextFieldOffsetInBytes * 8;
unsigned NumBytesToAppend;
if (FieldOffset < NextFieldOffset) {
assert(BitsAvailableInLastField && "Bitfield size mismatch!");
- assert(!FieldInfos.empty() && "Field infos can't be empty!");
+ assert(NextFieldOffsetInBytes && "Must have laid out at least one byte!");
// The bitfield begins in the previous bit-field.
NumBytesToAppend =
@@ -91,7 +91,7 @@ void CGRecordLayoutBuilder::LayoutBitField(const FieldDecl *D,
AlignmentAsLLVMStruct = std::max(AlignmentAsLLVMStruct, getTypeAlignment(Ty));
BitsAvailableInLastField =
- getNextFieldOffsetInBytes() * 8 - (FieldOffset + FieldSize);
+ NextFieldOffsetInBytes * 8 - (FieldOffset + FieldSize);
}
bool CGRecordLayoutBuilder::LayoutField(const FieldDecl *D,
@@ -222,13 +222,12 @@ void CGRecordLayoutBuilder::AppendTailPadding(uint64_t RecordSize) {
assert(RecordSize % 8 == 0 && "Invalid record size!");
uint64_t RecordSizeInBytes = RecordSize / 8;
- assert(getNextFieldOffsetInBytes() <= RecordSizeInBytes && "Size mismatch!");
+ assert(NextFieldOffsetInBytes <= RecordSizeInBytes && "Size mismatch!");
- unsigned NumPadBytes = RecordSizeInBytes - getNextFieldOffsetInBytes();
+ unsigned NumPadBytes = RecordSizeInBytes - NextFieldOffsetInBytes;
AppendBytes(NumPadBytes);
}
-
void CGRecordLayoutBuilder::AppendField(uint64_t FieldOffsetInBytes,
const llvm::Type *FieldTy) {
AlignmentAsLLVMStruct = std::max(AlignmentAsLLVMStruct,
@@ -237,8 +236,8 @@ void CGRecordLayoutBuilder::AppendField(uint64_t FieldOffsetInBytes,
uint64_t FieldSizeInBytes = getTypeSizeInBytes(FieldTy);
FieldTypes.push_back(FieldTy);
- FieldInfos.push_back(FieldInfo(FieldOffsetInBytes, FieldSizeInBytes));
+ NextFieldOffsetInBytes = FieldOffsetInBytes + FieldSizeInBytes;
BitsAvailableInLastField = 0;
}
@@ -250,7 +249,6 @@ CGRecordLayoutBuilder::AppendPadding(uint64_t FieldOffsetInBytes,
void CGRecordLayoutBuilder::AppendPadding(uint64_t FieldOffsetInBytes,
unsigned FieldAlignment) {
- uint64_t NextFieldOffsetInBytes = getNextFieldOffsetInBytes();
assert(NextFieldOffsetInBytes <= FieldOffsetInBytes &&
"Incorrect field layout!");
@@ -276,15 +274,7 @@ void CGRecordLayoutBuilder::AppendBytes(uint64_t NumBytes) {
Ty = llvm::ArrayType::get(Ty, NumBytes);
// Append the padding field
- AppendField(getNextFieldOffsetInBytes(), Ty);
-}
-
-uint64_t CGRecordLayoutBuilder::getNextFieldOffsetInBytes() const {
- if (FieldInfos.empty())
- return 0;
-
- const FieldInfo &LastInfo = FieldInfos.back();
- return LastInfo.OffsetInBytes + LastInfo.SizeInBytes;
+ AppendField(NextFieldOffsetInBytes, Ty);
}
unsigned CGRecordLayoutBuilder::getTypeAlignment(const llvm::Type *Ty) const {