mips.c (function_arg_pass_by_reference): Force to 0 in o32 and o64 ABIs.
* config/mips/mips.c (function_arg_pass_by_reference): Force to 0 in o32 and o64 ABIs. * config/mips/abi64.h (MUST_PASS_IN_STACK): Define as in expr.h, but getting fixed-size structs passed in registers regardless of padding in o32 and o64 ABIs. From-SVN: r50480
This commit is contained in:
parent
f1148658f1
commit
9445b81426
|
@ -1,5 +1,11 @@
|
|||
2002-03-09 Alexandre Oliva <aoliva@redhat.com>
|
||||
|
||||
* config/mips/mips.c (function_arg_pass_by_reference): Force to 0
|
||||
in o32 and o64 ABIs.
|
||||
* config/mips/abi64.h (MUST_PASS_IN_STACK): Define as in expr.h,
|
||||
but getting fixed-size structs passed in registers regardless of
|
||||
padding in o32 and o64 ABIs.
|
||||
|
||||
* config/mips/mips.c (mips_va_arg): Apply big-endianness address
|
||||
offset before loading address of argument passed by transparent
|
||||
reference.
|
||||
|
|
|
@ -86,6 +86,19 @@ Boston, MA 02111-1307, USA. */
|
|||
|| GET_MODE_CLASS (MODE) == MODE_INT))) \
|
||||
? downward : upward))
|
||||
|
||||
/* Modified version of the macro in expr.h. */
|
||||
#define MUST_PASS_IN_STACK(MODE,TYPE) \
|
||||
((TYPE) != 0 \
|
||||
&& (TREE_CODE (TYPE_SIZE (TYPE)) != INTEGER_CST \
|
||||
|| TREE_ADDRESSABLE (TYPE) \
|
||||
|| ((MODE) == BLKmode \
|
||||
&& mips_abi != ABI_32 && mips_abi != ABI_O64 \
|
||||
&& ! ((TYPE) != 0 && TREE_CODE (TYPE_SIZE (TYPE)) == INTEGER_CST \
|
||||
&& 0 == (int_size_in_bytes (TYPE) \
|
||||
% (PARM_BOUNDARY / BITS_PER_UNIT))) \
|
||||
&& (FUNCTION_ARG_PADDING (MODE, TYPE) \
|
||||
== (BYTES_BIG_ENDIAN ? upward : downward)))))
|
||||
|
||||
/* Under the old (i.e., 32 and O64 ABIs) all BLKmode objects are
|
||||
returned in memory. Under the new (N32 and 64-bit MIPS ABIs) small
|
||||
structures are returned in a register. Objects with varying size
|
||||
|
|
|
@ -8069,6 +8069,9 @@ function_arg_pass_by_reference (cum, mode, type, named)
|
|||
{
|
||||
int size;
|
||||
|
||||
if (mips_abi == ABI_32 || mips_abi == ABI_O64)
|
||||
return 0;
|
||||
|
||||
/* We must pass by reference if we would be both passing in registers
|
||||
and the stack. This is because any subsequent partial arg would be
|
||||
handled incorrectly in this case.
|
||||
|
|
Loading…
Reference in New Issue