Make step_start_function be per thread

I noticed that step_start_function is still a global, while it
obviously should be a per-thread field.

gdb/ChangeLog:
2015-03-24  Pedro Alves  <palves@redhat.com>

	* infrun.c (step_start_function): Delete and ...
	* gdbthread.h (struct thread_control_state) <step_start_function>:
	... now a field here.
	* infrun.c (clear_proceed_status_thread): Clear the thread's
	step_start_function.
	(proceed, process_event_stop_test, print_stop_event): Adjust.
This commit is contained in:
Pedro Alves 2015-03-24 17:50:30 +00:00
parent 3333f03ae1
commit 885eeb5b8e
3 changed files with 17 additions and 7 deletions

View file

@ -1,3 +1,12 @@
2015-03-24 Pedro Alves <palves@redhat.com>
* infrun.c (step_start_function): Delete and ...
* gdbthread.h (struct thread_control_state) <step_start_function>:
... now a field here.
* infrun.c (clear_proceed_status_thread): Clear the thread's
step_start_function.
(proceed, process_event_stop_test, print_stop_event): Adjust.
2015-03-24 Pedro Alves <palves@redhat.com>
* infrun.c (proceed): No longer handle negative step.

View file

@ -73,6 +73,9 @@ struct thread_control_state
CORE_ADDR step_range_start; /* Inclusive */
CORE_ADDR step_range_end; /* Exclusive */
/* Function the thread was in as of last it started stepping. */
struct symbol *step_start_function;
/* If GDB issues a target step request, and this is nonzero, the
target should single-step this thread once, and then continue
single-stepping it without GDB core involvement as long as the

View file

@ -326,10 +326,6 @@ update_signals_program_target (void)
static struct cmd_list_element *stop_command;
/* Function inferior was in as of last step command. */
static struct symbol *step_start_function;
/* Nonzero if we want to give control to the user when we're notified
of shared library events by the dynamic linker. */
int stop_on_solib_events;
@ -2409,6 +2405,7 @@ clear_proceed_status_thread (struct thread_info *tp)
tp->control.step_frame_id = null_frame_id;
tp->control.step_stack_frame_id = null_frame_id;
tp->control.step_over_calls = STEP_OVER_UNDEBUGGABLE;
tp->control.step_start_function = NULL;
tp->stop_requested = 0;
tp->control.stop_step = 0;
@ -2589,7 +2586,7 @@ proceed (CORE_ADDR addr, enum gdb_signal siggnal, int step)
tp = inferior_thread ();
if (step)
step_start_function = find_pc_function (pc);
tp->control.step_start_function = find_pc_function (pc);
/* Fill in with reasonable starting values. */
init_thread_stepping_state (tp);
@ -5171,7 +5168,8 @@ process_event_stop_test (struct execution_control_state *ecs)
ecs->event_thread->control.step_stack_frame_id)
&& (!frame_id_eq (ecs->event_thread->control.step_stack_frame_id,
outer_frame_id)
|| step_start_function != find_pc_function (stop_pc))))
|| (ecs->event_thread->control.step_start_function
!= find_pc_function (stop_pc)))))
{
CORE_ADDR real_stop_pc;
@ -6444,7 +6442,7 @@ print_stop_event (struct target_waitstatus *ws)
if (tp->control.stop_step
&& frame_id_eq (tp->control.step_frame_id,
get_frame_id (get_current_frame ()))
&& step_start_function == find_pc_function (stop_pc))
&& tp->control.step_start_function == find_pc_function (stop_pc))
{
/* Finished step, just print source line. */
source_flag = SRC_LINE;