Fix C++0x memory model for unaligned fields in packed...

2013-12-02  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        Fix C++0x memory model for unaligned fields in packed, aligned(4)
        structures with -fno-strict-volatile-bitfields on STRICT_ALIGNMENT
        targets like arm-none-eabi.
        * expr.c (expand_assignment): Handle normal fields like bit regions.

testsuite:
2013-12-02  Bernd Edlinger  <bernd.edlinger@hotmail.de>

        * gcc.dg/pr56997-4.c: New testcase.

From-SVN: r205597
This commit is contained in:
Bernd Edlinger 2013-12-02 19:50:55 +00:00 committed by Bernd Edlinger
parent 72ee07fb76
commit 2399cad090
4 changed files with 45 additions and 0 deletions

View File

@ -1,3 +1,10 @@
2013-12-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
Fix C++0x memory model for unaligned fields in packed, aligned(4)
structures with -fno-strict-volatile-bitfields on STRICT_ALIGNMENT
targets like arm-none-eabi.
* expr.c (expand_assignment): Handle normal fields like bit regions.
2013-12-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
PR target/58115

View File

@ -4824,6 +4824,17 @@ expand_assignment (tree to, tree from, bool nontemporal)
if (TREE_CODE (to) == COMPONENT_REF
&& DECL_BIT_FIELD_TYPE (TREE_OPERAND (to, 1)))
get_bit_range (&bitregion_start, &bitregion_end, to, &bitpos, &offset);
/* The C++ memory model naturally applies to byte-aligned fields.
However, if we do not have a DECL_BIT_FIELD_TYPE but BITPOS or
BITSIZE are not byte-aligned, there is no need to limit the range
we can access. This can occur with packed structures in Ada. */
else if (bitsize > 0
&& bitsize % BITS_PER_UNIT == 0
&& bitpos % BITS_PER_UNIT == 0)
{
bitregion_start = bitpos;
bitregion_end = bitpos + bitsize - 1;
}
to_rtx = expand_expr (tem, NULL_RTX, VOIDmode, EXPAND_WRITE);

View File

@ -1,3 +1,7 @@
2013-12-02 Bernd Edlinger <bernd.edlinger@hotmail.de>
* gcc.dg/pr56997-4.c: New testcase.
2013-12-02 Marek Polacek <polacek@redhat.com>
* c-c++-common/ubsan/vla-1.c: Split the tests into individual

View File

@ -0,0 +1,23 @@
/* Test volatile access to unaligned field. */
/* { dg-do compile } */
/* { dg-options "-fno-strict-volatile-bitfields -fdump-rtl-final" } */
#define test_type unsigned short
typedef struct s{
unsigned char Prefix[1];
volatile test_type Type;
}__attribute((__packed__,__aligned__(4))) ss;
extern volatile ss v;
void
foo (test_type u)
{
v.Type = u;
}
/* The C++ memory model forbids data store race conditions outside the
unaligned data member, therefore only QI or HI access is allowed, no SI. */
/* { dg-final { scan-rtl-dump-not "mem/v(/.)*:SI" "final" } } */
/* { dg-final { cleanup-rtl-dump "final" } } */