MPX: fix PR middle-end/79753

2017-03-20  Martin Liska  <mliska@suse.cz>

	PR middle-end/79753
	* tree-chkp.c (chkp_build_returned_bound): Do not build
	returned bounds for a LHS that's not a BOUNDED_P type.
2017-03-20  Martin Liska  <mliska@suse.cz>

	PR middle-end/79753
	* gcc.target/i386/mpx/pr79753.c: New test.

From-SVN: r246276
This commit is contained in:
Martin Liska 2017-03-20 11:06:00 +01:00 committed by Martin Liska
parent 918112d378
commit 243e28bfb9
4 changed files with 31 additions and 5 deletions

View File

@ -1,3 +1,9 @@
2017-03-20 Martin Liska <mliska@suse.cz>
PR middle-end/79753
* tree-chkp.c (chkp_build_returned_bound): Do not build
returned bounds for a LHS that's not a BOUNDED_P type.
2017-03-20 Martin Liska <mliska@suse.cz>
PR target/79769

View File

@ -1,3 +1,8 @@
2017-03-20 Martin Liska <mliska@suse.cz>
PR middle-end/79753
* gcc.target/i386/mpx/pr79753.c: New test.
2017-03-20 Martin Liska <mliska@suse.cz>
PR target/79769

View File

@ -0,0 +1,14 @@
/* { dg-do compile } */
/* { dg-options "-fcheck-pointer-bounds -mmpx -O2" } */
int
foo (void)
{
return 0;
}
void
bar (int **p)
{
*p = (int *) (__UINTPTR_TYPE__) foo ();
}

View File

@ -2218,6 +2218,7 @@ chkp_build_returned_bound (gcall *call)
gimple *stmt;
tree fndecl = gimple_call_fndecl (call);
unsigned int retflags;
tree lhs = gimple_call_lhs (call);
/* To avoid fixing alloca expands in targets we handle
it separately. */
@ -2227,9 +2228,8 @@ chkp_build_returned_bound (gcall *call)
|| DECL_FUNCTION_CODE (fndecl) == BUILT_IN_ALLOCA_WITH_ALIGN))
{
tree size = gimple_call_arg (call, 0);
tree lb = gimple_call_lhs (call);
gimple_stmt_iterator iter = gsi_for_stmt (call);
bounds = chkp_make_bounds (lb, size, &iter, true);
bounds = chkp_make_bounds (lhs, size, &iter, true);
}
/* We know bounds returned by set_bounds builtin call. */
else if (fndecl
@ -2282,9 +2282,10 @@ chkp_build_returned_bound (gcall *call)
bounds = chkp_find_bounds (gimple_call_arg (call, argno), &iter);
}
else if (chkp_call_returns_bounds_p (call))
else if (chkp_call_returns_bounds_p (call)
&& BOUNDED_P (lhs))
{
gcc_assert (TREE_CODE (gimple_call_lhs (call)) == SSA_NAME);
gcc_assert (TREE_CODE (lhs) == SSA_NAME);
/* In general case build checker builtin call to
obtain returned bounds. */
@ -2311,7 +2312,7 @@ chkp_build_returned_bound (gcall *call)
print_gimple_stmt (dump_file, call, 0, TDF_VOPS|TDF_MEMSYMS);
}
bounds = chkp_maybe_copy_and_register_bounds (gimple_call_lhs (call), bounds);
bounds = chkp_maybe_copy_and_register_bounds (lhs, bounds);
return bounds;
}