diff options
author | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-03-22 18:34:44 +0000 |
---|---|---|
committer | jakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-03-22 18:34:44 +0000 |
commit | 4860d299a00b0ed64495d105ed08924584411d75 (patch) | |
tree | 904be942771e5ff0b78f41ad11034f3427573b07 | |
parent | 9dff31564d1eb71876c14b824679abd43655582e (diff) | |
download | gcc-4860d299a00b0ed64495d105ed08924584411d75.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@246399 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/tsan/pr80110.C | 16 | ||||
-rw-r--r-- | gcc/tsan.c | 47 |
4 files changed, 60 insertions, 17 deletions
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 <jakub@redhat.com> + 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 <jakub@redhat.com> + + PR sanitizer/80110 + * g++.dg/tsan/pr80110.C: New test. + 2017-03-22 Thomas Koenig <tkoenig@gcc.gnu.org> 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<gimple *> 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. */ |