summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog11
-rw-r--r--gdb/frame.c77
-rw-r--r--gdb/frame.h10
3 files changed, 50 insertions, 48 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0e3c63924c4..318eb8a5481 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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.
diff --git a/gdb/frame.c b/gdb/frame.c
index f4e0a14e85d..5668d66e218 100644
--- a/gdb/frame.c
+++ b/gdb/frame.c
@@ -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;
diff --git a/gdb/frame.h b/gdb/frame.h
index bd20ba7aec1..18c4df4397f 100644
--- a/gdb/frame.h
+++ b/gdb/frame.h
@@ -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. */