Commit 4f5a53cc by Ilya Enkovich Committed by Ilya Enkovich

tree-chkp.h (chkp_insert_retbnd_call): New.

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.

From-SVN: r221917
parent 113c69ff
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> 2015-04-07 Jan Hubicka <hubicka@ucw.cz>
PR ipa/65540 PR ipa/65540
......
...@@ -1585,6 +1585,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk) ...@@ -1585,6 +1585,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
int i; int i;
tree resdecl; tree resdecl;
tree restmp = NULL; tree restmp = NULL;
tree resbnd = NULL;
gcall *call; gcall *call;
greturn *ret; greturn *ret;
...@@ -1701,6 +1702,17 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk) ...@@ -1701,6 +1702,17 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
gsi_insert_after (&bsi, call, GSI_NEW_STMT); gsi_insert_after (&bsi, call, GSI_NEW_STMT);
if (!alias_is_noreturn) 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 if (restmp && !this_adjusting
&& (fixed_offset || virtual_offset)) && (fixed_offset || virtual_offset))
{ {
...@@ -1770,6 +1782,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk) ...@@ -1770,6 +1782,7 @@ cgraph_node::expand_thunk (bool output_asm_thunks, bool force_gimple_thunk)
ret = gimple_build_return (restmp); ret = gimple_build_return (restmp);
else else
ret = gimple_build_return (resdecl); ret = gimple_build_return (resdecl);
gimple_return_set_retbnd (ret, resbnd);
gsi_insert_after (&bsi, ret, GSI_NEW_STMT); gsi_insert_after (&bsi, ret, GSI_NEW_STMT);
} }
......
...@@ -1230,20 +1230,6 @@ find_split_points (basic_block return_bb, int overall_time, int overall_size) ...@@ -1230,20 +1230,6 @@ find_split_points (basic_block return_bb, int overall_time, int overall_size)
BITMAP_FREE (current.ssa_names_to_pass); 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. */ /* Split function at SPLIT_POINT. */
static void static void
...@@ -1652,7 +1638,7 @@ split_function (basic_block return_bb, struct split_point *split_point, ...@@ -1652,7 +1638,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
} }
/* Build bndret call to obtain returned bounds. */ /* Build bndret call to obtain returned bounds. */
if (retbnd) if (retbnd)
insert_bndret_call_after (retbnd, retval, &gsi); chkp_insert_retbnd_call (retbnd, retval, &gsi);
gimple_call_set_lhs (call, retval); gimple_call_set_lhs (call, retval);
update_stmt (call); update_stmt (call);
} }
...@@ -1702,7 +1688,7 @@ split_function (basic_block return_bb, struct split_point *split_point, ...@@ -1702,7 +1688,7 @@ split_function (basic_block return_bb, struct split_point *split_point,
gsi_insert_after (&gsi, call, GSI_NEW_STMT); gsi_insert_after (&gsi, call, GSI_NEW_STMT);
/* Build bndret call to obtain returned bounds. */ /* Build bndret call to obtain returned bounds. */
if (retbnd) if (retbnd)
insert_bndret_call_after (retbnd, retval, &gsi); chkp_insert_retbnd_call (retbnd, retval, &gsi);
if (tsan_func_exit_call) if (tsan_func_exit_call)
gsi_insert_after (&gsi, tsan_func_exit_call, GSI_NEW_STMT); gsi_insert_after (&gsi, tsan_func_exit_call, GSI_NEW_STMT);
ret = gimple_build_return (retval); ret = gimple_build_return (retval);
......
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> 2015-04-08 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt48.adb: New test. * gnat.dg/opt48.adb: New test.
......
/* { 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 ();
}
...@@ -500,6 +500,35 @@ chkp_expand_bounds_reset_for_mem (tree mem, tree ptr) ...@@ -500,6 +500,35 @@ chkp_expand_bounds_reset_for_mem (tree mem, tree ptr)
expand_normal (bndstx); 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. */ /* Mark statement S to not be instrumented. */
static void static void
chkp_mark_stmt (gimple s) chkp_mark_stmt (gimple s)
......
...@@ -54,5 +54,7 @@ extern void chkp_copy_bounds_for_assign (gimple assign, ...@@ -54,5 +54,7 @@ extern void chkp_copy_bounds_for_assign (gimple assign,
extern bool chkp_gimple_call_builtin_p (gimple call, extern bool chkp_gimple_call_builtin_p (gimple call,
enum built_in_function code); enum built_in_function code);
extern void chkp_expand_bounds_reset_for_mem (tree mem, tree ptr); 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 */ #endif /* GCC_TREE_CHKP_H */
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