From patchwork Fri Mar 6 21:31:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Aktemur, Tankut Baris" X-Patchwork-Id: 38502 Received: (qmail 53224 invoked by alias); 6 Mar 2020 21:32:44 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 52672 invoked by uid 89); 6 Mar 2020 21:32:39 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.6 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy= X-HELO: mga03.intel.com Received: from mga03.intel.com (HELO mga03.intel.com) (134.134.136.65) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 06 Mar 2020 21:32:24 +0000 Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Mar 2020 13:32:19 -0800 Received: from irvmail001.ir.intel.com ([163.33.26.43]) by fmsmga005.fm.intel.com with ESMTP; 06 Mar 2020 13:32:18 -0800 Received: from ulvlx001.iul.intel.com (ulvlx001.iul.intel.com [172.28.207.17]) by irvmail001.ir.intel.com (8.14.3/8.13.6/MailSET/Hub) with ESMTP id 026LWH1u022458; Fri, 6 Mar 2020 21:32:17 GMT Received: from ulvlx001.iul.intel.com (localhost [127.0.0.1]) by ulvlx001.iul.intel.com with ESMTP id 026LWHKS020425; Fri, 6 Mar 2020 22:32:17 +0100 Received: (from taktemur@localhost) by ulvlx001.iul.intel.com with LOCAL id 026LWHEZ020421; Fri, 6 Mar 2020 22:32:17 +0100 From: Tankut Baris Aktemur To: gdb-patches@sourceware.org Subject: [PATCH 12/31] gdbserver/linux-low: turn 'supports_software_single_step' and 'get_next_pcs' into methods Date: Fri, 6 Mar 2020 22:31:20 +0100 Message-Id: <767d7aaa1466707c0ea9d85c7313a0ccbe5ae9be.1583529167.git.tankut.baris.aktemur@intel.com> In-Reply-To: References: In-Reply-To: References: X-IsSubscribed: yes gdbserver/ChangeLog: 2020-03-06 Tankut Baris Aktemur 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) : Remove. : 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) : 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. --- gdbserver/linux-aarch64-low.cc | 1 - gdbserver/linux-arm-low.cc | 15 +++++++++--- gdbserver/linux-bfin-low.cc | 1 - gdbserver/linux-cris-low.cc | 1 - gdbserver/linux-crisv32-low.cc | 1 - gdbserver/linux-low.cc | 42 ++++++++++++++-------------------- gdbserver/linux-low.h | 10 ++++---- gdbserver/linux-m32r-low.cc | 1 - gdbserver/linux-m68k-low.cc | 1 - gdbserver/linux-mips-low.cc | 1 - gdbserver/linux-nios2-low.cc | 1 - gdbserver/linux-ppc-low.cc | 1 - gdbserver/linux-riscv-low.cc | 1 - gdbserver/linux-s390-low.cc | 1 - gdbserver/linux-sh-low.cc | 1 - gdbserver/linux-sparc-low.cc | 1 - gdbserver/linux-tic6x-low.cc | 1 - gdbserver/linux-tile-low.cc | 1 - gdbserver/linux-x86-low.cc | 1 - gdbserver/linux-xtensa-low.cc | 1 - 20 files changed, 34 insertions(+), 50 deletions(-) diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc index 23c9c3e2518..11c3296eb6b 100644 --- a/gdbserver/linux-aarch64-low.cc +++ b/gdbserver/linux-aarch64-low.cc @@ -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, diff --git a/gdbserver/linux-arm-low.cc b/gdbserver/linux-arm-low.cc index aab2c427f5a..bd42feba1c4 100644 --- a/gdbserver/linux-arm-low.cc +++ b/gdbserver/linux-arm-low.cc @@ -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 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 -arm_gdbserver_get_next_pcs (struct regcache *regcache) +std::vector +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, diff --git a/gdbserver/linux-bfin-low.cc b/gdbserver/linux-bfin-low.cc index c798c9317f2..17948ed16f0 100644 --- a/gdbserver/linux-bfin-low.cc +++ b/gdbserver/linux-bfin-low.cc @@ -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 */ diff --git a/gdbserver/linux-cris-low.cc b/gdbserver/linux-cris-low.cc index a22ec3342dc..99060de1765 100644 --- a/gdbserver/linux-cris-low.cc +++ b/gdbserver/linux-cris-low.cc @@ -158,7 +158,6 @@ cris_target::get_regs_info () } struct linux_target_ops the_low_target = { - NULL, /* get_next_pcs */ 0, cris_breakpoint_at, }; diff --git a/gdbserver/linux-crisv32-low.cc b/gdbserver/linux-crisv32-low.cc index 965f186981d..c75e428885e 100644 --- a/gdbserver/linux-crisv32-low.cc +++ b/gdbserver/linux-crisv32-low.cc @@ -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, diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 14a4dbf0866..8eca077180e 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 +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 next_pcs = the_low_target.get_next_pcs (regcache); + std::vector 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; diff --git a/gdbserver/linux-low.h b/gdbserver/linux-low.h index b2f779893e3..2202a658225 100644 --- a/gdbserver/linux-low.h +++ b/gdbserver/linux-low.h @@ -131,9 +131,6 @@ struct lwp_info; struct linux_target_ops { - /* Find the next possible PCs after the current instruction executes. */ - std::vector (*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 low_get_next_pcs (regcache *regcache); }; extern linux_process_target *the_linux_target; diff --git a/gdbserver/linux-m32r-low.cc b/gdbserver/linux-m32r-low.cc index 1a6771f5845..78e002dfb24 100644 --- a/gdbserver/linux-m32r-low.cc +++ b/gdbserver/linux-m32r-low.cc @@ -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 */ diff --git a/gdbserver/linux-m68k-low.cc b/gdbserver/linux-m68k-low.cc index 5e19ab02094..00851af5f02 100644 --- a/gdbserver/linux-m68k-low.cc +++ b/gdbserver/linux-m68k-low.cc @@ -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 */ diff --git a/gdbserver/linux-mips-low.cc b/gdbserver/linux-mips-low.cc index 972f431bfbd..710245c1610 100644 --- a/gdbserver/linux-mips-low.cc +++ b/gdbserver/linux-mips-low.cc @@ -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, diff --git a/gdbserver/linux-nios2-low.cc b/gdbserver/linux-nios2-low.cc index 693af71f29e..3cae8dac285 100644 --- a/gdbserver/linux-nios2-low.cc +++ b/gdbserver/linux-nios2-low.cc @@ -277,7 +277,6 @@ nios2_target::get_regs_info () struct linux_target_ops the_low_target = { - NULL, /* get_next_pcs */ 0, nios2_breakpoint_at, }; diff --git a/gdbserver/linux-ppc-low.cc b/gdbserver/linux-ppc-low.cc index 9690d79f3d8..af9dc0b2adf 100644 --- a/gdbserver/linux-ppc-low.cc +++ b/gdbserver/linux-ppc-low.cc @@ -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, diff --git a/gdbserver/linux-riscv-low.cc b/gdbserver/linux-riscv-low.cc index c25519301c4..31401dbdbbe 100644 --- a/gdbserver/linux-riscv-low.cc +++ b/gdbserver/linux-riscv-low.cc @@ -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, }; diff --git a/gdbserver/linux-s390-low.cc b/gdbserver/linux-s390-low.cc index 164142dff6e..4c4b877bb75 100644 --- a/gdbserver/linux-s390-low.cc +++ b/gdbserver/linux-s390-low.cc @@ -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, diff --git a/gdbserver/linux-sh-low.cc b/gdbserver/linux-sh-low.cc index 10ee49a5f87..47242dafe94 100644 --- a/gdbserver/linux-sh-low.cc +++ b/gdbserver/linux-sh-low.cc @@ -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 */ diff --git a/gdbserver/linux-sparc-low.cc b/gdbserver/linux-sparc-low.cc index c94c3e3caf3..f724cb88b71 100644 --- a/gdbserver/linux-sparc-low.cc +++ b/gdbserver/linux-sparc-low.cc @@ -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 */ diff --git a/gdbserver/linux-tic6x-low.cc b/gdbserver/linux-tic6x-low.cc index 69bb4f3d7b1..347b79e6519 100644 --- a/gdbserver/linux-tic6x-low.cc +++ b/gdbserver/linux-tic6x-low.cc @@ -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 */ diff --git a/gdbserver/linux-tile-low.cc b/gdbserver/linux-tile-low.cc index e4565b4cfbe..86191b9bb1c 100644 --- a/gdbserver/linux-tile-low.cc +++ b/gdbserver/linux-tile-low.cc @@ -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 */ diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc index a9d7ec06705..59c6b386d11 100644 --- a/gdbserver/linux-x86-low.cc +++ b/gdbserver/linux-x86-low.cc @@ -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, diff --git a/gdbserver/linux-xtensa-low.cc b/gdbserver/linux-xtensa-low.cc index ab08227a862..320ac92968d 100644 --- a/gdbserver/linux-xtensa-low.cc +++ b/gdbserver/linux-xtensa-low.cc @@ -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 */