From ec8ac265ff21fb379ac072848561a91e4990c47f Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 29 Jul 2019 08:46:54 +0000 Subject: [PATCH] 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 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 --- gcc/ChangeLog | 5 +++++ gcc/testsuite/ChangeLog | 7 +++++++ .../c-c++-common/guality/Og-static-wo-1.c | 15 +++++++++++++++ gcc/testsuite/g++.dg/guality/guality.exp | 18 ++++++++++++++++-- gcc/testsuite/gcc.dg/guality/guality.exp | 18 ++++++++++++++++-- gcc/tree-cfg.c | 3 ++- 6 files changed, 61 insertions(+), 5 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 650201a640c..3eb52020e68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-07-29 Richard Sandiford + + * tree-cfg.c (execute_fixup_cfg): Don't delete stores to write-only + variables for -Og. + 2019-07-29 Richard Sandiford * doc/sourcebuild.texi (check-function-bodies): Document. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f896434fc0b..1dd2819e9e8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-07-29 Richard Sandiford + + * 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 * lib/scanasm.exp (parse_function_bodies, check_function_body) 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 00000000000..a4c7f30671d --- /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 757b20b61e2..33571f1f28f 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 ca77a446f86..89cd896d05c 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 54ee63add47..2648663204b 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)); -- 2.30.2