More work on the constant struct builder. We now try to layout all constant structs...
authorAnders Carlsson <andersca@mac.com>
Sat, 25 Jul 2009 00:24:56 +0000 (00:24 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 25 Jul 2009 00:24:56 +0000 (00:24 +0000)
llvm-svn: 77021

clang/lib/CodeGen/CGExprConstant.cpp
clang/utils/ABITest/layout/Makefile

index 07570c1034b822c7852d2eb4e14bd8aba1cb9770..84e9283cadbdb1d256869f8ae2ee1439c41a96d5 100644 (file)
@@ -34,6 +34,7 @@ class VISIBILITY_HIDDEN ConstStructBuilder {
   CodeGenFunction *CGF;
 
   bool Packed;  
+
   unsigned NextFieldOffsetInBytes;
   
   std::vector<llvm::Constant *> Elements;
@@ -131,12 +132,24 @@ class VISIBILITY_HIDDEN ConstStructBuilder {
       ElementNo++;
     }
     
+    uint64_t LayoutSizeInBytes = Layout.getSize() / 8;
+    
+    if (NextFieldOffsetInBytes > LayoutSizeInBytes) {
+      // If the struct is bigger than the size of the record type,
+      // we must have a flexible array member at the end.
+      assert(RD->hasFlexibleArrayMember() &&
+             "Must have flexible array member if struct is bigger than type!");
+      
+      // No tail padding is necessary.
+      return true;
+    }
+    
     // Append tail padding if necessary.
     AppendTailPadding(Layout.getSize());
-    
+      
     assert(Layout.getSize() / 8 == NextFieldOffsetInBytes && 
            "Tail padding mismatch!");
-
+    
     return true;
   }
   
@@ -156,16 +169,15 @@ public:
                                      const InitListExpr *ILE) {
     ConstStructBuilder Builder(CGM, CGF);
     
-    // FIXME: Use this when it works well enough.
-    return 0;
-    
     if (!Builder.Build(ILE))
       return 0;
     
     llvm::Constant *Result = 
       CGM.getLLVMContext().getConstantStruct(Builder.Elements, Builder.Packed);
 
-    assert(Builder.NextFieldOffsetInBytes == Builder.getSizeInBytes(Result));
+    assert(llvm::RoundUpToAlignment(Builder.NextFieldOffsetInBytes,
+                                    Builder.getAlignment(Result)) == 
+           Builder.getSizeInBytes(Result) && "Size mismatch!");
 
     return Result;
   }
@@ -330,6 +342,7 @@ public:
   }
 
   llvm::Constant *EmitStructInitialization(InitListExpr *ILE) {
+    // FIXME: Use the returned struct when the builder works well enough.
     ConstStructBuilder::BuildStruct(CGM, CGF, ILE);
     
     const llvm::StructType *SType =
index 0520625fcf29f850a47fe9e095adfabd2ced6810..95536b884a0188f38c6a6dd26d08ac84df7d40a9 100644 (file)
@@ -11,11 +11,11 @@ TIMEOUT := 5
 
 CFLAGS := -std=gnu99
 
-X_COMPILER := llvm-gcc
+X_COMPILER := /Developer/usr/bin/llvm-gcc-4.2
 Y_COMPILER := clang
 CC := gcc
 
-ifeq (0, 0)
+ifeq (1, 0)
 X_CFLAGS := -m32
 Y_CFLAGS := -m32
 CC_CFLAGS := -m32