[cfe-commits] r77335 - in /cfe/trunk/lib/CodeGen: CGRecordLayoutBuilder.cpp CGRecordLayoutBuilder.h

Anders Carlsson andersca at mac.com
Tue Jul 28 10:56:36 PDT 2009


Author: andersca
Date: Tue Jul 28 12:56:36 2009
New Revision: 77335

URL: http://llvm.org/viewvc/llvm-project?rev=77335&view=rev
Log:
More CGRecordLayoutBuilder cleanup.

Modified:
    cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp
    cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.h

Modified: cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp?rev=77335&r1=77334&r2=77335&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.cpp Tue Jul 28 12:56:36 2009
@@ -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 {

Modified: cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.h
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.h?rev=77335&r1=77334&r2=77335&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.h (original)
+++ cfe/trunk/lib/CodeGen/CGRecordLayoutBuilder.h Tue Jul 28 12:56:36 2009
@@ -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;
 





More information about the cfe-commits mailing list