2003-03-10 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Mon, 10 Mar 2003 14:43:15 +0000 (14:43 +0000)
committerAndrew Cagney <cagney@redhat.com>
Mon, 10 Mar 2003 14:43:15 +0000 (14:43 +0000)
* 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
gdb/d10v-tdep.c

index a1caeba..1d3a5cb 100644 (file)
@@ -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.
index 5f334e6..b50cfa7 100644 (file)
@@ -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,