tree-chkp.c (chkp_call_returns_bounds_p): New.
authorIlya Enkovich <ilya.enkovich@intel.com>
Mon, 8 Dec 2014 10:01:19 +0000 (10:01 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Mon, 8 Dec 2014 10:01:19 +0000 (10:01 +0000)
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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/chkp-bndret.c [new file with mode: 0644]
gcc/testsuite/gcc.target/i386/chkp-strchr.c [new file with mode: 0644]
gcc/tree-chkp.c

index f17774fe3ffe00d631d9ce50de8a772f6335929c..8302882ee364a615728634f46ba36d8c912eb9d2 100644 (file)
@@ -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.
index 2309d23109e59342c58b44ddc732c398493a25f2..05342ed6fbdfe0f7bd878eaa92fe299c03ba7564 100644 (file)
@@ -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 (file)
index 0000000..3498058
--- /dev/null
@@ -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 (file)
index 0000000..94a5eaa
--- /dev/null
@@ -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");
+}
index 56bc3037d5fa588fba5d8e28496b93a93a102f45..1ea4f24d31f3af3d2078aa96c4cba7295b0bf21f 100644 (file)
@@ -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))
     {