aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2003-09-09 20:22:37 +0000
committerAndrew Cagney <cagney@redhat.com>2003-09-09 20:22:37 +0000
commit7a41266bbb4ac11fb6237b143556a02ef0020e18 (patch)
tree19a0687e2a7df4949eb41ee2df773767c94dbcfb
parent77b2b6d4605f755f1e0d67514be5d69e5f43ec72 (diff)
downloadgdb-7a41266bbb4ac11fb6237b143556a02ef0020e18.zip
gdb-7a41266bbb4ac11fb6237b143556a02ef0020e18.tar.gz
gdb-7a41266bbb4ac11fb6237b143556a02ef0020e18.tar.bz2
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.
-rw-r--r--gdb/ChangeLog6
-rw-r--r--gdb/ppc-sysv-tdep.c13
-rw-r--r--gdb/rs6000-tdep.c33
3 files changed, 32 insertions, 20 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a502bca..75aa8c2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,11 @@
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
"ppc_sysv_abi_push_arguments".
* ppc-sysv-tdep.c (ppc_sysv_abi_push_dummy_call): Replace
diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c
index 24376b9..bd80188 100644
--- a/gdb/ppc-sysv-tdep.c
+++ b/gdb/ppc-sysv-tdep.c
@@ -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
diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c
index 17bcb24..8b90e75 100644
--- a/gdb/rs6000-tdep.c
+++ b/gdb/rs6000-tdep.c
@@ -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);