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

From-SVN: r16485
This commit is contained in:
Jeffrey A Law 1997-11-14 14:06:07 +00:00 committed by Jeff Law
parent 238ad62b9f
commit f78b5ca112
2 changed files with 8 additions and 30 deletions

View File

@ -1,5 +1,7 @@
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-mingw32.h (HAVE_FILE_H, HAVE_RUSAGE): Likewise.
* rs6000/xm-cygwin32.h (HAVE_FILE_H, HAVE_RUSAGE): Likewise.

View File

@ -2061,36 +2061,12 @@ expand_call (exp, target, ignore)
}
else if (pcc_struct_value)
{
if (target == 0)
{
/* 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)),
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);
/* This is the special C++ case where we need to
know what the true target was. We take care to
never use this value more than once in one expression. */
target = gen_rtx (MEM, TYPE_MODE (TREE_TYPE (exp)),
copy_to_reg (valreg));
MEM_IN_STRUCT_P (target) = AGGREGATE_TYPE_P (TREE_TYPE (exp));
}
/* Handle calls that return values in multiple non-contiguous locations.
The Irix 6 ABI has examples of this. */