Commit 55429190 by Ilya Enkovich Committed by Ilya Enkovich

re PR target/66569 ([CHKP] internal compiler error: in assign_by_spills)

gcc/

	PR target/66569
	* function.c (assign_bounds): Add arguments assign_regs,
	assign_special, assign_bt.
	(assign_parms): For vararg functions handle bounds in BT
	and special slots after incoming vararg bounds.

gcc/testsuite/

	PR target/66569
	* gcc.target/i386/mpx/chkp-vararg.c: New test.

From-SVN: r224602
parent 855f036d
2015-06-18 Ilya Enkovich <enkovich.gnu@gmail.com> 2015-06-18 Ilya Enkovich <enkovich.gnu@gmail.com>
PR target/66569
* function.c (assign_bounds): Add arguments assign_regs,
assign_special, assign_bt.
(assign_parms): For vararg functions handle bounds in BT
and special slots after incoming vararg bounds.
2015-06-18 Ilya Enkovich <enkovich.gnu@gmail.com>
PR middle-end/66568 PR middle-end/66568
* cfgexpand.c (expand_return): Handle missing bounds. * cfgexpand.c (expand_return): Handle missing bounds.
(expand_gimple_stmt_1): Likewise. (expand_gimple_stmt_1): Likewise.
......
...@@ -3489,9 +3489,11 @@ assign_parm_load_bounds (struct assign_parm_data_one *data, ...@@ -3489,9 +3489,11 @@ assign_parm_load_bounds (struct assign_parm_data_one *data,
static void static void
assign_bounds (vec<bounds_parm_data> &bndargs, assign_bounds (vec<bounds_parm_data> &bndargs,
struct assign_parm_data_all &all) struct assign_parm_data_all &all,
bool assign_regs, bool assign_special,
bool assign_bt)
{ {
unsigned i, pass, handled = 0; unsigned i, pass;
bounds_parm_data *pbdata; bounds_parm_data *pbdata;
if (!bndargs.exists ()) if (!bndargs.exists ())
...@@ -3505,17 +3507,20 @@ assign_bounds (vec<bounds_parm_data> &bndargs, ...@@ -3505,17 +3507,20 @@ assign_bounds (vec<bounds_parm_data> &bndargs,
{ {
/* Pass 0 => regs only. */ /* Pass 0 => regs only. */
if (pass == 0 if (pass == 0
&& (!pbdata->parm_data.entry_parm && (!assign_regs
|| GET_CODE (pbdata->parm_data.entry_parm) != REG)) ||(!pbdata->parm_data.entry_parm
|| GET_CODE (pbdata->parm_data.entry_parm) != REG)))
continue; continue;
/* Pass 1 => slots only. */ /* Pass 1 => slots only. */
else if (pass == 1 else if (pass == 1
&& (!pbdata->parm_data.entry_parm && (!assign_special
|| GET_CODE (pbdata->parm_data.entry_parm) == REG)) || (!pbdata->parm_data.entry_parm
|| GET_CODE (pbdata->parm_data.entry_parm) == REG)))
continue; continue;
/* Pass 2 => BT only. */ /* Pass 2 => BT only. */
else if (pass == 2 else if (pass == 2
&& pbdata->parm_data.entry_parm) && (!assign_bt
|| pbdata->parm_data.entry_parm))
continue; continue;
if (!pbdata->parm_data.entry_parm if (!pbdata->parm_data.entry_parm
...@@ -3536,14 +3541,7 @@ assign_bounds (vec<bounds_parm_data> &bndargs, ...@@ -3536,14 +3541,7 @@ assign_bounds (vec<bounds_parm_data> &bndargs,
else else
assign_parm_setup_stack (&all, pbdata->bounds_parm, assign_parm_setup_stack (&all, pbdata->bounds_parm,
&pbdata->parm_data); &pbdata->parm_data);
/* Count handled bounds to make sure we miss nothing. */
handled++;
} }
gcc_assert (handled == bndargs.length ());
bndargs.release ();
} }
/* Assign RTL expressions to the function's parameters. This may involve /* Assign RTL expressions to the function's parameters. This may involve
...@@ -3668,12 +3666,14 @@ assign_parms (tree fndecl) ...@@ -3668,12 +3666,14 @@ assign_parms (tree fndecl)
/* We expect this is the last parm. Otherwise it is wrong /* We expect this is the last parm. Otherwise it is wrong
to assign bounds right now. */ to assign bounds right now. */
gcc_assert (i == (fnargs.length () - 1)); gcc_assert (i == (fnargs.length () - 1));
assign_bounds (bndargs, all); assign_bounds (bndargs, all, true, false, false);
targetm.calls.setup_incoming_vararg_bounds (all.args_so_far, targetm.calls.setup_incoming_vararg_bounds (all.args_so_far,
data.promoted_mode, data.promoted_mode,
data.passed_type, data.passed_type,
&pretend_bytes, &pretend_bytes,
false); false);
assign_bounds (bndargs, all, false, true, true);
bndargs.release ();
} }
} }
...@@ -3685,7 +3685,8 @@ assign_parms (tree fndecl) ...@@ -3685,7 +3685,8 @@ assign_parms (tree fndecl)
bound_no++; bound_no++;
} }
assign_bounds (bndargs, all); assign_bounds (bndargs, all, true, true, true);
bndargs.release ();
if (targetm.calls.split_complex_arg) if (targetm.calls.split_complex_arg)
assign_parms_unsplit_complex (&all, fnargs); assign_parms_unsplit_complex (&all, fnargs);
......
2015-06-18 Ilya Enkovich <enkovich.gnu@gmail.com> 2015-06-18 Ilya Enkovich <enkovich.gnu@gmail.com>
PR target/66569
* gcc.target/i386/mpx/chkp-vararg.c: New test.
2015-06-18 Ilya Enkovich <enkovich.gnu@gmail.com>
PR middle-end/66568 PR middle-end/66568
* gcc.target/i386/mpx/pr66568.c: New test. * gcc.target/i386/mpx/pr66568.c: New test.
......
/* { dg-do compile } */
/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
struct s1 {
int *p;
int i;
};
struct s2 {
struct s1 s;
int i;
};
int test (struct s2 s, ...) { }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment