aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdbserver/ChangeLog183
-rw-r--r--gdbserver/linux-aarch64-low.cc26
-rw-r--r--gdbserver/linux-arm-low.cc26
-rw-r--r--gdbserver/linux-bfin-low.cc26
-rw-r--r--gdbserver/linux-cris-low.cc26
-rw-r--r--gdbserver/linux-crisv32-low.cc26
-rw-r--r--gdbserver/linux-low.cc55
-rw-r--r--gdbserver/linux-low.h11
-rw-r--r--gdbserver/linux-m32r-low.cc26
-rw-r--r--gdbserver/linux-m68k-low.cc26
-rw-r--r--gdbserver/linux-mips-low.cc22
-rw-r--r--gdbserver/linux-nios2-low.cc26
-rw-r--r--gdbserver/linux-ppc-low.cc22
-rw-r--r--gdbserver/linux-riscv-low.cc26
-rw-r--r--gdbserver/linux-s390-low.cc22
-rw-r--r--gdbserver/linux-sh-low.cc26
-rw-r--r--gdbserver/linux-sparc-low.cc21
-rw-r--r--gdbserver/linux-tic6x-low.cc22
-rw-r--r--gdbserver/linux-tile-low.cc26
-rw-r--r--gdbserver/linux-x86-low.cc22
-rw-r--r--gdbserver/linux-xtensa-low.cc26
21 files changed, 597 insertions, 95 deletions
diff --git a/gdbserver/ChangeLog b/gdbserver/ChangeLog
index d6d5eee..891eccd 100644
--- a/gdbserver/ChangeLog
+++ b/gdbserver/ChangeLog
@@ -1,5 +1,188 @@
2020-04-02 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
+ Turn the 'get_pc' and 'set_pc' linux target ops into methods
+ of linux_process_target.
+
+ * linux-low.h (struct linux_target_ops): Remove the ops.
+ (class linux_process_target) <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ * linux-low.cc (supports_breakpoints): Turn into...
+ (linux_process_target::low_supports_breakpoints): ...this.
+ (linux_process_target::low_get_pc): Define.
+ (linux_process_target::low_set_pc): Define.
+
+ Update the callers below.
+
+ (linux_process_target::get_pc)
+ (linux_process_target::save_stop_reason)
+ (linux_process_target::maybe_move_out_of_jump_pad)
+ (linux_process_target::wait_1)
+ (linux_process_target::resume_one_lwp_throw)
+ (linux_process_target::resume)
+ (linux_process_target::proceed_all_lwps)
+ (linux_process_target::read_pc)
+ (linux_process_target::write_pc)
+
+ * linux-x86-low.cc (class linux_process_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (x86_target::low_supports_breakpoints): Define.
+ (x86_get_pc): Turn into...
+ (x86_target::low_get_pc): ...this.
+ (x86_set_pc): Turn into...
+ (x86_target::low_set_pc): ...this.
+ (the_low_target): Remove the op fields.
+ * linux-arm-low.cc (class arm_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (arm_target::low_supports_breakpoints)
+ (arm_target::low_get_pc)
+ (arm_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-bfin-low.cc (class bfin_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (bfin_target::low_supports_breakpoints)
+ (bfin_target::low_get_pc)
+ (bfin_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-cris-low.cc (class cris_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (cris_target::low_supports_breakpoints)
+ (cris_target::low_get_pc)
+ (cris_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-crisv32-low.cc (class crisv32_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (crisv32_target::low_supports_breakpoints)
+ (crisv32_target::low_get_pc)
+ (crisv32_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-m32r-low.cc (class m32r_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (m32r_target::low_supports_breakpoints)
+ (m32r_target::low_get_pc)
+ (m32r_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-m68k-low.cc (class m68k_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (m68k_target::low_supports_breakpoints)
+ (m68k_target::low_get_pc)
+ (m68k_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-nios2-low.cc (class nios2_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (nios2_target::low_supports_breakpoints)
+ (nios2_target::low_get_pc)
+ (nios2_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-sh-low.cc (class sh_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (sh_target::low_supports_breakpoints)
+ (sh_target::low_get_pc)
+ (sh_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-xtensa-low.cc (class xtensa_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (xtensa_target::low_supports_breakpoints)
+ (xtensa_target::low_get_pc)
+ (xtensa_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-sparc-low.cc (class sparc_target)
+ <low_supports_breakpoints>
+ <low_get_pc>: Declare.
+ (sparc_target::low_supports_breakpoints)
+ (sparc_target::low_get_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-tile-low.cc (class tile_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (tile_target::low_supports_breakpoints)
+ (tile_target::low_get_pc)
+ (tile_target::low_set_pc): Define.
+ (the_low_target): Remove the op fields.
+ * linux-aarch64-low.cc (class aarch64_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (aarch64_target::low_supports_breakpoints): Define.
+ (aarch64_get_pc): Turn into...
+ (aarch64_target::low_get_pc): ...this.
+ (aarch64_set_pc): Turn into...
+ (aarch64_target::low_set_pc): ...this.
+ (the_low_target): Remove the op fields.
+ * linux-mips-low.cc (class mips_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (mips_target::low_supports_breakpoints): Define.
+ (mips_get_pc): Turn into...
+ (mips_target::low_get_pc): ...this.
+ (mips_set_pc): Turn into...
+ (mips_target::low_set_pc): ...this.
+ (the_low_target): Remove the op fields.
+ * linux-ppc-low.cc (class ppc_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (ppc_target::low_supports_breakpoints): Define.
+ (ppc_get_pc): Turn into...
+ (ppc_target::low_get_pc): ...this.
+ (ppc_set_pc): Turn into...
+ (ppc_target::low_set_pc): ...this.
+ (the_low_target): Remove the op fields.
+ * linux-riscv-low.cc (class riscv_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (riscv_target::low_supports_breakpoints): Define.
+ (riscv_get_pc): Turn into...
+ (riscv_target::low_get_pc): ...this.
+ (riscv_set_pc): Turn into...
+ (riscv_target::low_set_pc): ...this.
+ (the_low_target): Remove the op fields.
+ * linux-s390-low.cc (class s390_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (s390_target::low_supports_breakpoints): Define.
+ (s390_get_pc): Turn into...
+ (s390_target::low_get_pc): ...this.
+ (s390_set_pc): Turn into...
+ (s390_target::low_set_pc): ...this.
+ (the_low_target): Remove the op fields.
+ * linux-tic6x-low.cc (class tic6x_target)
+ <low_supports_breakpoints>
+ <low_get_pc>
+ <low_set_pc>: Declare.
+ (tic6x_target::low_supports_breakpoints): Define.
+ (tic6x_get_pc): Turn into...
+ (tic6x_target::low_get_pc): ...this.
+ (tic6x_set_pc): Turn into...
+ (tic6x_target::low_set_pc): ...this.
+ (the_low_target): Remove the op fields.
+
+2020-04-02 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
+
Turn some more static methods in linux-low into private methods
of linux_process_target.
diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc
index 0bcac19..6bed620 100644
--- a/gdbserver/linux-aarch64-low.cc
+++ b/gdbserver/linux-aarch64-low.cc
@@ -64,6 +64,12 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -189,10 +195,16 @@ aarch64_store_pauthregset (struct regcache *regcache, const void *buf)
&pauth_regset[1]);
}
-/* Implementation of linux_target_ops method "get_pc". */
+bool
+aarch64_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+/* Implementation of linux target ops method "low_get_pc". */
-static CORE_ADDR
-aarch64_get_pc (struct regcache *regcache)
+CORE_ADDR
+aarch64_target::low_get_pc (regcache *regcache)
{
if (register_size (regcache->tdesc, 0) == 8)
return linux_get_pc_64bit (regcache);
@@ -200,10 +212,10 @@ aarch64_get_pc (struct regcache *regcache)
return linux_get_pc_32bit (regcache);
}
-/* Implementation of linux_target_ops method "set_pc". */
+/* Implementation of linux target ops method "low_set_pc". */
-static void
-aarch64_set_pc (struct regcache *regcache, CORE_ADDR pc)
+void
+aarch64_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
{
if (register_size (regcache->tdesc, 0) == 8)
linux_set_pc_64bit (regcache, pc);
@@ -3085,8 +3097,6 @@ aarch64_supports_hardware_single_step (void)
struct linux_target_ops the_low_target =
{
- aarch64_get_pc,
- aarch64_set_pc,
aarch64_breakpoint_kind_from_pc,
aarch64_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-arm-low.cc b/gdbserver/linux-arm-low.cc
index 1bbf0e6..7b9ef89 100644
--- a/gdbserver/linux-arm-low.cc
+++ b/gdbserver/linux-arm-low.cc
@@ -69,12 +69,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static arm_target the_arm_target;
+bool
+arm_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+arm_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+arm_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Information describing the hardware breakpoint capabilities. */
static struct
{
@@ -1027,8 +1051,6 @@ arm_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
arm_breakpoint_kind_from_pc,
arm_sw_breakpoint_from_kind,
arm_gdbserver_get_next_pcs,
diff --git a/gdbserver/linux-bfin-low.cc b/gdbserver/linux-bfin-low.cc
index a8bb8f0..f734c12 100644
--- a/gdbserver/linux-bfin-low.cc
+++ b/gdbserver/linux-bfin-low.cc
@@ -38,12 +38,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static bfin_target the_bfin_target;
+bool
+bfin_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+bfin_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+bfin_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-bfin.c. */
void init_registers_bfin (void);
extern const struct target_desc *tdesc_bfin;
@@ -135,8 +159,6 @@ bfin_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_kind_from_pc */
bfin_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-cris-low.cc b/gdbserver/linux-cris-low.cc
index 7956922..50c9b5b 100644
--- a/gdbserver/linux-cris-low.cc
+++ b/gdbserver/linux-cris-low.cc
@@ -35,12 +35,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static cris_target the_cris_target;
+bool
+cris_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+cris_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+cris_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-cris.c. */
void init_registers_cris (void);
extern const struct target_desc *tdesc_cris;
@@ -132,8 +156,6 @@ cris_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_kind_from_pc */
cris_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-crisv32-low.cc b/gdbserver/linux-crisv32-low.cc
index 828ac11..1d650e3 100644
--- a/gdbserver/linux-crisv32-low.cc
+++ b/gdbserver/linux-crisv32-low.cc
@@ -35,6 +35,12 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -55,6 +61,24 @@ crisv32_target::low_cannot_store_register (int regno)
"is not implemented by the target");
}
+bool
+crisv32_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+crisv32_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+crisv32_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-crisv32.c. */
void init_registers_crisv32 (void);
extern const struct target_desc *tdesc_crisv32;
@@ -429,8 +453,6 @@ crisv32_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_kind_from_pc */
cris_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-low.cc b/gdbserver/linux-low.cc
index 65edde8..47b2ef9 100644
--- a/gdbserver/linux-low.cc
+++ b/gdbserver/linux-low.cc
@@ -301,13 +301,22 @@ can_software_single_step (void)
return (the_low_target.get_next_pcs != NULL);
}
-/* True if the low target supports memory breakpoints. If so, we'll
- have a GET_PC implementation. */
+bool
+linux_process_target::low_supports_breakpoints ()
+{
+ return false;
+}
-static int
-supports_breakpoints (void)
+CORE_ADDR
+linux_process_target::low_get_pc (regcache *regcache)
+{
+ return 0;
+}
+
+void
+linux_process_target::low_set_pc (regcache *regcache, CORE_ADDR newpc)
{
- return (the_low_target.get_pc != NULL);
+ gdb_assert_not_reached ("linux target op low_set_pc is not implemented");
}
/* Returns true if this target can support fast tracepoints. This
@@ -728,14 +737,14 @@ linux_process_target::get_pc (lwp_info *lwp)
struct regcache *regcache;
CORE_ADDR pc;
- if (the_low_target.get_pc == NULL)
+ if (!low_supports_breakpoints ())
return 0;
saved_thread = current_thread;
current_thread = get_lwp_thread (lwp);
regcache = get_thread_regcache (current_thread, 1);
- pc = (*the_low_target.get_pc) (regcache);
+ pc = low_get_pc (regcache);
if (debug_threads)
debug_printf ("pc is 0x%lx\n", (long) pc);
@@ -785,7 +794,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
siginfo_t siginfo;
#endif
- if (the_low_target.get_pc == NULL)
+ if (!low_supports_breakpoints ())
return false;
pc = get_pc (lwp);
@@ -868,7 +877,7 @@ linux_process_target::save_stop_reason (lwp_info *lwp)
{
struct regcache *regcache
= get_thread_regcache (current_thread, 1);
- (*the_low_target.set_pc) (regcache, sw_breakpoint_pc);
+ low_set_pc (regcache, sw_breakpoint_pc);
}
/* Update this so we record the correct stop PC below. */
@@ -2092,7 +2101,7 @@ linux_process_target::maybe_move_out_of_jump_pad (lwp_info *lwp, int *wstat)
}
regcache = get_thread_regcache (current_thread, 1);
- (*the_low_target.set_pc) (regcache, status.tpoint_addr);
+ low_set_pc (regcache, status.tpoint_addr);
lwp->stop_pc = status.tpoint_addr;
/* Cancel any fast tracepoint lock this thread was
@@ -3170,7 +3179,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
= get_thread_regcache (current_thread, 1);
event_child->stop_pc += increment_pc;
- (*the_low_target.set_pc) (regcache, event_child->stop_pc);
+ low_set_pc (regcache, event_child->stop_pc);
if (!(*the_low_target.breakpoint_at) (event_child->stop_pc))
event_child->stop_reason = TARGET_STOPPED_BY_NO_REASON;
@@ -3183,7 +3192,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
not support internal breakpoints at all, we also report the
SIGTRAP without further processing; it's of no concern to us. */
maybe_internal_trap
- = (supports_breakpoints ()
+ = (low_supports_breakpoints ()
&& (WSTOPSIG (w) == SIGTRAP
|| ((WSTOPSIG (w) == SIGILL
|| WSTOPSIG (w) == SIGSEGV)
@@ -3478,11 +3487,11 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
decr_pc_after_break adjustment to the inferior's regcache
ourselves. */
- if (the_low_target.set_pc != NULL)
+ if (low_supports_breakpoints ())
{
struct regcache *regcache
= get_thread_regcache (current_thread, 1);
- (*the_low_target.set_pc) (regcache, event_child->stop_pc);
+ low_set_pc (regcache, event_child->stop_pc);
}
if (step_over_finished)
@@ -3693,7 +3702,7 @@ linux_process_target::wait_1 (ptid_t ptid, target_waitstatus *ourstatus,
{
struct regcache *regcache
= get_thread_regcache (current_thread, 1);
- (*the_low_target.set_pc) (regcache, event_child->stop_pc + decr_pc);
+ low_set_pc (regcache, event_child->stop_pc + decr_pc);
}
}
@@ -4285,11 +4294,11 @@ linux_process_target::resume_one_lwp_throw (lwp_info *lwp, int step,
step = single_step (lwp);
}
- if (proc->tdesc != NULL && the_low_target.get_pc != NULL)
+ if (proc->tdesc != NULL && low_supports_breakpoints ())
{
struct regcache *regcache = get_thread_regcache (current_thread, 1);
- lwp->stop_pc = (*the_low_target.get_pc) (regcache);
+ lwp->stop_pc = low_get_pc (regcache);
if (debug_threads)
{
@@ -4915,7 +4924,7 @@ linux_process_target::resume (thread_resume *resume_info, size_t n)
other threads stopped, then resume all threads again. Make sure
to queue any signals that would otherwise be delivered or
queued. */
- if (!any_pending && supports_breakpoints ())
+ if (!any_pending && low_supports_breakpoints ())
need_step_over = find_thread ([this] (thread_info *thread)
{
return thread_needs_step_over (thread);
@@ -5077,7 +5086,7 @@ linux_process_target::proceed_all_lwps ()
resume any threads - have it step over the breakpoint with all
other threads stopped, then resume all threads again. */
- if (supports_breakpoints ())
+ if (low_supports_breakpoints ())
{
need_step_over = find_thread ([this] (thread_info *thread)
{
@@ -6453,18 +6462,18 @@ linux_process_target::supports_tracepoints ()
CORE_ADDR
linux_process_target::read_pc (regcache *regcache)
{
- if (the_low_target.get_pc == NULL)
+ if (!low_supports_breakpoints ())
return 0;
- return (*the_low_target.get_pc) (regcache);
+ return low_get_pc (regcache);
}
void
linux_process_target::write_pc (regcache *regcache, CORE_ADDR pc)
{
- gdb_assert (the_low_target.set_pc != NULL);
+ gdb_assert (low_supports_breakpoints ());
- (*the_low_target.set_pc) (regcache, pc);
+ low_set_pc (regcache, pc);
}
bool
diff --git a/gdbserver/linux-low.h b/gdbserver/linux-low.h
index 4f5502b..4d2435c 100644
--- a/gdbserver/linux-low.h
+++ b/gdbserver/linux-low.h
@@ -131,9 +131,6 @@ struct lwp_info;
struct linux_target_ops
{
- CORE_ADDR (*get_pc) (struct regcache *regcache);
- void (*set_pc) (struct regcache *regcache, CORE_ADDR newpc);
-
/* See target.h for details. */
int (*breakpoint_kind_from_pc) (CORE_ADDR *pcptr);
@@ -676,6 +673,14 @@ protected:
REGNO was supplied, false if not, and we should fallback to the
standard ptrace methods. */
virtual bool low_fetch_register (regcache *regcache, int regno);
+
+ /* Return true if breakpoints are supported. Such targets must
+ implement the GET_PC and SET_PC methods. */
+ virtual bool low_supports_breakpoints ();
+
+ virtual CORE_ADDR low_get_pc (regcache *regcache);
+
+ virtual void low_set_pc (regcache *regcache, CORE_ADDR newpc);
};
extern linux_process_target *the_linux_target;
diff --git a/gdbserver/linux-m32r-low.cc b/gdbserver/linux-m32r-low.cc
index 82a5034..090b75d 100644
--- a/gdbserver/linux-m32r-low.cc
+++ b/gdbserver/linux-m32r-low.cc
@@ -38,12 +38,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static m32r_target the_m32r_target;
+bool
+m32r_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+m32r_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+m32r_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-m32r.c. */
void init_registers_m32r (void);
extern const struct target_desc *tdesc_m32r;
@@ -134,8 +158,6 @@ m32r_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_from_pc */
m32r_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-m68k-low.cc b/gdbserver/linux-m68k-low.cc
index 6a3a2aa..07bbae6 100644
--- a/gdbserver/linux-m68k-low.cc
+++ b/gdbserver/linux-m68k-low.cc
@@ -34,12 +34,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static m68k_target the_m68k_target;
+bool
+m68k_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+m68k_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+m68k_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-m68k.c. */
void init_registers_m68k (void);
extern const struct target_desc *tdesc_m68k;
@@ -229,8 +253,6 @@ m68k_supports_hardware_single_step (void)
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_kind_from_pc */
m68k_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-mips-low.cc b/gdbserver/linux-mips-low.cc
index ae925ff..22cd3bd 100644
--- a/gdbserver/linux-mips-low.cc
+++ b/gdbserver/linux-mips-low.cc
@@ -42,6 +42,12 @@ protected:
bool low_cannot_store_register (int regno) override;
bool low_fetch_register (regcache *regcache, int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -279,16 +285,22 @@ mips_target::low_fetch_register (regcache *regcache, int regno)
return false;
}
-static CORE_ADDR
-mips_get_pc (struct regcache *regcache)
+bool
+mips_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+mips_target::low_get_pc (regcache *regcache)
{
union mips_register pc;
collect_register_by_name (regcache, "pc", pc.buf);
return register_size (regcache->tdesc, 0) == 4 ? pc.reg32 : pc.reg64;
}
-static void
-mips_set_pc (struct regcache *regcache, CORE_ADDR pc)
+void
+mips_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
{
union mips_register newpc;
if (register_size (regcache->tdesc, 0) == 4)
@@ -952,8 +964,6 @@ mips_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- mips_get_pc,
- mips_set_pc,
NULL, /* breakpoint_kind_from_pc */
mips_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-nios2-low.cc b/gdbserver/linux-nios2-low.cc
index a58d9ca..c1372dd 100644
--- a/gdbserver/linux-nios2-low.cc
+++ b/gdbserver/linux-nios2-low.cc
@@ -46,12 +46,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static nios2_target the_nios2_target;
+bool
+nios2_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+nios2_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+nios2_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* The following definition must agree with the number of registers
defined in "struct user_regs" in GLIBC
(sysdeps/unix/sysv/linux/nios2/sys/user.h), and also with
@@ -251,8 +275,6 @@ nios2_target::get_regs_info ()
struct linux_target_ops the_low_target =
{
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_kind_from_pc */
nios2_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-ppc-low.cc b/gdbserver/linux-ppc-low.cc
index 096308a..4aa7f51 100644
--- a/gdbserver/linux-ppc-low.cc
+++ b/gdbserver/linux-ppc-low.cc
@@ -59,6 +59,12 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -241,8 +247,14 @@ ppc_supply_ptrace_register (struct regcache *regcache,
perror_with_name ("Unexpected byte order");
}
-static CORE_ADDR
-ppc_get_pc (struct regcache *regcache)
+bool
+ppc_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+ppc_target::low_get_pc (regcache *regcache)
{
if (register_size (regcache->tdesc, 0) == 4)
{
@@ -258,8 +270,8 @@ ppc_get_pc (struct regcache *regcache)
}
}
-static void
-ppc_set_pc (struct regcache *regcache, CORE_ADDR pc)
+void
+ppc_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
{
if (register_size (regcache->tdesc, 0) == 4)
{
@@ -3392,8 +3404,6 @@ ppc_get_ipa_tdesc_idx (void)
}
struct linux_target_ops the_low_target = {
- ppc_get_pc,
- ppc_set_pc,
NULL, /* breakpoint_kind_from_pc */
ppc_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-riscv-low.cc b/gdbserver/linux-riscv-low.cc
index 69af59f..4fb2308 100644
--- a/gdbserver/linux-riscv-low.cc
+++ b/gdbserver/linux-riscv-low.cc
@@ -47,6 +47,12 @@ protected:
bool low_cannot_store_register (int regno) override;
bool low_fetch_register (regcache *regcache, int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -203,10 +209,16 @@ riscv_target::low_fetch_register (regcache *regcache, int regno)
return true;
}
-/* Implementation of linux_target_ops method "get_pc". */
+bool
+riscv_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+/* Implementation of linux target ops method "low_get_pc". */
-static CORE_ADDR
-riscv_get_pc (struct regcache *regcache)
+CORE_ADDR
+riscv_target::low_get_pc (regcache *regcache)
{
elf_gregset_t regset;
@@ -216,10 +228,10 @@ riscv_get_pc (struct regcache *regcache)
return linux_get_pc_32bit (regcache);
}
-/* Implementation of linux_target_ops method "set_pc". */
+/* Implementation of linux target ops method "low_set_pc". */
-static void
-riscv_set_pc (struct regcache *regcache, CORE_ADDR newpc)
+void
+riscv_target::low_set_pc (regcache *regcache, CORE_ADDR newpc)
{
elf_gregset_t regset;
@@ -293,8 +305,6 @@ riscv_breakpoint_at (CORE_ADDR pc)
/* RISC-V/Linux target operations. */
struct linux_target_ops the_low_target =
{
- riscv_get_pc,
- riscv_set_pc,
riscv_breakpoint_kind_from_pc,
riscv_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-s390-low.cc b/gdbserver/linux-s390-low.cc
index d25fafa..ef5e822 100644
--- a/gdbserver/linux-s390-low.cc
+++ b/gdbserver/linux-s390-low.cc
@@ -66,6 +66,12 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -454,8 +460,14 @@ s390_sw_breakpoint_from_kind (int kind, int *size)
return s390_breakpoint;
}
-static CORE_ADDR
-s390_get_pc (struct regcache *regcache)
+bool
+s390_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+s390_target::low_get_pc (regcache *regcache)
{
if (register_size (regcache->tdesc, 0) == 4)
{
@@ -471,8 +483,8 @@ s390_get_pc (struct regcache *regcache)
}
}
-static void
-s390_set_pc (struct regcache *regcache, CORE_ADDR newpc)
+void
+s390_target::low_set_pc (regcache *regcache, CORE_ADDR newpc)
{
if (register_size (regcache->tdesc, 0) == 4)
{
@@ -2812,8 +2824,6 @@ s390_emit_ops (void)
}
struct linux_target_ops the_low_target = {
- s390_get_pc,
- s390_set_pc,
NULL, /* breakpoint_kind_from_pc */
s390_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-sh-low.cc b/gdbserver/linux-sh-low.cc
index 42bd427..4e514257 100644
--- a/gdbserver/linux-sh-low.cc
+++ b/gdbserver/linux-sh-low.cc
@@ -34,12 +34,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static sh_target the_sh_target;
+bool
+sh_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+sh_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+sh_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-sh.c. */
void init_registers_sh (void);
extern const struct target_desc *tdesc_sh;
@@ -164,8 +188,6 @@ sh_target::low_arch_setup ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_kind_from_pc */
sh_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-sparc-low.cc b/gdbserver/linux-sparc-low.cc
index b68ed2d..b415dee 100644
--- a/gdbserver/linux-sparc-low.cc
+++ b/gdbserver/linux-sparc-low.cc
@@ -57,12 +57,30 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ /* No low_set_pc is needed. */
};
/* The singleton target ops object. */
static sparc_target the_sparc_target;
+bool
+sparc_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+sparc_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_64bit (regcache);
+}
+
/* Each offset is multiplied by 8, because of the register size.
These offsets apply to the buffer sent/filled by ptrace.
Additionally, the array elements order corresponds to the .dat file, and the
@@ -319,9 +337,6 @@ sparc_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_64bit,
- /* No sparc_set_pc is needed. */
- NULL,
NULL, /* breakpoint_kind_from_pc */
sparc_sw_breakpoint_from_kind,
NULL, /* get_next_pcs */
diff --git a/gdbserver/linux-tic6x-low.cc b/gdbserver/linux-tic6x-low.cc
index 5cfdd09..790b4e4 100644
--- a/gdbserver/linux-tic6x-low.cc
+++ b/gdbserver/linux-tic6x-low.cc
@@ -53,6 +53,12 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -239,8 +245,14 @@ tic6x_target::low_cannot_store_register (int regno)
return (tic6x_regmap[regno] == -1);
}
-static CORE_ADDR
-tic6x_get_pc (struct regcache *regcache)
+bool
+tic6x_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+tic6x_target::low_get_pc (regcache *regcache)
{
union tic6x_register pc;
@@ -248,8 +260,8 @@ tic6x_get_pc (struct regcache *regcache)
return pc.reg32;
}
-static void
-tic6x_set_pc (struct regcache *regcache, CORE_ADDR pc)
+void
+tic6x_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
{
union tic6x_register newpc;
@@ -407,8 +419,6 @@ tic6x_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- tic6x_get_pc,
- tic6x_set_pc,
NULL, /* breakpoint_kind_from_pc */
tic6x_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-tile-low.cc b/gdbserver/linux-tile-low.cc
index a6138e7..9756c6c 100644
--- a/gdbserver/linux-tile-low.cc
+++ b/gdbserver/linux-tile-low.cc
@@ -38,12 +38,36 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
static tile_target the_tile_target;
+bool
+tile_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+tile_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_64bit (regcache);
+}
+
+void
+tile_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_64bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-tilegx.c. */
void init_registers_tilegx (void);
extern const struct target_desc *tdesc_tilegx;
@@ -196,8 +220,6 @@ tile_supports_hardware_single_step (void)
struct linux_target_ops the_low_target =
{
- linux_get_pc_64bit,
- linux_set_pc_64bit,
NULL, /* breakpoint_kind_from_pc */
tile_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-x86-low.cc b/gdbserver/linux-x86-low.cc
index 475d777..9aa29f8 100644
--- a/gdbserver/linux-x86-low.cc
+++ b/gdbserver/linux-x86-low.cc
@@ -113,6 +113,12 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -494,8 +500,14 @@ static struct regset_info x86_regsets[] =
NULL_REGSET
};
-static CORE_ADDR
-x86_get_pc (struct regcache *regcache)
+bool
+x86_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+x86_target::low_get_pc (regcache *regcache)
{
int use_64bit = register_size (regcache->tdesc, 0) == 8;
@@ -515,8 +527,8 @@ x86_get_pc (struct regcache *regcache)
}
}
-static void
-x86_set_pc (struct regcache *regcache, CORE_ADDR pc)
+void
+x86_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
{
int use_64bit = register_size (regcache->tdesc, 0) == 8;
@@ -2885,8 +2897,6 @@ x86_get_ipa_tdesc_idx (void)
struct linux_target_ops the_low_target =
{
- x86_get_pc,
- x86_set_pc,
NULL, /* breakpoint_kind_from_pc */
x86_sw_breakpoint_from_kind,
NULL,
diff --git a/gdbserver/linux-xtensa-low.cc b/gdbserver/linux-xtensa-low.cc
index d71b2c9..fb680bd 100644
--- a/gdbserver/linux-xtensa-low.cc
+++ b/gdbserver/linux-xtensa-low.cc
@@ -35,6 +35,12 @@ protected:
bool low_cannot_fetch_register (int regno) override;
bool low_cannot_store_register (int regno) override;
+
+ bool low_supports_breakpoints () override;
+
+ CORE_ADDR low_get_pc (regcache *regcache) override;
+
+ void low_set_pc (regcache *regcache, CORE_ADDR newpc) override;
};
/* The singleton target ops object. */
@@ -55,6 +61,24 @@ xtensa_target::low_cannot_store_register (int regno)
"is not implemented by the target");
}
+bool
+xtensa_target::low_supports_breakpoints ()
+{
+ return true;
+}
+
+CORE_ADDR
+xtensa_target::low_get_pc (regcache *regcache)
+{
+ return linux_get_pc_32bit (regcache);
+}
+
+void
+xtensa_target::low_set_pc (regcache *regcache, CORE_ADDR pc)
+{
+ linux_set_pc_32bit (regcache, pc);
+}
+
/* Defined in auto-generated file reg-xtensa.c. */
void init_registers_xtensa (void);
extern const struct target_desc *tdesc_xtensa;
@@ -302,8 +326,6 @@ xtensa_target::get_regs_info ()
}
struct linux_target_ops the_low_target = {
- linux_get_pc_32bit,
- linux_set_pc_32bit,
NULL, /* breakpoint_kind_from_pc */
xtensa_sw_breakpoint_from_kind,
NULL,