More CGRecordLayoutBuilder cleanup.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@77335 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/CodeGen/CGRecordLayoutBuilder.cpp b/lib/CodeGen/CGRecordLayoutBuilder.cpp
index ed08d34..11e1ee3 100644
--- a/lib/CodeGen/CGRecordLayoutBuilder.cpp
+++ b/lib/CodeGen/CGRecordLayoutBuilder.cpp
@@ -41,8 +41,8 @@
// 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 @@
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 @@
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 @@
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 @@
uint64_t FieldSizeInBytes = getTypeSizeInBytes(FieldTy);
FieldTypes.push_back(FieldTy);
- FieldInfos.push_back(FieldInfo(FieldOffsetInBytes, FieldSizeInBytes));
+ NextFieldOffsetInBytes = FieldOffsetInBytes + FieldSizeInBytes;
BitsAvailableInLastField = 0;
}
@@ -250,7 +249,6 @@
void CGRecordLayoutBuilder::AppendPadding(uint64_t FieldOffsetInBytes,
unsigned FieldAlignment) {
- uint64_t NextFieldOffsetInBytes = getNextFieldOffsetInBytes();
assert(NextFieldOffsetInBytes <= FieldOffsetInBytes &&
"Incorrect field layout!");
@@ -276,15 +274,7 @@
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 {
diff --git a/lib/CodeGen/CGRecordLayoutBuilder.h b/lib/CodeGen/CGRecordLayoutBuilder.h
index f236881..bca0b5c 100644
--- a/lib/CodeGen/CGRecordLayoutBuilder.h
+++ b/lib/CodeGen/CGRecordLayoutBuilder.h
@@ -43,21 +43,13 @@
/// BitsAvailableInLastField - If a bit field spans only part of a LLVM field,
/// this will have the number of bits still available in the field.
char BitsAvailableInLastField;
+
+ /// NextFieldOffsetInBytes - Holds the next field offset in bytes.
+ uint64_t NextFieldOffsetInBytes;
/// FieldTypes - Holds the LLVM types that the struct is created from.
std::vector<const llvm::Type *> FieldTypes;
- /// FieldInfo - Holds size and offset information about a field.
- /// FIXME: I think we can get rid of this.
- struct FieldInfo {
- FieldInfo(uint64_t OffsetInBytes, uint64_t SizeInBytes)
- : OffsetInBytes(OffsetInBytes), SizeInBytes(SizeInBytes) { }
-
- const uint64_t OffsetInBytes;
- const uint64_t SizeInBytes;
- };
- llvm::SmallVector<FieldInfo, 16> FieldInfos;
-
/// LLVMFieldInfo - Holds a field and its corresponding LLVM field number.
typedef std::pair<const FieldDecl *, unsigned> LLVMFieldInfo;
llvm::SmallVector<LLVMFieldInfo, 16> LLVMFields;
@@ -78,7 +70,7 @@
CGRecordLayoutBuilder(CodeGenTypes &Types)
: Types(Types), Packed(false), AlignmentAsLLVMStruct(1)
- , BitsAvailableInLastField(0) { }
+ , BitsAvailableInLastField(0), NextFieldOffsetInBytes(0) { }
/// Layout - Will layout a RecordDecl.
void Layout(const RecordDecl *D);
@@ -115,9 +107,6 @@
/// the passed size.
void AppendTailPadding(uint64_t RecordSize);
- /// getNextFieldOffsetInBytes - returns where the next field offset is.
- uint64_t getNextFieldOffsetInBytes() const;
-
unsigned getTypeAlignment(const llvm::Type *Ty) const;
uint64_t getTypeSizeInBytes(const llvm::Type *Ty) const;