summaryrefslogtreecommitdiffstats
path: root/test/CodeGen/arm64-be-bitfield.c
diff options
context:
space:
mode:
authorJames Molloy <james.molloy@arm.com>2014-05-07 17:41:15 +0000
committerJames Molloy <james.molloy@arm.com>2014-05-07 17:41:15 +0000
commit7bb93d64a69ee417a4f7f63ae6caffa59037ec53 (patch)
tree591ff6cb2b6e103422b5116475d482f060fa9c6f /test/CodeGen/arm64-be-bitfield.c
parent16173fc9baad640bab38a826c9d83963ccd3a0f1 (diff)
When doing int<->ptr coercion for big-endian, calculate the shift amount correctly.
Previously we calculated the shift amount based upon DataLayout::getTypeAllocSizeInBits. This will only work for legal types - types such as i24 that are created as part of structs for bitfields will return "32" from that function. Change to using getTypeSizeInBits. It turns out that AArch64 didn't run across this problem because it always returned [1 x i64] as the type for a bitfield, whereas ARM64 returns i64 so goes down this (better, but wrong) codepath. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@208231 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGen/arm64-be-bitfield.c')
-rw-r--r--test/CodeGen/arm64-be-bitfield.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/test/CodeGen/arm64-be-bitfield.c b/test/CodeGen/arm64-be-bitfield.c
new file mode 100644
index 0000000000..f563596bdd
--- /dev/null
+++ b/test/CodeGen/arm64-be-bitfield.c
@@ -0,0 +1,9 @@
+// RUN: %clang_cc1 -triple arm64_be-linux-gnu -ffreestanding -emit-llvm -O0 -o - %s | FileCheck %s
+
+struct bt3 { signed b2:10; signed b3:10; } b16;
+
+// The correct right-shift amount is 40 bits for big endian.
+signed callee_b0f(struct bt3 bp11) {
+// CHECK: = lshr i64 %{{.*}}, 40
+ return bp11.b2;
+}