aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Earnshaw <rearnsha@arm.com>2019-01-22 17:56:02 +0000
committerRichard Earnshaw <rearnsha@gcc.gnu.org>2019-01-22 17:56:02 +0000
commit43646ce3e010e02f4c9252bde6032f233b341245 (patch)
tree6c0bf94fc846c397921e236d689a06cc36b8dbbd
parentdf69e824488337a4a85f8a4893e0f0081f45cd72 (diff)
downloadgcc-43646ce3e010e02f4c9252bde6032f233b341245.zip
gcc-43646ce3e010e02f4c9252bde6032f233b341245.tar.gz
gcc-43646ce3e010e02f4c9252bde6032f233b341245.tar.bz2
[arm] Further fixes for PR88469
A bitfield that is exactly the same size as an integral type and naturally aligned will have DECL_BIT_FIELD cleared. So we need to check DECL_BIT_FIELD_TYPE to be sure whether or not the underlying type was declared with a bitfield declaration. I've also added a test for bitfields that are based on overaligned types. PR target/88469 gcc: * config/arm/arm.c (arm_needs_double_word_align): Check DECL_BIT_FIELD_TYPE. gcc/testsuite: * gcc.target/arm/aapcs/bitfield2.c: New test. * gcc.target/arm/aapcs/bitfield3.c: New test. From-SVN: r268160
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/arm/arm.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.target/arm/aapcs/bitfield2.c26
-rw-r--r--gcc/testsuite/gcc.target/arm/aapcs/bitfield3.c26
5 files changed, 65 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8a077cc..84f9622 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-22 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/88469
+ * config/arm/arm.c (arm_needs_double_word_align): Check
+ DECL_BIT_FIELD_TYPE.
+
2019-01-22 Hongtao Liu <hongtao.liu@intel.com>
H.J. Lu <hongjiu.lu@intel.com>
diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
index c6fbda2..16e22ee 100644
--- a/gcc/config/arm/arm.c
+++ b/gcc/config/arm/arm.c
@@ -6634,7 +6634,7 @@ arm_needs_doubleword_align (machine_mode mode, const_tree type)
ret = -1;
}
else if (TREE_CODE (field) == FIELD_DECL
- && DECL_BIT_FIELD (field)
+ && DECL_BIT_FIELD_TYPE (field)
&& TYPE_ALIGN (DECL_BIT_FIELD_TYPE (field)) > PARM_BOUNDARY)
ret2 = 1;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 86212e5..851e391 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2019-01-22 Richard Earnshaw <rearnsha@arm.com>
+
+ PR target/88469
+ * gcc.target/arm/aapcs/bitfield2.c: New test.
+ * gcc.target/arm/aapcs/bitfield3.c: New test.
+
2019-01-22 Wilco Dijkstra <wdijkstr@arm.com>
PR rtl-optimization/87763
diff --git a/gcc/testsuite/gcc.target/arm/aapcs/bitfield2.c b/gcc/testsuite/gcc.target/arm/aapcs/bitfield2.c
new file mode 100644
index 0000000..9cbe2b0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/aapcs/bitfield2.c
@@ -0,0 +1,26 @@
+/* Test AAPCS layout (alignment). */
+
+/* { dg-do run { target arm_eabi } } */
+/* { dg-require-effective-target arm32 } */
+/* { dg-options "-O" } */
+
+#ifndef IN_FRAMEWORK
+#define TESTFILE "bitfield2.c"
+
+typedef unsigned int alint __attribute__((aligned (8)));
+
+struct bf
+{
+ alint a: 17;
+ alint b: 15;
+} v = {1, 1};
+
+#include "abitest.h"
+#else
+ ARG (int, 7, R0)
+ ARG (int, 9, R1)
+ ARG (int, 11, R2)
+ /* Alignment of the bitfield type should affect alignment of the overall
+ type, so R3 not used. */
+ LAST_ARG (struct bf, v, STACK)
+#endif
diff --git a/gcc/testsuite/gcc.target/arm/aapcs/bitfield3.c b/gcc/testsuite/gcc.target/arm/aapcs/bitfield3.c
new file mode 100644
index 0000000..0386e66
--- /dev/null
+++ b/gcc/testsuite/gcc.target/arm/aapcs/bitfield3.c
@@ -0,0 +1,26 @@
+/* Test AAPCS layout (alignment). */
+
+/* { dg-do run { target arm_eabi } } */
+/* { dg-require-effective-target arm32 } */
+/* { dg-options "-O" } */
+
+#ifndef IN_FRAMEWORK
+#define TESTFILE "bitfield3.c"
+
+struct bf
+{
+ /* Internally this may be mapped to unsigned short. Ensure we still
+ check the original declaration. */
+ unsigned long long a: 16;
+ unsigned b: 3;
+} v = {1, 3};
+
+#include "abitest.h"
+#else
+ ARG (int, 7, R0)
+ ARG (int, 9, R1)
+ ARG (int, 11, R2)
+ /* Alignment of the bitfield type should affect alignment of the overall
+ type, so R3 not used. */
+ LAST_ARG (struct bf, v, STACK)
+#endif