2004-12-12 Andrew Cagney <cagney@gnu.org>
authorAndrew Cagney <cagney@redhat.com>
Sun, 12 Dec 2004 16:26:17 +0000 (16:26 +0000)
committerAndrew Cagney <cagney@redhat.com>
Sun, 12 Dec 2004 16:26:17 +0000 (16:26 +0000)
* frame.c (get_prev_frame): When unwinding normal frames, check
that the PC isn't zero.
* hppa-tdep.c (hppa_stub_frame_unwind_cache): Delete check for a
zero PC.

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

index 2b42da6fdca406d544d551cf346281f7737d1104..59161b46efd32e467e04098c979989c0a8858d57 100644 (file)
@@ -1,5 +1,10 @@
 2004-12-12  Andrew Cagney  <cagney@gnu.org>
 
+       * frame.c (get_prev_frame): When unwinding normal frames, check
+       that the PC isn't zero.
+       * hppa-tdep.c (hppa_stub_frame_unwind_cache): Delete check for a
+       zero PC.
+
        * MAINTAINERS: Reword description of what "Target Instruction Set
        Architectures" covers.
 
index b22973059991b56224bd8878f7d1efad08433d77..99ad24d1efaffc6bc0810e3f3056042496264886 100644 (file)
@@ -1257,6 +1257,18 @@ get_prev_frame (struct frame_info *this_frame)
       return NULL;
     }
 
+  /* Assume that the only way to get a zero PC is through something
+     like a SIGSEGV or a dummy frame, and hence that NORMAL frames
+     will never unwind a zero PC.  */
+  if (this_frame->level > 0
+      && get_frame_type (this_frame) == NORMAL_FRAME
+      && get_frame_type (get_next_frame (this_frame)) == NORMAL_FRAME
+      && get_frame_pc (this_frame) == 0)
+    {
+      frame_debug_got_null_frame (gdb_stdlog, this_frame, "zero PC");
+      return NULL;
+    }
+
   return get_prev_frame_1 (this_frame);
 }
 
index b04b3c6eb3b339af61f3abf7475f09bc5288a88f..58fe24981657fe2d5144fae8767cea7e86debe90 100644 (file)
@@ -2105,9 +2105,6 @@ hppa_stub_frame_unwind_cache (struct frame_info *next_frame,
   if (*this_cache)
     return *this_cache;
 
-  if (frame_pc_unwind (next_frame) == 0)
-    return NULL;
-
   info = FRAME_OBSTACK_ZALLOC (struct hppa_stub_unwind_cache);
   *this_cache = info;
   info->saved_regs = trad_frame_alloc_saved_regs (next_frame);