diff options
author | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2020-04-02 15:11:26 +0200 |
---|---|---|
committer | Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> | 2020-04-02 15:11:26 +0200 |
commit | 7582c77c1d2cab3f53b70697529c1644ceeb94a2 (patch) | |
tree | 12a99919ee6846daf70b83723c9b416d19a9f73b /gdbserver/linux-low.cc | |
parent | 3ca4edb6617353defacd3bf3a4ee3d458238419e (diff) | |
download | gdb-7582c77c1d2cab3f53b70697529c1644ceeb94a2.zip gdb-7582c77c1d2cab3f53b70697529c1644ceeb94a2.tar.gz gdb-7582c77c1d2cab3f53b70697529c1644ceeb94a2.tar.bz2 |
gdbserver/linux-low: turn 'supports_software_single_step' and 'get_next_pcs' into methods
gdbserver/ChangeLog:
2020-04-02 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
Remove the 'supports_software_single_step' linux target op and let
the concrete linux target define it by overriding the op in
process_stratum_target.
Turn the 'get_next_pcs' linux target op into a method of
linux_process_target.
* linux-low.h (struct linux_target_ops): Remove the ops.
(class linux_process_target) <supports_software_single_step>:
Remove.
<low_get_next_pcs>: Declare.
* linux-low.cc (can_software_single_step): Remove.
(linux_process_target::low_get_next_pcs): Define.
(linux_process_target::supports_software_single_step): Remove.
Update the callers below.
(linux_process_target::handle_extended_wait)
(linux_process_target::wait_1)
(linux_process_target::install_software_single_step_breakpoints)
(linux_process_target::single_step)
(linux_process_target::thread_needs_step_over)
(linux_process_target::proceed_one_lwp)
(linux_process_target::supports_range_stepping)
* linux-x86-low.cc (the_low_target): Remove the op field.
* linux-aarch64-low.cc (the_low_target): Ditto.
* linux-bfin-low.cc (the_low_target): Ditto.
* linux-cris-low.cc (the_low_target): Ditto.
* linux-crisv32-low.cc (the_low_target): Ditto.
* linux-m32r-low.cc (the_low_target): Ditto.
* linux-m68k-low.cc (the_low_target): Ditto.
* linux-mips-low.cc (the_low_target): Ditto.
* linux-nios2-low.cc (the_low_target): Ditto.
* linux-ppc-low.cc (the_low_target): Ditto.
* linux-riscv-low.cc (the_low_target): Ditto.
* linux-s390-low.cc (the_low_target): Ditto.
* linux-sh-low.cc (the_low_target): Ditto.
* linux-sparc-low.cc (the_low_target): Ditto.
* linux-tic6x-low.cc (the_low_target): Ditto.
* linux-tile-low.cc (the_low_target): Ditto.
* linux-xtensa-low.cc (the_low_target): Ditto.
* linux-arm-low.cc (class arm_target) <low_get_next_pcs>
<supports_software_single_step>: Declare.
(arm_target::supports_software_single_step): Define.
(arm_gdbserver_get_next_pcs): Turn into...
(arm_target::low_get_next_pcs): ...this.
(the_low_target): Remove the op field.
Diffstat (limited to 'gdbserver/linux-low.cc')
-rw-r--r-- | gdbserver/linux-low.cc | 42 |
1 files changed, 17 insertions, 25 deletions
diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 14a4dbf..8eca077 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -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); @@ -5911,12 +5909,6 @@ linux_process_target::supports_hardware_single_step () } bool -linux_process_target::supports_software_single_step () -{ - return can_software_single_step (); -} - -bool linux_process_target::stopped_by_watchpoint () { struct lwp_info *lwp = get_thread_lwp (current_thread); @@ -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; |