This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH 10/13] Make build_check_stmt accept an SSA_NAME for its base
- From: dodji at redhat dot com
- To: gcc-patches at gcc dot gnu dot org
- Cc: dnovillo at google dot com, jakub at redhat dot com, wmi at google dot com, davidxl at google dot com, konstantin dot s dot serebryany at gmail dot com
- Date: Thu, 1 Nov 2012 20:52:43 +0100
- Subject: [PATCH 10/13] Make build_check_stmt accept an SSA_NAME for its base
- References: <1351799566-31447-1-git-send-email-dodji@redhat.com>
From: dodji <dodji@138bc75d-0d04-0410-961f-82ee72b054a4>
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/branches/asan@192843 138bc75d-0d04-0410-961f-82ee72b054a4
---
gcc/ChangeLog.asan | 5 +++++
gcc/asan.c | 36 +++++++++++++++++++++++-------------
2 files changed, 28 insertions(+), 13 deletions(-)
diff --git a/gcc/ChangeLog.asan b/gcc/ChangeLog.asan
index 57670f7..9159b3f 100644
--- a/gcc/ChangeLog.asan
+++ b/gcc/ChangeLog.asan
@@ -1,3 +1,8 @@
+2012-10-26 Dodji Seketeli <dodji@redhat.com>
+
+ * asan.c (build_check_stmt): Accept the memory access to be
+ represented by an SSA_NAME.
+
2012-10-25 Wei Mi Â<wmi@google.com>
* varasm.c (assemble_variable): Set asan_protected even
diff --git a/gcc/asan.c b/gcc/asan.c
index 6715e51..b43f03b 100644
--- a/gcc/asan.c
+++ b/gcc/asan.c
@@ -397,16 +397,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;
@@ -417,6 +419,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
@@ -462,15 +465,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);
--
1.7.11.7