* m68k-tdep.c (m68k_return_value): Properly return contents of
authorMark Kettenis <kettenis@gnu.org>
Wed, 17 Aug 2005 18:34:17 +0000 (18:34 +0000)
committerMark Kettenis <kettenis@gnu.org>
Wed, 17 Aug 2005 18:34:17 +0000 (18:34 +0000)
structures passed in memory.

gdb/ChangeLog
gdb/m68k-tdep.c

index 8ea18b36560c235b6e0feaec69e52818e23b8ffc..914910e20f802020da1343d1191282ca1ed8b736 100644 (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.
 
index 31ac09cb4bc06a37d10b4a2d563d42d48c542086..ebbe4944c42683a12c318157d79b9d05d6c9052b 100644 (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.  */
+
+      if (readbuf)
+       {
+         ULONGEST addr;
+
+         regcache_raw_read_unsigned (regcache, M68K_D0_REGNUM, &addr);
+         read_memory (addr, readbuf, TYPE_LENGTH (type));
+       }
 
-  /* GCC returns a `long double' in memory.  */
-  if (code == TYPE_CODE_FLT && TYPE_LENGTH (type) == 12)
-    return RETURN_VALUE_STRUCT_CONVENTION;
+      return RETURN_VALUE_ABI_RETURNS_ADDRESS;
+    }
 
   if (readbuf)
     m68k_extract_return_value (type, regcache, readbuf);