Commit 08ab0acf by Jakub Jelinek Committed by Jakub Jelinek

re PR debug/41238 (VTA: bootstrap failure, ICE in loc_cmp, at var-tracking.c:2456)

	PR debug/41238
	* function.c (assign_parm_find_stack_rtl): Don't set mem attributes on
	the stack slot if it is passed by invisible reference.
	* var-tracking.c (vt_add_function_parameters): Handle arguments passed by
	invisible reference.

From-SVN: r151384
parent eead42e0
2009-09-03 Jakub Jelinek <jakub@redhat.com>
PR debug/41238
* function.c (assign_parm_find_stack_rtl): Don't set mem attributes on
the stack slot if it is passed by invisible reference.
* var-tracking.c (vt_add_function_parameters): Handle arguments passed by
invisible reference.
2009-09-03 Bernd Schmidt <bernd.schmidt@analog.com>
* config/bfin/linux.h (TARGET_SUPPORTS_SYNC_CALLS): Define to 1.
......
......@@ -2433,20 +2433,25 @@ assign_parm_find_stack_rtl (tree parm, struct assign_parm_data_one *data)
stack_parm = gen_rtx_PLUS (Pmode, stack_parm, offset_rtx);
stack_parm = gen_rtx_MEM (data->promoted_mode, stack_parm);
set_mem_attributes (stack_parm, parm, 1);
/* set_mem_attributes could set MEM_SIZE to the passed mode's size,
while promoted mode's size is needed. */
if (data->promoted_mode != BLKmode
&& data->promoted_mode != DECL_MODE (parm))
if (!data->passed_pointer)
{
set_mem_size (stack_parm, GEN_INT (GET_MODE_SIZE (data->promoted_mode)));
if (MEM_EXPR (stack_parm) && MEM_OFFSET (stack_parm))
set_mem_attributes (stack_parm, parm, 1);
/* set_mem_attributes could set MEM_SIZE to the passed mode's size,
while promoted mode's size is needed. */
if (data->promoted_mode != BLKmode
&& data->promoted_mode != DECL_MODE (parm))
{
int offset = subreg_lowpart_offset (DECL_MODE (parm),
data->promoted_mode);
if (offset)
set_mem_offset (stack_parm,
plus_constant (MEM_OFFSET (stack_parm), -offset));
set_mem_size (stack_parm,
GEN_INT (GET_MODE_SIZE (data->promoted_mode)));
if (MEM_EXPR (stack_parm) && MEM_OFFSET (stack_parm))
{
int offset = subreg_lowpart_offset (DECL_MODE (parm),
data->promoted_mode);
if (offset)
set_mem_offset (stack_parm,
plus_constant (MEM_OFFSET (stack_parm),
-offset));
}
}
}
......
......@@ -7058,10 +7058,20 @@ vt_add_function_parameters (void)
if (!vt_get_decl_and_offset (incoming, &decl, &offset))
{
if (!vt_get_decl_and_offset (decl_rtl, &decl, &offset))
continue;
offset += byte_lowpart_offset (GET_MODE (incoming),
GET_MODE (decl_rtl));
if (REG_P (incoming) || MEM_P (incoming))
{
/* This means argument is passed by invisible reference. */
offset = 0;
decl = parm;
incoming = gen_rtx_MEM (GET_MODE (decl_rtl), incoming);
}
else
{
if (!vt_get_decl_and_offset (decl_rtl, &decl, &offset))
continue;
offset += byte_lowpart_offset (GET_MODE (incoming),
GET_MODE (decl_rtl));
}
}
if (!decl)
......
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