[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