aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Liska <mliska@suse.cz>2017-06-19 15:27:48 +0200
committerMartin Liska <marxin@gcc.gnu.org>2017-06-19 13:27:48 +0000
commita6e5212a77e34682cfb591ed80e7166eaa895365 (patch)
tree306ee35916c9118ad658594b931d61933751b679 /gcc
parent1a1e0df1cd646b81e35dd65523c3ae484d29fbf6 (diff)
downloadgcc-a6e5212a77e34682cfb591ed80e7166eaa895365.zip
gcc-a6e5212a77e34682cfb591ed80e7166eaa895365.tar.gz
gcc-a6e5212a77e34682cfb591ed80e7166eaa895365.tar.bz2
Initialize live_switch_vars for SWITCH_BODY == STATEMENT_LIST (PR sanitizer/80879).
2017-06-19 Martin Liska <mliska@suse.cz> PR sanitizer/80879 * gimplify.c (gimplify_switch_expr): Initialize live_switch_vars for SWITCH_BODY == STATEMENT_LIST. 2017-06-19 Martin Liska <mliska@suse.cz> PR sanitizer/80879 * gcc.dg/asan/use-after-scope-switch-4.c: New test. From-SVN: r249368
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimplify.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/asan/use-after-scope-switch-4.c35
4 files changed, 48 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6ddc171..aab38b1 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2017-06-19 Martin Liska <mliska@suse.cz>
+ PR sanitizer/80879
+ * gimplify.c (gimplify_switch_expr):
+ Initialize live_switch_vars for SWITCH_BODY == STATEMENT_LIST.
+
+2017-06-19 Martin Liska <mliska@suse.cz>
+
* doc/install.texi: Document that PGO runs in 4 stages.
2017-06-19 Martin Liska <mliska@suse.cz>
diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 9af95a2..cf82f95 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -2279,7 +2279,8 @@ gimplify_switch_expr (tree *expr_p, gimple_seq *pre_p)
/* Do not create live_switch_vars if SWITCH_BODY is not a BIND_EXPR. */
saved_live_switch_vars = gimplify_ctxp->live_switch_vars;
- if (TREE_CODE (SWITCH_BODY (switch_expr)) == BIND_EXPR)
+ tree_code body_type = TREE_CODE (SWITCH_BODY (switch_expr));
+ if (body_type == BIND_EXPR || body_type == STATEMENT_LIST)
gimplify_ctxp->live_switch_vars = new hash_set<tree> (4);
else
gimplify_ctxp->live_switch_vars = NULL;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0b55fe0..26e527c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2017-06-19 Martin Liska <mliska@suse.cz>
+ PR sanitizer/80879
+ * gcc.dg/asan/use-after-scope-switch-4.c: New test.
+
+2017-06-19 Martin Liska <mliska@suse.cz>
+
PR ipa/80732
* gcc.target/i386/mvc5.c: Scan indirect_function.
* gcc.target/i386/mvc7.c: Likewise.
diff --git a/gcc/testsuite/gcc.dg/asan/use-after-scope-switch-4.c b/gcc/testsuite/gcc.dg/asan/use-after-scope-switch-4.c
new file mode 100644
index 0000000..290a920
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/asan/use-after-scope-switch-4.c
@@ -0,0 +1,35 @@
+// { dg-do run }
+// { dg-additional-options "-fdump-tree-gimple" }
+
+int *ptr;
+
+struct a
+{
+ int c;
+};
+
+int main(int argc, char **argv)
+{
+ struct a e;
+ e.c = 2;
+ int x = 0;
+
+ for (;;)
+ switch (e.c)
+ case 3:
+ {
+ int resxxx;
+ case 2:
+ ptr = &resxxx;
+ *ptr = 123;
+
+ if (x)
+ return 0;
+ else
+ x = 1;
+ }
+
+ return 1;
+}
+
+/* { dg-final { scan-tree-dump-times "ASAN_MARK \\(UNPOISON, &resxxx, \[0-9\]\\);" 2 "gimple" } } */