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:
parent
63e163f24f
commit
9822cb57f7
2 changed files with 50 additions and 13 deletions
|
@ -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.
|
||||||
|
|
55
gdb/infrun.c
55
gdb/infrun.c
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue