diff options
author | Olivier Hainque <hainque@act-europe.fr> | 2003-03-17 17:23:50 +0100 |
---|---|---|
committer | Olivier Hainque <hainque@gcc.gnu.org> | 2003-03-17 16:23:50 +0000 |
commit | b36a8cc273592c1c2083aa8d00d9928c4556b701 (patch) | |
tree | d39dd381ff2965bfa9f220ab49dc97fcb9454267 /gcc/function.c | |
parent | 3897ea90dfc69feb6bbd30214ebdb7e0070a48dd (diff) | |
download | gcc-b36a8cc273592c1c2083aa8d00d9928c4556b701.zip gcc-b36a8cc273592c1c2083aa8d00d9928c4556b701.tar.gz gcc-b36a8cc273592c1c2083aa8d00d9928c4556b701.tar.bz2 |
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
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 38 |
1 files changed, 20 insertions, 18 deletions
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; |