2003-03-05 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Wed, 5 Mar 2003 18:51:17 +0000 (18:51 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 5 Mar 2003 18:51:17 +0000 (18:51 +0000)
* frame.h (struct frame_info): Replace "id_unwind_cache_p" and
"id_unwind_cache" with "id".
(frame_id_unwind): Delete declaration.
* frame.c (frame_id_unwind): Delete function.
(get_prev_frame): Call the frame id unwind method directly.  Store
the returned next frame's ID value in NEXT_FRAME.  Note that there
is a problem with the wrong unwind ID being called with the wrong
unwind cache.

gdb/ChangeLog
gdb/frame.c
gdb/frame.h

index 0e3c639..318eb8a 100644 (file)
@@ -1,3 +1,14 @@
+2003-03-05  Andrew Cagney  <cagney@redhat.com>
+
+       * frame.h (struct frame_info): Replace "id_unwind_cache_p" and
+       "id_unwind_cache" with "id".
+       (frame_id_unwind): Delete declaration.
+       * frame.c (frame_id_unwind): Delete function.
+       (get_prev_frame): Call the frame id unwind method directly.  Store
+       the returned next frame's ID value in NEXT_FRAME.  Note that there
+       is a problem with the wrong unwind ID being called with the wrong
+       unwind cache.
+
 2003-03-05  Daniel Jacobowitz  <drow@mvista.com>
 
        * Makefile.in (FLAGS_TO_PASS): Add LDFLAGS.
index f4e0a14..5668d66 100644 (file)
@@ -145,17 +145,6 @@ frame_pc_unwind (struct frame_info *frame)
   return frame->pc_unwind_cache;
 }
 
-struct frame_id
-frame_id_unwind (struct frame_info *frame)
-{
-  if (!frame->id_unwind_cache_p)
-    {
-      frame->unwind->id (frame, &frame->unwind_cache, &frame->id_unwind_cache);
-      frame->id_unwind_cache_p = 1;
-    }
-  return frame->id_unwind_cache;
-}
-
 void
 frame_pop (struct frame_info *frame)
 {
@@ -1344,36 +1333,42 @@ get_prev_frame (struct frame_info *next_frame)
   /* FIXME: cagney/2003-01-13: A dummy frame doesn't need to unwind
      the frame ID because the frame ID comes from the previous frame.
      The other frames do though.  True?  */
-  {
-    /* FIXME: cagney/2002-12-18: Instead of this hack, should just
-       save the frame ID directly.  */
-    struct frame_id id = frame_id_unwind (next_frame);
-    /* Check that the unwound ID is valid.  As of 2003-02-24 the
-       x86-64 was returning an invalid frame ID when trying to do an
-       unwind a sentinel frame that belonged to a frame dummy.  */
-    if (!frame_id_p (id))
-      {
-       if (frame_debug)
-         fprintf_unfiltered (gdb_stdlog,
-                             "Outermost frame - unwound frame ID invalid\n");
-       return NULL;
-      }
-    /* Check that the new frame isn't inner to (younger, below, next)
-       the old frame.  If that happens the frame unwind is going
-       backwards.  */
-    /* FIXME: cagney/2003-02-25: Ignore the sentinel frame since that
-       doesn't have a valid frame ID.  Should instead set the sentinel
-       frame's frame ID to a `sentinel'.  Leave it until after the
-       switch to storing the frame ID, instead of the frame base, in
-       the frame object.  */
-    if (next_frame->level >= 0
-       && frame_id_inner (id, get_frame_id (next_frame)))
-      error ("Unwound frame inner-to selected frame (corrupt stack?)");
-    /* Note that, due to frameless functions, the stronger test of the
-       new frame being outer to the old frame can't be used -
-       frameless functions differ by only their PC value.  */
-    prev_frame->frame = id.base;
-  }
+  /* FIXME: cagney/2003-03-04: The below call isn't right.  It should
+     instead be doing something like "prev_frame -> unwind -> id
+     (next_frame, & prev_frame -> unwind_cache, & prev_frame -> id)"
+     but that requires more extensive (pending) changes.  */
+  next_frame->unwind->id (next_frame, &next_frame->unwind_cache,
+                         &prev_frame->id);
+  /* Check that the unwound ID is valid.  As of 2003-02-24 the x86-64
+     was returning an invalid frame ID when trying to do an unwind a
+     sentinel frame that belonged to a frame dummy.  */
+  if (!frame_id_p (prev_frame->id))
+    {
+      if (frame_debug)
+       fprintf_unfiltered (gdb_stdlog,
+                           "Outermost frame - unwound frame ID invalid\n");
+      return NULL;
+    }
+  /* Check that the new frame isn't inner to (younger, below, next)
+     the old frame.  If that happens the frame unwind is going
+     backwards.  */
+  /* FIXME: cagney/2003-02-25: Ignore the sentinel frame since that
+     doesn't have a valid frame ID.  Should instead set the sentinel
+     frame's frame ID to a `sentinel'.  Leave it until after the
+     switch to storing the frame ID, instead of the frame base, in the
+     frame object.  */
+  if (next_frame->level >= 0
+      && frame_id_inner (prev_frame->id, get_frame_id (next_frame)))
+    error ("Unwound frame inner-to selected frame (corrupt stack?)");
+  /* Note that, due to frameless functions, the stronger test of the
+     new frame being outer to the old frame can't be used - frameless
+     functions differ by only their PC value.  */
+
+  /* FIXME: cagney/2002-12-18: Instead of this hack, should only store
+     the frame ID in PREV_FRAME.  Unfortunatly, some architectures
+     (HP/UX) still reply on EXTRA_FRAME_INFO and, hence, still poke at
+     the "struct frame_info" object directly.  */
+  prev_frame->frame = prev_frame->id.base;
 
   /* Link it in.  */
   next_frame->prev = prev_frame;
index bd20ba7..18c4df4 100644 (file)
@@ -310,10 +310,6 @@ extern const char *frame_map_regnum_to_name (int regnum);
 
 extern CORE_ADDR frame_pc_unwind (struct frame_info *frame);
 
-/* Unwind the frame ID.  Return an ID that uniquely identifies the
-   caller's frame.  */
-extern struct frame_id frame_id_unwind (struct frame_info *frame);
-
 /* Discard the specified frame.  Restoring the registers to the state
    of the caller.  */
 extern void frame_pop (struct frame_info *frame);
@@ -412,9 +408,9 @@ struct frame_info
     int pc_unwind_cache_p;
     CORE_ADDR pc_unwind_cache;
 
-    /* Cached copy of the previous frame's ID.  */
-    int id_unwind_cache_p;
-    struct frame_id id_unwind_cache;
+    /* This frame's ID.  Note that the frame's ID, base and PC contain
+       redundant information.  */
+    struct frame_id id;
 
     /* Pointers to the next (down, inner, younger) and previous (up,
        outer, older) frame_info's in the frame cache.  */