summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorienkovich <ienkovich@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-08 10:44:59 +0000
committerienkovich <ienkovich@138bc75d-0d04-0410-961f-82ee72b054a4>2015-04-08 10:44:59 +0000
commit17c596cc422a7e2a22158c3a29c82246e301ae01 (patch)
tree3b12f9e0a29bd3d514d93f2c8bdb05d2c21c7962
parent95de51be8bb9d3ede2abc49ab318dd270a7b1b11 (diff)
downloadgcc-17c596cc422a7e2a22158c3a29c82246e301ae01.tar.gz
gcc/
* tree-chkp.h (chkp_insert_retbnd_call): New. * tree-chkp.c (chkp_insert_retbnd_call): New. * ipa-split.c (insert_bndret_call_after): Remove. (split_function): Use chkp_insert_retbnd_call. * cgraphunit.c (cgraph_node::expand_thunk): Build returned bounds for instrumented functions. gcc/testsuite/ * gcc/testsuite/gcc.target/i386/thunk-retbnd.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@221917 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/cgraphunit.c13
-rw-r--r--gcc/ipa-split.c18
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/thunk-retbnd.c19
-rw-r--r--gcc/tree-chkp.c29
-rw-r--r--gcc/tree-chkp.h2
7 files changed, 78 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7de54510bd4..4ab9dca77f5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2015-04-08 Ilya Enkovich <ilya.enkovich@intel.com>
+
+ * tree-chkp.h (chkp_insert_retbnd_call): New.
+ * tree-chkp.c (chkp_insert_retbnd_call): New.
+ * ipa-split.c (insert_bndret_call_after): Remove.
+ (split_function): Use chkp_insert_retbnd_call.
+ * cgraphunit.c (cgraph_node::expand_thunk): Build returned
+ bounds for instrumented functions.
+
2015-04-07 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65540
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index 77ef9edba4a..2315ba84bb7 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -1585,6 +1585,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
int i;
tree resdecl;
tree restmp = NULL;
+ tree resbnd = NULL;
gcall *call;
greturn *ret;
@@ -1701,6 +1702,17 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
gsi_insert_after (&bsi, call, GSI_NEW_STMT);
if (!alias_is_noreturn)
{
+ if (instrumentation_clone
+ && !DECL_BY_REFERENCE (resdecl)
+ && restmp
+ && BOUNDED_P (restmp))
+ {
+ resbnd = chkp_insert_retbnd_call (NULL, restmp, &bsi);
+ create_edge (get_create (gimple_call_fndecl (gsi_stmt (bsi))),
+ as_a <gcall *> (gsi_stmt (bsi)),
+ callees->count, callees->frequency);
+ }
+
if (restmp && !this_adjusting
&& (fixed_offset || virtual_offset))
{
@@ -1770,6 +1782,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
ret = gimple_build_return (restmp);
else
ret = gimple_build_return (resdecl);
+ gimple_return_set_retbnd (ret, resbnd);
gsi_insert_after (&bsi, ret, GSI_NEW_STMT);
}
diff --git a/gcc/ipa-split.c b/gcc/ipa-split.c
index a28f3a1ad92..5d6763d102d 100644
--- a/gcc/ipa-split.c
+++ b/gcc/ipa-split.c
@@ -1230,20 +1230,6 @@ find_split_points (basic_block return_bb, int overall_time, int overall_size)
BITMAP_FREE (current.ssa_names_to_pass);
}
-/* Build and insert initialization of returned bounds RETBND
- for returned value RETVAL. Statements are inserted after
- a statement pointed by GSI and GSI is modified to point to
- the last inserted statement. */
-
-static void
-insert_bndret_call_after (tree retbnd, tree retval, gimple_stmt_iterator *gsi)
-{
- tree fndecl = targetm.builtin_chkp_function (BUILT_IN_CHKP_BNDRET);
- gimple bndret = gimple_build_call (fndecl, 1, retval);
- gimple_call_set_lhs (bndret, retbnd);
- gsi_insert_after (gsi, bndret, GSI_CONTINUE_LINKING);
-}
-
/* Split function at SPLIT_POINT. */
static void
@@ -1652,7 +1638,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
}
/* Build bndret call to obtain returned bounds. */
if (retbnd)
- insert_bndret_call_after (retbnd, retval, &gsi);
+ chkp_insert_retbnd_call (retbnd, retval, &gsi);
gimple_call_set_lhs (call, retval);
update_stmt (call);
}
@@ -1702,7 +1688,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
gsi_insert_after (&gsi, call, GSI_NEW_STMT);
/* Build bndret call to obtain returned bounds. */
if (retbnd)
- insert_bndret_call_after (retbnd, retval, &gsi);
+ chkp_insert_retbnd_call (retbnd, retval, &gsi);
if (tsan_func_exit_call)
gsi_insert_after (&gsi, tsan_func_exit_call, GSI_NEW_STMT);
ret = gimple_build_return (retval);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index a6a7be318be..c926f3d32ea 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2015-04-08 Ilya Enkovich <ilya.enkovich@intel.com>
+
+ * gcc/testsuite/gcc.target/i386/thunk-retbnd.c: New.
+
2015-04-08 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt48.adb: New test.
diff --git a/gcc/testsuite/gcc.target/i386/thunk-retbnd.c b/gcc/testsuite/gcc.target/i386/thunk-retbnd.c
new file mode 100644
index 00000000000..d9bd031471a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/thunk-retbnd.c
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target mpx } */
+/* { dg-options "-O2 -fcheck-pointer-bounds -mmpx -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-times "return &glob," 2 "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
+
+int glob;
+
+int *
+test1 (void)
+{
+ return &glob;
+}
+
+int *
+test2 (void)
+{
+ return test1 ();
+}
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index 03f75b35da8..541af29a48a 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -500,6 +500,35 @@ chkp_expand_bounds_reset_for_mem (tree mem, tree ptr)
expand_normal (bndstx);
}
+/* Build retbnd call for returned value RETVAL.
+
+ If BNDVAL is not NULL then result is stored
+ in it. Otherwise a temporary is created to
+ hold returned value.
+
+ GSI points to a position for a retbnd call
+ and is set to created stmt.
+
+ Cgraph edge is created for a new call if
+ UPDATE_EDGE is 1.
+
+ Obtained bounds are returned. */
+tree
+chkp_insert_retbnd_call (tree bndval, tree retval,
+ gimple_stmt_iterator *gsi)
+{
+ gimple call;
+
+ if (!bndval)
+ bndval = create_tmp_reg (pointer_bounds_type_node, "retbnd");
+
+ call = gimple_build_call (chkp_ret_bnd_fndecl, 1, retval);
+ gimple_call_set_lhs (call, bndval);
+ gsi_insert_after (gsi, call, GSI_CONTINUE_LINKING);
+
+ return bndval;
+}
+
/* Mark statement S to not be instrumented. */
static void
chkp_mark_stmt (gimple s)
diff --git a/gcc/tree-chkp.h b/gcc/tree-chkp.h
index 86f3618bd6e..1bafe994da2 100644
--- a/gcc/tree-chkp.h
+++ b/gcc/tree-chkp.h
@@ -54,5 +54,7 @@ extern void chkp_copy_bounds_for_assign (gimple assign,
extern bool chkp_gimple_call_builtin_p (gimple call,
enum built_in_function code);
extern void chkp_expand_bounds_reset_for_mem (tree mem, tree ptr);
+extern tree chkp_insert_retbnd_call (tree bndval, tree retval,
+ gimple_stmt_iterator *gsi);
#endif /* GCC_TREE_CHKP_H */