From a940fdc7e61a553a4edeb1d9c662980bd864d70f Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 2 Sep 2016 17:11:42 +0000 Subject: 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@239961 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/sanopt.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'gcc/sanopt.c') diff --git a/gcc/sanopt.c b/gcc/sanopt.c index 26604539ca5..eeb4cd00de0 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)) { -- cgit v1.2.1