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