This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[PATCH 06/14] Introduce basic LWP accessors
- From: Gary Benson <gbenson at redhat dot com>
- To: gdb-patches at sourceware dot org
- Date: Mon, 8 Sep 2014 16:25:14 +0100
- Subject: [PATCH 06/14] Introduce basic LWP accessors
- Authentication-results: sourceware.org; auth=none
- References: <1410189922-18320-1-git-send-email-gbenson at redhat dot com>
This commit introduces three accessors that shared Linux code can
use to access fields of struct lwp_info. The GDB and gdbserver
Linux x86 code is modified to use them.
gdb/ChangeLog:
* nat/linux-nat.h (ptid_of_lwp): New declaration.
(lwp_is_stopped): Likewise.
(lwp_is_stopped_by_watchpoint): Likewise.
* linux-nat.c (ptid_of_lwp): New function.
(lwp_is_stopped): Likewise.
(lwp_is_stopped_by_watchpoint): Likewise.
* x86-linux-nat.c (update_debug_registers_callback):
Use lwp_is_stopped.
(x86_linux_prepare_to_resume): Use ptid_of_lwp and
lwp_is_stopped_by_watchpoint.
gdb/gdbserver/ChangeLog:
* linux-low.c (ptid_of_lwp): New function.
(lwp_is_stopped): Likewise.
(lwp_is_stopped_by_watchpoint): Likewise.
* linux-x86-low.c (update_debug_registers_callback):
Use lwp_is_stopped.
(x86_linux_prepare_to_resume): Use ptid_of_lwp and
lwp_is_stopped_by_watchpoint.
---
gdb/ChangeLog | 13 +++++++++++++
gdb/gdbserver/ChangeLog | 10 ++++++++++
gdb/gdbserver/linux-low.c | 26 ++++++++++++++++++++++++++
gdb/gdbserver/linux-x86-low.c | 6 +++---
gdb/linux-nat.c | 27 +++++++++++++++++++++++++++
gdb/nat/linux-nat.h | 14 ++++++++++++++
gdb/x86-linux-nat.c | 15 ++++++++-------
7 files changed, 101 insertions(+), 10 deletions(-)
diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 652d351..b1982be 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -134,6 +134,32 @@ typedef struct
} Elf64_auxv_t;
#endif
+/* LWP accessors. */
+
+/* See nat/linux-nat.h. */
+
+ptid_t
+ptid_of_lwp (struct lwp_info *lwp)
+{
+ return ptid_of (get_lwp_thread (lwp));
+}
+
+/* See nat/linux-nat.h. */
+
+int
+lwp_is_stopped (struct lwp_info *lwp)
+{
+ return lwp->stopped;
+}
+
+/* See nat/linux-nat.h. */
+
+int
+lwp_is_stopped_by_watchpoint (struct lwp_info *lwp)
+{
+ return lwp->stopped_by_watchpoint;
+}
+
/* A list of all unknown processes which receive stop signals. Some
other process will presumably claim each of these as forked
children momentarily. */
diff --git a/gdb/gdbserver/linux-x86-low.c b/gdb/gdbserver/linux-x86-low.c
index 7d5b52b..ead70a0 100644
--- a/gdb/gdbserver/linux-x86-low.c
+++ b/gdb/gdbserver/linux-x86-low.c
@@ -569,7 +569,7 @@ update_debug_registers_callback (struct lwp_info *lwp, void *arg)
/* If the lwp isn't stopped, force it to momentarily pause, so
we can update its debug registers. */
- if (!lwp->stopped)
+ if (!lwp_is_stopped (lwp))
linux_stop_lwp (lwp);
return 0;
@@ -769,7 +769,7 @@ x86_debug_reg_state (pid_t pid)
static void
x86_linux_prepare_to_resume (struct lwp_info *lwp)
{
- ptid_t ptid = ptid_of (get_lwp_thread (lwp));
+ ptid_t ptid = ptid_of_lwp (lwp);
int clear_status = 0;
if (lwp->arch_private->debug_registers_changed)
@@ -798,7 +798,7 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp)
lwp->arch_private->debug_registers_changed = 0;
}
- if (clear_status || lwp->stopped_by_watchpoint)
+ if (clear_status || lwp_is_stopped_by_watchpoint (lwp))
x86_linux_dr_set (ptid, DR_STATUS, 0);
}
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index 7626d68..f51f7d3 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -281,6 +281,33 @@ static void delete_lwp (ptid_t ptid);
static struct lwp_info *find_lwp_pid (ptid_t ptid);
+/* LWP accessors. */
+
+/* See nat/linux-nat.h. */
+
+ptid_t
+ptid_of_lwp (struct lwp_info *lwp)
+{
+ return lwp->ptid;
+}
+
+/* See nat/linux-nat.h. */
+
+int
+lwp_is_stopped (struct lwp_info *lwp)
+{
+ return lwp->stopped;
+}
+
+/* See nat/linux-nat.h. */
+
+int
+lwp_is_stopped_by_watchpoint (struct lwp_info *lwp)
+{
+ return lwp->stopped_by_watchpoint;
+}
+
+
/* Trivial list manipulation functions to keep track of a list of
new stopped processes. */
static void
diff --git a/gdb/nat/linux-nat.h b/gdb/nat/linux-nat.h
index da77d6b..8dada8e 100644
--- a/gdb/nat/linux-nat.h
+++ b/gdb/nat/linux-nat.h
@@ -40,6 +40,20 @@ extern struct lwp_info *iterate_over_lwps (ptid_t filter,
iterate_over_lwps_ftype callback,
void *data);
+/* Return the ptid of LWP. */
+
+extern ptid_t ptid_of_lwp (struct lwp_info *lwp);
+
+/* Return nonzero if LWP is stopped, zero otherwise. This function
+ must be provided by the client. */
+
+extern int lwp_is_stopped (struct lwp_info *lwp);
+
+/* Return nonzero if LWP is stopped with a data watchpoint trap,
+ zero otherwise. This function must be provided by the client. */
+
+extern int lwp_is_stopped_by_watchpoint (struct lwp_info *lwp);
+
/* Cause LWP to stop. This function must be provided by the
client. */
diff --git a/gdb/x86-linux-nat.c b/gdb/x86-linux-nat.c
index 92bdfec..3c96740 100644
--- a/gdb/x86-linux-nat.c
+++ b/gdb/x86-linux-nat.c
@@ -131,7 +131,7 @@ update_debug_registers_callback (struct lwp_info *lwp, void *arg)
/* If the lwp isn't stopped, force it to momentarily pause, so we
can update its debug registers. */
- if (!lwp->stopped)
+ if (!lwp_is_stopped (lwp))
linux_stop_lwp (lwp);
/* Continue the iteration. */
@@ -167,6 +167,7 @@ x86_linux_dr_set_addr (int regnum, CORE_ADDR addr)
static void
x86_linux_prepare_to_resume (struct lwp_info *lwp)
{
+ ptid_t ptid = ptid_of_lwp (lwp);
int clear_status = 0;
/* NULL means this is the main thread still going through the shell,
@@ -178,7 +179,7 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp)
if (lwp->arch_private->debug_registers_changed)
{
struct x86_debug_reg_state *state
- = x86_debug_reg_state (ptid_get_pid (lwp->ptid));
+ = x86_debug_reg_state (ptid_get_pid (ptid));
int i;
/* On Linux kernel before 2.6.33 commit
@@ -191,12 +192,12 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp)
/* Clear DR_CONTROL first. In some cases, setting DR0-3 to a
value that doesn't match what is enabled in DR_CONTROL
results in EINVAL. */
- x86_linux_dr_set (lwp->ptid, DR_CONTROL, 0);
+ x86_linux_dr_set (ptid, DR_CONTROL, 0);
ALL_DEBUG_ADDRESS_REGISTERS (i)
if (state->dr_ref_count[i] > 0)
{
- x86_linux_dr_set (lwp->ptid, i, state->dr_mirror[i]);
+ x86_linux_dr_set (ptid, i, state->dr_mirror[i]);
/* If we're setting a watchpoint, any change the inferior
had done itself to the debug registers needs to be
@@ -208,13 +209,13 @@ x86_linux_prepare_to_resume (struct lwp_info *lwp)
/* If DR_CONTROL is supposed to be zero, we've already set it
above. */
if (state->dr_control_mirror != 0)
- x86_linux_dr_set (lwp->ptid, DR_CONTROL, state->dr_control_mirror);
+ x86_linux_dr_set (ptid, DR_CONTROL, state->dr_control_mirror);
lwp->arch_private->debug_registers_changed = 0;
}
- if (clear_status || lwp->stopped_by_watchpoint)
- x86_linux_dr_set (lwp->ptid, DR_STATUS, 0);
+ if (clear_status || lwp_is_stopped_by_watchpoint (lwp))
+ x86_linux_dr_set (ptid, DR_STATUS, 0);
}
static void
--
1.7.1