aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorOlivier Hainque <hainque@act-europe.fr>2003-03-17 17:23:50 +0100
committerOlivier Hainque <hainque@gcc.gnu.org>2003-03-17 16:23:50 +0000
commitb36a8cc273592c1c2083aa8d00d9928c4556b701 (patch)
treed39dd381ff2965bfa9f220ab49dc97fcb9454267 /gcc/function.c
parent3897ea90dfc69feb6bbd30214ebdb7e0070a48dd (diff)
downloadgcc-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.c38
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;