* m68k-tdep.c (m68k_return_value): Properly return contents of
structures passed in memory.
This commit is contained in:
parent
3b6940c0d1
commit
1c845060d9
|
@ -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.
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue