Make step_start_function be per thread
authorPedro Alves <palves@redhat.com>
Tue, 24 Mar 2015 17:50:30 +0000 (17:50 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 24 Mar 2015 17:50:30 +0000 (17:50 +0000)
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.

gdb/ChangeLog
gdb/gdbthread.h
gdb/infrun.c

index 0bb5aebcd8ffc784facdc66f4a382b78882d515a..d131d9acef420870e7d075629a66ba01fb9ab0b1 100644 (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.
index e9ae47df1c15a5d73d90616090c0690a83be092c..ce4f76f7b7fa8ec7fb5671bd13c7a8ec1fc9d840 100644 (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
index ed4ba79787c41e928821f02e5872fbec663e5800..be1cc748b1a96bf989abb590ba08525006ffc281 100644 (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;