Commit 985f48f7 by Ilya Enkovich Committed by Ilya Enkovich

tree-chkp.c (chkp_call_returns_bounds_p): New.

gcc/

	* tree-chkp.c (chkp_call_returns_bounds_p): New.
	(chkp_build_returned_bound): Use zero bounds as
	returned by calls not returning bounds.

gcc/testsuite/

	* gcc.target/i386/chkp-bndret.c: New.
	* gcc.target/i386/chkp-strchr.c: New.

From-SVN: r218478
parent 2625bb5d
2014-12-08 Ilya Enkovich <ilya.enkovich@intel.com>
* tree-chkp.c (chkp_call_returns_bounds_p): New.
(chkp_build_returned_bound): Use zero bounds as
returned by calls not returning bounds.
2014-12-08 Richard Biener <rguenther@suse.de> 2014-12-08 Richard Biener <rguenther@suse.de>
* builtins.c (fold_builtin_0): Remove unused ignore parameter. * builtins.c (fold_builtin_0): Remove unused ignore parameter.
2014-12-08 Ilya Enkovich <ilya.enkovich@intel.com>
* gcc.target/i386/chkp-bndret.c: New.
* gcc.target/i386/chkp-strchr.c: New.
2014-12-07 Oleg Endo <olegendo@gcc.gnu.org> 2014-12-07 Oleg Endo <olegendo@gcc.gnu.org>
PR target/53513 PR target/53513
......
/* { dg-do compile } */
/* { dg-require-effective-target mpx } */
/* { dg-options "-fcheck-pointer-bounds -mmpx -O2 -fdump-tree-chkp" } */
/* { dg-final { scan-tree-dump-not "bndret" "chkp" } } */
/* { dg-final { cleanup-tree-dump "chkp" } } */
#include "string.h"
extern int *test1 (int *p) __attribute__((bnd_legacy));
int *
test2 (int *p)
{
return test1 (p);
}
/* { dg-do compile } */
/* { dg-require-effective-target mpx } */
/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
#include "string.h"
static char *
test1 (char *str)
{
return strrchr (str, '_');
}
char *
test2 ()
{
return test1 ("test_string");
}
...@@ -2082,6 +2082,38 @@ chkp_get_nonpointer_load_bounds (void) ...@@ -2082,6 +2082,38 @@ chkp_get_nonpointer_load_bounds (void)
return chkp_get_zero_bounds (); return chkp_get_zero_bounds ();
} }
/* Return 1 if may use bndret call to get bounds for pointer
returned by CALL. */
static bool
chkp_call_returns_bounds_p (gcall *call)
{
if (gimple_call_internal_p (call))
return false;
tree fndecl = gimple_call_fndecl (call);
if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_MD)
return false;
if (fndecl
&& lookup_attribute ("bnd_legacy", DECL_ATTRIBUTES (fndecl)))
return false;
if (fndecl && DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL)
{
if (chkp_instrument_normal_builtin (fndecl))
return true;
if (!lookup_attribute ("always_inline", DECL_ATTRIBUTES (fndecl)))
return false;
struct cgraph_node *clone = chkp_maybe_create_clone (fndecl);
return (clone && gimple_has_body_p (clone->decl));
}
return true;
}
/* Build bounds returned by CALL. */ /* Build bounds returned by CALL. */
static tree static tree
chkp_build_returned_bound (gcall *call) chkp_build_returned_bound (gcall *call)
...@@ -2156,7 +2188,7 @@ chkp_build_returned_bound (gcall *call) ...@@ -2156,7 +2188,7 @@ chkp_build_returned_bound (gcall *call)
bounds = chkp_find_bounds (gimple_call_arg (call, argno), &iter); bounds = chkp_find_bounds (gimple_call_arg (call, argno), &iter);
} }
else else if (chkp_call_returns_bounds_p (call))
{ {
gcc_assert (TREE_CODE (gimple_call_lhs (call)) == SSA_NAME); gcc_assert (TREE_CODE (gimple_call_lhs (call)) == SSA_NAME);
...@@ -2174,6 +2206,8 @@ chkp_build_returned_bound (gcall *call) ...@@ -2174,6 +2206,8 @@ chkp_build_returned_bound (gcall *call)
update_stmt (stmt); update_stmt (stmt);
} }
else
bounds = chkp_get_zero_bounds ();
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
......
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