* m68k-tdep.c (m68k_return_value): Properly return contents of

structures passed in memory.
This commit is contained in:
Mark Kettenis 2005-08-17 18:34:17 +00:00
parent 3b6940c0d1
commit 1c845060d9
2 changed files with 21 additions and 6 deletions

View File

@ -1,5 +1,8 @@
2005-08-17 Mark Kettenis <kettenis@gnu.org>
* m68k-tdep.c (m68k_return_value): Properly return contents of
structures passed in memory.
* infcmd.c (print_return_value): Move CHECK_TYPEDEF up. Deal with
RETURN_VALUE_ABI_PRESERVED_ADDRESS.

View File

@ -333,13 +333,25 @@ m68k_return_value (struct gdbarch *gdbarch, struct type *type,
{
enum type_code code = TYPE_CODE (type);
if ((code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION)
&& !m68k_reg_struct_return_p (gdbarch, type))
return RETURN_VALUE_STRUCT_CONVENTION;
/* GCC returns a `long double' in memory too. */
if (((code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION)
&& !m68k_reg_struct_return_p (gdbarch, type))
|| (code == TYPE_CODE_FLT && TYPE_LENGTH (type) == 12))
{
/* The default on m68k is to return structures in static memory.
Consequently a function must return the address where we can
find the return value. */
/* GCC returns a `long double' in memory. */
if (code == TYPE_CODE_FLT && TYPE_LENGTH (type) == 12)
return RETURN_VALUE_STRUCT_CONVENTION;
if (readbuf)
{
ULONGEST addr;
regcache_raw_read_unsigned (regcache, M68K_D0_REGNUM, &addr);
read_memory (addr, readbuf, TYPE_LENGTH (type));
}
return RETURN_VALUE_ABI_RETURNS_ADDRESS;
}
if (readbuf)
m68k_extract_return_value (type, regcache, readbuf);