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:
parent
3897ea90df
commit
b36a8cc273
@ -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>
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user