diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2019-07-29 08:46:54 +0000 |
---|---|---|
committer | Richard Sandiford <rsandifo@gcc.gnu.org> | 2019-07-29 08:46:54 +0000 |
commit | ec8ac265ff21fb379ac072848561a91e4990c47f (patch) | |
tree | 05590c079f7410c30e47e42b0b61d229124c5895 | |
parent | 4d706ff86ea86868615558e92407674a4f4b4af9 (diff) | |
download | gcc-ec8ac265ff21fb379ac072848561a91e4990c47f.zip gcc-ec8ac265ff21fb379ac072848561a91e4990c47f.tar.gz gcc-ec8ac265ff21fb379ac072848561a91e4990c47f.tar.bz2 |
Prevent -Og from deleting stores to write-only variables
This patch prevents -Og from deleting stores to write-only variables,
so that the values are still available when debugging. This seems
more convenient than forcing users to use __attribute__((used))
(probably conditionally, if it's not something they want in release
builds).
2019-07-29 Richard Sandiford <richard.sandiford@arm.com>
gcc/
* tree-cfg.c (execute_fixup_cfg): Don't delete stores to write-only
variables for -Og.
gcc/testsuite/
* c-c++-common/guality/Og-static-wo-1.c: New test.
* g++.dg/guality/guality.exp: Separate the c-c++-common tests into
"Og" and "general" tests. Run the latter at -O0 and -Og only.
* gcc.dg/guality/guality.exp: Likewise.
From-SVN: r273870
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/guality/guality.exp | 18 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/guality/guality.exp | 18 | ||||
-rw-r--r-- | gcc/tree-cfg.c | 3 |
6 files changed, 61 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 650201a..3eb5202 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2019-07-29 Richard Sandiford <richard.sandiford@arm.com> + * tree-cfg.c (execute_fixup_cfg): Don't delete stores to write-only + variables for -Og. + +2019-07-29 Richard Sandiford <richard.sandiford@arm.com> + * doc/sourcebuild.texi (check-function-bodies): Document. 2019-07-29 Richard Sandiford <richard.sandiford@arm.com> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f896434..1dd2819 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,12 @@ 2019-07-29 Richard Sandiford <richard.sandiford@arm.com> + * c-c++-common/guality/Og-static-wo-1.c: New test. + * g++.dg/guality/guality.exp: Separate the c-c++-common tests into + "Og" and "general" tests. Run the latter at -O0 and -Og only. + * gcc.dg/guality/guality.exp: Likewise. + +2019-07-29 Richard Sandiford <richard.sandiford@arm.com> + * lib/scanasm.exp (parse_function_bodies, check_function_body) (check-function-bodies): New procedures. * gcc.target/aarch64/sve/init_1.c: Use check-function-bodies diff --git a/gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c b/gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c new file mode 100644 index 0000000..a4c7f30 --- /dev/null +++ b/gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c @@ -0,0 +1,15 @@ +/* { dg-do run } */ +/* { dg-options "-g" } */ + +#include "../../gcc.dg/nop.h" + +static int x = 0; + +int +main (void) +{ + asm volatile (NOP); /* { dg-final { gdb-test . "x" "0" } } */ + x = 1; + asm volatile (NOP); /* { dg-final { gdb-test . "x" "1" } } */ + return 0; +} diff --git a/gcc/testsuite/g++.dg/guality/guality.exp b/gcc/testsuite/g++.dg/guality/guality.exp index 757b20b..33571f1 100644 --- a/gcc/testsuite/g++.dg/guality/guality.exp +++ b/gcc/testsuite/g++.dg/guality/guality.exp @@ -65,8 +65,22 @@ if {[check_guality " return 0; } "]} { - gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" "" - gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] "" "" + set general [list] + set Og [list] + foreach file [lsort [glob $srcdir/c-c++-common/guality/*.c]] { + switch -glob -- [file tail $file] { + Og-* { lappend Og $file } + * { lappend general $file } + } + } + + gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.C]] "" "" + gcc-dg-runtest $general "" "" + set-torture-options \ + [list "-O0" "-Og"] \ + [list {}] \ + [list "-Og -flto"] + gcc-dg-runtest $Og "" "" } if [info exists guality_gdb_name] { diff --git a/gcc/testsuite/gcc.dg/guality/guality.exp b/gcc/testsuite/gcc.dg/guality/guality.exp index ca77a44..89cd896 100644 --- a/gcc/testsuite/gcc.dg/guality/guality.exp +++ b/gcc/testsuite/gcc.dg/guality/guality.exp @@ -80,8 +80,22 @@ if {[check_guality " return 0; } "]} { - gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" "" - gcc-dg-runtest [lsort [glob $srcdir/c-c++-common/guality/*.c]] "" "-Wc++-compat" + set general [list] + set Og [list] + foreach file [lsort [glob $srcdir/c-c++-common/guality/*.c]] { + switch -glob -- [file tail $file] { + Og-* { lappend Og $file } + * { lappend general $file } + } + } + + gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] "" "" + gcc-dg-runtest $general "" "-Wc++-compat" + set-torture-options \ + [list "-O0" "-Og"] \ + [list {}] \ + [list "-Og -flto"] + gcc-dg-runtest $Og "" "-Wc++-compat" } if [info exists guality_gdb_name] { diff --git a/gcc/tree-cfg.c b/gcc/tree-cfg.c index 54ee63a..2648663 100644 --- a/gcc/tree-cfg.c +++ b/gcc/tree-cfg.c @@ -9579,7 +9579,8 @@ execute_fixup_cfg (void) Keep access when store has side effect, i.e. in case when source is volatile. */ if (gimple_store_p (stmt) - && !gimple_has_side_effects (stmt)) + && !gimple_has_side_effects (stmt) + && !optimize_debug) { tree lhs = get_base_address (gimple_get_lhs (stmt)); |