Commit f78b5ca1 by Jeffrey A Law Committed by Jeff Law

* calls.c (expand_call): Handle pcc_struct_value correctly for C++.

From-SVN: r16485
parent 238ad62b
Fri Nov 14 06:59:33 1997 Jeffrey A Law (law@cygnus.com) Fri Nov 14 06:59:33 1997 Jeffrey A Law (law@cygnus.com)
* calls.c (expand_call): Handle pcc_struct_value correctly for C++.
* i386/xm-cygwin32.h (HAVE_FILE_H, HAVE_RUSAGE): Delete defines. * i386/xm-cygwin32.h (HAVE_FILE_H, HAVE_RUSAGE): Delete defines.
* i386/xm-mingw32.h (HAVE_FILE_H, HAVE_RUSAGE): Likewise. * i386/xm-mingw32.h (HAVE_FILE_H, HAVE_RUSAGE): Likewise.
* rs6000/xm-cygwin32.h (HAVE_FILE_H, HAVE_RUSAGE): Likewise. * rs6000/xm-cygwin32.h (HAVE_FILE_H, HAVE_RUSAGE): Likewise.
......
...@@ -2061,36 +2061,12 @@ expand_call (exp, target, ignore) ...@@ -2061,36 +2061,12 @@ expand_call (exp, target, ignore)
} }
else if (pcc_struct_value) else if (pcc_struct_value)
{ {
if (target == 0) /* This is the special C++ case where we need to
{ know what the true target was. We take care to
/* We used leave the value in the location that it is never use this value more than once in one expression. */
returned in, but that causes problems if it is used more target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
than once in one expression. Rather than trying to track copy_to_reg (valreg));
when a copy is required, we always copy when TARGET is MEM_IN_STRUCT_P (target) = AGGREGATE_TYPE_P (TREE_TYPE (exp));
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)),
0);
MEM_IN_STRUCT_P (target) = AGGREGATE_TYPE_P (TREE_TYPE (exp));
/* Save this temp slot around the pop below. */
preserve_temp_slots (target);
}
else
target = gen_reg_rtx (TYPE_MODE (TREE_TYPE (exp)));
}
if (TYPE_MODE (TREE_TYPE (exp)) != BLKmode)
emit_move_insn (target, gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
copy_to_reg (valreg)));
else
emit_block_move (target, gen_rtx (MEM, BLKmode, copy_to_reg (valreg)),
expr_size (exp),
TYPE_ALIGN (TREE_TYPE (exp)) / BITS_PER_UNIT);
} }
/* Handle calls that return values in multiple non-contiguous locations. /* Handle calls that return values in multiple non-contiguous locations.
The Irix 6 ABI has examples of this. */ The Irix 6 ABI has examples of this. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment