From b36a8cc273592c1c2083aa8d00d9928c4556b701 Mon Sep 17 00:00:00 2001 From: Olivier Hainque Date: Mon, 17 Mar 2003 17:23:50 +0100 Subject: 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 --- gcc/function.c | 38 ++++++++++++++++++++------------------ 1 file changed, 20 insertions(+), 18 deletions(-) (limited to 'gcc/function.c') diff --git a/gcc/function.c b/gcc/function.c index 4df1800..0828969 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; -- cgit v1.1