diff options
author | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-12 15:52:56 +0000 |
---|---|---|
committer | dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-11-12 15:52:56 +0000 |
commit | c91b0fff683d97d428f822ecaf63e8ee0e36b1a7 (patch) | |
tree | 180ca989839a55574caee4be09f93e799a6249f4 /gcc | |
parent | 92fc5c480a861c81c784da2fca89c7a5b6931e19 (diff) | |
download | gcc-c91b0fff683d97d428f822ecaf63e8ee0e36b1a7.tar.gz |
Make build_check_stmt accept an SSA_NAME for its base
This patch makes build_check_stmt accept its memory access parameter
to be an SSA name. This is useful for a subsequent patch that will
re-use.
Tested by running cc1 -fasan on the program below with and without the
patch and inspecting the gimple output to see that there is no change.
void
foo ()
{
char foo[1] = {0};
foo[0] = 1;
}
gcc/
* asan.c (build_check_stmt): Accept the memory access to be
represented by an SSA_NAME.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@193438 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/asan.c | 36 |
2 files changed, 28 insertions, 13 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 49ac3850fa6..7fec865b717 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-11-12 Dodji Seketeli <dodji@redhat.com> + + * asan.c (build_check_stmt): Accept the memory access to be + represented by an SSA_NAME. + 2012-11-12 Jakub Jelinek <jakub@redhat.com> Wei Mi <wmi@google.com> diff --git a/gcc/asan.c b/gcc/asan.c index db82ba7aadb..da5f22bf6fb 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -520,16 +520,18 @@ asan_init_func (void) #define PROB_VERY_UNLIKELY (REG_BR_PROB_BASE / 2000 - 1) #define PROB_ALWAYS (REG_BR_PROB_BASE) -/* Instrument the memory access instruction BASE. - Insert new statements before ITER. - LOCATION is source code location. - IS_STORE is either 1 (for a store) or 0 (for a load). +/* Instrument the memory access instruction BASE. Insert new + statements before ITER. + + Note that the memory access represented by BASE can be either an + SSA_NAME, or a non-SSA expression. LOCATION is the source code + location. IS_STORE is TRUE for a store, FALSE for a load. SIZE_IN_BYTES is one of 1, 2, 4, 8, 16. */ static void -build_check_stmt (tree base, - gimple_stmt_iterator *iter, - location_t location, bool is_store, int size_in_bytes) +build_check_stmt (tree base, gimple_stmt_iterator *iter, + location_t location, bool is_store, + int size_in_bytes) { gimple_stmt_iterator gsi; basic_block cond_bb, then_bb, else_bb; @@ -540,6 +542,7 @@ build_check_stmt (tree base, tree shadow_type = TREE_TYPE (shadow_ptr_type); tree uintptr_type = build_nonstandard_integer_type (TYPE_PRECISION (TREE_TYPE (base)), 1); + tree base_ssa = base; /* We first need to split the current basic block, and start altering the CFG. This allows us to insert the statements we're about to @@ -585,15 +588,22 @@ build_check_stmt (tree base, base = unshare_expr (base); gsi = gsi_last_bb (cond_bb); - g = gimple_build_assign_with_ops (TREE_CODE (base), - make_ssa_name (TREE_TYPE (base), NULL), - base, NULL_TREE); - gimple_set_location (g, location); - gsi_insert_after (&gsi, g, GSI_NEW_STMT); + + /* BASE can already be an SSA_NAME; in that case, do not create a + new SSA_NAME for it. */ + if (TREE_CODE (base) != SSA_NAME) + { + g = gimple_build_assign_with_ops (TREE_CODE (base), + make_ssa_name (TREE_TYPE (base), NULL), + base, NULL_TREE); + gimple_set_location (g, location); + gsi_insert_after (&gsi, g, GSI_NEW_STMT); + base_ssa = gimple_assign_lhs (g); + } g = gimple_build_assign_with_ops (NOP_EXPR, make_ssa_name (uintptr_type, NULL), - gimple_assign_lhs (g), NULL_TREE); + base_ssa, NULL_TREE); gimple_set_location (g, location); gsi_insert_after (&gsi, g, GSI_NEW_STMT); base_addr = gimple_assign_lhs (g); |