+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.
+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
--- /dev/null
+/* { 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);
+}
--- /dev/null
+/* { 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");
+}
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)
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);
update_stmt (stmt);
}
+ else
+ bounds = chkp_get_zero_bounds ();
if (dump_file && (dump_flags & TDF_DETAILS))
{