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:
Bernd Schmidt 2011-12-20 16:46:22 +00:00 committed by Bernd Schmidt
parent 51e641f8ef
commit 36acc1a242
12 changed files with 74 additions and 8 deletions

View File

@ -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> 2011-12-20 Richard Guenther <rguenther@suse.de>
PR lto/46796 PR lto/46796

View File

@ -1989,7 +1989,8 @@ arm_option_override (void)
global_options_set.x_param_values); global_options_set.x_param_values);
/* ARM EABI defaults to strict volatile bitfields. */ /* 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; flag_strict_volatile_bitfields = 1;
/* Enable sw prefetching at -O3 for CPUS that have prefetch, and we have deemed /* Enable sw prefetching at -O3 for CPUS that have prefetch, and we have deemed

View File

@ -409,7 +409,7 @@ h8300_option_override (void)
} }
/* This target defaults to strict volatile bitfields. */ /* 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; flag_strict_volatile_bitfields = 1;
} }

View File

@ -417,7 +417,7 @@ m32c_option_override (void)
flag_ivopts = 0; flag_ivopts = 0;
/* This target defaults to strict volatile bitfields. */ /* 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; flag_strict_volatile_bitfields = 1;
/* r8c/m16c have no 16-bit indirect call, so thunks are involved. /* r8c/m16c have no 16-bit indirect call, so thunks are involved.

View File

@ -2571,7 +2571,7 @@ rx_option_override (void)
} }
/* This target defaults to strict volatile bitfields. */ /* 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; flag_strict_volatile_bitfields = 1;
rx_override_options_after_change (); rx_override_options_after_change ();

View File

@ -842,7 +842,7 @@ sh_option_override (void)
sh_fix_range (sh_fixed_range_str); sh_fix_range (sh_fixed_range_str);
/* This target defaults to strict volatile bitfields. */ /* 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; flag_strict_volatile_bitfields = 1;
} }

View File

@ -6327,6 +6327,8 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos,
|| bitpos % GET_MODE_ALIGNMENT (mode)) || bitpos % GET_MODE_ALIGNMENT (mode))
&& SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target))) && SLOW_UNALIGNED_ACCESS (mode, MEM_ALIGN (target)))
|| (bitpos % BITS_PER_UNIT != 0))) || (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 /* 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 RHS isn't the same size as the bitfield, we must use bitfield
operations. */ operations. */

View File

@ -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. /* See if we can use an ordinary integer mode for a bit-field.
Conditions are: a fixed size that is correct for another mode, Conditions are: a fixed size that is correct for another mode,
occupying a complete byte or bytes on proper boundary, 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 if (TYPE_SIZE (type) != 0
&& TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST
&& GET_MODE_CLASS (TYPE_MODE (type)) == MODE_INT && 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 enum machine_mode xmode
= mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1); = mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1);

View File

@ -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> 2011-12-20 Dodji Seketeli <dodji@redhat.com>
PR debug/49951 PR debug/49951

View File

@ -0,0 +1,3 @@
/* { dg-warning "incompatible" } */
/* { dg-do compile } */
/* { dg-options "-fstrict-volatile-bitfields -fabi-version=1" } */

View 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;
}

View File

@ -1330,6 +1330,13 @@ process_options (void)
flag_ira_region flag_ira_region
= optimize_size || !optimize ? IRA_REGION_ONE : IRA_REGION_MIXED; = 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 /* Unrolling all loops implies that standard loop unrolling must also
be done. */ be done. */
if (flag_unroll_all_loops) if (flag_unroll_all_loops)