diff options
author | Andrew Cagney <cagney@redhat.com> | 2003-04-16 14:39:47 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2003-04-16 14:39:47 +0000 |
commit | c50901fda0471af8f5f823b211db41c6724590bc (patch) | |
tree | c133f95123923e3afdfda6d8b9cebcccaad96f09 /gdb/frame.c | |
parent | f81824a9ed224daf40da0222217618bae9b8d383 (diff) | |
download | gdb-c50901fda0471af8f5f823b211db41c6724590bc.zip gdb-c50901fda0471af8f5f823b211db41c6724590bc.tar.gz gdb-c50901fda0471af8f5f823b211db41c6724590bc.tar.bz2 |
2003-04-16 Andrew Cagney <cagney@redhat.com>
* frame.c (get_prev_frame): Do not initialize "unwind" or "type",
update comments.
(get_frame_type): Initialize unwind and type when needed.
(get_frame_id, frame_register_unwind): Ditto.
Diffstat (limited to 'gdb/frame.c')
-rw-r--r-- | gdb/frame.c | 61 |
1 files changed, 46 insertions, 15 deletions
diff --git a/gdb/frame.c b/gdb/frame.c index f35d8c1..3871aa1 100644 --- a/gdb/frame.c +++ b/gdb/frame.c @@ -226,6 +226,19 @@ get_frame_id (struct frame_info *fi) if (frame_debug) fprintf_unfiltered (gdb_stdlog, "{ get_frame_id (fi=%d) ", fi->level); + /* Find the unwinder. */ + if (fi->unwind == NULL) + { + fi->unwind = frame_unwind_find_by_pc (current_gdbarch, + get_frame_pc (fi)); + /* FIXME: cagney/2003-04-02: Rather than storing the frame's + type in the frame, the unwinder's type should be returned + directly. Unfortunatly, legacy code, called by + legacy_get_prev_frame, explicitly set the frames type + using the method deprecated_set_frame_type(). */ + gdb_assert (fi->unwind->type != UNKNOWN_FRAME); + fi->type = fi->unwind->type; + } /* Find THIS frame's ID. */ fi->unwind->this_id (fi->next, &fi->prologue_cache, &fi->this_id.value); fi->this_id.p = 1; @@ -503,6 +516,20 @@ frame_register_unwind (struct frame_info *frame, int regnum, detected the problem before calling here. */ gdb_assert (frame != NULL); + /* Find the unwinder. */ + if (frame->unwind == NULL) + { + frame->unwind = frame_unwind_find_by_pc (current_gdbarch, + get_frame_pc (frame)); + /* FIXME: cagney/2003-04-02: Rather than storing the frame's + type in the frame, the unwinder's type should be returned + directly. Unfortunatly, legacy code, called by + legacy_get_prev_frame, explicitly set the frames type using + the method deprecated_set_frame_type(). */ + gdb_assert (frame->unwind->type != UNKNOWN_FRAME); + frame->type = frame->unwind->type; + } + /* Ask this frame to unwind its register. See comment in "frame-unwind.h" for why NEXT frame and this unwind cace are passed in. */ @@ -1899,22 +1926,12 @@ get_prev_frame (struct frame_info *this_frame) return NULL; } - /* Set the unwind functions based on that identified PC. */ - prev_frame->unwind = frame_unwind_find_by_pc (current_gdbarch, - frame_pc_unwind (this_frame)); + /* Don't yet compute ->unwind (and hence ->type). It is computed + on-demand in get_frame_type, frame_register_unwind, and + get_frame_id. */ - /* FIXME: cagney/2003-04-02: Rather than storing the frame's type in - the frame, the unwinder's type should be returned directly. - Unfortunatly, legacy code, called by legacy_get_prev_frame, - explicitly set the frames type using the method - deprecated_set_frame_type(). */ - gdb_assert (prev_frame->unwind->type != UNKNOWN_FRAME); - prev_frame->type = prev_frame->unwind->type; - - /* Can the frame's type and unwinder be computed on demand? That - would make a frame's creation really really lite! */ - - /* The prev's frame's ID is computed by demand in get_frame_id(). */ + /* Don't yet compute the frame's ID. It is computed on-demand by + get_frame_id(). */ /* The unwound frame ID is validate at the start of this function, as part of the logic to decide if that frame should be further @@ -2052,6 +2069,20 @@ get_frame_type (struct frame_info *frame) if (!DEPRECATED_USE_GENERIC_DUMMY_FRAMES && deprecated_frame_in_dummy (frame)) return DUMMY_FRAME; + if (frame->unwind == NULL) + { + /* Initialize the frame's unwinder because it is that which + provides the frame's type. */ + frame->unwind = frame_unwind_find_by_pc (current_gdbarch, + get_frame_pc (frame)); + /* FIXME: cagney/2003-04-02: Rather than storing the frame's + type in the frame, the unwinder's type should be returned + directly. Unfortunatly, legacy code, called by + legacy_get_prev_frame, explicitly set the frames type using + the method deprecated_set_frame_type(). */ + gdb_assert (frame->unwind->type != UNKNOWN_FRAME); + frame->type = frame->unwind->type; + } if (frame->type == UNKNOWN_FRAME) return NORMAL_FRAME; else |