diff options
author | Richard Earnshaw <rearnsha@arm.com> | 2019-01-22 17:56:02 +0000 |
---|---|---|
committer | Richard Earnshaw <rearnsha@gcc.gnu.org> | 2019-01-22 17:56:02 +0000 |
commit | 43646ce3e010e02f4c9252bde6032f233b341245 (patch) | |
tree | 6c0bf94fc846c397921e236d689a06cc36b8dbbd | |
parent | df69e824488337a4a85f8a4893e0f0081f45cd72 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/bitfield2.c | 26 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/aapcs/bitfield3.c | 26 |
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 |