Commit dfb9e332 by Jakub Jelinek Committed by Dodji Seketeli

Allow asan at -O0

This patch defines a new asan pass gate that is activated at -O0, in
addition to the pass that was initially activated at -O3 level The
patch also does some comment cleanups here and there.

	* asan.c (build_check_stmt): Rename join_bb variable to else_bb.
	(gate_asan_O0): New function.
	(pass_asan_O0): New variable.
	* passes.c (init_optimization_passes): Add pass_asan_O0.
	* tree-pass.h (pass_asan_O0): New declaration.

From-SVN: r193435
parent f6d98484
2012-11-12 Jakub Jelinek <jakub@redhat.com> 2012-11-12 Jakub Jelinek <jakub@redhat.com>
* asan.c (build_check_stmt): Rename join_bb variable to else_bb.
(gate_asan_O0): New function.
(pass_asan_O0): New variable.
* passes.c (init_optimization_passes): Add pass_asan_O0.
* tree-pass.h (pass_asan_O0): New declaration.
2012-11-12 Jakub Jelinek <jakub@redhat.com>
Xinliang David Li <davidxl@google.com> Xinliang David Li <davidxl@google.com>
Dodji Seketeli <dodji@redhat.com> Dodji Seketeli <dodji@redhat.com>
...@@ -123,7 +123,7 @@ build_check_stmt (tree base, ...@@ -123,7 +123,7 @@ build_check_stmt (tree base,
location_t location, bool is_store, int size_in_bytes) location_t location, bool is_store, int size_in_bytes)
{ {
gimple_stmt_iterator gsi; gimple_stmt_iterator gsi;
basic_block cond_bb, then_bb, join_bb; basic_block cond_bb, then_bb, else_bb;
edge e; edge e;
tree t, base_addr, shadow; tree t, base_addr, shadow;
gimple g; gimple g;
...@@ -144,23 +144,23 @@ build_check_stmt (tree base, ...@@ -144,23 +144,23 @@ build_check_stmt (tree base,
else else
e = split_block_after_labels (cond_bb); e = split_block_after_labels (cond_bb);
cond_bb = e->src; cond_bb = e->src;
join_bb = e->dest; else_bb = e->dest;
/* A recap at this point: join_bb is the basic block at whose head /* A recap at this point: else_bb is the basic block at whose head
is the gimple statement for which this check expression is being is the gimple statement for which this check expression is being
built. cond_bb is the (possibly new, synthetic) basic block the built. cond_bb is the (possibly new, synthetic) basic block the
end of which will contain the cache-lookup code, and a end of which will contain the cache-lookup code, and a
conditional that jumps to the cache-miss code or, much more conditional that jumps to the cache-miss code or, much more
likely, over to join_bb. */ likely, over to else_bb. */
/* Create the bb that contains the crash block. */ /* Create the bb that contains the crash block. */
then_bb = create_empty_bb (cond_bb); then_bb = create_empty_bb (cond_bb);
e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE); e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
e->probability = PROB_VERY_UNLIKELY; e->probability = PROB_VERY_UNLIKELY;
make_single_succ_edge (then_bb, join_bb, EDGE_FALLTHRU); make_single_succ_edge (then_bb, else_bb, EDGE_FALLTHRU);
/* Mark the pseudo-fallthrough edge from cond_bb to join_bb. */ /* Mark the pseudo-fallthrough edge from cond_bb to else_bb. */
e = find_edge (cond_bb, join_bb); e = find_edge (cond_bb, else_bb);
e->flags = EDGE_FALSE_VALUE; e->flags = EDGE_FALSE_VALUE;
e->count = cond_bb->count; e->count = cond_bb->count;
e->probability = PROB_ALWAYS - PROB_VERY_UNLIKELY; e->probability = PROB_ALWAYS - PROB_VERY_UNLIKELY;
...@@ -170,7 +170,7 @@ build_check_stmt (tree base, ...@@ -170,7 +170,7 @@ build_check_stmt (tree base,
if (dom_info_available_p (CDI_DOMINATORS)) if (dom_info_available_p (CDI_DOMINATORS))
{ {
set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb); set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
set_immediate_dominator (CDI_DOMINATORS, join_bb, cond_bb); set_immediate_dominator (CDI_DOMINATORS, else_bb, cond_bb);
} }
base = unshare_expr (base); base = unshare_expr (base);
...@@ -293,7 +293,7 @@ build_check_stmt (tree base, ...@@ -293,7 +293,7 @@ build_check_stmt (tree base,
gimple_set_location (g, location); gimple_set_location (g, location);
gsi_insert_after (&gsi, g, GSI_NEW_STMT); gsi_insert_after (&gsi, g, GSI_NEW_STMT);
*iter = gsi_start_bb (join_bb); *iter = gsi_start_bb (else_bb);
} }
/* If T represents a memory access, add instrumentation code before ITER. /* If T represents a memory access, add instrumentation code before ITER.
...@@ -436,4 +436,31 @@ struct gimple_opt_pass pass_asan = ...@@ -436,4 +436,31 @@ struct gimple_opt_pass pass_asan =
} }
}; };
static bool
gate_asan_O0 (void)
{
return flag_asan != 0 && !optimize;
}
struct gimple_opt_pass pass_asan_O0 =
{
{
GIMPLE_PASS,
"asan0", /* name */
OPTGROUP_NONE, /* optinfo_flags */
gate_asan_O0, /* gate */
asan_instrument, /* execute */
NULL, /* sub */
NULL, /* next */
0, /* static_pass_number */
TV_NONE, /* tv_id */
PROP_ssa | PROP_cfg | PROP_gimple_leh,/* properties_required */
0, /* properties_provided */
0, /* properties_destroyed */
0, /* todo_flags_start */
TODO_verify_flow | TODO_verify_stmts
| TODO_update_ssa /* todo_flags_finish */
}
};
#include "gt-asan.h" #include "gt-asan.h"
...@@ -1562,6 +1562,7 @@ init_optimization_passes (void) ...@@ -1562,6 +1562,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_tm_edges); NEXT_PASS (pass_tm_edges);
} }
NEXT_PASS (pass_lower_complex_O0); NEXT_PASS (pass_lower_complex_O0);
NEXT_PASS (pass_asan_O0);
NEXT_PASS (pass_cleanup_eh); NEXT_PASS (pass_cleanup_eh);
NEXT_PASS (pass_lower_resx); NEXT_PASS (pass_lower_resx);
NEXT_PASS (pass_nrv); NEXT_PASS (pass_nrv);
......
...@@ -260,6 +260,7 @@ struct register_pass_info ...@@ -260,6 +260,7 @@ struct register_pass_info
extern struct gimple_opt_pass pass_mudflap_1; extern struct gimple_opt_pass pass_mudflap_1;
extern struct gimple_opt_pass pass_mudflap_2; extern struct gimple_opt_pass pass_mudflap_2;
extern struct gimple_opt_pass pass_asan; extern struct gimple_opt_pass pass_asan;
extern struct gimple_opt_pass pass_asan_O0;
extern struct gimple_opt_pass pass_lower_cf; extern struct gimple_opt_pass pass_lower_cf;
extern struct gimple_opt_pass pass_refactor_eh; extern struct gimple_opt_pass pass_refactor_eh;
extern struct gimple_opt_pass pass_lower_eh; extern struct gimple_opt_pass pass_lower_eh;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment