gdb: stop trying to prepare displaced steps for an inferior when it returns _UNAVAILABLE
authorSimon Marchi <simon.marchi@efficios.com>
Mon, 16 Mar 2020 21:21:55 +0000 (17:21 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 4 Jun 2020 19:04:21 +0000 (15:04 -0400)
Once we got one _UNAVAILABLE for a given inferior, don't try to prepare
other threads for displaced stepping for that inferior during this
execution of start_step_over.

gdb/displaced-stepping.h
gdb/infrun.c

index 0cb2d8c97071e97b0afb692de5afa89cf2a3ed61..835fd92086bad096ec85b4fc42db8720c81dc6ba 100644 (file)
@@ -67,6 +67,8 @@ struct displaced_step_inferior_state
   /* True if preparing a displaced step ever failed.  If so, we won't
      try displaced stepping for this inferior again.  */
   bool failed_before;
+
+  bool unavailable = false;
 };
 
 /* Per-thread displaced stepping state.  */
index 17c342be50971433ad82a36e84be7dad2f8a97f2..ec06e5703bea7f6ea5d295320bebbb17e8e8b5e5 100644 (file)
@@ -1748,6 +1748,7 @@ displaced_step_prepare_throw (thread_info *tp)
                            target_pid_to_str (tp->ptid).c_str ());
 
       global_thread_step_over_chain_enqueue (tp);
+      tp->inf->displaced_step_state.unavailable = true;
 
       return DISPLACED_STEP_PREPARE_STATUS_UNAVAILABLE;
     }
@@ -1937,6 +1938,9 @@ start_step_over (void)
                        "infrun: stealing list of %d threads to step from global queue\n",
                        thread_step_over_chain_length (threads_to_step));
 
+  for (inferior *inf : all_inferiors ())
+    inf->displaced_step_state.unavailable = false;
+
   for (tp = threads_to_step; tp != NULL; tp = next)
     {
       struct execution_control_state ecss;
@@ -1986,6 +1990,12 @@ start_step_over (void)
       if (!target_is_non_stop_p () && !step_what)
        continue;
 
+      if (tp->inf->displaced_step_state.unavailable)
+       {
+         global_thread_step_over_chain_enqueue (tp);
+         continue;
+       }
+
       switch_to_thread (tp);
       reset_ecs (ecs, tp);
       keep_going_pass_signal (ecs);
This page took 0.030981 seconds and 4 git commands to generate.