From 03d8a53edcc322f64d9eb4a717d077ec47c85d7f Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Mon, 10 Mar 2003 14:43:15 +0000 Subject: [PATCH] 2003-03-10 Andrew Cagney * 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. --- gdb/ChangeLog | 7 +++++++ gdb/d10v-tdep.c | 17 ++++++++++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a1caebada6..1d3a5cbca7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +2003-03-10 Andrew Cagney + + * 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 * gdbarch.sh (save_dummy_frame_tos): Add comment. diff --git a/gdb/d10v-tdep.c b/gdb/d10v-tdep.c index 5f334e6a7a..b50cfa75a8 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, -- 2.11.0