* m68k-tdep.c (m68k_svr4_return_value): Implement
authorMark Kettenis <kettenis@gnu.org>
Sun, 16 May 2004 23:04:15 +0000 (23:04 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sun, 16 May 2004 23:04:15 +0000 (23:04 +0000)
RETURN_VALUE_ABI_RETURNS_ADDRESS.

gdb/ChangeLog
gdb/m68k-tdep.c

index 160286d2ddef604b88a2e6f642c14fa4ee2550fa..68d415500a81266f133330a392b6018b969a1e6a 100644 (file)
@@ -1,3 +1,8 @@
+2004-05-17  Mark Kettenis  <kettenis@gnu.org>
+
+       * m68k-tdep.c (m68k_svr4_return_value): Implement
+       RETURN_VALUE_ABI_RETURNS_ADDRESS.
+
 2004-05-16  Mark Kettenis  <kettenis@gnu.org>
 
        * sol-thread.c Update copyright year.  Fix various coding
index b254005956acd9eb32ef9084edc31590cb7549f9..5973f0ba81a76989966a9b8c6583c9071af66009 100644 (file)
@@ -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