Small clean up of use_displaced_stepping

This function returns the result of a quite big condition.  I think it
would be more readeable if it was broken up in smaller pieces and
commented.  This is what this patch does.

I also introduced gdbarch_supports_displaced_stepping, since it shows
the intent better than checking for gdbarch_displaced_step_copy_insn_p.
I also used that new function in displaced_step_prepare_throw.

I also updated the comment on top of can_use_displaced_stepping, which
seemed a bit outdated with respect to non-stop.  The comment likely
dates from before it was possible to have targets that always operate
non-stop under the hood, even when the user-visible mode is all-stop.

No functional changes intended.

gdb/ChangeLog:

	* infrun.c (gdbarch_supports_displaced_stepping): New.
	(use_displaced_stepping): Break up conditions in smaller pieces.
	Use gdbarch_supports_displaced_stepping.
	(displaced_step_prepare_throw): Use
	gdbarch_supports_displaced_stepping.
This commit is contained in:
Simon Marchi 2020-03-02 15:47:04 -05:00 committed by Simon Marchi
parent 63e163f24f
commit 9822cb57f7
2 changed files with 50 additions and 13 deletions

View file

@ -1,3 +1,11 @@
2020-03-02 Simon Marchi <simon.marchi@polymtl.ca>
* infrun.c (gdbarch_supports_displaced_stepping): New.
(use_displaced_stepping): Break up conditions in smaller pieces.
Use gdbarch_supports_displaced_stepping.
(displaced_step_prepare_throw): Use
gdbarch_supports_displaced_stepping.
2020-03-02 Andrew Burgess <andrew.burgess@embecosm.com> 2020-03-02 Andrew Burgess <andrew.burgess@embecosm.com>
* NEWS: Mention new behaviour of the history filename. * NEWS: Mention new behaviour of the history filename.

View file

@ -1556,8 +1556,7 @@ infrun_inferior_exit (struct inferior *inf)
doesn't support it, GDB will instead use the traditional doesn't support it, GDB will instead use the traditional
hold-and-step approach. If AUTO (which is the default), GDB will hold-and-step approach. If AUTO (which is the default), GDB will
decide which technique to use to step over breakpoints depending on decide which technique to use to step over breakpoints depending on
which of all-stop or non-stop mode is active --- displaced stepping whether the target works in a non-stop way (see use_displaced_stepping). */
in non-stop mode; hold-and-step in all-stop mode. */
static enum auto_boolean can_use_displaced_stepping = AUTO_BOOLEAN_AUTO; static enum auto_boolean can_use_displaced_stepping = AUTO_BOOLEAN_AUTO;
@ -1577,23 +1576,53 @@ show_can_use_displaced_stepping (struct ui_file *file, int from_tty,
"to step over breakpoints is %s.\n"), value); "to step over breakpoints is %s.\n"), value);
} }
/* Return true if the gdbarch implements the required methods to use
displaced stepping. */
static bool
gdbarch_supports_displaced_stepping (gdbarch *arch)
{
/* Only check for the presence of step_copy_insn. Other required methods
are checked by the gdbarch validation. */
return gdbarch_displaced_step_copy_insn_p (arch);
}
/* Return non-zero if displaced stepping can/should be used to step /* Return non-zero if displaced stepping can/should be used to step
over breakpoints of thread TP. */ over breakpoints of thread TP. */
static int static bool
use_displaced_stepping (struct thread_info *tp) use_displaced_stepping (thread_info *tp)
{ {
struct regcache *regcache = get_thread_regcache (tp); /* If the user disabled it explicitly, don't use displaced stepping. */
struct gdbarch *gdbarch = regcache->arch (); if (can_use_displaced_stepping == AUTO_BOOLEAN_FALSE)
return false;
/* If "auto", only use displaced stepping if the target operates in a non-stop
way. */
if (can_use_displaced_stepping == AUTO_BOOLEAN_AUTO
&& !target_is_non_stop_p ())
return false;
gdbarch *gdbarch = get_thread_regcache (tp)->arch ();
/* If the architecture doesn't implement displaced stepping, don't use
it. */
if (!gdbarch_supports_displaced_stepping (gdbarch))
return false;
/* If recording, don't use displaced stepping. */
if (find_record_target () != nullptr)
return false;
displaced_step_inferior_state *displaced_state displaced_step_inferior_state *displaced_state
= get_displaced_stepping_state (tp->inf); = get_displaced_stepping_state (tp->inf);
return (((can_use_displaced_stepping == AUTO_BOOLEAN_AUTO /* If displaced stepping failed before for this inferior, don't bother trying
&& target_is_non_stop_p ()) again. */
|| can_use_displaced_stepping == AUTO_BOOLEAN_TRUE) if (displaced_state->failed_before)
&& gdbarch_displaced_step_copy_insn_p (gdbarch) return false;
&& find_record_target () == NULL
&& !displaced_state->failed_before); return true;
} }
/* Simple function wrapper around displaced_step_inferior_state::reset. */ /* Simple function wrapper around displaced_step_inferior_state::reset. */
@ -1650,7 +1679,7 @@ displaced_step_prepare_throw (thread_info *tp)
/* We should never reach this function if the architecture does not /* We should never reach this function if the architecture does not
support displaced stepping. */ support displaced stepping. */
gdb_assert (gdbarch_displaced_step_copy_insn_p (gdbarch)); gdb_assert (gdbarch_supports_displaced_stepping (gdbarch));
/* Nor if the thread isn't meant to step over a breakpoint. */ /* Nor if the thread isn't meant to step over a breakpoint. */
gdb_assert (tp->control.trap_expected); gdb_assert (tp->control.trap_expected);