function.c (assign_parms): For a struct value address passed as first argument...

* function.c (assign_parms): For a struct value address passed as
	first argument, delay the function's result RTL setup code until
	after the emission of parameter conversions.

From-SVN: r64493
This commit is contained in:
Olivier Hainque 2003-03-17 17:23:50 +01:00 committed by Olivier Hainque
parent 3897ea90df
commit b36a8cc273
2 changed files with 26 additions and 18 deletions

View File

@ -1,3 +1,9 @@
2003-03-17 Olivier Hainque <hainque@act-europe.fr>
* function.c (assign_parms): For a struct value address passed as
first argument, delay the function's result RTL setup code until
after the emission of parameter conversions.
2003-03-17 Dave Love <fx@gnu.org>
Rainer Orth <ro@TechFak.Uni-Bielefeld.DE>

View File

@ -5009,30 +5009,32 @@ assign_parms (fndecl)
SET_DECL_RTL (parm, stack_parm);
}
/* If this "parameter" was the place where we are receiving the
function's incoming structure pointer, set up the result. */
if (parm == function_result_decl)
{
tree result = DECL_RESULT (fndecl);
rtx addr = DECL_RTL (parm);
rtx x;
#ifdef POINTERS_EXTEND_UNSIGNED
if (GET_MODE (addr) != Pmode)
addr = convert_memory_address (Pmode, addr);
#endif
x = gen_rtx_MEM (DECL_MODE (result), addr);
set_mem_attributes (x, result, 1);
SET_DECL_RTL (result, x);
}
}
/* Output all parameter conversion instructions (possibly including calls)
now that all parameters have been copied out of hard registers. */
emit_insn (conversion_insns);
/* If we are receiving a struct value address as the first argument, set up
the RTL for the function result. As this might require code to convert
the transmitted address to Pmode, we do this here to ensure that possible
preliminary conversions of the address have been emitted already. */
if (function_result_decl)
{
tree result = DECL_RESULT (fndecl);
rtx addr = DECL_RTL (function_result_decl);
rtx x;
#ifdef POINTERS_EXTEND_UNSIGNED
if (GET_MODE (addr) != Pmode)
addr = convert_memory_address (Pmode, addr);
#endif
x = gen_rtx_MEM (DECL_MODE (result), addr);
set_mem_attributes (x, result, 1);
SET_DECL_RTL (result, x);
}
last_parm_insn = get_last_insn ();
current_function_args_size = stack_args_size.constant;