From ac1bbaca10666fc85572a6deeaa6f1debcd4c129 Mon Sep 17 00:00:00 2001 From: Tankut Baris Aktemur Date: Thu, 2 Apr 2020 15:11:27 +0200 Subject: [PATCH] gdbserver/linux-low: turn watchpoint ops into methods gdbserver/ChangeLog: 2020-04-02 Tankut Baris Aktemur Turn the 'stopped_by_watchpoint' and 'stopped_data_address' linux target ops into methods of linux_process_target. * linux-low.h (struct linux_target_ops): Remove the ops. (class linux_process_target) : Declare. * linux-low.cc (check_stopped_by_watchpoint): Turn into... (linux_process_target::check_stopped_by_watchpoint): ...this. (linux_process_target::low_stopped_by_watchpoint): Define. (linux_process_target::low_stopped_data_address): Define. * linux-x86-low.cc (class x86_target) : Declare. (x86_stopped_by_watchpoint): Turn into... (x86_target::low_stopped_by_watchpoint): ...this. (x86_stopped_data_address): Turn into... (x86_target::low_stopped_data_address): ...this. (the_low_target): Remove the op fields. * linux-aarch64-low.cc (class aarch64_target) : Declare. (aarch64_stopped_by_watchpoint): Turn into... (aarch64_target::low_stopped_by_watchpoint): ...this. (aarch64_stopped_data_address): Turn into... (aarch64_target::low_stopped_data_address): ...this. (the_low_target): Remove the op fields. * linux-arm-low.cc (class arm_target) : Declare. (arm_stopped_by_watchpoint): Turn into... (arm_target::low_stopped_by_watchpoint): ...this. (arm_stopped_data_address): Turn into... (arm_target::low_stopped_data_address): ...this. (the_low_target): Remove the op fields. * linux-crisv32-low.cc (class crisv32_target) : Declare. (cris_stopped_by_watchpoint): Turn into... (crisv32_target::low_stopped_by_watchpoint): ...this. (cris_stopped_data_address): Turn into... (crisv32_target::low_stopped_data_address): ...this. (the_low_target): Remove the op fields. * linux-mips-low.cc (class mips_target) : Declare. (mips_stopped_by_watchpoint): Turn into... (mips_target::low_stopped_by_watchpoint): ...this. (mips_stopped_data_address): Turn into... (mips_target::low_stopped_data_address): ...this. (the_low_target): Remove the op fields. * linux-bfin-low.cc (the_low_target): Remove the op fields. * linux-m32r-low.cc (the_low_target): Ditto. * linux-m68k-low.cc (the_low_target): Ditto. * linux-ppc-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. --- gdbserver/ChangeLog | 61 ++++++++++++++++++++++++++++++++++ gdbserver/linux-aarch64-low.cc | 23 ++++++------- gdbserver/linux-arm-low.cc | 26 ++++++++------- gdbserver/linux-bfin-low.cc | 2 -- gdbserver/linux-crisv32-low.cc | 14 ++++---- gdbserver/linux-low.cc | 57 ++++++++++++------------------- gdbserver/linux-low.h | 23 +++++++++++-- gdbserver/linux-m32r-low.cc | 2 -- gdbserver/linux-m68k-low.cc | 2 -- gdbserver/linux-mips-low.cc | 26 ++++++++------- gdbserver/linux-ppc-low.cc | 2 -- gdbserver/linux-s390-low.cc | 2 -- gdbserver/linux-sh-low.cc | 2 -- gdbserver/linux-sparc-low.cc | 1 - gdbserver/linux-tic6x-low.cc | 2 -- gdbserver/linux-tile-low.cc | 2 -- gdbserver/linux-x86-low.cc | 14 ++++---- gdbserver/linux-xtensa-low.cc | 2 -- 18 files changed, 157 insertions(+), 106 deletions(-) diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog index 45860154721..0b17ea5be26 100644 --- a/gdbserver/ChangeLog +++ b/gdbserver/ChangeLog @@ -1,3 +1,64 @@ +2020-04-02 Tankut Baris Aktemur + + Turn the 'stopped_by_watchpoint' and 'stopped_data_address' linux + target ops into methods of linux_process_target. + + * linux-low.h (struct linux_target_ops): Remove the ops. + (class linux_process_target) + + : Declare. + * linux-low.cc (check_stopped_by_watchpoint): Turn into... + (linux_process_target::check_stopped_by_watchpoint): ...this. + (linux_process_target::low_stopped_by_watchpoint): Define. + (linux_process_target::low_stopped_data_address): Define. + * linux-x86-low.cc (class x86_target) + : Declare. + (x86_stopped_by_watchpoint): Turn into... + (x86_target::low_stopped_by_watchpoint): ...this. + (x86_stopped_data_address): Turn into... + (x86_target::low_stopped_data_address): ...this. + (the_low_target): Remove the op fields. + * linux-aarch64-low.cc (class aarch64_target) + + : Declare. + (aarch64_stopped_by_watchpoint): Turn into... + (aarch64_target::low_stopped_by_watchpoint): ...this. + (aarch64_stopped_data_address): Turn into... + (aarch64_target::low_stopped_data_address): ...this. + (the_low_target): Remove the op fields. + * linux-arm-low.cc (class arm_target) + : Declare. + (arm_stopped_by_watchpoint): Turn into... + (arm_target::low_stopped_by_watchpoint): ...this. + (arm_stopped_data_address): Turn into... + (arm_target::low_stopped_data_address): ...this. + (the_low_target): Remove the op fields. + * linux-crisv32-low.cc (class crisv32_target) + + : Declare. + (cris_stopped_by_watchpoint): Turn into... + (crisv32_target::low_stopped_by_watchpoint): ...this. + (cris_stopped_data_address): Turn into... + (crisv32_target::low_stopped_data_address): ...this. + (the_low_target): Remove the op fields. + * linux-mips-low.cc (class mips_target) + : Declare. + (mips_stopped_by_watchpoint): Turn into... + (mips_target::low_stopped_by_watchpoint): ...this. + (mips_stopped_data_address): Turn into... + (mips_target::low_stopped_data_address): ...this. + (the_low_target): Remove the op fields. + * linux-bfin-low.cc (the_low_target): Remove the op fields. + * linux-m32r-low.cc (the_low_target): Ditto. + * linux-m68k-low.cc (the_low_target): Ditto. + * linux-ppc-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. + 2020-04-02 Tankut Baris Aktemur Turn the 'insert_point' and 'remove_point' linux target ops into diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc index 5660ec0fd60..96f8f46d4ee 100644 --- a/gdbserver/linux-aarch64-low.cc +++ b/gdbserver/linux-aarch64-low.cc @@ -86,6 +86,10 @@ protected: int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, int size, raw_breakpoint *bp) override; + + bool low_stopped_by_watchpoint () override; + + CORE_ADDR low_stopped_data_address () override; }; /* The singleton target ops object. */ @@ -409,10 +413,10 @@ aarch64_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, return ret; } -/* Implementation of linux_target_ops method "stopped_data_address". */ +/* Implementation of linux target ops method "low_stopped_data_address". */ -static CORE_ADDR -aarch64_stopped_data_address (void) +CORE_ADDR +aarch64_target::low_stopped_data_address () { siginfo_t siginfo; int pid, i; @@ -471,15 +475,12 @@ aarch64_stopped_data_address (void) return (CORE_ADDR) 0; } -/* Implementation of linux_target_ops method "stopped_by_watchpoint". */ +/* Implementation of linux target ops method "low_stopped_by_watchpoint". */ -static int -aarch64_stopped_by_watchpoint (void) +bool +aarch64_target::low_stopped_by_watchpoint () { - if (aarch64_stopped_data_address () != 0) - return 1; - else - return 0; + return (low_stopped_data_address () != 0); } /* Fetch the thread-local storage pointer for libthread_db. */ @@ -3112,8 +3113,6 @@ aarch64_supports_hardware_single_step (void) struct linux_target_ops the_low_target = { - aarch64_stopped_by_watchpoint, - aarch64_stopped_data_address, NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ aarch64_linux_siginfo_fixup, diff --git a/gdbserver/linux-arm-low.cc b/gdbserver/linux-arm-low.cc index edb8cd05c1d..2593dfa0eee 100644 --- a/gdbserver/linux-arm-low.cc +++ b/gdbserver/linux-arm-low.cc @@ -95,6 +95,10 @@ protected: int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, int size, raw_breakpoint *bp) override; + + bool low_stopped_by_watchpoint () override; + + CORE_ADDR low_stopped_data_address () override; }; /* The singleton target ops object. */ @@ -672,43 +676,43 @@ arm_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, } /* Return whether current thread is stopped due to a watchpoint. */ -static int -arm_stopped_by_watchpoint (void) +bool +arm_target::low_stopped_by_watchpoint () { struct lwp_info *lwp = get_thread_lwp (current_thread); siginfo_t siginfo; /* We must be able to set hardware watchpoints. */ if (arm_linux_get_hw_watchpoint_count () == 0) - return 0; + return false; /* Retrieve siginfo. */ errno = 0; ptrace (PTRACE_GETSIGINFO, lwpid_of (current_thread), 0, &siginfo); if (errno != 0) - return 0; + return false; /* This must be a hardware breakpoint. */ if (siginfo.si_signo != SIGTRAP || (siginfo.si_code & 0xffff) != 0x0004 /* TRAP_HWBKPT */) - return 0; + return false; /* If we are in a positive slot then we're looking at a breakpoint and not a watchpoint. */ if (siginfo.si_errno >= 0) - return 0; + return false; /* Cache stopped data address for use by arm_stopped_data_address. */ lwp->arch_private->stopped_data_address = (CORE_ADDR) (uintptr_t) siginfo.si_addr; - return 1; + return true; } /* Return data address that triggered watchpoint. Called only if - arm_stopped_by_watchpoint returned true. */ -static CORE_ADDR -arm_stopped_data_address (void) + low_stopped_by_watchpoint returned true. */ +CORE_ADDR +arm_target::low_stopped_data_address () { struct lwp_info *lwp = get_thread_lwp (current_thread); return lwp->arch_private->stopped_data_address; @@ -1101,8 +1105,6 @@ arm_target::get_regs_info () } struct linux_target_ops the_low_target = { - arm_stopped_by_watchpoint, - arm_stopped_data_address, NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-bfin-low.cc b/gdbserver/linux-bfin-low.cc index 50c1743a6b4..bc3e312c18f 100644 --- a/gdbserver/linux-bfin-low.cc +++ b/gdbserver/linux-bfin-low.cc @@ -171,8 +171,6 @@ bfin_target::get_regs_info () } struct linux_target_ops the_low_target = { - NULL, /* stopped_by_watchpoint */ - NULL, /* stopped_data_address */ NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-crisv32-low.cc b/gdbserver/linux-crisv32-low.cc index 4d5edc570e5..fd458350d5a 100644 --- a/gdbserver/linux-crisv32-low.cc +++ b/gdbserver/linux-crisv32-low.cc @@ -53,6 +53,10 @@ protected: int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, int size, raw_breakpoint *bp) override; + + bool low_stopped_by_watchpoint () override; + + CORE_ADDR low_stopped_data_address () override; }; /* The singleton target ops object. */ @@ -355,8 +359,8 @@ crisv32_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, return 0; } -static int -cris_stopped_by_watchpoint (void) +bool +crisv32_target::low_stopped_by_watchpoint () { unsigned long exs; struct regcache *regcache = get_thread_regcache (current_thread, 1); @@ -366,8 +370,8 @@ cris_stopped_by_watchpoint (void) return (((exs & 0xff00) >> 8) == 0xc); } -static CORE_ADDR -cris_stopped_data_address (void) +CORE_ADDR +crisv32_target::low_stopped_data_address () { unsigned long eda; struct regcache *regcache = get_thread_regcache (current_thread, 1); @@ -464,8 +468,6 @@ crisv32_target::get_regs_info () } struct linux_target_ops the_low_target = { - cris_stopped_by_watchpoint, - cris_stopped_data_address, NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc index 814c03705cd..998bd1d0595 100644 --- a/gdbserver/linux-low.cc +++ b/gdbserver/linux-low.cc @@ -786,8 +786,6 @@ get_syscall_trapinfo (struct lwp_info *lwp, int *sysno) current_thread = saved_thread; } -static int check_stopped_by_watchpoint (struct lwp_info *child); - bool linux_process_target::save_stop_reason (lwp_info *lwp) { @@ -2245,46 +2243,33 @@ dequeue_one_deferred_signal (struct lwp_info *lwp, int *wstat) return 0; } -/* Fetch the possibly triggered data watchpoint info and store it in - CHILD. - - On some archs, like x86, that use debug registers to set - watchpoints, it's possible that the way to know which watched - address trapped, is to check the register that is used to select - which address to watch. Problem is, between setting the watchpoint - and reading back which data address trapped, the user may change - the set of watchpoints, and, as a consequence, GDB changes the - debug registers in the inferior. To avoid reading back a stale - stopped-data-address when that happens, we cache in LP the fact - that a watchpoint trapped, and the corresponding data address, as - soon as we see CHILD stop with a SIGTRAP. If GDB changes the debug - registers meanwhile, we have the cached data we can rely on. */ - -static int -check_stopped_by_watchpoint (struct lwp_info *child) +bool +linux_process_target::check_stopped_by_watchpoint (lwp_info *child) { - if (the_low_target.stopped_by_watchpoint != NULL) - { - struct thread_info *saved_thread; + struct thread_info *saved_thread = current_thread; + current_thread = get_lwp_thread (child); - saved_thread = current_thread; - current_thread = get_lwp_thread (child); + if (low_stopped_by_watchpoint ()) + { + child->stop_reason = TARGET_STOPPED_BY_WATCHPOINT; + child->stopped_data_address = low_stopped_data_address (); + } - if (the_low_target.stopped_by_watchpoint ()) - { - child->stop_reason = TARGET_STOPPED_BY_WATCHPOINT; + current_thread = saved_thread; - if (the_low_target.stopped_data_address != NULL) - child->stopped_data_address - = the_low_target.stopped_data_address (); - else - child->stopped_data_address = 0; - } + return child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT; +} - current_thread = saved_thread; - } +bool +linux_process_target::low_stopped_by_watchpoint () +{ + return false; +} - return child->stop_reason == TARGET_STOPPED_BY_WATCHPOINT; +CORE_ADDR +linux_process_target::low_stopped_data_address () +{ + return 0; } /* Return the ptrace options that we want to try to enable. */ diff --git a/gdbserver/linux-low.h b/gdbserver/linux-low.h index 0fdd8ceb945..ee2fdb8e865 100644 --- a/gdbserver/linux-low.h +++ b/gdbserver/linux-low.h @@ -131,9 +131,6 @@ struct lwp_info; struct linux_target_ops { - int (*stopped_by_watchpoint) (void); - CORE_ADDR (*stopped_data_address) (void); - /* Hooks to reformat register data for PEEKUSR/POKEUSR (in particular for registers smaller than an xfer unit). */ void (*collect_ptrace_register) (struct regcache *regcache, @@ -622,6 +619,22 @@ private: /* Install breakpoints for software single stepping. */ void install_software_single_step_breakpoints (lwp_info *lwp); + /* Fetch the possibly triggered data watchpoint info and store it in + CHILD. + + On some archs, like x86, that use debug registers to set + watchpoints, it's possible that the way to know which watched + address trapped, is to check the register that is used to select + which address to watch. Problem is, between setting the watchpoint + and reading back which data address trapped, the user may change + the set of watchpoints, and, as a consequence, GDB changes the + debug registers in the inferior. To avoid reading back a stale + stopped-data-address when that happens, we cache in LP the fact + that a watchpoint trapped, and the corresponding data address, as + soon as we see CHILD stop with a SIGTRAP. If GDB changes the debug + registers meanwhile, we have the cached data we can rely on. */ + bool check_stopped_by_watchpoint (lwp_info *child); + protected: /* The architecture-specific "low" methods are listed below. */ @@ -665,6 +678,10 @@ protected: virtual int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, int size, raw_breakpoint *bp); + virtual bool low_stopped_by_watchpoint (); + + virtual CORE_ADDR low_stopped_data_address (); + /* How many bytes the PC should be decremented after a break. */ virtual int low_decr_pc_after_break (); }; diff --git a/gdbserver/linux-m32r-low.cc b/gdbserver/linux-m32r-low.cc index bbafe8fa5c2..14bb83797d9 100644 --- a/gdbserver/linux-m32r-low.cc +++ b/gdbserver/linux-m32r-low.cc @@ -161,8 +161,6 @@ m32r_target::get_regs_info () } struct linux_target_ops the_low_target = { - NULL, /* stopped_by_watchpoint */ - NULL, /* stopped_data_address */ NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-m68k-low.cc b/gdbserver/linux-m68k-low.cc index fd2d601ba08..7cb80bc2af4 100644 --- a/gdbserver/linux-m68k-low.cc +++ b/gdbserver/linux-m68k-low.cc @@ -265,8 +265,6 @@ m68k_supports_hardware_single_step (void) } struct linux_target_ops the_low_target = { - NULL, /* stopped_by_watchpoint */ - NULL, /* stopped_data_address */ NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-mips-low.cc b/gdbserver/linux-mips-low.cc index 5696af6fae2..3c2231bda30 100644 --- a/gdbserver/linux-mips-low.cc +++ b/gdbserver/linux-mips-low.cc @@ -60,6 +60,10 @@ protected: int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, int size, raw_breakpoint *bp) override; + + bool low_stopped_by_watchpoint () override; + + CORE_ADDR low_stopped_data_address () override; }; /* The singleton target ops object. */ @@ -608,12 +612,12 @@ mips_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, return 0; } -/* This is the implementation of linux_target_ops method - stopped_by_watchpoint. The watchhi R and W bits indicate +/* This is the implementation of linux target ops method + low_stopped_by_watchpoint. The watchhi R and W bits indicate the watch register triggered. */ -static int -mips_stopped_by_watchpoint (void) +bool +mips_target::low_stopped_by_watchpoint () { struct process_info *proc = current_process (); struct arch_process_info *priv = proc->priv->arch_private; @@ -632,16 +636,16 @@ mips_stopped_by_watchpoint (void) for (n = 0; n < MAX_DEBUG_REGISTER && n < num_valid; n++) if (mips_linux_watch_get_watchhi (&priv->watch_readback, n) & (R_MASK | W_MASK)) - return 1; + return true; - return 0; + return false; } -/* This is the implementation of linux_target_ops method - stopped_data_address. */ +/* This is the implementation of linux target ops method + low_stopped_data_address. */ -static CORE_ADDR -mips_stopped_data_address (void) +CORE_ADDR +mips_target::low_stopped_data_address () { struct process_info *proc = current_process (); struct arch_process_info *priv = proc->priv->arch_private; @@ -976,8 +980,6 @@ mips_target::get_regs_info () } struct linux_target_ops the_low_target = { - mips_stopped_by_watchpoint, - mips_stopped_data_address, mips_collect_ptrace_register, mips_supply_ptrace_register, NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-ppc-low.cc b/gdbserver/linux-ppc-low.cc index d28551534bf..deb2ef64f12 100644 --- a/gdbserver/linux-ppc-low.cc +++ b/gdbserver/linux-ppc-low.cc @@ -3416,8 +3416,6 @@ ppc_get_ipa_tdesc_idx (void) } struct linux_target_ops the_low_target = { - NULL, - NULL, ppc_collect_ptrace_register, ppc_supply_ptrace_register, NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-s390-low.cc b/gdbserver/linux-s390-low.cc index 36471fbea62..9e7db23e5d0 100644 --- a/gdbserver/linux-s390-low.cc +++ b/gdbserver/linux-s390-low.cc @@ -2838,8 +2838,6 @@ s390_emit_ops (void) } struct linux_target_ops the_low_target = { - NULL, - NULL, s390_collect_ptrace_register, s390_supply_ptrace_register, NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-sh-low.cc b/gdbserver/linux-sh-low.cc index c4af7defadb..a2215ddb4bc 100644 --- a/gdbserver/linux-sh-low.cc +++ b/gdbserver/linux-sh-low.cc @@ -192,8 +192,6 @@ sh_target::low_arch_setup () } struct linux_target_ops the_low_target = { - NULL, /* stopped_by_watchpoint */ - NULL, /* stopped_data_address */ NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-sparc-low.cc b/gdbserver/linux-sparc-low.cc index 0380cedb800..8d1b61b0631 100644 --- a/gdbserver/linux-sparc-low.cc +++ b/gdbserver/linux-sparc-low.cc @@ -341,7 +341,6 @@ sparc_target::get_regs_info () } struct linux_target_ops the_low_target = { - NULL, NULL, NULL, NULL }; diff --git a/gdbserver/linux-tic6x-low.cc b/gdbserver/linux-tic6x-low.cc index e6f2203d492..9ff23969c6c 100644 --- a/gdbserver/linux-tic6x-low.cc +++ b/gdbserver/linux-tic6x-low.cc @@ -423,8 +423,6 @@ tic6x_target::get_regs_info () } struct linux_target_ops the_low_target = { - NULL, /* stopped_by_watchpoint */ - NULL, /* stopped_data_address */ NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-tile-low.cc b/gdbserver/linux-tile-low.cc index f9c5460989e..6efd7b2c8c3 100644 --- a/gdbserver/linux-tile-low.cc +++ b/gdbserver/linux-tile-low.cc @@ -224,8 +224,6 @@ tile_supports_hardware_single_step (void) struct linux_target_ops the_low_target = { - NULL, /* stopped_by_watchpoint */ - NULL, /* stopped_data_address */ NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc index e6566a1da94..1c6e9b1d100 100644 --- a/gdbserver/linux-x86-low.cc +++ b/gdbserver/linux-x86-low.cc @@ -133,6 +133,10 @@ protected: int low_remove_point (raw_bkpt_type type, CORE_ADDR addr, int size, raw_breakpoint *bp) override; + + bool low_stopped_by_watchpoint () override; + + CORE_ADDR low_stopped_data_address () override; }; /* The singleton target ops object. */ @@ -661,15 +665,15 @@ x86_target::low_remove_point (raw_bkpt_type type, CORE_ADDR addr, } } -static int -x86_stopped_by_watchpoint (void) +bool +x86_target::low_stopped_by_watchpoint () { struct process_info *proc = current_process (); return x86_dr_stopped_by_watchpoint (&proc->priv->arch_private->debug_reg_state); } -static CORE_ADDR -x86_stopped_data_address (void) +CORE_ADDR +x86_target::low_stopped_data_address () { struct process_info *proc = current_process (); CORE_ADDR addr; @@ -2918,8 +2922,6 @@ x86_get_ipa_tdesc_idx (void) struct linux_target_ops the_low_target = { - x86_stopped_by_watchpoint, - x86_stopped_data_address, /* collect_ptrace_register/supply_ptrace_register are not needed in the native i386 case (no registers smaller than an xfer unit), and are not used in the biarch case (HAVE_LINUX_USRREGS is not defined). */ diff --git a/gdbserver/linux-xtensa-low.cc b/gdbserver/linux-xtensa-low.cc index a7023f465b2..7bc09e99629 100644 --- a/gdbserver/linux-xtensa-low.cc +++ b/gdbserver/linux-xtensa-low.cc @@ -329,8 +329,6 @@ xtensa_target::get_regs_info () } struct linux_target_ops the_low_target = { - NULL, /* stopped_by_watchpoint */ - NULL, /* stopped_data_address */ NULL, /* collect_ptrace_register */ NULL, /* supply_ptrace_register */ NULL, /* siginfo_fixup */ -- 2.30.2