2008-06-03 Michael Snyder <msnyder@redhat.com>

Joseph Myers  <joseph@codesourcery.com>

	* mips-tdep.c (mips_eabi_return_value): Replace stub that always
	returned RETURN_VALUE_STRUCT_CONVENTION with a real function.
This commit is contained in:
Joseph Myers 2008-06-03 10:53:34 +00:00
parent 7317d33400
commit 609ba7801a
2 changed files with 57 additions and 2 deletions

View File

@ -1,3 +1,9 @@
2008-06-03 Michael Snyder <msnyder@redhat.com>
Joseph Myers <joseph@codesourcery.com>
* mips-tdep.c (mips_eabi_return_value): Replace stub that always
returned RETURN_VALUE_STRUCT_CONVENTION with a real function.
2008-06-02 Roman Zippel <zippel@linux-m68k.org>
* m68klinux-tdep.c (m68k_linux_pc_in_sigtramp): Fix incorrect test.

View File

@ -2956,10 +2956,59 @@ mips_eabi_return_value (struct gdbarch *gdbarch, struct type *func_type,
struct type *type, struct regcache *regcache,
gdb_byte *readbuf, const gdb_byte *writebuf)
{
struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
int fp_return_type = 0;
int offset, regnum, xfer;
if (TYPE_LENGTH (type) > 2 * mips_abi_regsize (gdbarch))
return RETURN_VALUE_STRUCT_CONVENTION;
if (readbuf)
memset (readbuf, 0, TYPE_LENGTH (type));
/* Floating point type? */
if (tdep->mips_fpu_type != MIPS_FPU_NONE)
{
if (TYPE_CODE (type) == TYPE_CODE_FLT)
fp_return_type = 1;
/* Structs with a single field of float type
are returned in a floating point register. */
if ((TYPE_CODE (type) == TYPE_CODE_STRUCT
|| TYPE_CODE (type) == TYPE_CODE_UNION)
&& TYPE_NFIELDS (type) == 1)
{
struct type *fieldtype = TYPE_FIELD_TYPE (type, 0);
if (TYPE_CODE (check_typedef (fieldtype)) == TYPE_CODE_FLT)
fp_return_type = 1;
}
}
if (fp_return_type)
{
/* A floating-point value belongs in the least significant part
of FP0/FP1. */
if (mips_debug)
fprintf_unfiltered (gdb_stderr, "Return float in $fp0\n");
regnum = mips_regnum (gdbarch)->fp0;
}
else
{
/* An integer value goes in V0/V1. */
if (mips_debug)
fprintf_unfiltered (gdb_stderr, "Return scalar in $v0\n");
regnum = MIPS_V0_REGNUM;
}
for (offset = 0;
offset < TYPE_LENGTH (type);
offset += mips_abi_regsize (gdbarch), regnum++)
{
xfer = mips_abi_regsize (gdbarch);
if (offset + xfer > TYPE_LENGTH (type))
xfer = TYPE_LENGTH (type) - offset;
mips_xfer_register (gdbarch, regcache,
gdbarch_num_regs (gdbarch) + regnum, xfer,
gdbarch_byte_order (gdbarch), readbuf, writebuf,
offset);
}
return RETURN_VALUE_REGISTER_CONVENTION;
}