From 9ff3afda84c2aa2d6fe70b91a5fd9def10e15228 Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Wed, 3 Sep 2008 21:27:05 +0000 Subject: [PATCH] * spu-tdep.c (spu_push_dummy_call): Update all stack pointer slots when allocating stack frame for inferior call. --- gdb/ChangeLog | 5 +++++ gdb/spu-tdep.c | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a52ce2ec2ac..856fed0895e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2008-09-03 Ulrich Weigand + + * spu-tdep.c (spu_push_dummy_call): Update all stack pointer slots + when allocating stack frame for inferior call. + 2008-09-03 Ulrich Weigand * spu-tdep.c (spu_frame_unwind_cache): Do not attempt to unwind diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c index b016d4ba79e..8ebaf04a586 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; } -- 2.30.2