From: Joey Ye Date: Thu, 29 Mar 2012 02:15:29 +0000 (+0000) Subject: backport: [multiple changes] X-Git-Tag: releases/gcc-4.6.4~615 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b9e681b9a31a50b4e3301bf07d47cf1e1446a3b5;p=thirdparty%2Fgcc.git backport: [multiple changes] 2012-03-28 Joey Ye Backported from mainline 2011-12-20 Bernd Schmidt PR middle-end/51200 * expr.c (store_field): Avoid a direct store if the mode is larger than the size of the bit field. * stor-layout.c (layout_decl): If flag_strict_volatile_bitfields, treat non-volatile bit fields like volatile ones. * toplev.c (process_options): Disallow combination of -fstrict-volatile-bitfields and ABI versions less than 2. * config/arm/arm.c (arm_option_override): Don't enable flag_strict_volatile_bitfields if the ABI version is less than 2. * config/h8300/h8300.c (h8300_option_override): Likewise. * config/rx/rx.c (rx_option_override): Likewise. * config/m32c/m32c.c (m32c_option_override): Likewise. * config/sh/sh.c (sh_option_override): Likewise. 2011-12-22 Joey Ye * toplev.c (process_options): Fix typo. testcases: Backported from mainline 2011-12-20 Bernd Schmidt PR middle-end/51200 * gcc.target/arm/volatile-bitfields-4.c: New test. * c-c++-common/abi-bf.c: New test. 2011-12-26 Joey Ye PR middle-end/51200 * gcc.dg/volatile-bitfields-2.c: New test. From-SVN: r185944 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4b4c1257513e..d0d023643327 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2012-03-28 Joey Ye + + Backported from mainline + 2011-12-20 Bernd Schmidt + + PR middle-end/51200 + * expr.c (store_field): Avoid a direct store if the mode is larger + than the size of the bit field. + * stor-layout.c (layout_decl): If flag_strict_volatile_bitfields, + treat non-volatile bit fields like volatile ones. + * toplev.c (process_options): Disallow combination of + -fstrict-volatile-bitfields and ABI versions less than 2. + * config/arm/arm.c (arm_option_override): Don't enable + flag_strict_volatile_bitfields if the ABI version is less than 2. + * config/h8300/h8300.c (h8300_option_override): Likewise. + * config/rx/rx.c (rx_option_override): Likewise. + * config/m32c/m32c.c (m32c_option_override): Likewise. + * config/sh/sh.c (sh_option_override): Likewise. + + 2011-12-22 Joey Ye + + * toplev.c (process_options): Fix typo. + 2012-03-28 Martin Jambor Backported from mainline diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 49c2a75bdbc5..a5edf04b9ed6 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -2005,7 +2005,8 @@ arm_option_override (void) global_options_set.x_param_values); /* ARM EABI defaults to strict volatile bitfields. */ - if (TARGET_AAPCS_BASED && flag_strict_volatile_bitfields < 0) + if (TARGET_AAPCS_BASED && flag_strict_volatile_bitfields < 0 + && abi_version_at_least(2)) flag_strict_volatile_bitfields = 1; /* Enable sw prefetching at -O3 for CPUS that have prefetch, and we have deemed diff --git a/gcc/config/h8300/h8300.c b/gcc/config/h8300/h8300.c index 834fc992fc1f..55acfff5c0b9 100644 --- a/gcc/config/h8300/h8300.c +++ b/gcc/config/h8300/h8300.c @@ -416,7 +416,7 @@ h8300_option_override (void) } /* This target defaults to strict volatile bitfields. */ - if (flag_strict_volatile_bitfields < 0) + if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2)) flag_strict_volatile_bitfields = 1; } diff --git a/gcc/config/m32c/m32c.c b/gcc/config/m32c/m32c.c index 83bf86c2071f..9b4a5a95c185 100644 --- a/gcc/config/m32c/m32c.c +++ b/gcc/config/m32c/m32c.c @@ -447,7 +447,7 @@ m32c_option_override (void) flag_ivopts = 0; /* This target defaults to strict volatile bitfields. */ - if (flag_strict_volatile_bitfields < 0) + if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2)) flag_strict_volatile_bitfields = 1; /* r8c/m16c have no 16-bit indirect call, so thunks are involved. diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c index a2d48abd2961..392e2ff80393 100644 --- a/gcc/config/rx/rx.c +++ b/gcc/config/rx/rx.c @@ -2348,7 +2348,7 @@ static void rx_option_override (void) { /* This target defaults to strict volatile bitfields. */ - if (flag_strict_volatile_bitfields < 0) + if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2)) flag_strict_volatile_bitfields = 1; rx_override_options_after_change (); diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index ee80028e5bd2..6ac593e839e1 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -1018,7 +1018,7 @@ sh_option_override (void) sh_fix_range (sh_fixed_range_str); /* This target defaults to strict volatile bitfields. */ - if (flag_strict_volatile_bitfields < 0) + if (flag_strict_volatile_bitfields < 0 && abi_version_at_least(2)) flag_strict_volatile_bitfields = 1; } diff --git a/gcc/expr.c b/gcc/expr.c index 0ccdd2e00dba..83ecc039abf0 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -5971,6 +5971,8 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, || bitpos % GET_MODE_ALIGNMENT (mode)) && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target))) || (bitpos % BITS_PER_UNIT != 0))) + || (bitsize >= 0 && mode != BLKmode + && GET_MODE_BITSIZE (mode) > bitsize) /* If the RHS and field are a constant size and the size of the RHS isn't the same size as the bitfield, we must use bitfield operations. */ diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index 0396c8cdd3d0..4e7454d3aea8 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -660,12 +660,13 @@ layout_decl (tree decl, unsigned int known_align) /* See if we can use an ordinary integer mode for a bit-field. Conditions are: a fixed size that is correct for another mode, occupying a complete byte or bytes on proper boundary, - and not volatile or not -fstrict-volatile-bitfields. */ + and not -fstrict-volatile-bitfields. If the latter is set, + we unfortunately can't check TREE_THIS_VOLATILE, as a cast + may make a volatile object later. */ if (TYPE_SIZE (type) != 0 && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST && GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT - && !(TREE_THIS_VOLATILE (decl) - && flag_strict_volatile_bitfields > 0)) + && flag_strict_volatile_bitfields <= 0) { enum machine_mode xmode = mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e93779ede0f0..9dcfc25b8891 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,17 @@ +2012-03-28 Joey Ye + + Backported from mainline + 2011-12-20 Bernd Schmidt + + PR middle-end/51200 + * gcc.target/arm/volatile-bitfields-4.c: New test. + * c-c++-common/abi-bf.c: New test. + + 2011-12-26 Joey Ye + + PR middle-end/51200 + * gcc.dg/volatile-bitfields-2.c: New test. + 2012-03-28 Martin Jambor Backported from mainline diff --git a/gcc/testsuite/c-c++-common/abi-bf.c b/gcc/testsuite/c-c++-common/abi-bf.c new file mode 100644 index 000000000000..05b898609c2d --- /dev/null +++ b/gcc/testsuite/c-c++-common/abi-bf.c @@ -0,0 +1,3 @@ +/* { dg-warning "incompatible" } */ +/* { dg-do compile } */ +/* { dg-options "-fstrict-volatile-bitfields -fabi-version=1" } */ diff --git a/gcc/testsuite/gcc.dg/volatile-bitfields-2.c b/gcc/testsuite/gcc.dg/volatile-bitfields-2.c new file mode 100644 index 000000000000..a57cd74753cb --- /dev/null +++ b/gcc/testsuite/gcc.dg/volatile-bitfields-2.c @@ -0,0 +1,15 @@ +/* { dg-do run } */ +/* { dg-options "-fstrict-volatile-bitfields" } */ + +extern void abort(void); +struct thing { + volatile unsigned short a: 8; + volatile unsigned short b: 8; +} t = {1,2}; + +int main() +{ + t.a = 3; + if (t.a !=3 || t.b !=2) abort(); + return 0; +} diff --git a/gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c b/gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c new file mode 100644 index 000000000000..805dab16428d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c @@ -0,0 +1,30 @@ +/* { dg-require-effective-target arm_eabi } */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ +/* { dg-final { scan-assembler-times "ldr\[\\t \]+\[^\n\]*,\[\\t \]*\\\[\[^\n\]*\\\]" 2 } } */ +/* { dg-final { scan-assembler-times "str\[\\t \]+\[^\n\]*,\[\\t \]*\\\[\[^\n\]*\\\]" 2 } } */ +/* { dg-final { scan-assembler-not "strb" } } */ + +struct thing { + unsigned a: 8; + unsigned b: 8; + unsigned c: 8; + unsigned d: 8; +}; + +struct thing2 { + volatile unsigned a: 8; + volatile unsigned b: 8; + volatile unsigned c: 8; + volatile unsigned d: 8; +}; + +void test1(volatile struct thing *t) +{ + t->a = 5; +} + +void test2(struct thing2 *t) +{ + t->a = 5; +} diff --git a/gcc/toplev.c b/gcc/toplev.c index 64af11200e9f..2b0f06d56793 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -1326,6 +1326,13 @@ process_options (void) "and -ftree-loop-linear)"); #endif + if (flag_strict_volatile_bitfields > 0 && !abi_version_at_least (2)) + { + warning (0, "-fstrict-volatile-bitfields disabled; " + "it is incompatible with ABI versions < 2"); + flag_strict_volatile_bitfields = 0; + } + /* Unrolling all loops implies that standard loop unrolling must also be done. */ if (flag_unroll_all_loops)