From: Simon Marchi Date: Mon, 16 Mar 2020 21:21:55 +0000 (-0400) Subject: gdb: stop trying to prepare displaced steps for an inferior when it returns _UNAVAILABLE X-Git-Url: http://git.efficios.com/?p=deliverable%2Fbinutils-gdb.git;a=commitdiff_plain;h=d6864985e9af77d15e7310b1066543eb8bdc5bba gdb: stop trying to prepare displaced steps for an inferior when it returns _UNAVAILABLE 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. --- diff --git a/gdb/displaced-stepping.h b/gdb/displaced-stepping.h index 0cb2d8c970..835fd92086 100644 --- a/gdb/displaced-stepping.h +++ b/gdb/displaced-stepping.h @@ -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. */ diff --git a/gdb/infrun.c b/gdb/infrun.c index 17c342be50..ec06e5703b 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -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);