From f3dd574e54fc67403c7bfe43780401e06e856dde Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 22 Mar 2017 19:34:44 +0100 Subject: [PATCH] =?utf8?q?re=20PR=20sanitizer/80110=20(error:=20statement?= =?utf8?q?=20marked=20for=20throw,=20but=20doesn=E2=80=99t=20w/=20-fsaniti?= =?utf8?q?ze=3Dthread)?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit PR sanitizer/80110 * tsan.c: Include tree-eh.h. (instrument_builtin_call): Call maybe_clean_eh_stmt or maybe_clean_or_replace_eh_stmt where needed. (instrument_memory_accesses): Add cfg_changed argument. Call gimple_purge_dead_eh_edges on each block and set *cfg_changed if it returned true. (tsan_pass): Adjust caller. Return TODO_cleanup_cfg if cfg_changed. * g++.dg/tsan/pr80110.C: New test. From-SVN: r246399 --- gcc/ChangeLog | 9 ++++++ gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.dg/tsan/pr80110.C | 16 ++++++++++ gcc/tsan.c | 47 ++++++++++++++++++----------- 4 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 gcc/testsuite/g++.dg/tsan/pr80110.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 00d2015f959..2721da3a36d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2017-03-22 Jakub Jelinek + PR sanitizer/80110 + * tsan.c: Include tree-eh.h. + (instrument_builtin_call): Call maybe_clean_eh_stmt or + maybe_clean_or_replace_eh_stmt where needed. + (instrument_memory_accesses): Add cfg_changed argument. + Call gimple_purge_dead_eh_edges on each block and set *cfg_changed + if it returned true. + (tsan_pass): Adjust caller. Return TODO_cleanup_cfg if cfg_changed. + PR rtl-optimization/63191 * config/i386/i386.c (ix86_delegitimize_address): Turn into small wrapper function, moved the whole old content into ... diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 53474a1b1aa..d8b45dcacf6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-03-22 Jakub Jelinek + + PR sanitizer/80110 + * g++.dg/tsan/pr80110.C: New test. + 2017-03-22 Thomas Koenig PR fortran/80142 diff --git a/gcc/testsuite/g++.dg/tsan/pr80110.C b/gcc/testsuite/g++.dg/tsan/pr80110.C new file mode 100644 index 00000000000..bee19e50d30 --- /dev/null +++ b/gcc/testsuite/g++.dg/tsan/pr80110.C @@ -0,0 +1,16 @@ +// PR sanitizer/80110 +// { dg-do compile } +// { dg-options "-fnon-call-exceptions -fsanitize=thread" } + +struct A +{ + int b (); + void c () { static int d = b (); } +}; + +void +foo () +{ + A e; + e.c (); +} diff --git a/gcc/tsan.c b/gcc/tsan.c index 5e5961f4bda..dd8cd85647c 100644 --- a/gcc/tsan.c +++ b/gcc/tsan.c @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-iterator.h" #include "tree-ssa-propagate.h" #include "tree-ssa-loop-ivopts.h" +#include "tree-eh.h" #include "tsan.h" #include "asan.h" #include "builtins.h" @@ -504,6 +505,7 @@ instrument_builtin_call (gimple_stmt_iterator *gsi) return; gimple_call_set_fndecl (stmt, decl); update_stmt (stmt); + maybe_clean_eh_stmt (stmt); if (tsan_atomic_table[i].action == fetch_op) { args[1] = gimple_call_arg (stmt, 1); @@ -524,6 +526,7 @@ instrument_builtin_call (gimple_stmt_iterator *gsi) ? MEMMODEL_SEQ_CST : MEMMODEL_ACQUIRE); update_gimple_call (gsi, decl, num + 1, args[0], args[1], args[2]); + maybe_clean_or_replace_eh_stmt (stmt, gsi_stmt (*gsi)); stmt = gsi_stmt (*gsi); if (tsan_atomic_table[i].action == fetch_op_seq_cst) { @@ -572,6 +575,7 @@ instrument_builtin_call (gimple_stmt_iterator *gsi) return; update_gimple_call (gsi, decl, 5, args[0], args[1], args[2], args[4], args[5]); + maybe_clean_or_replace_eh_stmt (stmt, gsi_stmt (*gsi)); return; case bool_cas: case val_cas: @@ -599,6 +603,7 @@ instrument_builtin_call (gimple_stmt_iterator *gsi) MEMMODEL_SEQ_CST), build_int_cst (NULL_TREE, MEMMODEL_SEQ_CST)); + maybe_clean_or_replace_eh_stmt (stmt, gsi_stmt (*gsi)); if (tsan_atomic_table[i].action == val_cas && lhs) { tree cond; @@ -623,6 +628,7 @@ instrument_builtin_call (gimple_stmt_iterator *gsi) build_int_cst (t, 0), build_int_cst (NULL_TREE, MEMMODEL_RELEASE)); + maybe_clean_or_replace_eh_stmt (stmt, gsi_stmt (*gsi)); return; case bool_clear: case bool_test_and_set: @@ -651,11 +657,13 @@ instrument_builtin_call (gimple_stmt_iterator *gsi) { update_gimple_call (gsi, decl, 3, gimple_call_arg (stmt, 0), build_int_cst (t, 0), last_arg); + maybe_clean_or_replace_eh_stmt (stmt, gsi_stmt (*gsi)); return; } t = build_int_cst (t, targetm.atomic_test_and_set_trueval); update_gimple_call (gsi, decl, 3, gimple_call_arg (stmt, 0), t, last_arg); + maybe_clean_or_replace_eh_stmt (stmt, gsi_stmt (*gsi)); stmt = gsi_stmt (*gsi); lhs = gimple_call_lhs (stmt); if (lhs == NULL_TREE) @@ -766,7 +774,7 @@ instrument_func_exit (void) Return true if func entry/exit should be instrumented. */ static bool -instrument_memory_accesses (void) +instrument_memory_accesses (bool *cfg_changed) { basic_block bb; gimple_stmt_iterator gsi; @@ -775,20 +783,24 @@ instrument_memory_accesses (void) auto_vec tsan_func_exits; FOR_EACH_BB_FN (bb, cfun) - for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) - { - gimple *stmt = gsi_stmt (gsi); - if (gimple_call_internal_p (stmt, IFN_TSAN_FUNC_EXIT)) - { - if (fentry_exit_instrument) - replace_func_exit (stmt); - else - tsan_func_exits.safe_push (stmt); - func_exit_seen = true; - } - else - fentry_exit_instrument |= instrument_gimple (&gsi); - } + { + for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) + { + gimple *stmt = gsi_stmt (gsi); + if (gimple_call_internal_p (stmt, IFN_TSAN_FUNC_EXIT)) + { + if (fentry_exit_instrument) + replace_func_exit (stmt); + else + tsan_func_exits.safe_push (stmt); + func_exit_seen = true; + } + else + fentry_exit_instrument |= instrument_gimple (&gsi); + } + if (gimple_purge_dead_eh_edges (bb)) + *cfg_changed = true; + } unsigned int i; gimple *stmt; FOR_EACH_VEC_ELT (tsan_func_exits, i, stmt) @@ -835,9 +847,10 @@ static unsigned tsan_pass (void) { initialize_sanitizer_builtins (); - if (instrument_memory_accesses ()) + bool cfg_changed = false; + if (instrument_memory_accesses (&cfg_changed)) instrument_func_entry (); - return 0; + return cfg_changed ? TODO_cleanup_cfg : 0; } /* Inserts __tsan_init () into the list of CTORs. */ -- 2.30.2