* hppa-hpux-tdep.c (hppa_hpux_sigtramp_unwind_sniffer): Detect
authorMark Kettenis <kettenis@gnu.org>
Tue, 13 Dec 2005 10:24:35 +0000 (10:24 +0000)
committerMark Kettenis <kettenis@gnu.org>
Tue, 13 Dec 2005 10:24:35 +0000 (10:24 +0000)
export stub for signal trampoline as a signal trampoline too.

gdb/ChangeLog
gdb/hppa-hpux-tdep.c

index 230b841a9259151e6915776590e0394a4490e350..0af48eb54aec9b8781edf7821958ffbe7f30ccf7 100644 (file)
@@ -1,5 +1,8 @@
 2005-12-13  Mark Kettenis  <kettenis@gnu.org>
 
+       * hppa-hpux-tdep.c (hppa_hpux_sigtramp_unwind_sniffer): Detect
+       export stub for signal trampoline as a signal trampoline too.
+
        * hppa-hpux-tdep.c (hppa_hpux_sigtramp_frame_unwind_cache): Don't
        set pcoqh to rp.
 
index c1d35b5cbc111916312ee8acf6144361e1054d38..17b4e2f2114f03e2047e62b95cf85ddd2e2a323b 100644 (file)
@@ -1276,6 +1276,22 @@ hppa_hpux_sigtramp_unwind_sniffer (struct frame_info *next_frame)
 
   u = find_unwind_entry (pc);
 
+  /* If this is an export stub, try to get the unwind descriptor for
+     the actual function itself.  */
+  if (u && u->stub_unwind.stub_type == EXPORT)
+    {
+      gdb_byte buf[HPPA_INSN_SIZE];
+      unsigned long insn;
+
+      if (!safe_frame_unwind_memory (next_frame, u->region_start,
+                                    buf, sizeof buf))
+       return NULL;
+
+      insn = extract_unsigned_integer (buf, sizeof buf);
+      if ((insn & 0xffe0e000) == 0xe8400000)
+       u = find_unwind_entry(u->region_start + hppa_extract_17 (insn) + 8);
+    }
+
   if (u && u->HP_UX_interrupt_marker)
     return &hppa_hpux_sigtramp_frame_unwind;