diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-09-02 19:11:42 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-09-02 19:11:42 +0200 |
commit | 94087e88e0fcd45e51ab5797406714048dd5334c (patch) | |
tree | fbe11b6178ba7e9156879fe0f685cee7e04473c7 /gcc/sanopt.c | |
parent | af711c232d854adacd147897c1886cadeb4391f2 (diff) | |
download | gcc-94087e88e0fcd45e51ab5797406714048dd5334c.zip gcc-94087e88e0fcd45e51ab5797406714048dd5334c.tar.gz gcc-94087e88e0fcd45e51ab5797406714048dd5334c.tar.bz2 |
re PR sanitizer/77396 (address sanitizer crashes if all static global variables are optimized)
PR sanitizer/77396
* sanopt.c: Include gimple-ssa.h, tree-phinodes.h and ssa-iterators.h.
(sanopt_optimize_walker): Optimize away
__asan_before_dynamic_init (...) followed by
__asan_after_dynamic_init () without intervening memory loads/stores.
* ipa-pure-const.c (special_builtin_state): Handle
BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT and
BUILT_IN_ASAN_AFTER_DYNAMIC_INIT.
* decl2.c (do_static_initialization_or_destruction): Only
call asan_dynamic_init_call if INITP is true.
* g++.dg/asan/pr77396.C: New test.
From-SVN: r239961
Diffstat (limited to 'gcc/sanopt.c')
-rw-r--r-- | gcc/sanopt.c | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/sanopt.c b/gcc/sanopt.c index 2660453..eeb4cd0 100644 --- a/gcc/sanopt.c +++ b/gcc/sanopt.c @@ -33,6 +33,9 @@ along with GCC; see the file COPYING3. If not see #include "ubsan.h" #include "params.h" #include "tree-hash-traits.h" +#include "gimple-ssa.h" +#include "tree-phinodes.h" +#include "ssa-iterators.h" /* This is used to carry information about basic blocks. It is @@ -538,6 +541,28 @@ sanopt_optimize_walker (basic_block bb, struct sanopt_ctx *ctx) if (asan_check_optimize && !nonfreeing_call_p (stmt)) info->freeing_call_events++; + /* If __asan_before_dynamic_init ("module"); is followed by + __asan_after_dynamic_init (); without intervening memory loads/stores, + there is nothing to guard, so optimize both away. */ + if (asan_check_optimize + && gimple_call_builtin_p (stmt, BUILT_IN_ASAN_BEFORE_DYNAMIC_INIT)) + { + use_operand_p use; + gimple *use_stmt; + if (single_imm_use (gimple_vdef (stmt), &use, &use_stmt)) + { + if (is_gimple_call (use_stmt) + && gimple_call_builtin_p (use_stmt, + BUILT_IN_ASAN_AFTER_DYNAMIC_INIT)) + { + unlink_stmt_vdef (use_stmt); + gimple_stmt_iterator gsi2 = gsi_for_stmt (use_stmt); + gsi_remove (&gsi2, true); + remove = true; + } + } + } + if (gimple_call_internal_p (stmt)) switch (gimple_call_internal_fn (stmt)) { |