From 51da707ac6f9602d6a34e46e8602c93f80bf6ef6 Mon Sep 17 00:00:00 2001 From: Mark Kettenis Date: Sun, 16 May 2004 23:04:15 +0000 Subject: * m68k-tdep.c (m68k_svr4_return_value): Implement RETURN_VALUE_ABI_RETURNS_ADDRESS. --- gdb/ChangeLog | 5 +++++ gdb/m68k-tdep.c | 22 +++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 160286d..68d4155 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2004-05-17 Mark Kettenis + + * m68k-tdep.c (m68k_svr4_return_value): Implement + RETURN_VALUE_ABI_RETURNS_ADDRESS. + 2004-05-16 Mark Kettenis * sol-thread.c Update copyright year. Fix various coding diff --git a/gdb/m68k-tdep.c b/gdb/m68k-tdep.c index b254005..5973f0b 100644 --- a/gdb/m68k-tdep.c +++ b/gdb/m68k-tdep.c @@ -360,7 +360,27 @@ m68k_svr4_return_value (struct gdbarch *gdbarch, struct type *type, if ((code == TYPE_CODE_STRUCT || code == TYPE_CODE_UNION) && !m68k_reg_struct_return_p (gdbarch, type)) - return RETURN_VALUE_STRUCT_CONVENTION; + { + /* The System V ABI says that: + + "A function returning a structure or union also sets %a0 to + the value it finds in %a0. Thus when the caller receives + control again, the address of the returned object resides in + register %a0." + + So the ABI guarantees that we can always find the return + value just after the function has returned. */ + + if (readbuf) + { + ULONGEST addr; + + regcache_raw_read_unsigned (regcache, M68K_A0_REGNUM, &addr); + read_memory (addr, readbuf, TYPE_LENGTH (type)); + } + + return RETURN_VALUE_ABI_RETURNS_ADDRESS; + } /* This special case is for structures consisting of a single `float' or `double' member. These structures are returned in -- cgit v1.1