* sparc64-tdep.c (sparc64_16_byte_align_p)
authorMark Kettenis <kettenis@gnu.org>
Sat, 3 Jan 2004 15:00:10 +0000 (15:00 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 3 Jan 2004 15:00:10 +0000 (15:00 +0000)
(sparc64_store_floating_fields, sparc64_store_floating_fields):
Use check_typedef to get subtypes of structures and unions.
(sparc64_store_return_value): Fix calculation of the appropriate
offset into VALBUF when storing a structure or union.
(sparc64_return_value): New function.
(sparc64_use_struct_convention): Remove function.
(sparc64_init_abi): Set return_value, don't set
extract_return_value, store_return_value and
use_struct_convention.

gdb/ChangeLog
gdb/sparc64-tdep.c

index a01d928cea72eb0e4e2982d14f7d70db7522f493..3c4504ba2c9668a950e88d0f7d7c90842f02f262 100644 (file)
@@ -1,3 +1,16 @@
+2004-01-03  Mark Kettenis  <kettenis@gnu.org>
+
+       * sparc64-tdep.c (sparc64_16_byte_align_p)
+       (sparc64_store_floating_fields, sparc64_store_floating_fields):
+       Use check_typedef to get subtypes of structures and unions.
+       (sparc64_store_return_value): Fix calculation of the appropriate
+       offset into VALBUF when storing a structure or union.
+       (sparc64_return_value): New function.
+       (sparc64_use_struct_convention): Remove function.
+       (sparc64_init_abi): Set return_value, don't set
+       extract_return_value, store_return_value and
+       use_struct_convention.
+
 2004-01-03  Eli Zaretskii  <eliz@elta.co.il>
 
        * config/djgpp/fnchange.lst: Add lines for COPYING.LIBGLOSS,
index ced47a4edbe2bf3966ce10bf6ff4ba2b4c24dbfb..1e06ea527f13827d55254fa0b0c32c07bf9a1109 100644 (file)
@@ -604,8 +604,12 @@ sparc64_16_byte_align_p (struct type *type)
       int i;
 
       for (i = 0; i < TYPE_NFIELDS (type); i++)
-       if (sparc64_16_byte_align_p (TYPE_FIELD_TYPE (type, i)))
-         return 1;
+       {
+         struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
+
+         if (sparc64_16_byte_align_p (subtype))
+           return 1;
+       }
     }
 
   return 0;
@@ -657,9 +661,13 @@ sparc64_store_floating_fields (struct regcache *regcache, struct type *type,
       int i;
 
       for (i = 0; i < TYPE_NFIELDS (type); i++)
-       sparc64_store_floating_fields (regcache, TYPE_FIELD_TYPE (type, i),
-                                      valbuf, element,
-                                      bitpos + TYPE_FIELD_BITPOS (type, i));
+       {
+         struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
+         int subpos = bitpos + TYPE_FIELD_BITPOS (type, i);
+
+         sparc64_store_floating_fields (regcache, subtype, valbuf,
+                                        element, subpos);
+       }
     }
 }
 
@@ -705,9 +713,12 @@ sparc64_extract_floating_fields (struct regcache *regcache, struct type *type,
       int i;
 
       for (i = 0; i < TYPE_NFIELDS (type); i++)
-       sparc64_extract_floating_fields (regcache, TYPE_FIELD_TYPE (type, i),
-                                        valbuf,
-                                        bitpos + TYPE_FIELD_BITPOS (type, i));
+       {
+         struct type *subtype = check_typedef (TYPE_FIELD_TYPE (type, i));
+         int subpos = bitpos + TYPE_FIELD_BITPOS (type, i);
+
+         sparc64_extract_floating_fields (regcache, subtype, valbuf, subpos);
+       }
     }
 }
 
@@ -1019,7 +1030,7 @@ sparc64_store_return_value (struct type *type, struct regcache *regcache,
       memset (buf, 0, sizeof (buf));
       memcpy (buf, valbuf, len);
       for (i = 0; i < ((len + 7) / 8); i++)
-       regcache_cooked_write (regcache, SPARC_O0_REGNUM + i, buf + i * 4);
+       regcache_cooked_write (regcache, SPARC_O0_REGNUM + i, buf + i * 8);
       if (TYPE_CODE (type) != TYPE_CODE_UNION)
        sparc64_store_floating_fields (regcache, type, buf, 0, 0);
     }
@@ -1042,12 +1053,20 @@ sparc64_store_return_value (struct type *type, struct regcache *regcache,
     }
 }
 
-static int
-sparc64_use_struct_convention (int gcc_p, struct type *type)
+static enum return_value_convention
+sparc64_return_value (struct gdbarch *gdbarch, struct type *type,
+                     struct regcache *regcache, void *readbuf,
+                     const void *writebuf)
 {
-  /* Structure and union types up to 32 bytes in size are returned in
-     registers.  */
-  return (TYPE_LENGTH (type) > 32);
+  if (TYPE_LENGTH (type) > 32)
+    return RETURN_VALUE_STRUCT_CONVENTION;
+
+  if (readbuf)
+    sparc64_extract_return_value (type, regcache, readbuf);
+  if (writebuf)
+    sparc64_store_return_value (type, regcache, writebuf);
+
+  return RETURN_VALUE_REGISTER_CONVENTION;
 }
 \f
 
@@ -1079,9 +1098,7 @@ sparc64_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   set_gdbarch_push_dummy_code (gdbarch, NULL);
   set_gdbarch_push_dummy_call (gdbarch, sparc64_push_dummy_call);
 
-  set_gdbarch_extract_return_value (gdbarch, sparc64_extract_return_value);
-  set_gdbarch_store_return_value (gdbarch, sparc64_store_return_value);
-  set_gdbarch_use_struct_convention (gdbarch, sparc64_use_struct_convention);
+  set_gdbarch_return_value (gdbarch, sparc64_return_value);
   set_gdbarch_return_value_on_stack
     (gdbarch, generic_return_value_on_stack_not);
   set_gdbarch_stabs_argument_has_addr