Move lookup_selected_frame to frame.c
This function is now external, and isn't really threads related. Move it to frame.c. gdb/ChangeLog: * thread.c (lookup_selected_frame): Move ... * frame.c (lookup_selected_frame): ... here. Change-Id: Ia96b79c15767337c68efd3358bcc715ce8e26c15
This commit is contained in:
parent
79952e6963
commit
d70bdd3cc4
@ -1,3 +1,8 @@
|
|||||||
|
2020-10-30 Pedro Alves <pedro@palves.net>
|
||||||
|
|
||||||
|
* thread.c (lookup_selected_frame): Move ...
|
||||||
|
* frame.c (lookup_selected_frame): ... here.
|
||||||
|
|
||||||
2020-10-30 Pedro Alves <pedro@palves.net>
|
2020-10-30 Pedro Alves <pedro@palves.net>
|
||||||
|
|
||||||
* blockframe.c (block_innermost_frame): Use get_selected_frame.
|
* blockframe.c (block_innermost_frame): Use get_selected_frame.
|
||||||
|
66
gdb/frame.c
66
gdb/frame.c
@ -1740,6 +1740,72 @@ restore_selected_frame (frame_id frame_id, int frame_level)
|
|||||||
selected_frame = nullptr;
|
selected_frame = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* See frame.h. */
|
||||||
|
|
||||||
|
void
|
||||||
|
lookup_selected_frame (struct frame_id a_frame_id, int frame_level)
|
||||||
|
{
|
||||||
|
struct frame_info *frame = NULL;
|
||||||
|
int count;
|
||||||
|
|
||||||
|
/* This either means there was no selected frame, or the selected
|
||||||
|
frame was the current frame. In either case, select the current
|
||||||
|
frame. */
|
||||||
|
if (frame_level == -1)
|
||||||
|
{
|
||||||
|
select_frame (get_current_frame ());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* select_frame never saves 0 in SELECTED_FRAME_LEVEL, so we
|
||||||
|
shouldn't see it here. */
|
||||||
|
gdb_assert (frame_level > 0);
|
||||||
|
|
||||||
|
/* Restore by level first, check if the frame id is the same as
|
||||||
|
expected. If that fails, try restoring by frame id. If that
|
||||||
|
fails, nothing to do, just warn the user. */
|
||||||
|
|
||||||
|
count = frame_level;
|
||||||
|
frame = find_relative_frame (get_current_frame (), &count);
|
||||||
|
if (count == 0
|
||||||
|
&& frame != NULL
|
||||||
|
/* The frame ids must match - either both valid or both
|
||||||
|
outer_frame_id. The latter case is not failsafe, but since
|
||||||
|
it's highly unlikely the search by level finds the wrong
|
||||||
|
frame, it's 99.9(9)% of the time (for all practical purposes)
|
||||||
|
safe. */
|
||||||
|
&& frame_id_eq (get_frame_id (frame), a_frame_id))
|
||||||
|
{
|
||||||
|
/* Cool, all is fine. */
|
||||||
|
select_frame (frame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
frame = frame_find_by_id (a_frame_id);
|
||||||
|
if (frame != NULL)
|
||||||
|
{
|
||||||
|
/* Cool, refound it. */
|
||||||
|
select_frame (frame);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nothing else to do, the frame layout really changed. Select the
|
||||||
|
innermost stack frame. */
|
||||||
|
select_frame (get_current_frame ());
|
||||||
|
|
||||||
|
/* Warn the user. */
|
||||||
|
if (frame_level > 0 && !current_uiout->is_mi_like_p ())
|
||||||
|
{
|
||||||
|
warning (_("Couldn't restore frame #%d in "
|
||||||
|
"current thread. Bottom (innermost) frame selected:"),
|
||||||
|
frame_level);
|
||||||
|
/* For MI, we should probably have a notification about current
|
||||||
|
frame change. But this error is not very likely, so don't
|
||||||
|
bother for now. */
|
||||||
|
print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
has_stack_frames ()
|
has_stack_frames ()
|
||||||
{
|
{
|
||||||
|
63
gdb/thread.c
63
gdb/thread.c
@ -1327,69 +1327,6 @@ switch_to_thread (process_stratum_target *proc_target, ptid_t ptid)
|
|||||||
|
|
||||||
/* See frame.h. */
|
/* See frame.h. */
|
||||||
|
|
||||||
void
|
|
||||||
lookup_selected_frame (struct frame_id a_frame_id, int frame_level)
|
|
||||||
{
|
|
||||||
struct frame_info *frame = NULL;
|
|
||||||
int count;
|
|
||||||
|
|
||||||
/* This either means there was no selected frame, or the selected
|
|
||||||
frame was the current frame. In either case, select the current
|
|
||||||
frame. */
|
|
||||||
if (frame_level == -1)
|
|
||||||
{
|
|
||||||
select_frame (get_current_frame ());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* select_frame never saves 0 in SELECTED_FRAME_LEVEL, so we
|
|
||||||
shouldn't see it here. */
|
|
||||||
gdb_assert (frame_level > 0);
|
|
||||||
|
|
||||||
/* Restore by level first, check if the frame id is the same as
|
|
||||||
expected. If that fails, try restoring by frame id. If that
|
|
||||||
fails, nothing to do, just warn the user. */
|
|
||||||
|
|
||||||
count = frame_level;
|
|
||||||
frame = find_relative_frame (get_current_frame (), &count);
|
|
||||||
if (count == 0
|
|
||||||
&& frame != NULL
|
|
||||||
/* The frame ids must match - either both valid or both outer_frame_id.
|
|
||||||
The latter case is not failsafe, but since it's highly unlikely
|
|
||||||
the search by level finds the wrong frame, it's 99.9(9)% of
|
|
||||||
the time (for all practical purposes) safe. */
|
|
||||||
&& frame_id_eq (get_frame_id (frame), a_frame_id))
|
|
||||||
{
|
|
||||||
/* Cool, all is fine. */
|
|
||||||
select_frame (frame);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
frame = frame_find_by_id (a_frame_id);
|
|
||||||
if (frame != NULL)
|
|
||||||
{
|
|
||||||
/* Cool, refound it. */
|
|
||||||
select_frame (frame);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Nothing else to do, the frame layout really changed. Select the
|
|
||||||
innermost stack frame. */
|
|
||||||
select_frame (get_current_frame ());
|
|
||||||
|
|
||||||
/* Warn the user. */
|
|
||||||
if (frame_level > 0 && !current_uiout->is_mi_like_p ())
|
|
||||||
{
|
|
||||||
warning (_("Couldn't restore frame #%d in "
|
|
||||||
"current thread. Bottom (innermost) frame selected:"),
|
|
||||||
frame_level);
|
|
||||||
/* For MI, we should probably have a notification about
|
|
||||||
current frame change. But this error is not very
|
|
||||||
likely, so don't bother for now. */
|
|
||||||
print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
scoped_restore_current_thread::restore ()
|
scoped_restore_current_thread::restore ()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user