Commit e5fe4319 by Joey Ye Committed by Joey Ye

expr.c (expand_expr_real_1): Correctly handle strict volatile bitfield loads…

expr.c (expand_expr_real_1): Correctly handle strict volatile bitfield loads smaller than mode size.

2011-11-20  Joey Ye  <joey.ye@arm.com>

	* expr.c (expand_expr_real_1): Correctly handle strict volatile
	bitfield loads smaller than mode size.

testsuite:

	* gcc.dg/volatile-bitfields-1.c: New.

From-SVN: r181549
parent 25a96761
2011-11-20 Joey Ye <joey.ye@arm.com>
* expr.c (expand_expr_real_1): Correctly handle strict volatile
bitfield loads smaller than mode size.
2011-11-20 Richard Henderson <rth@redhat.com>
* config/mips/mips.c (mips_init_libfuncs): Call init_sync_libfuncs.
......@@ -9740,11 +9740,16 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode,
&& modifier != EXPAND_CONST_ADDRESS
&& modifier != EXPAND_INITIALIZER)
/* If the field is volatile, we always want an aligned
access. Only do this if the access is not already naturally
access. Do this in following two situations:
1. the access is not already naturally
aligned, otherwise "normal" (non-bitfield) volatile fields
become non-addressable. */
become non-addressable.
2. the bitsize is narrower than the access size. Need
to extract bitfields from the access. */
|| (volatilep && flag_strict_volatile_bitfields > 0
&& (bitpos % GET_MODE_ALIGNMENT (mode) != 0))
&& (bitpos % GET_MODE_ALIGNMENT (mode) != 0
|| (mode1 != BLKmode
&& bitsize < GET_MODE_SIZE (mode1) * BITS_PER_UNIT)))
/* If the field isn't aligned enough to fetch as a memref,
fetch it as a bit field. */
|| (mode1 != BLKmode
......
2011-11-20 Joey Ye <joey.ye@arm.com>
* gcc.dg/volatile-bitfields-1.c: New.
2011-11-20 Jason Merrill <jason@redhat.com>
PR c++/48322
......
/* { dg-options "-fstrict-volatile-bitfields" } */
/* { dg-do run } */
extern int puts(const char *);
extern void abort(void) __attribute__((noreturn));
typedef struct {
volatile unsigned short a:8, b:8;
} BitStruct;
BitStruct bits = {1, 2};
void check(int i, int j)
{
if (i != 1 || j != 2) puts("FAIL"), abort();
}
int main ()
{
check(bits.a, bits.b);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment