From: Ilya Enkovich Date: Mon, 8 Dec 2014 10:01:19 +0000 (+0000) Subject: tree-chkp.c (chkp_call_returns_bounds_p): New. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=985f48f7b575747ac5f0ece95816a3bb208fb138;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f17774fe3ff..8302882ee36 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-12-08 Ilya Enkovich + + * 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 * builtins.c (fold_builtin_0): Remove unused ignore parameter. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2309d23109e..05342ed6fbd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-12-08 Ilya Enkovich + + * gcc.target/i386/chkp-bndret.c: New. + * gcc.target/i386/chkp-strchr.c: New. + 2014-12-07 Oleg Endo PR target/53513 diff --git a/gcc/testsuite/gcc.target/i386/chkp-bndret.c b/gcc/testsuite/gcc.target/i386/chkp-bndret.c new file mode 100644 index 00000000000..34980586219 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/chkp-bndret.c @@ -0,0 +1,15 @@ +/* { 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); +} diff --git a/gcc/testsuite/gcc.target/i386/chkp-strchr.c b/gcc/testsuite/gcc.target/i386/chkp-strchr.c new file mode 100644 index 00000000000..94a5eaab692 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/chkp-strchr.c @@ -0,0 +1,17 @@ +/* { 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"); +} diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c index 56bc3037d5f..1ea4f24d31f 100644 --- a/gcc/tree-chkp.c +++ b/gcc/tree-chkp.c @@ -2082,6 +2082,38 @@ chkp_get_nonpointer_load_bounds (void) 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. */ static tree 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); } - else + else if (chkp_call_returns_bounds_p (call)) { gcc_assert (TREE_CODE (gimple_call_lhs (call)) == SSA_NAME); @@ -2174,6 +2206,8 @@ chkp_build_returned_bound (gcall *call) update_stmt (stmt); } + else + bounds = chkp_get_zero_bounds (); if (dump_file && (dump_flags & TDF_DETAILS)) {