diff options
author | Anders Carlsson <andersca@mac.com> | 2009-07-28 17:56:36 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-07-28 17:56:36 +0000 |
commit | c2cc1d5e29596f2ee2f32ca9c06f9119904dd161 (patch) | |
tree | 774785669b71798c4b38fa6ac9842c268ede34c7 /lib/CodeGen/CGRecordLayoutBuilder.cpp | |
parent | 9e809e7da2448c08aa11f15be4680226754678ce (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.cpp | 26 |
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 { |