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.
This commit is contained in:
parent
ed363b1b5e
commit
218e59567e
3 changed files with 50 additions and 48 deletions
|
@ -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.
|
||||
|
|
77
gdb/frame.c
77
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;
|
||||
|
|
10
gdb/frame.h
10
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. */
|
||||
|
|
Loading…
Reference in a new issue