* hppa-tdep.c (frame_saved_pc): Handle backtracing through signal
authorJeff Law <law@redhat.com>
Wed, 7 Jun 1995 18:43:58 +0000 (18:43 +0000)
committerJeff Law <law@redhat.com>
Wed, 7 Jun 1995 18:43:58 +0000 (18:43 +0000)
handler in dynamically linked executables.
mentor-7139

gdb/ChangeLog
gdb/hppa-tdep.c

index 47db0537237fad93fb0a5d1700242f6445c7bf31..30ba31d39106482562f30a8808875a2cab1c433e 100644 (file)
@@ -1,3 +1,8 @@
+Wed Jun  7 12:41:42 1995  Jeff Law  (law@snake.cs.utah.edu)
+
+       * hppa-tdep.c (frame_saved_pc): Handle backtracing through signal
+       handler in dynamically linked executables.
+
 Tue Jun  6 10:44:25 1995  Michael Meissner  <meissner@tiktok.cygnus.com>
 
        From Andrew Cagney <cagney@highland.com.au>
index b7711700c34bd7d7dfd8d4a9c1353b5434616a91..d5595dcf7c8348cfaf21813b7e4e9c5d2923893d 100644 (file)
@@ -866,7 +866,22 @@ restart:
      will return to.  */
   u = find_unwind_entry (pc);
   if (u && u->stub_type != 0)
-    goto restart;
+    {
+      unsigned int insn;
+
+      /* If this is a dynamic executable, and we're in a signal handler,
+        then the call chain will eventually point us into the stub for
+        _sigreturn.  Unlike most cases, we'll be pointed to the branch
+        to the real sigreturn rather than the code after the real branch!. 
+
+        Else, try to dig the address the stub will return to in the normal
+        fashion.  */
+      insn = read_memory_integer (pc, 4);
+      if ((insn & 0xfc00e000) == 0xe8000000)
+       return (pc + extract_17 (insn) + 8) & ~0x3;
+      else
+       goto restart;
+    }
 
   return pc;
 }