aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIlya Enkovich <ilya.enkovich@intel.com>2016-05-10 15:56:27 +0000
committerIlya Enkovich <ienkovich@gcc.gnu.org>2016-05-10 15:56:27 +0000
commitafc610dba10fd532e83da10e19c5e0c5d7bcc34d (patch)
treea6f710ff66873b64cfdb7f8b6456b6d11a8d699a /gcc
parent7f99d40a99b24026874887aff0cd269370e082f3 (diff)
downloadgcc-afc610dba10fd532e83da10e19c5e0c5d7bcc34d.zip
gcc-afc610dba10fd532e83da10e19c5e0c5d7bcc34d.tar.gz
gcc-afc610dba10fd532e83da10e19c5e0c5d7bcc34d.tar.bz2
re PR tree-optimization/70876 (ICE in chkp_find_bounds: Unexpected tree code with_size_expr)
gcc/ 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/ PR tree-optimization/70786 * gcc.target/i386/pr70876.c: New test. From-SVN: r236086
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/calls.c10
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr70876.c13
-rw-r--r--gcc/tree-chkp.c1
5 files changed, 36 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index dfbb1c3..e43a062 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+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.
+
2016-05-10 Jakub Jelinek <jakub@redhat.com>
PR target/70927
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/ChangeLog b/gcc/testsuite/ChangeLog
index deec34e..7cf507f5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-10 Ilya Enkovich <ilya.enkovich@intel.com>
+
+ PR tree-optimization/70786
+ * gcc.target/i386/pr70876.c: New test.
+
2016-05-10 Jakub Jelinek <jakub@redhat.com>
PR target/70927
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;