This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Prevent -Og from deleting stores to write-only variables
- From: Richard Sandiford <richard dot sandiford at arm dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Sun, 07 Jul 2019 10:41:43 +0100
- Subject: 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).
Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install?
Richard
2019-07-07 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.
Index: gcc/tree-cfg.c
===================================================================
--- gcc/tree-cfg.c 2019-07-06 09:25:08.717486045 +0100
+++ gcc/tree-cfg.c 2019-07-07 10:29:19.999365874 +0100
@@ -9571,7 +9571,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));
Index: gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c
===================================================================
--- /dev/null 2019-06-14 15:59:19.298479944 +0100
+++ gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c 2019-07-07 10:29:19.999365874 +0100
@@ -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;
+}
Index: gcc/testsuite/g++.dg/guality/guality.exp
===================================================================
--- gcc/testsuite/g++.dg/guality/guality.exp 2019-07-01 10:15:31.000000000 +0100
+++ gcc/testsuite/g++.dg/guality/guality.exp 2019-07-07 10:29:19.999365874 +0100
@@ -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] {
Index: gcc/testsuite/gcc.dg/guality/guality.exp
===================================================================
--- gcc/testsuite/gcc.dg/guality/guality.exp 2019-07-01 10:15:31.000000000 +0100
+++ gcc/testsuite/gcc.dg/guality/guality.exp 2019-07-07 10:29:19.999365874 +0100
@@ -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] {