@@ -3103,7 +3103,6 @@ aarch64_supports_hardware_single_step (void)
struct linux_target_ops the_low_target =
{
- NULL, /* get_next_pcs */
0, /* decr_pc_after_break */
aarch64_breakpoint_at,
aarch64_supports_z_point_type,
@@ -68,6 +68,8 @@ public:
const gdb_byte *sw_breakpoint_from_kind (int kind, int *size) override;
+ bool supports_software_single_step () override;
+
protected:
void low_arch_setup () override;
@@ -81,6 +83,8 @@ protected:
CORE_ADDR low_get_pc (regcache *regcache) override;
void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
+
+ std::vector<CORE_ADDR> low_get_next_pcs (regcache *regcache) override;
};
/* The singleton target ops object. */
@@ -968,10 +972,16 @@ arm_target::low_arch_setup ()
have_ptrace_getregset = 0;
}
+bool
+arm_target::supports_software_single_step ()
+{
+ return true;
+}
+
/* Fetch the next possible PCs after the current instruction executes. */
-static std::vector<CORE_ADDR>
-arm_gdbserver_get_next_pcs (struct regcache *regcache)
+std::vector<CORE_ADDR>
+arm_target::low_get_next_pcs (regcache *regcache)
{
struct arm_get_next_pcs next_pcs_ctx;
@@ -1075,7 +1085,6 @@ arm_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- arm_gdbserver_get_next_pcs,
0,
arm_breakpoint_at,
arm_supports_z_point_type,
@@ -161,7 +161,6 @@ bfin_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* get_next_pcs */
2,
bfin_breakpoint_at,
NULL, /* supports_z_point_type */
@@ -158,7 +158,6 @@ cris_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* get_next_pcs */
0,
cris_breakpoint_at,
};
@@ -455,7 +455,6 @@ crisv32_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* get_next_pcs */
0,
cris_breakpoint_at,
cris_supports_z_point_type,
@@ -292,15 +292,6 @@ can_hardware_single_step (void)
return 0;
}
-/* True if the low target can software single-step. Such targets
- implement the GET_NEXT_PCS callback. */
-
-static int
-can_software_single_step (void)
-{
- return (the_low_target.get_next_pcs != NULL);
-}
-
bool
linux_process_target::low_supports_breakpoints ()
{
@@ -319,6 +310,13 @@ linux_process_target::low_set_pc (regcache *regcache, CORE_ADDR newpc)
gdb_assert_not_reached ("linux target op low_set_pc is not implemented");
}
+std::vector<CORE_ADDR>
+linux_process_target::low_get_next_pcs (regcache *regcache)
+{
+ gdb_assert_not_reached ("linux target op low_get_next_pcs is not "
+ "implemented");
+}
+
/* Returns true if this target can support fast tracepoints. This
does not mean that the in-process agent has been loaded in the
inferior. */
@@ -551,7 +549,7 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
child_proc->attached = parent_proc->attached;
if (event_lwp->bp_reinsert != 0
- && can_software_single_step ()
+ && supports_software_single_step ()
&& event == PTRACE_EVENT_VFORK)
{
/* If we leave single-step breakpoints there, child will
@@ -596,7 +594,7 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
In case of vfork, we'll reinsert them back once vforked
child is done. */
if (event_lwp->bp_reinsert != 0
- && can_software_single_step ())
+ && supports_software_single_step ())
{
/* The child process is forked and stopped, so it is safe
to access its memory without stopping all other threads
@@ -660,7 +658,7 @@ linux_process_target::handle_extended_wait (lwp_info **orig_event_lwp,
{
event_lwp->waitstatus.kind = TARGET_WAITKIND_VFORK_DONE;
- if (event_lwp->bp_reinsert != 0 && can_software_single_step ())
+ if (event_lwp->bp_reinsert != 0 && supports_software_single_step ())
{
reinsert_single_step_breakpoints (event_thr);
@@ -3508,7 +3506,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
/* Remove the single-step breakpoints if any. Note that
there isn't single-step breakpoint if we finished stepping
over. */
- if (can_software_single_step ()
+ if (supports_software_single_step ()
&& has_single_step_breakpoints (current_thread))
{
stop_all_lwps (0, event_child);
@@ -3555,7 +3553,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
/* Alright, we're going to report a stop. */
/* Remove single-step breakpoints. */
- if (can_software_single_step ())
+ if (supports_software_single_step ())
{
/* Remove single-step breakpoints or not. It it is true, stop all
lwps, so that other threads won't hit the breakpoint in the
@@ -4116,7 +4114,7 @@ linux_process_target::install_software_single_step_breakpoints (lwp_info *lwp)
scoped_restore save_current_thread = make_scoped_restore (¤t_thread);
current_thread = thread;
- std::vector<CORE_ADDR> next_pcs = the_low_target.get_next_pcs (regcache);
+ std::vector<CORE_ADDR> next_pcs = low_get_next_pcs (regcache);
for (CORE_ADDR pc : next_pcs)
set_single_step_breakpoint (pc, current_ptid);
@@ -4131,7 +4129,7 @@ linux_process_target::single_step (lwp_info* lwp)
{
step = 1;
}
- else if (can_software_single_step ())
+ else if (supports_software_single_step ())
{
install_software_single_step_breakpoints (lwp);
step = 0;
@@ -4610,7 +4608,7 @@ linux_process_target::thread_needs_step_over (thread_info *thread)
/* On software single step target, resume the inferior with signal
rather than stepping over. */
- if (can_software_single_step ()
+ if (supports_software_single_step ()
&& lwp->pending_signals != NULL
&& lwp_signal_can_be_delivered (lwp))
{
@@ -5042,7 +5040,7 @@ linux_process_target::proceed_one_lwp (thread_info *thread, lwp_info *except)
/* If resume_step is requested by GDB, install single-step
breakpoints when the thread is about to be actually resumed if
the single-step breakpoints weren't removed. */
- if (can_software_single_step ()
+ if (supports_software_single_step ()
&& !has_single_step_breakpoints (thread))
install_software_single_step_breakpoints (lwp);
@@ -5910,12 +5908,6 @@ linux_process_target::supports_hardware_single_step ()
return can_hardware_single_step ();
}
-bool
-linux_process_target::supports_software_single_step ()
-{
- return can_software_single_step ();
-}
-
bool
linux_process_target::stopped_by_watchpoint ()
{
@@ -6299,7 +6291,7 @@ linux_process_target::supports_agent ()
bool
linux_process_target::supports_range_stepping ()
{
- if (can_software_single_step ())
+ if (supports_software_single_step ())
return true;
if (*the_low_target.supports_range_stepping == NULL)
return false;
@@ -131,9 +131,6 @@ struct lwp_info;
struct linux_target_ops
{
- /* Find the next possible PCs after the current instruction executes. */
- std::vector<CORE_ADDR> (*get_next_pcs) (struct regcache *regcache);
-
int decr_pc_after_break;
int (*breakpoint_at) (CORE_ADDR pc);
@@ -440,8 +437,6 @@ class linux_process_target : public process_stratum_target
int *handle_len) override;
#endif
- bool supports_software_single_step () override;
-
bool supports_catch_syscall () override;
int get_ipa_tdesc_idx () override;
@@ -666,6 +661,11 @@ class linux_process_target : public process_stratum_target
virtual CORE_ADDR low_get_pc (regcache *regcache);
virtual void low_set_pc (regcache *regcache, CORE_ADDR newpc);
+
+ /* Find the next possible PCs after the current instruction executes.
+ Targets that override this method should also override
+ 'supports_software_single_step' to return true. */
+ virtual std::vector<CORE_ADDR> low_get_next_pcs (regcache *regcache);
};
extern linux_process_target *the_linux_target;
@@ -160,7 +160,6 @@ m32r_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL,
0,
m32r_breakpoint_at,
NULL, /* supports_z_point_type */
@@ -255,7 +255,6 @@ m68k_supports_hardware_single_step (void)
}
struct linux_target_ops the_low_target = {
- NULL,
2,
m68k_breakpoint_at,
NULL, /* supports_z_point_type */
@@ -966,7 +966,6 @@ mips_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* get_next_pcs */
0,
mips_breakpoint_at,
mips_supports_z_point_type,
@@ -277,7 +277,6 @@ nios2_target::get_regs_info ()
struct linux_target_ops the_low_target =
{
- NULL, /* get_next_pcs */
0,
nios2_breakpoint_at,
};
@@ -3406,7 +3406,6 @@ ppc_get_ipa_tdesc_idx (void)
}
struct linux_target_ops the_low_target = {
- NULL,
0,
ppc_breakpoint_at,
ppc_supports_z_point_type,
@@ -309,7 +309,6 @@ riscv_breakpoint_at (CORE_ADDR pc)
/* RISC-V/Linux target operations. */
struct linux_target_ops the_low_target =
{
- NULL, /* get_next_pcs */
0, /* decr_pc_after_break */
riscv_breakpoint_at,
};
@@ -2826,7 +2826,6 @@ s390_emit_ops (void)
}
struct linux_target_ops the_low_target = {
- NULL,
s390_breakpoint_len,
s390_breakpoint_at,
s390_supports_z_point_type,
@@ -190,7 +190,6 @@ sh_target::low_arch_setup ()
}
struct linux_target_ops the_low_target = {
- NULL,
0,
sh_breakpoint_at,
NULL, /* supports_z_point_type */
@@ -339,7 +339,6 @@ sparc_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL, /* get_next_pcs */
0,
sparc_breakpoint_at,
NULL, /* supports_z_point_type */
@@ -421,7 +421,6 @@ tic6x_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL,
0,
tic6x_breakpoint_at,
NULL, /* supports_z_point_type */
@@ -222,7 +222,6 @@ tile_supports_hardware_single_step (void)
struct linux_target_ops the_low_target =
{
- NULL,
0,
tile_breakpoint_at,
NULL, /* supports_z_point_type */
@@ -2899,7 +2899,6 @@ x86_get_ipa_tdesc_idx (void)
struct linux_target_ops the_low_target =
{
- NULL,
1,
x86_breakpoint_at,
x86_supports_z_point_type,
@@ -328,7 +328,6 @@ xtensa_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- NULL,
0,
xtensa_breakpoint_at,
NULL, /* supports_z_point_type */