diff options
Diffstat (limited to 'meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99444.patch')
-rw-r--r-- | meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99444.patch | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99444.patch b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99444.patch new file mode 100644 index 0000000..80eebee --- /dev/null +++ b/meta-oe/recipes-devtools/gcc/gcc-4.5/linaro/gcc-4.5-linaro-r99444.patch @@ -0,0 +1,183 @@ +2010-12-02 Bernd Schmidt <bernds@codesourcery.com> + + Issue #10089 + + gcc/ + * 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. + + gcc/testsuite/ + * gcc.target/arm/volatile-bitfields-4.c: New test. + * c-c++-common/abi-bf.c: New test. + +=== modified file 'gcc/config/arm/arm.c' +--- old/gcc/config/arm/arm.c 2010-12-10 15:30:47 +0000 ++++ new/gcc/config/arm/arm.c 2010-12-10 15:34:19 +0000 +@@ -1934,7 +1934,8 @@ + set_param_value ("gcse-unrestricted-cost", 2); + + /* 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; + + /* Register global variables with the garbage collector. */ + +=== modified file 'gcc/config/h8300/h8300.c' +--- old/gcc/config/h8300/h8300.c 2010-11-04 12:43:52 +0000 ++++ new/gcc/config/h8300/h8300.c 2010-12-10 15:34:19 +0000 +@@ -405,7 +405,7 @@ + } + + /* 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; + } + + +=== modified file 'gcc/config/m32c/m32c.c' +--- old/gcc/config/m32c/m32c.c 2010-11-04 12:43:52 +0000 ++++ new/gcc/config/m32c/m32c.c 2010-12-10 15:34:19 +0000 +@@ -430,7 +430,7 @@ + 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; + } + + +=== modified file 'gcc/config/rx/rx.c' +--- old/gcc/config/rx/rx.c 2010-11-04 12:43:52 +0000 ++++ new/gcc/config/rx/rx.c 2010-12-10 15:34:19 +0000 +@@ -2191,7 +2191,7 @@ + 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; + } + + +=== modified file 'gcc/config/sh/sh.c' +--- old/gcc/config/sh/sh.c 2010-11-04 12:43:52 +0000 ++++ new/gcc/config/sh/sh.c 2010-12-10 15:34:19 +0000 +@@ -952,7 +952,7 @@ + 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; + } + + +=== modified file 'gcc/expr.c' +--- old/gcc/expr.c 2010-11-04 12:43:52 +0000 ++++ new/gcc/expr.c 2010-12-10 15:34:19 +0000 +@@ -5848,6 +5848,8 @@ + || 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. */ + +=== modified file 'gcc/stor-layout.c' +--- old/gcc/stor-layout.c 2010-11-26 12:03:32 +0000 ++++ new/gcc/stor-layout.c 2010-12-10 15:34:19 +0000 +@@ -621,12 +621,13 @@ + /* 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); + +=== added file 'gcc/testsuite/c-c++-common/abi-bf.c' +--- old/gcc/testsuite/c-c++-common/abi-bf.c 1970-01-01 00:00:00 +0000 ++++ new/gcc/testsuite/c-c++-common/abi-bf.c 2010-12-10 15:34:19 +0000 +@@ -0,0 +1,3 @@ ++/* { dg-warning "incompatible" } */ ++/* { dg-do compile } */ ++/* { dg-options "-fstrict-volatile-bitfields -fabi-version=1" } */ + +=== added file 'gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c' +--- old/gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c 1970-01-01 00:00:00 +0000 ++++ new/gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c 2010-12-10 15:34:19 +0000 +@@ -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;
++}
+ +=== modified file 'gcc/toplev.c' +--- old/gcc/toplev.c 2010-03-31 01:44:10 +0000 ++++ new/gcc/toplev.c 2010-12-10 15:34:19 +0000 +@@ -1851,6 +1851,13 @@ + sorry ("Graphite loop optimizations cannot be used"); + #endif + ++ if (flag_strict_volatile_bitfields > 0 && !abi_version_at_least (2)) ++ { ++ warning (0, "-fstrict-volatile-bitfield 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) + |