diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/spu-tdep.c | 11 |
2 files changed, 14 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a52ce2e..856fed0 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2008-09-03 Ulrich Weigand <uweigand@de.ibm.com> + * spu-tdep.c (spu_push_dummy_call): Update all stack pointer slots + when allocating stack frame for inferior call. + +2008-09-03 Ulrich Weigand <uweigand@de.ibm.com> + * spu-tdep.c (spu_frame_unwind_cache): Do not attempt to unwind SP or return address if we failed to find a valid frame. diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c index b016d4b..8ebaf04 100644 --- a/gdb/spu-tdep.c +++ b/gdb/spu-tdep.c @@ -1107,6 +1107,7 @@ spu_push_dummy_call (struct gdbarch *gdbarch, struct value *function, int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr) { + CORE_ADDR sp_delta; int i; int regnum = SPU_ARG1_REGNUM; int stack_arg = -1; @@ -1186,8 +1187,14 @@ spu_push_dummy_call (struct gdbarch *gdbarch, struct value *function, regcache_cooked_read (regcache, SPU_RAW_SP_REGNUM, buf); target_write_memory (sp, buf, 16); - /* Finally, update the SP register. */ - regcache_cooked_write_unsigned (regcache, SPU_SP_REGNUM, sp); + /* Finally, update all slots of the SP register. */ + sp_delta = sp - extract_unsigned_integer (buf, 4); + for (i = 0; i < 4; i++) + { + CORE_ADDR sp_slot = extract_unsigned_integer (buf + 4*i, 4); + store_unsigned_integer (buf + 4*i, 4, sp_slot + sp_delta); + } + regcache_cooked_write (regcache, SPU_RAW_SP_REGNUM, buf); return sp; } |