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:
Andrew Cagney 2003-03-05 18:51:17 +00:00
parent ed363b1b5e
commit 218e59567e
3 changed files with 50 additions and 48 deletions

View 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.

View 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;

View 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. */