public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
@ 2011-04-27  1:19 arthur.j.odwyer at gmail dot com
  2012-08-18  1:11 ` [Bug middle-end/48784] " sandra at codesourcery dot com
                   ` (7 more replies)
  0 siblings, 8 replies; 9+ messages in thread
From: arthur.j.odwyer at gmail dot com @ 2011-04-27  1:19 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

           Summary: #pragma pack(1) + -fstrict-volatile-bitfields = bad
                    codegen
           Product: gcc
           Version: 4.7.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: arthur.j.odwyer@gmail.com


Created attachment 24109
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=24109
Output of "ajo-gcc -fstrict-volatile-bitfields bug868575724-reduced.c -v"

#pragma pack(1) is incompatible with -fstrict-volatile-bitfields, causing
silently wrong codegen if you mix the two options. It feels like the compiler
really ought to warn the user that bad code will be generated, even if it *is*
ultimately the user's fault.  ...But is it even the user's fault, in this case?

cat >test.c <<EOF
#include <stdio.h>
#pragma pack(1)
volatile struct S0 {
   signed a : 7;
   unsigned b : 28;  /* b can't be fetched with an aligned 32-bit access, */
                     /* but it certainly can be fetched with an unaligned
access */
} g = {0,-1};
int main() {
    printf("%x\n", (unsigned int)g.b);
    return 0;
}
EOF
gcc test.c ; ./a.out  // prints "fffffff"
gcc -fstrict-volatile-bitfields test.c ; ./a.out  // prints "1ffffff"

Without -fstrict-volatile-bitfields, the correct 28-bit number "fffffff" is
printed. With -fstrict-volatile-bitfields, the incorrect 25-bit number
"1ffffff" is printed. 

Bug 43341 is a similar gray-area bug/not-a-bug involving #pragma pack.


This test case is reduced from the output of Csmith
(http://embed.cs.utah.edu/csmith/), using the following command line:
csmith --bitfields --packed-struct -s 868575724 > test868575724.c


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
@ 2012-08-18  1:11 ` sandra at codesourcery dot com
  2013-06-08 19:55 ` sandra at codesourcery dot com
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: sandra at codesourcery dot com @ 2012-08-18  1:11 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

Sandra Loosemore <sandra at codesourcery dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |sandra at codesourcery dot
                   |                            |com

--- Comment #1 from Sandra Loosemore <sandra at codesourcery dot com> 2012-08-18 01:11:12 UTC ---
I just checked the test case on mainline head for a couple other builds I have
handy.

ARM EABI prints "1ffffff" whether or not you compile with
-fstrict-volatile-bitfields.

MIPS ELF prints "0" with -fstrict-volatile-bitfields and "fffffff" without.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
  2012-08-18  1:11 ` [Bug middle-end/48784] " sandra at codesourcery dot com
@ 2013-06-08 19:55 ` sandra at codesourcery dot com
  2013-06-14  2:59 ` sandra at codesourcery dot com
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: sandra at codesourcery dot com @ 2013-06-08 19:55 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

--- Comment #2 from Sandra Loosemore <sandra at codesourcery dot com> ---
I'm working on a fix for this.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
  2012-08-18  1:11 ` [Bug middle-end/48784] " sandra at codesourcery dot com
  2013-06-08 19:55 ` sandra at codesourcery dot com
@ 2013-06-14  2:59 ` sandra at codesourcery dot com
  2013-10-07 15:40 ` sandra at codesourcery dot com
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: sandra at codesourcery dot com @ 2013-06-14  2:59 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

--- Comment #3 from Sandra Loosemore <sandra at codesourcery dot com> ---
Patch posted here:

http://gcc.gnu.org/ml/gcc-patches/2013-06/msg00750.html


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
                   ` (2 preceding siblings ...)
  2013-06-14  2:59 ` sandra at codesourcery dot com
@ 2013-10-07 15:40 ` sandra at codesourcery dot com
  2013-12-11 16:50 ` edlinger at gcc dot gnu.org
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: sandra at codesourcery dot com @ 2013-10-07 15:40 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

--- Comment #4 from Sandra Loosemore <sandra at codesourcery dot com> ---
Updated patch series:

http://gcc.gnu.org/ml/gcc-patches/2013-09/msg02057.html
http://gcc.gnu.org/ml/gcc-patches/2013-09/msg02058.html
http://gcc.gnu.org/ml/gcc-patches/2013-09/msg02059.html

Unfortunately, it seems that fixing bugs with -fstrict-volatile-bitfields has
been blocked by disagreement between global reviewers and target maintainers
who can't agree on whether the C/C++11 memory model should take precedence over
target-specific ABIs by default.  :-(


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
                   ` (3 preceding siblings ...)
  2013-10-07 15:40 ` sandra at codesourcery dot com
@ 2013-12-11 16:50 ` edlinger at gcc dot gnu.org
  2013-12-11 16:59 ` edlinger at gcc dot gnu.org
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 9+ messages in thread
From: edlinger at gcc dot gnu.org @ 2013-12-11 16:50 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

--- Comment #5 from edlinger at gcc dot gnu.org ---
Author: edlinger
Date: Wed Dec 11 16:50:05 2013
New Revision: 205896

URL: http://gcc.gnu.org/viewcvs?rev=205896&root=gcc&view=rev
Log:
2013-12-11  Sandra Loosemore  <sandra@codesourcery.com>

        PR middle-end/23623
        PR middle-end/48784
        PR middle-end/56341
        PR middle-end/56997

        gcc/
        * expmed.c (strict_volatile_bitfield_p): New function.
        (store_bit_field_1): Don't special-case strict volatile
        bitfields here.
        (store_bit_field): Handle strict volatile bitfields here instead.
        (store_fixed_bit_field): Don't special-case strict volatile
        bitfields here.
        (extract_bit_field_1): Don't special-case strict volatile
        bitfields here.
        (extract_bit_field): Handle strict volatile bitfields here instead.
        (extract_fixed_bit_field): Don't special-case strict volatile
        bitfields here.  Simplify surrounding code to resemble that in
        store_fixed_bit_field.
        * doc/invoke.texi (Code Gen Options): Update
        -fstrict-volatile-bitfields description.

        gcc/testsuite/
        * gcc.dg/pr23623.c: New test.
        * gcc.dg/pr48784-1.c: New test.
        * gcc.dg/pr48784-2.c: New test.
        * gcc.dg/pr56341-1.c: New test.
        * gcc.dg/pr56341-2.c: New test.
        * gcc.dg/pr56997-1.c: New test.
        * gcc.dg/pr56997-2.c: New test.
        * gcc.dg/pr56997-3.c: New test.

Added:
    trunk/gcc/testsuite/gcc.dg/pr23623.c
    trunk/gcc/testsuite/gcc.dg/pr48784-1.c
    trunk/gcc/testsuite/gcc.dg/pr48784-2.c
    trunk/gcc/testsuite/gcc.dg/pr56341-1.c
    trunk/gcc/testsuite/gcc.dg/pr56341-2.c
    trunk/gcc/testsuite/gcc.dg/pr56997-1.c
    trunk/gcc/testsuite/gcc.dg/pr56997-2.c
    trunk/gcc/testsuite/gcc.dg/pr56997-3.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/doc/invoke.texi
    trunk/gcc/expmed.c
    trunk/gcc/testsuite/ChangeLog


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
                   ` (4 preceding siblings ...)
  2013-12-11 16:50 ` edlinger at gcc dot gnu.org
@ 2013-12-11 16:59 ` edlinger at gcc dot gnu.org
  2014-02-27  7:28 ` jye2 at gcc dot gnu.org
  2021-09-28  1:37 ` pinskia at gcc dot gnu.org
  7 siblings, 0 replies; 9+ messages in thread
From: edlinger at gcc dot gnu.org @ 2013-12-11 16:59 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

--- Comment #6 from edlinger at gcc dot gnu.org ---
Author: edlinger
Date: Wed Dec 11 16:59:24 2013
New Revision: 205897

URL: http://gcc.gnu.org/viewcvs?rev=205897&root=gcc&view=rev
Log:
2013-12-11  Bernd Edlinger  <bernd.edlinger@hotmail.de>
            Sandra Loosemore  <sandra@codesourcery.com>

        PR middle-end/23623
        PR middle-end/48784
        PR middle-end/56341
        PR middle-end/56997
        * expmed.c (strict_volatile_bitfield_p): Add bitregion_start
        and bitregion_end parameters.  Test for compliance with C++
        memory model.
        (store_bit_field): Adjust call to strict_volatile_bitfield_p.
        Add fallback logic for cases where -fstrict-volatile-bitfields
        is supposed to apply, but cannot.
        (extract_bit_field): Likewise. Use narrow_bit_field_mem and
        extract_fixed_bit_field_1 to do the extraction.
        (extract_fixed_bit_field): Revert to previous mode selection algorithm.
        Call extract_fixed_bit_field_1 to do the real work.
        (extract_fixed_bit_field_1): New function.

testsuite:        
        * gcc.dg/pr23623.c: Update to test interaction with C++
        memory model.

Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/expmed.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.dg/pr23623.c


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
                   ` (5 preceding siblings ...)
  2013-12-11 16:59 ` edlinger at gcc dot gnu.org
@ 2014-02-27  7:28 ` jye2 at gcc dot gnu.org
  2021-09-28  1:37 ` pinskia at gcc dot gnu.org
  7 siblings, 0 replies; 9+ messages in thread
From: jye2 at gcc dot gnu.org @ 2014-02-27  7:28 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

--- Comment #7 from jye2 at gcc dot gnu.org ---
Author: jye2
Date: Thu Feb 27 07:28:06 2014
New Revision: 208195

URL: http://gcc.gnu.org/viewcvs?rev=208195&root=gcc&view=rev
Log:
2014-02-27  Joey Ye  <joey.ye@arm.com>

        Backport mainline strict-volatile-bitfields fixes
    2013-09-28  Sandra Loosemore  <sandra@codesourcery.com>

        gcc/
        * expr.h (extract_bit_field): Remove packedp parameter.
        * expmed.c (extract_fixed_bit_field): Remove packedp parameter
        from forward declaration.
        (store_split_bit_field): Remove packedp arg from calls to
        extract_fixed_bit_field.
        (extract_bit_field_1): Remove packedp parameter and packedp
        argument from recursive calls and calls to extract_fixed_bit_field.
        (extract_bit_field): Remove packedp parameter and corresponding
        arg to extract_bit_field_1.
        (extract_fixed_bit_field): Remove packedp parameter.  Remove code
        to issue warnings.
        (extract_split_bit_field): Remove packedp arg from call to
        extract_fixed_bit_field.
        * expr.c (emit_group_load_1): Adjust calls to extract_bit_field.
        (copy_blkmode_from_reg): Likewise.
        (copy_blkmode_to_reg): Likewise.
        (read_complex_part): Likewise.
        (store_field): Likewise.
        (expand_expr_real_1): Likewise.
        * calls.c (store_unaligned_arguments_into_pseudos): Adjust call
        to extract_bit_field.
        * config/tilegx/tilegx.c (tilegx_expand_unaligned_load): Adjust
        call to extract_bit_field.
        * config/tilepro/tilepro.c (tilepro_expand_unaligned_load): Adjust
        call to extract_bit_field.
        * doc/invoke.texi (Code Gen Options): Remove mention of warnings
        and special packedp behavior from -fstrict-volatile-bitfields
        documentation.

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

        * expr.c (expand_assignment): Remove dependency on 
        flag_strict_volatile_bitfields. Always set the memory
        access mode.
        (expand_expr_real_1): Likewise.

2013-12-11  Sandra Loosemore  <sandra@codesourcery.com>

        PR middle-end/23623
        PR middle-end/48784
        PR middle-end/56341
        PR middle-end/56997

        gcc/
        * expmed.c (strict_volatile_bitfield_p): New function.
        (store_bit_field_1): Don't special-case strict volatile
        bitfields here.
        (store_bit_field): Handle strict volatile bitfields here instead.
        (store_fixed_bit_field): Don't special-case strict volatile
        bitfields here.
        (extract_bit_field_1): Don't special-case strict volatile
        bitfields here.
        (extract_bit_field): Handle strict volatile bitfields here instead.
        (extract_fixed_bit_field): Don't special-case strict volatile
        bitfields here.  Simplify surrounding code to resemble that in
        store_fixed_bit_field.
        * doc/invoke.texi (Code Gen Options): Update
        -fstrict-volatile-bitfields description.

        gcc/testsuite/
        * gcc.dg/pr23623.c: New test.
        * gcc.dg/pr48784-1.c: New test.
        * gcc.dg/pr48784-2.c: New test.
        * gcc.dg/pr56341-1.c: New test.
        * gcc.dg/pr56341-2.c: New test.
        * gcc.dg/pr56997-1.c: New test.
        * gcc.dg/pr56997-2.c: New test.
        * gcc.dg/pr56997-3.c: New test.

2013-12-11  Bernd Edlinger  <bernd.edlinger@hotmail.de>
             Sandra Loosemore  <sandra@codesourcery.com>

        PR middle-end/23623
        PR middle-end/48784
        PR middle-end/56341
        PR middle-end/56997
        * expmed.c (strict_volatile_bitfield_p): Add bitregion_start
        and bitregion_end parameters.  Test for compliance with C++
        memory model.
        (store_bit_field): Adjust call to strict_volatile_bitfield_p.
        Add fallback logic for cases where -fstrict-volatile-bitfields
        is supposed to apply, but cannot.
        (extract_bit_field): Likewise. Use narrow_bit_field_mem and
        extract_fixed_bit_field_1 to do the extraction.
        (extract_fixed_bit_field): Revert to previous mode selection
algorithm.
        Call extract_fixed_bit_field_1 to do the real work.
        (extract_fixed_bit_field_1): New function.

testsuite:
        * gcc.dg/pr23623.c: Update to test interaction with C++
        memory model.

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

        PR middle-end/59134
        * expmed.c (store_bit_field): Use narrow_bit_field_mem and
        store_fixed_bit_field_1 for -fstrict-volatile-bitfields.
        (store_fixed_bit_field): Split up.  Call store_fixed_bit_field_1
        to do the real work.
        (store_fixed_bit_field_1): New function. 
        (store_split_bit_field): Limit the unit size to the memory mode
size,
        to prevent recursion.

testsuite:
        * gcc.c-torture/compile/pr59134.c: New test.
        * gnat.dg/misaligned_volatile.adb: New test.

Added:
   
branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.c-torture/compile/pr59134.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr23623.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr48784-1.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr48784-2.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr56341-1.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr56341-2.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr56997-1.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr56997-2.c
    branches/ARM/embedded-4_8-branch/gcc/testsuite/gcc.dg/pr56997-3.c
   
branches/ARM/embedded-4_8-branch/gcc/testsuite/gnat.dg/misaligned_volatile.adb
Modified:
    branches/ARM/embedded-4_8-branch/gcc/ChangeLog.arm
    branches/ARM/embedded-4_8-branch/gcc/calls.c
    branches/ARM/embedded-4_8-branch/gcc/config/tilegx/tilegx.c
    branches/ARM/embedded-4_8-branch/gcc/config/tilepro/tilepro.c
    branches/ARM/embedded-4_8-branch/gcc/doc/invoke.texi
    branches/ARM/embedded-4_8-branch/gcc/expmed.c
    branches/ARM/embedded-4_8-branch/gcc/expr.c
    branches/ARM/embedded-4_8-branch/gcc/expr.h
    branches/ARM/embedded-4_8-branch/gcc/testsuite/ChangeLog.arm


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [Bug middle-end/48784] #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen
  2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
                   ` (6 preceding siblings ...)
  2014-02-27  7:28 ` jye2 at gcc dot gnu.org
@ 2021-09-28  1:37 ` pinskia at gcc dot gnu.org
  7 siblings, 0 replies; 9+ messages in thread
From: pinskia at gcc dot gnu.org @ 2021-09-28  1:37 UTC (permalink / raw)
  To: gcc-bugs

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=48784

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|---                         |FIXED
   Target Milestone|---                         |4.9.0
             Status|UNCONFIRMED                 |RESOLVED

--- Comment #8 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
Fixed.

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2021-09-28  1:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-04-27  1:19 [Bug tree-optimization/48784] New: #pragma pack(1) + -fstrict-volatile-bitfields = bad codegen arthur.j.odwyer at gmail dot com
2012-08-18  1:11 ` [Bug middle-end/48784] " sandra at codesourcery dot com
2013-06-08 19:55 ` sandra at codesourcery dot com
2013-06-14  2:59 ` sandra at codesourcery dot com
2013-10-07 15:40 ` sandra at codesourcery dot com
2013-12-11 16:50 ` edlinger at gcc dot gnu.org
2013-12-11 16:59 ` edlinger at gcc dot gnu.org
2014-02-27  7:28 ` jye2 at gcc dot gnu.org
2021-09-28  1:37 ` pinskia at gcc dot gnu.org

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).