On Wed, Nov 16, 2016 at 05:01:31PM +0100, Martin Liška wrote:
> + use_operand_p use_p;
> + imm_use_iterator imm_iter;
> + FOR_EACH_IMM_USE_FAST (use_p, imm_iter, poisoned_var)
> + {
> + gimple *use = USE_STMT (use_p);
> + if (is_gimple_debug (use))
> + continue;
> +
> + built_in_function b = (recover_p
> + ? BUILT_IN_ASAN_REPORT_USE_AFTER_SCOPE_NOABORT
> + : BUILT_IN_ASAN_REPORT_USE_AFTER_SCOPE);
> + tree fun = builtin_decl_implicit (b);
> + pretty_printer pp;
> + pp_tree_identifier (&pp, DECL_NAME (var_decl));
> +
> + gcall *call = gimple_build_call (fun, 2, asan_pp_string (&pp),
> + DECL_SIZE_UNIT (var_decl));
> + gimple_set_location (call, gimple_location (use));
> +
> + /* The USE can be a gimple PHI node. If so, insert the call on
> + all edges leading to the PHI node. */
> + if (is_a <gphi *> (use))
> + {
> + gphi * phi = dyn_cast<gphi *> (use);
No space after *.
> + for (unsigned i = 0; i < gimple_phi_num_args (phi); ++i)
> + if (gimple_phi_arg_def (phi, i) == poisoned_var)
> + {
> + edge e = gimple_phi_arg_edge (phi, i);
> + gsi_insert_seq_on_edge (e, call);
> + *need_commit_edge_insert = true;
You clearly don't have a sufficient testsuite coverage for this,
because this won't really work if you have more than one phi
argument equal to poisoned_var. Inserting the same gimple stmt
into multiple places can't really work. I bet you want to set
call to NULL after the gsi_insert_seq_on_edge and before that
call if (call == NULL) { call = gimple_build_call (...); gimple_set_location
(...); }
Or maybe gimple_copy for the 2nd etc. would work too, dunno.
> + }
> + }
> + else
> + {
> + gimple_stmt_iterator gsi = gsi_for_stmt (use);
> + gsi_insert_before (&gsi, call, GSI_NEW_STMT);
> + }
> + }
> +
> + gimple *nop = gimple_build_nop ();
> + SSA_NAME_IS_DEFAULT_DEF (poisoned_var) = true;
> + SSA_NAME_DEF_STMT (poisoned_var) = nop;
> + gsi_replace (iter, nop, GSI_NEW_STMT);
The last argument of gsi_replace is a bool, not GSI_*.
But not sure how this will work anyway, I think SSA_NAME_IS_DEFAULT_DEF
are supposed to have SSA_NAME_DEF_STMT a GIMPLE_NOP that doesn't
have bb set, while you are putting it into the stmt sequence.
Shouldn't you just gsi_remove iter instead?
Otherwise LGTM, but please post the asan patch to llvm-commits
or through their web review interface.
Jakub