aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2019-07-29 08:46:54 +0000
committerRichard Sandiford <rsandifo@gcc.gnu.org>2019-07-29 08:46:54 +0000
commitec8ac265ff21fb379ac072848561a91e4990c47f (patch)
tree05590c079f7410c30e47e42b0b61d229124c5895
parent4d706ff86ea86868615558e92407674a4f4b4af9 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/c-c++-common/guality/Og-static-wo-1.c15
-rw-r--r--gcc/testsuite/g++.dg/guality/guality.exp18
-rw-r--r--gcc/testsuite/gcc.dg/guality/guality.exp18
-rw-r--r--gcc/tree-cfg.c3
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));