summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2010-04-17 20:21:41 +0000
committerAnders Carlsson <andersca@mac.com>2010-04-17 20:21:41 +0000
commitaad5fa85d06989ee3270e2012245f481b5de19e3 (patch)
tree29ed69346189037e5fdbb5c50a7f338b1331f6e3
parente03aa55bfdf5f8f63c1c6b4240b71e1027750d0b (diff)
downloadbcm5719-llvm-aad5fa85d06989ee3270e2012245f481b5de19e3.tar.gz
bcm5719-llvm-aad5fa85d06989ee3270e2012245f481b5de19e3.zip
If a wide bit-field is inside a union its offset should always be 0.
llvm-svn: 101668
-rw-r--r--clang/lib/AST/RecordLayoutBuilder.cpp11
-rw-r--r--clang/test/CodeGenCXX/bitfield-layout.cpp9
2 files changed, 16 insertions, 4 deletions
diff --git a/clang/lib/AST/RecordLayoutBuilder.cpp b/clang/lib/AST/RecordLayoutBuilder.cpp
index d1de70a7ab8..a674ad79709 100644
--- a/clang/lib/AST/RecordLayoutBuilder.cpp
+++ b/clang/lib/AST/RecordLayoutBuilder.cpp
@@ -640,13 +640,16 @@ void ASTRecordLayoutBuilder::LayoutWideBitField(uint64_t FieldSize,
// We're not going to use any of the unfilled bits in the last byte.
UnfilledBitsInLastByte = 0;
- // The bitfield is allocated starting at the next offset aligned appropriately
- // for T', with length n bits.
- uint64_t FieldOffset = llvm::RoundUpToAlignment(DataSize, TypeAlign);
-
+ uint64_t FieldOffset;
+
if (IsUnion) {
DataSize = std::max(DataSize, FieldSize);
+ FieldOffset = 0;
} else {
+ // The bitfield is allocated starting at the next offset aligned appropriately
+ // for T', with length n bits.
+ FieldOffset = llvm::RoundUpToAlignment(DataSize, TypeAlign);
+
uint64_t NewSizeInBits = FieldOffset + FieldSize;
DataSize = llvm::RoundUpToAlignment(NewSizeInBits, 8);
diff --git a/clang/test/CodeGenCXX/bitfield-layout.cpp b/clang/test/CodeGenCXX/bitfield-layout.cpp
new file mode 100644
index 00000000000..c77c925d876
--- /dev/null
+++ b/clang/test/CodeGenCXX/bitfield-layout.cpp
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 %s -triple=x86_64-apple-darwin10 -emit-llvm -o - | FileCheck %s
+
+// CHECK: = type { i32, [4 x i8] }
+union Test1 {
+ int a;
+ int b: 39;
+};
+
+Test1 t1;
OpenPOWER on IntegriCloud