static int backtrace_below_main;
-static void
+void
fprint_frame_id (struct ui_file *file, struct frame_id id)
{
fprintf_unfiltered (file, "{stack=0x%s,code=0x%s}",
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;
/* The .stack and .code are identical, the ID's are identical. */
eq = 1;
else
- /* FIXME: cagney/2003-04-06: This should be zero. Can't yet do
- this because most frame ID's are not being initialized
- correctly. */
- eq = 1;
+ /* No luck. */
+ eq = 0;
if (frame_debug)
{
fprintf_unfiltered (gdb_stdlog, "{ frame_id_eq (l=");
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. */
using the same sequence as is found a traditional
unwinder. Once all architectures supply the
unwind_dummy_id method, this code can go away. */
- prev->this_id.value = frame_id_build (read_fp (), read_pc ());
+ prev->this_id.value = frame_id_build (deprecated_read_fp (),
+ read_pc ());
}
/* Check that the unwound ID is valid. */
DEPRECATED_INIT_EXTRA_FRAME_INFO, one possible scheme:
SETUP_INNERMOST_FRAME(): Default version is just create_new_frame
- (read_fp ()), read_pc ()). Machines with extra frame info would
- do that (or the local equivalent) and then set the extra fields.
+ (deprecated_read_fp ()), read_pc ()). Machines with extra frame
+ info would do that (or the local equivalent) and then set the
+ extra fields.
SETUP_ARBITRARY_FRAME(argc, argv): Only change here is that
create_new_frame would no longer init extra frame info;
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));
-
- /* 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;
+ /* Don't yet compute ->unwind (and hence ->type). It is computed
+ on-demand in get_frame_type, frame_register_unwind, and
+ get_frame_id. */
- /* 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
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