[cfe-commits] r107185 - in /cfe/trunk: lib/AST/RecordLayoutBuilder.cpp test/Sema/bitfield-layout.c

Daniel Dunbar daniel at zuster.org
Tue Jun 29 11:34:35 PDT 2010


Author: ddunbar
Date: Tue Jun 29 13:34:35 2010
New Revision: 107185

URL: http://llvm.org/viewvc/llvm-project?rev=107185&view=rev
Log:
Sema: Fix a subtle i64 -> i32 truncation which broke layout of large structures
with bit-fields.

Modified:
    cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
    cfe/trunk/test/Sema/bitfield-layout.c

Modified: cfe/trunk/lib/AST/RecordLayoutBuilder.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/RecordLayoutBuilder.cpp?rev=107185&r1=107184&r2=107185&view=diff
==============================================================================
--- cfe/trunk/lib/AST/RecordLayoutBuilder.cpp (original)
+++ cfe/trunk/lib/AST/RecordLayoutBuilder.cpp Tue Jun 29 13:34:35 2010
@@ -1296,7 +1296,7 @@
 
   // Check if we need to add padding to give the field the correct alignment.
   if (FieldSize == 0 || (FieldOffset & (FieldAlign-1)) + FieldSize > TypeSize)
-    FieldOffset = (FieldOffset + (FieldAlign-1)) & ~(FieldAlign-1);
+    FieldOffset = llvm::RoundUpToAlignment(FieldOffset, FieldAlign);
 
   // Padding members don't affect overall alignment.
   if (!D->getIdentifier())

Modified: cfe/trunk/test/Sema/bitfield-layout.c
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/bitfield-layout.c?rev=107185&r1=107184&r2=107185&view=diff
==============================================================================
--- cfe/trunk/test/Sema/bitfield-layout.c (original)
+++ cfe/trunk/test/Sema/bitfield-layout.c Tue Jun 29 13:34:35 2010
@@ -30,3 +30,13 @@
 struct f {__attribute((aligned(8))) int x : 30, y : 30, z : 30;};
 CHECK_SIZE(struct, f, 24)
 CHECK_ALIGN(struct, f, 8)
+
+// Large structure (overflows i32, in bits).
+struct s0 {
+  char a[0x32100000];
+  int x:30, y:30;
+};
+
+CHECK_SIZE(struct, s0, 0x32100008)
+CHECK_ALIGN(struct, s0, 4)
+





More information about the cfe-commits mailing list