diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d8f49d00142..905cb24b32f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-03-17 Olivier Hainque + + * 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 Rainer Orth diff --git a/gcc/function.c b/gcc/function.c index 4df1800846d..0828969e572 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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;