summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2003-03-10 14:43:15 +0000
committerAndrew Cagney <cagney@redhat.com>2003-03-10 14:43:15 +0000
commit03d8a53edcc322f64d9eb4a717d077ec47c85d7f (patch)
tree451f687c7a2a2b9d0edc0fff1583b0c6a9bc261f
parenta5877e6677ae0e9b9f56e9dac1b2cb282a5c2c5e (diff)
downloadgdb-03d8a53edcc322f64d9eb4a717d077ec47c85d7f.tar.gz
2003-03-10 Andrew Cagney <cagney@redhat.com>
* d10v-tdep.c (d10v_frame_register_unwind): Correctly unwind the PC. (d10v_frame_pop): Unwind the PC, and not the LR, when restoring the PC register.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/d10v-tdep.c17
2 files changed, 21 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a1caebada69..1d3a5cbca7c 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2003-03-10 Andrew Cagney <cagney@redhat.com>
+
+ * d10v-tdep.c (d10v_frame_register_unwind): Correctly unwind the
+ PC.
+ (d10v_frame_pop): Unwind the PC, and not the LR, when restoring
+ the PC register.
+
2003-03-08 Mark Kettenis <kettenis@gnu.org>
* gdbarch.sh (save_dummy_frame_tos): Add comment.
diff --git a/gdb/d10v-tdep.c b/gdb/d10v-tdep.c
index 5f334e6a7ab..b50cfa75a8f 100644
--- a/gdb/d10v-tdep.c
+++ b/gdb/d10v-tdep.c
@@ -1557,8 +1557,19 @@ d10v_frame_register_unwind (struct frame_info *frame,
int *realnump, void *bufferp)
{
struct d10v_unwind_cache *info = d10v_frame_unwind_cache (frame, cache);
- saved_regs_unwinder (frame, info->saved_regs, regnum, optimizedp,
- lvalp, addrp, realnump, bufferp);
+ if (regnum == PC_REGNUM)
+ {
+ /* The call instruction saves the caller's PC in LR. The
+ function prologue of the callee may then save the LR on the
+ stack. Find that possibly saved LR value and return it. */
+ saved_regs_unwinder (frame, info->saved_regs, LR_REGNUM, optimizedp,
+ lvalp, addrp, realnump, bufferp);
+ }
+ else
+ {
+ saved_regs_unwinder (frame, info->saved_regs, regnum, optimizedp,
+ lvalp, addrp, realnump, bufferp);
+ }
}
@@ -1587,7 +1598,7 @@ d10v_frame_pop (struct frame_info *fi, void **unwind_cache,
frame_unwind_register (fi, PSW_REGNUM, raw_buffer);
regcache_cooked_write (regcache, PSW_REGNUM, raw_buffer);
- frame_unwind_register (fi, LR_REGNUM, raw_buffer);
+ frame_unwind_register (fi, PC_REGNUM, raw_buffer);
regcache_cooked_write (regcache, PC_REGNUM, raw_buffer);
store_unsigned_integer (raw_buffer,