2012-07-20 Jeff Kenton <jkenton@tilera.com>
authorPedro Alves <palves@redhat.com>
Fri, 20 Jul 2012 17:54:06 +0000 (17:54 +0000)
committerPedro Alves <palves@redhat.com>
Fri, 20 Jul 2012 17:54:06 +0000 (17:54 +0000)
* tilegx-linux-tdep.c (tilegx_linux_sigframe_init): Fix
SIGTRAMP_FRAME unwinding.

gdb/ChangeLog
gdb/tilegx-linux-tdep.c

index 4bb108bd2c874c3722e7b91af6c9f346561067b9..4be51eb33baf2d2f6095c4e54d4b232011e2300d 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-20  Jeff Kenton  <jkenton@tilera.com>
+
+       * tilegx-linux-tdep.c (tilegx_linux_sigframe_init): Fix
+       SIGTRAMP_FRAME unwinding.
+
 2012-07-20  Doug Evans  <dje@google.com>
 
        * NEWS: Document new options "set/show use-deprecated-index-sections",
index 2b7677da3fafac1ae78f413abf2df80fa38c1d2b..c5e0e8027c495e488463db9ae4dd1c96920174c6 100644 (file)
@@ -39,13 +39,23 @@ tilegx_linux_sigframe_init (const struct tramp_frame *self,
 {
   CORE_ADDR pc = get_frame_register_unsigned (this_frame, 64);
   CORE_ADDR sp = get_frame_register_unsigned (this_frame, 54);
-  CORE_ADDR base = sp + 16;
+
+  /* Base address of register save area.  */
+  CORE_ADDR base = sp
+                   + 16    /* Skip ABI_SAVE_AREA.  */
+                   + 128   /* Skip SIGINFO.  */
+                   + 40;   /* Skip UCONTEXT.  */
+
+  /* Address of saved LR register (R56) which holds previous PC.  */
+  CORE_ADDR prev_pc = base + 56 * 8;
+
   int i;
 
   for (i = 0; i < 56; i++)
     trad_frame_set_reg_addr (this_cache, i, base + i * 8);
 
-  trad_frame_set_reg_value (this_cache, 64, pc);
+  trad_frame_set_reg_value (this_cache, 64,
+                            get_frame_memory_unsigned (this_frame, prev_pc, 8));
 
   /* Save a frame ID.  */
   trad_frame_set_id (this_cache, frame_id_build (base, func));