diff options
author | Jie Zhang <jie@codesourcery.com> | 2010-10-26 03:22:49 +0000 |
---|---|---|
committer | Jie Zhang <jiez@gcc.gnu.org> | 2010-10-26 03:22:49 +0000 |
commit | f5c88dbfe7040583158ad45e4ef2801401a2732d (patch) | |
tree | e3deba847e33f104b4175dd8a3946b33f33a08d4 /gcc | |
parent | 7021d5df0a0c762b092f88d8274089fb12acc6ac (diff) | |
download | gcc-f5c88dbfe7040583158ad45e4ef2801401a2732d.zip gcc-f5c88dbfe7040583158ad45e4ef2801401a2732d.tar.gz gcc-f5c88dbfe7040583158ad45e4ef2801401a2732d.tar.bz2 |
stor-layout.c (layout_decl): Use the field's type to determine the mode and keep DECL_BIT_FIELD for a...
* stor-layout.c (layout_decl): Use the field's type to
determine the mode and keep DECL_BIT_FIELD for a volatile
bit-field.
* config/arm/arm.c (arm_override_options): Default to
-fstrict-volatile-bitfields.
testsuite/
* gcc.target/arm/volatile-bitfields-1.c: New test.
* gcc.target/arm/volatile-bitfields-2.c: New test.
* gcc.target/arm/volatile-bitfields-3.c: New test.
From-SVN: r165934
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 4 | ||||
-rw-r--r-- | gcc/stor-layout.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/volatile-bitfields-1.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/volatile-bitfields-2.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/volatile-bitfields-3.c | 18 |
7 files changed, 78 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5c0a060..a482314 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2010-10-26 Jie Zhang <jie@codesourcery.com> + + * stor-layout.c (layout_decl): Use the field's type to + determine the mode and keep DECL_BIT_FIELD for a volatile + bit-field. + * config/arm/arm.c (arm_override_options): Default to + -fstrict-volatile-bitfields. + 2010-10-25 Paul Koning <ni1d@arrl.net> * config/pdp11/pdp11.md: Add define_constants for register diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index ea72beb..2586a27 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -1971,6 +1971,10 @@ arm_option_override (void) global_options.x_param_values, global_options_set.x_param_values); + /* ARM EABI defaults to strict volatile bitfields. */ + if (TARGET_AAPCS_BASED && flag_strict_volatile_bitfields < 0) + flag_strict_volatile_bitfields = 1; + /* Register global variables with the garbage collector. */ arm_add_gc_roots (); } diff --git a/gcc/stor-layout.c b/gcc/stor-layout.c index f366318..17e4fe5 100644 --- a/gcc/stor-layout.c +++ b/gcc/stor-layout.c @@ -661,11 +661,14 @@ 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 - and occupying a complete byte or bytes on proper boundary. */ + 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. */ if (TYPE_SIZE (type) != 0 && 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)) { enum machine_mode xmode = mode_for_size_tree (DECL_SIZE (decl), MODE_INT, 1); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index da3c046..48ab2cd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2010-10-26 Jie Zhang <jie@codesourcery.com> + + * gcc.target/arm/volatile-bitfields-1.c: New test. + * gcc.target/arm/volatile-bitfields-2.c: New test. + * gcc.target/arm/volatile-bitfields-3.c: New test. + 2010-10-25 Eric Botcazou <ebotcazou@adacore.com> * gnat.dg/pointer_discr1.adb: New test. diff --git a/gcc/testsuite/gcc.target/arm/volatile-bitfields-1.c b/gcc/testsuite/gcc.target/arm/volatile-bitfields-1.c new file mode 100644 index 0000000..c519419 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/volatile-bitfields-1.c @@ -0,0 +1,18 @@ +/* { dg-require-effective-target arm_eabi } */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef struct { + char a:1; + char b:7; + int c; +} BitStruct; + +volatile BitStruct bits; + +int foo () +{ + return bits.b; +} + +/* { dg-final { scan-assembler "ldrb\[\\t \]+\[^\n\]*,\[\\t \]*\\\[\[^\n\]*\\\]" } } */ diff --git a/gcc/testsuite/gcc.target/arm/volatile-bitfields-2.c b/gcc/testsuite/gcc.target/arm/volatile-bitfields-2.c new file mode 100644 index 0000000..eb0aaf7 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/volatile-bitfields-2.c @@ -0,0 +1,18 @@ +/* { dg-require-effective-target arm_eabi } */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef struct { + volatile unsigned long a:8; + volatile unsigned long b:8; + volatile unsigned long c:16; +} BitStruct; + +BitStruct bits; + +unsigned long foo () +{ + return bits.b; +} + +/* { dg-final { scan-assembler "ldr\[\\t \]+\[^\n\]*,\[\\t \]*\\\[\[^\n\]*\\\]" } } */ diff --git a/gcc/testsuite/gcc.target/arm/volatile-bitfields-3.c b/gcc/testsuite/gcc.target/arm/volatile-bitfields-3.c new file mode 100644 index 0000000..0f5dde0 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/volatile-bitfields-3.c @@ -0,0 +1,18 @@ +/* { dg-require-effective-target arm_eabi } */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +typedef struct { + volatile unsigned long a:8; + volatile unsigned long b:8; + volatile unsigned long c:16; +} BitStruct; + +BitStruct bits; + +unsigned long foo () +{ + return bits.c; +} + +/* { dg-final { scan-assembler "ldr\[\\t \]+\[^\n\]*,\[\\t \]*\\\[\[^\n\]*\\\]" } } */ |