summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-10-12 21:32:22 +0000
committerDodji Seketeli <dodji@seketeli.org>2012-11-09 18:02:28 +0100
commitffd77b7b947d9c91e105ba55af1d9460c4212f7e (patch)
treea5fc1dca1c39356c318bf136c5848d71608eec72
parent72ed51c18dd269ee10fa1b70a919d77de498fc06 (diff)
downloadgcc-ffd77b7b947d9c91e105ba55af1d9460c4212f7e.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/asan@192415 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog.asan8
-rw-r--r--gcc/asan.c45
-rw-r--r--gcc/passes.c1
-rw-r--r--gcc/tree-pass.h1
4 files changed, 46 insertions, 9 deletions
diff --git a/gcc/ChangeLog.asan b/gcc/ChangeLog.asan
index 6db81a2798b..b630f9aa386 100644
--- a/gcc/ChangeLog.asan
+++ b/gcc/ChangeLog.asan
@@ -1,3 +1,11 @@
+2012-10-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-10-11 Jakub Jelinek <jakub@redhat.com>
Xinliang David Li <davidxl@google.com>
Dodji Seketeli <dodji@redhat.com>
diff --git a/gcc/asan.c b/gcc/asan.c
index 04b11e579ac..398b83775e6 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -123,7 +123,7 @@ build_check_stmt (tree base,
location_t location, bool is_store, int size_in_bytes)
{
gimple_stmt_iterator gsi;
- basic_block cond_bb, then_bb, join_bb;
+ basic_block cond_bb, then_bb, else_bb;
edge e;
tree t, base_addr, shadow;
gimple g;
@@ -144,23 +144,23 @@ build_check_stmt (tree base,
else
e = split_block_after_labels (cond_bb);
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
built. cond_bb is the (possibly new, synthetic) basic block the
end of which will contain the cache-lookup code, and a
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. */
then_bb = create_empty_bb (cond_bb);
e = make_edge (cond_bb, then_bb, EDGE_TRUE_VALUE);
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. */
- e = find_edge (cond_bb, join_bb);
+ /* Mark the pseudo-fallthrough edge from cond_bb to else_bb. */
+ e = find_edge (cond_bb, else_bb);
e->flags = EDGE_FALSE_VALUE;
e->count = cond_bb->count;
e->probability = PROB_ALWAYS - PROB_VERY_UNLIKELY;
@@ -170,7 +170,7 @@ build_check_stmt (tree base,
if (dom_info_available_p (CDI_DOMINATORS))
{
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);
@@ -293,7 +293,7 @@ build_check_stmt (tree base,
gimple_set_location (g, location);
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.
@@ -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"
diff --git a/gcc/passes.c b/gcc/passes.c
index 66a2f74b15e..d4115b38ae7 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -1562,6 +1562,7 @@ init_optimization_passes (void)
NEXT_PASS (pass_tm_edges);
}
NEXT_PASS (pass_lower_complex_O0);
+ NEXT_PASS (pass_asan_O0);
NEXT_PASS (pass_cleanup_eh);
NEXT_PASS (pass_lower_resx);
NEXT_PASS (pass_nrv);
diff --git a/gcc/tree-pass.h b/gcc/tree-pass.h
index 0e618569e65..929d5100249 100644
--- a/gcc/tree-pass.h
+++ b/gcc/tree-pass.h
@@ -260,6 +260,7 @@ struct register_pass_info
extern struct gimple_opt_pass pass_mudflap_1;
extern struct gimple_opt_pass pass_mudflap_2;
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_refactor_eh;
extern struct gimple_opt_pass pass_lower_eh;