* rs6000-tdep.c (rs6000_store_return_value): Use
authorJim Blandy <jimb@codesourcery.com>
Sat, 5 Jun 2004 00:11:49 +0000 (00:11 +0000)
committerJim Blandy <jimb@codesourcery.com>
Sat, 5 Jun 2004 00:11:49 +0000 (00:11 +0000)
regcache_cooked_write_part instead of
deprecated_write_register_bytes.
(rs6000_gdbarch_init): Register it for gdbarch_store_return_value,
not gdbarch_deprecated_store_return_value.

gdb/ChangeLog
gdb/rs6000-tdep.c

index 01e5533aefc25760a1e3d90d1ebc215206903c78..e0b88081197831cb1dfe3203e67637131e82fe17 100644 (file)
@@ -1,5 +1,11 @@
 2004-06-04  Jim Blandy  <jimb@redhat.com>
 
+       * rs6000-tdep.c (rs6000_store_return_value): Use
+       regcache_cooked_write_part instead of
+       deprecated_write_register_bytes.
+       (rs6000_gdbarch_init): Register it for gdbarch_store_return_value,
+       not gdbarch_deprecated_store_return_value.
+
        * ppc-linux-nat.c (store_register, fetch_register): Remove
        incorrect assertions.  Simplify and generalize handling of
        transfers whose sizes are not multiples of, or less than, sizeof
index 47b0a6469c2e5329090911021dc09f27c3dc5df4..c7dfae5675ece3edbe2a2285d9c7b78d5bff6dce 100644 (file)
@@ -1894,38 +1894,54 @@ rs6000_dwarf2_reg_to_regnum (int num)
 
 
 static void
-rs6000_store_return_value (struct type *type, char *valbuf)
+rs6000_store_return_value (struct type *type,
+                           struct regcache *regcache,
+                           const void *valbuf)
 {
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
+  struct gdbarch *gdbarch = get_regcache_arch (regcache);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  int regnum = -1;
 
   /* The calling convention this function implements assumes the
      processor has floating-point registers.  We shouldn't be using it
      on PPC variants that lack them.  */
-  gdb_assert (ppc_floating_point_unit_p (current_gdbarch));
+  gdb_assert (ppc_floating_point_unit_p (gdbarch));
 
   if (TYPE_CODE (type) == TYPE_CODE_FLT)
-
     /* Floating point values are returned starting from FPR1 and up.
        Say a double_double_double type could be returned in
        FPR1/FPR2/FPR3 triple.  */
-
-    deprecated_write_register_bytes
-      (DEPRECATED_REGISTER_BYTE (tdep->ppc_fp0_regnum + 1),
-       valbuf,
-       TYPE_LENGTH (type));
+    regnum = tdep->ppc_fp0_regnum + 1;
   else if (TYPE_CODE (type) == TYPE_CODE_ARRAY)
     {
       if (TYPE_LENGTH (type) == 16
           && TYPE_VECTOR (type))
-       deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (tdep->ppc_vr0_regnum + 2),
-                                        valbuf, TYPE_LENGTH (type));
+        regnum = tdep->ppc_vr0_regnum + 2;
+      else
+        gdb_assert (0);
     }
   else
     /* Everything else is returned in GPR3 and up.  */
-    deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (gdbarch_tdep (current_gdbarch)->ppc_gp0_regnum + 3),
-                                    valbuf, TYPE_LENGTH (type));
+    regnum = tdep->ppc_gp0_regnum + 3;
+
+  {
+    size_t bytes_written = 0;
+
+    while (bytes_written < TYPE_LENGTH (type))
+      {
+        /* How much of this value can we write to this register?  */
+        size_t bytes_to_write = min (TYPE_LENGTH (type) - bytes_written,
+                                     register_size (gdbarch, regnum));
+        regcache_cooked_write_part (regcache, regnum,
+                                    0, bytes_to_write,
+                                    (char *) valbuf + bytes_written);
+        regnum++;
+        bytes_written += bytes_to_write;
+      }
+  }
 }
 
+
 /* Extract from an array REGBUF containing the (raw) register state
    the address in which a function should return its structure value,
    as a CORE_ADDR (or an expression that can be used as one).  */
@@ -2885,7 +2901,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   else
     {
       set_gdbarch_deprecated_extract_return_value (gdbarch, rs6000_extract_return_value);
-      set_gdbarch_deprecated_store_return_value (gdbarch, rs6000_store_return_value);
+      set_gdbarch_store_return_value (gdbarch, rs6000_store_return_value);
     }
 
   /* Set lr_frame_offset.  */