This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, CHKP, PR tree-optimization/70876] Support WITH_SIZE_EXPR in instrumented calls


Hi,

This patch adds WITH_SIZE_EXPR operands in instrumented calls.  It also
adds check for args passed by reference on call expand to correctly
bind arg and its bounds.

Bootstrapped and regtested on x86_64-unknown-linux-gnu on MPX enabled
machine.  Applied to trunk.  I'm going to port it to gcc-6-branch.

Thanks,
Ilya
--
gcc/

2016-05-10  Ilya Enkovich  <ilya.enkovich@intel.com>

	PR tree-optimization/70786
	* tree-chkp.c (chkp_find_bounds_1): Support WITH_SIZE_EXPR.
	* gcc/calls.c (initialize_argument_information): Bind bounds
	with corresponding args passed by reference.

gcc/testsuite/

2016-05-10  Ilya Enkovich  <ilya.enkovich@intel.com>

	PR tree-optimization/70786
	* gcc.target/i386/pr70876.c: New test.


diff --git a/gcc/calls.c b/gcc/calls.c
index 6415e08..6cc1fc7 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -1188,6 +1188,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
 	    j--;
 	  }
       }
+    argpos = 0;
     FOR_EACH_CALL_EXPR_ARG (arg, iter, exp)
       {
 	tree argtype = TREE_TYPE (arg);
@@ -1206,6 +1207,14 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
 		chkp_find_bound_slots (argtype, slots);
 	      }
 	  }
+	else if (CALL_WITH_BOUNDS_P (exp)
+		 && pass_by_reference (NULL, TYPE_MODE (argtype), argtype,
+				       argpos < n_named_args))
+	  {
+	    if (slots)
+	      BITMAP_FREE (slots);
+	    ptr_arg = j;
+	  }
 	else if (POINTER_BOUNDS_TYPE_P (argtype))
 	  {
 	    /* We expect bounds in instrumented calls only.
@@ -1249,6 +1258,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
 	else
 	  args[j].tree_value = arg;
 	j--;
+	argpos++;
       }
 
     if (slots)
diff --git a/gcc/testsuite/gcc.target/i386/pr70876.c b/gcc/testsuite/gcc.target/i386/pr70876.c
new file mode 100644
index 0000000..c9bab69
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr70876.c
@@ -0,0 +1,13 @@
+/* { dg-do compile { target { ! x32 } } } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx -Wno-implicit-function-declaration" } */
+
+void f (char *s1, char *s2)
+{
+  int z = 5;
+
+  struct { char a[z]; } x;
+
+  s1[0] = s2[0];
+
+  foo (x, x);
+}
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index 3fba12c..8c7d214 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -3646,6 +3646,7 @@ chkp_find_bounds_1 (tree ptr, tree ptr_src, gimple_stmt_iterator *iter)
       break;
 
     case ADDR_EXPR:
+    case WITH_SIZE_EXPR:
       bounds = chkp_make_addressed_object_bounds (TREE_OPERAND (ptr_src, 0), iter);
       break;
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]