diff options
author | Andrew Cagney <cagney@redhat.com> | 2003-03-05 18:51:17 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2003-03-05 18:51:17 +0000 |
commit | 218e59567e1b9416603fdf10045cfb5897d9d446 (patch) | |
tree | 7bf3a45d85182ca2c8200b9f9707a0dbd23ec26e /gdb/frame.c | |
parent | ed363b1b5e3188a6e71b46e51581fb1d7e8312de (diff) | |
download | gdb-218e59567e1b9416603fdf10045cfb5897d9d446.zip gdb-218e59567e1b9416603fdf10045cfb5897d9d446.tar.gz gdb-218e59567e1b9416603fdf10045cfb5897d9d446.tar.bz2 |
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.
Diffstat (limited to 'gdb/frame.c')
-rw-r--r-- | gdb/frame.c | 77 |
1 files changed, 36 insertions, 41 deletions
diff --git a/gdb/frame.c b/gdb/frame.c index f4e0a14..5668d66 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; |