From 84b0316f720bd089d87acb21ec0002b2da33e6c9 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Tue, 29 Jun 2010 18:34:35 +0000 Subject: [PATCH] Sema: Fix a subtle i64 -> i32 truncation which broke layout of large structures with bit-fields. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@107185 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/RecordLayoutBuilder.cpp | 2 +- test/Sema/bitfield-layout.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/AST/RecordLayoutBuilder.cpp b/lib/AST/RecordLayoutBuilder.cpp index 275daf6bb2..88d71ce042 100644 --- a/lib/AST/RecordLayoutBuilder.cpp +++ b/lib/AST/RecordLayoutBuilder.cpp @@ -1296,7 +1296,7 @@ void RecordLayoutBuilder::LayoutBitField(const FieldDecl *D) { // 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()) diff --git a/test/Sema/bitfield-layout.c b/test/Sema/bitfield-layout.c index edc44bdefa..2655fc70cd 100644 --- a/test/Sema/bitfield-layout.c +++ b/test/Sema/bitfield-layout.c @@ -30,3 +30,13 @@ CHECK_ALIGN(struct, e, 1) 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) + -- 2.40.0