aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIlya Enkovich <ilya.enkovich@intel.com>2014-12-08 10:01:19 +0000
committerIlya Enkovich <ienkovich@gcc.gnu.org>2014-12-08 10:01:19 +0000
commit985f48f7b575747ac5f0ece95816a3bb208fb138 (patch)
treed66ef7fdb2d954f9e839018b44994dd041ffed0c /gcc
parent2625bb5df57f49af1b01e1aef952db551a77824f (diff)
downloadgcc-985f48f7b575747ac5f0ece95816a3bb208fb138.zip
gcc-985f48f7b575747ac5f0ece95816a3bb208fb138.tar.gz
gcc-985f48f7b575747ac5f0ece95816a3bb208fb138.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/chkp-bndret.c15
-rw-r--r--gcc/testsuite/gcc.target/i386/chkp-strchr.c17
-rw-r--r--gcc/tree-chkp.c36
5 files changed, 78 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f17774f..8302882 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+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>
* builtins.c (fold_builtin_0): Remove unused ignore parameter.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 2309d23..05342ed 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+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>
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 0000000..3498058
--- /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 0000000..94a5eaa
--- /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 56bc303..1ea4f24 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))
{