2003-09-09 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Tue, 9 Sep 2003 20:22:37 +0000 (20:22 +0000)
committerAndrew Cagney <cagney@redhat.com>
Tue, 9 Sep 2003 20:22:37 +0000 (20:22 +0000)
* rs6000-tdep.c (rs6000_store_struct_return): Delete function.
(rs6000_push_dummy_call): Store the struct return address.
* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Ditto.

gdb/ChangeLog
gdb/ppc-sysv-tdep.c
gdb/rs6000-tdep.c

index a502bca135d7d5ca7b2bca8a92ec5a25454aab84..75aa8c29c23552cd25802b5b8d40b9b2745036d4 100644 (file)
@@ -1,3 +1,9 @@
+2003-09-09  Andrew Cagney  <cagney@redhat.com>
+
+       * rs6000-tdep.c (rs6000_store_struct_return): Delete function.
+       (rs6000_push_dummy_call): Store the struct return address.
+       * ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Ditto.
+
 2003-09-09  Andrew Cagney  <cagney@redhat.com>
 
        * ppc-tdep.h (ppc_sysv_abi_push_dummy_call): Replace
index 24376b9cec6f23ccdc8b89ec0942ec13b26d88e3..bd801881837c19a001259566284f9330c56d7044 100644 (file)
@@ -69,12 +69,23 @@ ppc_sysv_abi_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
   CORE_ADDR saved_sp;
   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
 
-  greg = struct_return ? 4 : 3;
+  greg = 3;
   freg = 1;
   vreg = 2;
   argstkspace = 0;
   structstkspace = 0;
 
+  /* If the function is returning a `struct', then the first word
+     (which will be passed in r3) is used for struct return address.
+     In that case we should advance one word and start from r4
+     register to copy parameters.  */
+  if (struct_return)
+    {
+      regcache_raw_write_signed (regcache, tdep->ppc_gp0_regnum + greg,
+                                struct_addr);
+      greg++;
+    }
+
   /* Figure out how much new stack space is required for arguments
      which don't fit in registers.  Unlike the PowerOpen ABI, the
      SysV ABI doesn't reserve any extra space for parameters which
index 17bcb2439a252e0a432ae7c109b1c1da14c06739..8b90e75493ebc9910e5303d5154effd0465d2be9 100644 (file)
@@ -1123,6 +1123,7 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
                        int nargs, struct value **args, CORE_ADDR sp,
                        int struct_return, CORE_ADDR struct_addr)
 {
+  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
   int ii;
   int len = 0;
   int argno;                   /* current argument number */
@@ -1137,14 +1138,19 @@ rs6000_push_dummy_call (struct gdbarch *gdbarch, CORE_ADDR func_addr,
   CORE_ADDR saved_sp;
 
   /* The first eight words of ther arguments are passed in registers.
-     Copy them appropriately.
-
-     If the function is returning a `struct', then the first word (which 
-     will be passed in r3) is used for struct return address.  In that
-     case we should advance one word and start from r4 register to copy 
-     parameters.  */
-
-  ii = struct_return ? 1 : 0;
+     Copy them appropriately.  */
+  ii = 0;
+
+  /* If the function is returning a `struct', then the first word
+     (which will be passed in r3) is used for struct return address.
+     In that case we should advance one word and start from r4
+     register to copy parameters.  */
+  if (struct_return)
+    {
+      regcache_raw_write_unsigned (regcache, tdep->ppc_gp0_regnum + 3,
+                                  struct_addr);
+      ii++;
+    }
 
 /* 
    effectively indirect call... gcc does...
@@ -2051,16 +2057,6 @@ rs6000_stab_reg_to_regnum (int num)
   return regnum;
 }
 
-/* Store the address of the place in which to copy the structure the
-   subroutine will return.  */
-
-static void
-rs6000_store_struct_return (CORE_ADDR addr, CORE_ADDR sp)
-{
-  struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
-  write_register (tdep->ppc_gp0_regnum + 3, addr);
-}
-
 /* Write into appropriate registers a function return value
    of type TYPE, given in virtual format.  */
 static void
@@ -2973,7 +2969,6 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   else
     set_gdbarch_push_dummy_call (gdbarch, rs6000_push_dummy_call);
 
-  set_gdbarch_deprecated_store_struct_return (gdbarch, rs6000_store_struct_return);
   set_gdbarch_extract_struct_value_address (gdbarch, rs6000_extract_struct_value_address);
   set_gdbarch_deprecated_pop_frame (gdbarch, rs6000_pop_frame);