mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 17:40:46 +08:00
expr.c (store_field): Avoid a direct store if the mode is larger than the size of the bit field.
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. From-SVN: r182545
This commit is contained in:
parent
51e641f8ef
commit
36acc1a242
@ -1,3 +1,19 @@
|
||||
2011-12-20 Bernd Schmidt <bernds@codesourcery.com>
|
||||
|
||||
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-20 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR lto/46796
|
||||
|
@ -1989,7 +1989,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
|
||||
|
@ -409,7 +409,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;
|
||||
}
|
||||
|
||||
|
@ -417,7 +417,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.
|
||||
|
@ -2571,7 +2571,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;
|
||||
|
||||
rx_override_options_after_change ();
|
||||
|
@ -842,7 +842,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;
|
||||
}
|
||||
|
||||
|
@ -6327,6 +6327,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. */
|
||||
|
@ -622,12 +622,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);
|
||||
|
@ -1,3 +1,9 @@
|
||||
2011-12-20 Bernd Schmidt <bernds@codesourcery.com>
|
||||
|
||||
PR middle-end/51200
|
||||
* gcc.target/arm/volatile-bitfields-4.c: New test.
|
||||
* c-c++-common/abi-bf.c: New test.
|
||||
|
||||
2011-12-20 Dodji Seketeli <dodji@redhat.com>
|
||||
|
||||
PR debug/49951
|
||||
|
3
gcc/testsuite/c-c++-common/abi-bf.c
Normal file
3
gcc/testsuite/c-c++-common/abi-bf.c
Normal file
@ -0,0 +1,3 @@
|
||||
/* { dg-warning "incompatible" } */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-fstrict-volatile-bitfields -fabi-version=1" } */
|
30
gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c
Normal file
30
gcc/testsuite/gcc.target/arm/volatile-bitfields-4.c
Normal file
@ -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;
|
||||
}
|
@ -1330,6 +1330,13 @@ process_options (void)
|
||||
flag_ira_region
|
||||
= optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED;
|
||||
|
||||
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)
|
||||
|
Loading…
x
Reference in New Issue
Block a user