From 3008222343f1160e317ac2528719a855e6b79b88 Mon Sep 17 00:00:00 2001 From: Richard Stallman Date: Mon, 14 Jun 1993 21:40:37 +0000 Subject: [PATCH] (expand_call): If PCC_STATIC_STRUCT_RETURN and TARGET is zero, copy result from static location. From-SVN: r4677 --- gcc/calls.c | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/gcc/calls.c b/gcc/calls.c index 4e0e4e2b9dc..03dbdfbc97d 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -1838,15 +1838,21 @@ expand_call (exp, target, ignore) { if (target == 0) { - target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), - copy_to_reg (valreg)); - MEM_IN_STRUCT_P (target) - = (TREE_CODE (TREE_TYPE (exp)) == ARRAY_TYPE - || TREE_CODE (TREE_TYPE (exp)) == RECORD_TYPE - || TREE_CODE (TREE_TYPE (exp)) == UNION_TYPE - || TREE_CODE (TREE_TYPE (exp)) == QUAL_UNION_TYPE); + /* We used leave the value in the location that it is + returned in, but that causes problems if it is used more + than once in one expression. Rather than trying to track + when a copy is required, we always copy when TARGET is + not specified. This calling sequence is only used on + a few machines and TARGET is usually nonzero. */ + if (TYPE_MODE (TREE_TYPE (exp)) == BLKmode) + target = assign_stack_temp (BLKmode, + int_size_in_bytes (TREE_TYPE (exp)), + 1); + else + target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp))); } - else if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode) + + if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode) emit_move_insn (target, gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)), copy_to_reg (valreg))); else -- 2.30.2