Pass thread_info pointer to various inferior control functions

[ Migrating this from Gerrit: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/321 ]

I noticed that some functions in infcmd and infrun call each other and
all call inferior_thread, while they could just get the thread_info
pointer from their caller.  That means less calls to inferior_thread, so
less reliance on global state, since inferior_thread reads
inferior_ptid.

The paths I am unsure about are:

  - fetch_inferior_event calls...
  - step_command_fsm::should_stop calls...
  - prepare_one_step

and

 - process_event_stop_test calls...
 - set_step_info

Before this patch, prepare_one_step gets the thread pointer using
inferior_thread.  After this patch, it gets it from the
execution_control_state structure in fetch_inferior_event.  Are we sure
that the thread from the execution_control_state structure is the same
as the one inferior_thread would return?  This code path is used when a
thread completes a step, but the user had specified a step count (e.g.
"step 5") so we decide to do one more step.  It would be strange (and
even a bug I suppose) if the thread in the ecs structure in
fetch_inferior_event was not the same thread that is prepared to stepped
by prepare_one_step.  So I believe passing the ecs thread is fine.

The same logic applies to process_event_stop_test calling
set_step_info.

gdb/ChangeLog:

	* infrun.h: Forward-declare thread_info.
	(set_step_info): Add thread_info parameter, add doc.
	* infrun.c (set_step_info): Add thread_info parameter, move doc
	to header.
	* infrun.c (process_event_stop_test): Pass thread to
	set_step_info call.
	* infcmd.c (set_step_frame): Add thread_info pointer, pass it to
	set_step_info.
	(prepare_one_step): Add thread_info parameter, pass it to
	set_step_frame and prepare_one_step (recursive) call.
	(step_1): Pass thread to prepare_one_step call.
	(step_command_fsm::should_stop): Pass thread to
	prepare_one_step.
	(until_next_fsm): Pass thread to set_step_frame call.
	(finish_command): Pass thread to set_step_info call.
This commit is contained in:
Simon Marchi 2020-03-06 18:04:52 -05:00 committed by Simon Marchi
parent b7d64b2909
commit 29734269a7
4 changed files with 49 additions and 23 deletions

View File

@ -1,3 +1,21 @@
2020-03-06 Simon Marchi <simon.marchi@polymtl.ca>
* infrun.h: Forward-declare thread_info.
(set_step_info): Add thread_info parameter, add doc.
* infrun.c (set_step_info): Add thread_info parameter, move doc
to header.
* infrun.c (process_event_stop_test): Pass thread to
set_step_info call.
* infcmd.c (set_step_frame): Add thread_info pointer, pass it to
set_step_info.
(prepare_one_step): Add thread_info parameter, pass it to
set_step_frame and prepare_one_step (recursive) call.
(step_1): Pass thread to prepare_one_step call.
(step_command_fsm::should_stop): Pass thread to
prepare_one_step.
(until_next_fsm): Pass thread to set_step_frame call.
(finish_command): Pass thread to set_step_info call.
2020-03-06 Hannes Domani <ssbssa@yahoo.de> 2020-03-06 Hannes Domani <ssbssa@yahoo.de>
* windows-tdep.c (windows_solib_create_inferior_hook): * windows-tdep.c (windows_solib_create_inferior_hook):

View File

@ -914,18 +914,21 @@ continue_command (const char *args, int from_tty)
continue_1 (all_threads_p); continue_1 (all_threads_p);
} }
/* Record the starting point of a "step" or "next" command. */ /* Record in TP the starting point of a "step" or "next" command. */
static void static void
set_step_frame (void) set_step_frame (thread_info *tp)
{ {
/* This can be removed once this function no longer implicitly relies on the
inferior_ptid value. */
gdb_assert (inferior_ptid == tp->ptid);
frame_info *frame = get_current_frame (); frame_info *frame = get_current_frame ();
symtab_and_line sal = find_frame_sal (frame); symtab_and_line sal = find_frame_sal (frame);
set_step_info (frame, sal); set_step_info (tp, frame, sal);
CORE_ADDR pc = get_frame_pc (frame); CORE_ADDR pc = get_frame_pc (frame);
thread_info *tp = inferior_thread ();
tp->control.step_start_function = find_pc_function (pc); tp->control.step_start_function = find_pc_function (pc);
} }
@ -1002,7 +1005,7 @@ step_command_fsm_prepare (struct step_command_fsm *sm,
thread->control.stepping_command = 1; thread->control.stepping_command = 1;
} }
static int prepare_one_step (struct step_command_fsm *sm); static int prepare_one_step (thread_info *, struct step_command_fsm *sm);
static void static void
step_1 (int skip_subroutines, int single_inst, const char *count_string) step_1 (int skip_subroutines, int single_inst, const char *count_string)
@ -1040,7 +1043,7 @@ step_1 (int skip_subroutines, int single_inst, const char *count_string)
loop. Let the continuation figure out how many other steps we loop. Let the continuation figure out how many other steps we
need to do, and handle them one at the time, through need to do, and handle them one at the time, through
step_once. */ step_once. */
if (!prepare_one_step (step_sm)) if (!prepare_one_step (thr, step_sm))
proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT); proceed ((CORE_ADDR) -1, GDB_SIGNAL_DEFAULT);
else else
{ {
@ -1070,7 +1073,7 @@ step_command_fsm::should_stop (struct thread_info *tp)
/* There are more steps to make, and we did stop due to /* There are more steps to make, and we did stop due to
ending a stepping range. Do another step. */ ending a stepping range. Do another step. */
if (--count > 0) if (--count > 0)
return prepare_one_step (this); return prepare_one_step (tp, this);
set_finished (); set_finished ();
} }
@ -1102,19 +1105,17 @@ step_command_fsm::do_async_reply_reason ()
resumed. */ resumed. */
static int static int
prepare_one_step (struct step_command_fsm *sm) prepare_one_step (thread_info *tp, struct step_command_fsm *sm)
{ {
/* This can be removed once this function no longer implicitly relies on the
inferior_ptid value. */
gdb_assert (inferior_ptid == tp->ptid);
if (sm->count > 0) if (sm->count > 0)
{ {
struct frame_info *frame = get_current_frame (); struct frame_info *frame = get_current_frame ();
/* Don't assume THREAD is a valid thread id. It is set to -1 if set_step_frame (tp);
the longjmp breakpoint was not required. Use the
INFERIOR_PTID thread instead, which is the same thread when
THREAD is set. */
struct thread_info *tp = inferior_thread ();
set_step_frame ();
if (!sm->single_inst) if (!sm->single_inst)
{ {
@ -1146,7 +1147,7 @@ prepare_one_step (struct step_command_fsm *sm)
|| !function_name_is_marked_for_skip (fn, sal)) || !function_name_is_marked_for_skip (fn, sal))
{ {
sm->count--; sm->count--;
return prepare_one_step (sm); return prepare_one_step (tp, sm);
} }
} }
@ -1488,7 +1489,7 @@ until_next_command (int from_tty)
struct until_next_fsm *sm; struct until_next_fsm *sm;
clear_proceed_status (0); clear_proceed_status (0);
set_step_frame (); set_step_frame (tp);
frame = get_current_frame (); frame = get_current_frame ();
@ -1945,7 +1946,7 @@ finish_command (const char *arg, int from_tty)
called by that frame. We don't use the magic "1" value for called by that frame. We don't use the magic "1" value for
step_range_end, because then infrun will think this is nexti, step_range_end, because then infrun will think this is nexti,
and not step over the rest of this inlined function call. */ and not step over the rest of this inlined function call. */
set_step_info (frame, {}); set_step_info (tp, frame, {});
tp->control.step_range_start = get_frame_pc (frame); tp->control.step_range_start = get_frame_pc (frame);
tp->control.step_range_end = tp->control.step_range_start; tp->control.step_range_end = tp->control.step_range_start;
tp->control.step_over_calls = STEP_OVER_ALL; tp->control.step_over_calls = STEP_OVER_ALL;

View File

@ -4102,11 +4102,15 @@ fetch_inferior_event (void *client_data)
printf_unfiltered (_("completed.\n")); printf_unfiltered (_("completed.\n"));
} }
/* Record the frame and location we're currently stepping through. */ /* See infrun.h. */
void void
set_step_info (struct frame_info *frame, struct symtab_and_line sal) set_step_info (thread_info *tp, struct frame_info *frame,
struct symtab_and_line sal)
{ {
struct thread_info *tp = inferior_thread (); /* This can be removed once this function no longer implicitly relies on the
inferior_ptid value. */
gdb_assert (inferior_ptid == tp->ptid);
tp->control.step_frame_id = get_frame_id (frame); tp->control.step_frame_id = get_frame_id (frame);
tp->control.step_stack_frame_id = get_stack_frame_id (frame); tp->control.step_stack_frame_id = get_stack_frame_id (frame);
@ -7200,7 +7204,7 @@ process_event_stop_test (struct execution_control_state *ecs)
ecs->event_thread->control.step_range_start = stop_pc_sal.pc; ecs->event_thread->control.step_range_start = stop_pc_sal.pc;
ecs->event_thread->control.step_range_end = stop_pc_sal.end; ecs->event_thread->control.step_range_end = stop_pc_sal.end;
ecs->event_thread->control.may_range_step = 1; ecs->event_thread->control.may_range_step = 1;
set_step_info (frame, stop_pc_sal); set_step_info (ecs->event_thread, frame, stop_pc_sal);
if (debug_infrun) if (debug_infrun)
fprintf_unfiltered (gdb_stdlog, "infrun: keep going\n"); fprintf_unfiltered (gdb_stdlog, "infrun: keep going\n");

View File

@ -26,6 +26,7 @@ struct frame_info;
struct address_space; struct address_space;
struct return_value_info; struct return_value_info;
struct process_stratum_target; struct process_stratum_target;
struct thread_info;
/* True if we are debugging run control. */ /* True if we are debugging run control. */
extern unsigned int debug_infrun; extern unsigned int debug_infrun;
@ -150,7 +151,9 @@ extern int thread_is_stepping_over_breakpoint (int thread);
triggers a non-steppable watchpoint. */ triggers a non-steppable watchpoint. */
extern int stepping_past_nonsteppable_watchpoint (void); extern int stepping_past_nonsteppable_watchpoint (void);
extern void set_step_info (struct frame_info *frame, /* Record in TP the frame and location we're currently stepping through. */
extern void set_step_info (thread_info *tp,
struct frame_info *frame,
struct symtab_and_line sal); struct symtab_and_line sal);
/* Several print_*_reason helper functions to print why the inferior /* Several print_*_reason helper functions to print why the inferior