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
This commit is contained in:
Ilya Enkovich 2016-05-10 15:56:27 +00:00 committed by Ilya Enkovich
parent 7f99d40a99
commit afc610dba1
5 changed files with 36 additions and 0 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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);
}

View File

@ -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;