* [PATCH] Share more common target structures between gdb and gdbserver
@ 2013-07-16 18:49 Luis Machado
2013-07-22 17:18 ` Tom Tromey
2013-07-30 17:48 ` Pedro Alves
0 siblings, 2 replies; 9+ messages in thread
From: Luis Machado @ 2013-07-16 18:49 UTC (permalink / raw)
To: 'gdb-patches@sourceware.org'
[-- Attachment #1: Type: text/plain, Size: 396 bytes --]
Hi,
While doing some research about the remote fork following feature, i
noticed there was some duplication of target data structures for GDB and
gdbserver.
This patch moves the shareable code/data structures to
common/target-common.* and makes both GDB and gdbserver target files
reference the header common/target-common.h.
Makefiles and other files have been adjusted accordingly.
OK?
[-- Attachment #2: target_common.diff --]
[-- Type: text/x-patch, Size: 24976 bytes --]
2013-07-16 Luis Machado <lgustavo@codesourcery.com>
gdb/
* Makefile.in (SFILES): Add common/target-common.c.
Add common/target-common.h to headers.
(COMMON_OBS): Add target-common.o.
(target-common.o): New target.
* linux-nat.h (resume_kind): Move to common/target-common.h.
* target.c (target_waitstatus_to_string): Move to
common/target-common.c.
* target.h: Include target-common.h.
(target_waitkind): Move to common/target-common.h.
(target_waitstatus): Likewise.
(TARGET_WNOHANG): Likewise.
* common/target-common.c: New file.
* common/target-common.h: New file.
gdb/gdbserver/
* Makefile.in (SFILES): /common/target-common.c.
(OBS): Add target-common.o.
(server_h): Add $(srcdir)/../common/target-common.h.
(target-common.o): New target.
* server.c (queue_stop_reply_callback): Free
status string after use.
* target.c (target_waitstatus_to_string): Remove.
* target.h: Include target-common.h.
(resume_kind): Likewise.
(target_waitkind): Likewise.
(target_waitstatus): Likewise.
(TARGET_WNOHANG): Likewise.
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index a51afcb..2d574d4 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -774,7 +774,8 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
regset.c sol-thread.c windows-termcap.c \
common/gdb_vecs.c common/common-utils.c common/xml-utils.c \
common/ptid.c common/buffer.c gdb-dlfcn.c common/agent.c \
- common/format.c common/filestuff.c btrace.c record-btrace.c ctf.c
+ common/format.c common/filestuff.c btrace.c record-btrace.c ctf.c \
+ common/target-common.c
LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
@@ -853,7 +854,7 @@ common/common-utils.h common/xml-utils.h common/buffer.h common/ptid.h \
common/format.h common/host-defs.h utils.h common/queue.h common/gdb_string.h \
common/linux-osdata.h gdb-dlfcn.h auto-load.h probe.h stap-probe.h \
gdb_bfd.h sparc-ravenscar-thread.h ppc-ravenscar-thread.h common/linux-btrace.h \
-ctf.h common/i386-cpuid.h common/i386-gcc-cpuid.h
+ctf.h common/i386-cpuid.h common/i386-gcc-cpuid.h common/target-common.h
# Header files that already have srcdir in them, or which are in objdir.
@@ -947,7 +948,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
inferior.o osdata.o gdb_usleep.o record.o record-full.o gcore.o \
gdb_vecs.o jit.o progspace.o skip.o probe.o \
common-utils.o buffer.o ptid.o gdb-dlfcn.o common-agent.o \
- format.o registry.o btrace.o record-btrace.o
+ format.o registry.o btrace.o record-btrace.o target-common.o
TSOBS = inflow.o
@@ -2021,6 +2022,10 @@ linux-btrace.o: ${srcdir}/common/linux-btrace.c
$(COMPILE) $(srcdir)/common/linux-btrace.c
$(POSTCOMPILE)
+target-common.o: ${srcdir}/common/target-common.c
+ $(COMPILE) $(srcdir)/common/target-common.c
+ $(POSTCOMPILE)
+
#
# gdb/tui/ dependencies
#
diff --git a/gdb/common/target-common.c b/gdb/common/target-common.c
new file mode 100644
index 0000000..a7ee3e2
--- /dev/null
+++ b/gdb/common/target-common.c
@@ -0,0 +1,72 @@
+/* Common target operations for GDB and gdbserver.
+
+ Copyright (C) 1990-2013 Free Software Foundation, Inc.
+
+ Contributed by Cygnus Support.
+ Contributed by MontaVista Software.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
+
+#include "target-common.h"
+
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
+
+char *
+target_waitstatus_to_string (const struct target_waitstatus *ws)
+{
+ const char *kind_str = "status->kind = ";
+
+ switch (ws->kind)
+ {
+ case TARGET_WAITKIND_EXITED:
+ return xstrprintf ("%sexited, status = %d",
+ kind_str, ws->value.integer);
+ case TARGET_WAITKIND_STOPPED:
+ return xstrprintf ("%sstopped, signal = %s",
+ kind_str, gdb_signal_to_name (ws->value.sig));
+ case TARGET_WAITKIND_SIGNALLED:
+ return xstrprintf ("%ssignalled, signal = %s",
+ kind_str, gdb_signal_to_name (ws->value.sig));
+ case TARGET_WAITKIND_LOADED:
+ return xstrprintf ("%sloaded", kind_str);
+ case TARGET_WAITKIND_FORKED:
+ return xstrprintf ("%sforked", kind_str);
+ case TARGET_WAITKIND_VFORKED:
+ return xstrprintf ("%svforked", kind_str);
+ case TARGET_WAITKIND_EXECD:
+ return xstrprintf ("%sexecd", kind_str);
+ case TARGET_WAITKIND_VFORK_DONE:
+ return xstrprintf ("%svfork-done", kind_str);
+ case TARGET_WAITKIND_SYSCALL_ENTRY:
+ return xstrprintf ("%sentered syscall", kind_str);
+ case TARGET_WAITKIND_SYSCALL_RETURN:
+ return xstrprintf ("%sexited syscall", kind_str);
+ case TARGET_WAITKIND_SPURIOUS:
+ return xstrprintf ("%sspurious", kind_str);
+ case TARGET_WAITKIND_IGNORE:
+ return xstrprintf ("%signore", kind_str);
+ case TARGET_WAITKIND_NO_HISTORY:
+ return xstrprintf ("%sno-history", kind_str);
+ case TARGET_WAITKIND_NO_RESUMED:
+ return xstrprintf ("%sno-resumed", kind_str);
+ default:
+ return xstrprintf ("%sunknown???", kind_str);
+ }
+}
diff --git a/gdb/common/target-common.h b/gdb/common/target-common.h
new file mode 100644
index 0000000..e4bfae9
--- /dev/null
+++ b/gdb/common/target-common.h
@@ -0,0 +1,153 @@
+/* Interface between the debugger and target environments, including files
+ and processes, shared between GDB and gdbserver.
+
+ Copyright (C) 1990-2013 Free Software Foundation, Inc.
+
+ Contributed by Cygnus Support. Written by John Gilmore.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef TARGET_COMMON_H
+#define TARGET_COMMON_H
+
+#include "common-utils.h"
+#include "ptid.h"
+#include "gdb_signals.h"
+
+/* Ways to "resume" a thread. */
+
+enum resume_kind
+{
+ /* Thread should continue. */
+ resume_continue,
+
+ /* Thread should single-step. */
+ resume_step,
+
+ /* Thread should be stopped. */
+ resume_stop
+};
+
+/* Stuff for target_wait. */
+
+/* Generally, what has the program done? */
+enum target_waitkind
+{
+ /* The program has exited. The exit status is in value.integer. */
+ TARGET_WAITKIND_EXITED,
+
+ /* The program has stopped with a signal. Which signal is in
+ value.sig. */
+ TARGET_WAITKIND_STOPPED,
+
+ /* The program has terminated with a signal. Which signal is in
+ value.sig. */
+ TARGET_WAITKIND_SIGNALLED,
+
+ /* The program is letting us know that it dynamically loaded something
+ (e.g. it called load(2) on AIX). */
+ TARGET_WAITKIND_LOADED,
+
+ /* The program has forked. A "related" process' PTID is in
+ value.related_pid. I.e., if the child forks, value.related_pid
+ is the parent's ID. */
+
+ TARGET_WAITKIND_FORKED,
+
+ /* The program has vforked. A "related" process's PTID is in
+ value.related_pid. */
+
+ TARGET_WAITKIND_VFORKED,
+
+ /* The program has exec'ed a new executable file. The new file's
+ pathname is pointed to by value.execd_pathname. */
+
+ TARGET_WAITKIND_EXECD,
+
+ /* The program had previously vforked, and now the child is done
+ with the shared memory region, because it exec'ed or exited.
+ Note that the event is reported to the vfork parent. This is
+ only used if GDB did not stay attached to the vfork child,
+ otherwise, a TARGET_WAITKIND_EXECD or
+ TARGET_WAITKIND_EXIT|SIGNALLED event associated with the child
+ has the same effect. */
+ TARGET_WAITKIND_VFORK_DONE,
+
+ /* The program has entered or returned from a system call. On
+ HP-UX, this is used in the hardware watchpoint implementation.
+ The syscall's unique integer ID number is in value.syscall_id. */
+
+ TARGET_WAITKIND_SYSCALL_ENTRY,
+ TARGET_WAITKIND_SYSCALL_RETURN,
+
+ /* Nothing happened, but we stopped anyway. This perhaps should be handled
+ within target_wait, but I'm not sure target_wait should be resuming the
+ inferior. */
+ TARGET_WAITKIND_SPURIOUS,
+
+ /* An event has occured, but we should wait again.
+ Remote_async_wait() returns this when there is an event
+ on the inferior, but the rest of the world is not interested in
+ it. The inferior has not stopped, but has just sent some output
+ to the console, for instance. In this case, we want to go back
+ to the event loop and wait there for another event from the
+ inferior, rather than being stuck in the remote_async_wait()
+ function. sThis way the event loop is responsive to other events,
+ like for instance the user typing. */
+ TARGET_WAITKIND_IGNORE,
+
+ /* The target has run out of history information,
+ and cannot run backward any further. */
+ TARGET_WAITKIND_NO_HISTORY,
+
+ /* There are no resumed children left in the program. */
+ TARGET_WAITKIND_NO_RESUMED
+ };
+
+struct target_waitstatus
+{
+ enum target_waitkind kind;
+
+ /* Additional information about the event. */
+ union
+ {
+ /* Exit status */
+ int integer;
+ /* Signal number */
+ enum gdb_signal sig;
+ /* Forked child pid */
+ ptid_t related_pid;
+ /* execd pathname */
+ char *execd_pathname;
+ /* Syscall number */
+ int syscall_number;
+ } value;
+};
+
+/* Options that can be passed to target_wait. */
+
+/* Return immediately if there's no event already queued. If this
+ options is not requested, target_wait blocks waiting for an
+ event. */
+#define TARGET_WNOHANG 1
+
+/* Prototypes */
+
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
+extern char *target_waitstatus_to_string (const struct target_waitstatus *);
+
+#endif /* TARGET_COMMON_H */
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 2cbf208..010a096 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -157,7 +157,7 @@ SFILES= $(srcdir)/gdbreplay.c $(srcdir)/inferiors.c $(srcdir)/dll.c \
$(srcdir)/common/common-utils.c $(srcdir)/common/xml-utils.c \
$(srcdir)/common/linux-osdata.c $(srcdir)/common/ptid.c \
$(srcdir)/common/buffer.c $(srcdir)/common/linux-btrace.c \
- $(srcdir)/common/filestuff.c
+ $(srcdir)/common/filestuff.c $(srcdir)/common/target-common.c
DEPFILES = @GDBSERVER_DEPFILES@
@@ -166,13 +166,11 @@ LIBOBJS = @LIBOBJS@
SOURCES = $(SFILES)
TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS}
-OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o target.o \
- utils.o version.o vec.o gdb_vecs.o \
- mem-break.o hostio.o event-loop.o tracepoint.o \
- xml-utils.o common-utils.o ptid.o buffer.o format.o filestuff.o \
- dll.o notif.o tdesc.o \
- $(XML_BUILTIN) \
- $(DEPFILES) $(LIBOBJS)
+OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o \
+ target.o target-common.o utils.o version.o vec.o gdb_vecs.o \
+ mem-break.o hostio.o event-loop.o tracepoint.o xml-utils.o \
+ common-utils.o ptid.o buffer.o format.o filestuff.o dll.o notif.o \
+ tdesc.o $(XML_BUILTIN) $(DEPFILES) $(LIBOBJS)
GDBREPLAY_OBS = gdbreplay.o version.o
GDBSERVER_LIBS = @GDBSERVER_LIBS@
XM_CLIBS = @LIBS@
@@ -429,6 +427,7 @@ vec_h = $(srcdir)/../common/vec.h
gdb_vecs_h = $(srcdir)/../common/gdb_vecs.h
host_defs_h = $(srcdir)/../common/host-defs.h
libiberty_h = $(srcdir)/../../include/libiberty.h
+target_common_h = $(srcdir)/../common/target-common.h
# Since everything must include server.h, we make that depend on
# generated files.
server_h = $(srcdir)/server.h $(regcache_h) $(srcdir)/target.h \
@@ -438,6 +437,7 @@ server_h = $(srcdir)/server.h $(regcache_h) $(srcdir)/target.h \
$(srcdir)/../common/buffer.h \
$(srcdir)/../common/gdb_assert.h \
$(srcdir)/../common/gdb_locale.h \
+ $(srcdir)/../common/target-common.h \
$(ptid_h) \
$(signals_h) \
$(libiberty_h) \
@@ -548,6 +548,9 @@ filestuff.o: ../common/filestuff.c
agent.o: ../common/agent.c
$(COMPILE) $<
$(POSTCOMPILE)
+target-common.o: ../common/target-common.c
+ $(COMPILE) $<
+ $(POSTCOMPILE)
linux-btrace.o: ../common/linux-btrace.c $(linux_btrace_h) $(server_h)
$(CC) -c $(CPPFLAGS) $(INTERNAL_CFLAGS) $<
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index a172c98..a4b9129 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -2470,10 +2470,17 @@ queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg)
if (thread_stopped (thread))
{
if (debug_threads)
- fprintf (stderr,
- "Reporting thread %s as already stopped with %s\n",
- target_pid_to_str (entry->id),
- target_waitstatus_to_string (&thread->last_status));
+ {
+ char *status_string
+ = target_waitstatus_to_string (&thread->last_status);
+
+ fprintf (stderr,
+ "Reporting thread %s as already stopped with %s\n",
+ target_pid_to_str (entry->id),
+ status_string);
+
+ xfree (status_string);
+ }
gdb_assert (thread->last_status.kind != TARGET_WAITKIND_IGNORE);
diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c
index 3a28099..a47053c 100644
--- a/gdb/gdbserver/target.c
+++ b/gdb/gdbserver/target.c
@@ -140,48 +140,6 @@ target_pid_to_str (ptid_t ptid)
return buf;
}
-/* Return a pretty printed form of target_waitstatus. */
-
-const char *
-target_waitstatus_to_string (const struct target_waitstatus *ws)
-{
- static char buf[200];
- const char *kind_str = "status->kind = ";
-
- switch (ws->kind)
- {
- case TARGET_WAITKIND_EXITED:
- sprintf (buf, "%sexited, status = %d",
- kind_str, ws->value.integer);
- break;
- case TARGET_WAITKIND_STOPPED:
- sprintf (buf, "%sstopped, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- break;
- case TARGET_WAITKIND_SIGNALLED:
- sprintf (buf, "%ssignalled, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- break;
- case TARGET_WAITKIND_LOADED:
- sprintf (buf, "%sloaded", kind_str);
- break;
- case TARGET_WAITKIND_EXECD:
- sprintf (buf, "%sexecd", kind_str);
- break;
- case TARGET_WAITKIND_SPURIOUS:
- sprintf (buf, "%sspurious", kind_str);
- break;
- case TARGET_WAITKIND_IGNORE:
- sprintf (buf, "%signore", kind_str);
- break;
- default:
- sprintf (buf, "%sunknown???", kind_str);
- break;
- }
-
- return buf;
-}
-
int
kill_inferior (int pid)
{
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index c57cb40..d064b79 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -21,24 +21,12 @@
#ifndef TARGET_H
#define TARGET_H
+#include "target-common.h"
+
struct emit_ops;
struct btrace_target_info;
struct buffer;
-/* Ways to "resume" a thread. */
-
-enum resume_kind
-{
- /* Thread should continue. */
- resume_continue,
-
- /* Thread should single-step. */
- resume_step,
-
- /* Thread should be stopped. */
- resume_stop
-};
-
/* This structure describes how to resume a particular thread (or all
threads) based on the client's request. If thread is -1, then this
entry applies to all threads. These are passed around as an
@@ -68,57 +56,6 @@ struct thread_resume
CORE_ADDR step_range_end; /* Exclusive */
};
-/* Generally, what has the program done? */
-enum target_waitkind
- {
- /* The program has exited. The exit status is in
- value.integer. */
- TARGET_WAITKIND_EXITED,
-
- /* The program has stopped with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_STOPPED,
-
- /* The program has terminated with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_SIGNALLED,
-
- /* The program is letting us know that it dynamically loaded
- something. */
- TARGET_WAITKIND_LOADED,
-
- /* The program has exec'ed a new executable file. The new file's
- pathname is pointed to by value.execd_pathname. */
- TARGET_WAITKIND_EXECD,
-
- /* Nothing of interest to GDB happened, but we stopped anyway. */
- TARGET_WAITKIND_SPURIOUS,
-
- /* An event has occurred, but we should wait again. In this case,
- we want to go back to the event loop and wait there for another
- event from the inferior. */
- TARGET_WAITKIND_IGNORE
- };
-
-struct target_waitstatus
- {
- enum target_waitkind kind;
-
- /* Forked child pid, execd pathname, exit status or signal number. */
- union
- {
- int integer;
- enum gdb_signal sig;
- ptid_t related_pid;
- char *execd_pathname;
- }
- value;
- };
-
-/* Options that can be passed to target_ops->wait. */
-
-#define TARGET_WNOHANG 1
-
struct target_ops
{
/* Start a new process.
@@ -596,6 +533,4 @@ void set_desired_inferior (int id);
const char *target_pid_to_str (ptid_t);
-const char *target_waitstatus_to_string (const struct target_waitstatus *);
-
#endif /* TARGET_H */
diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h
index 3de866d..cb8f1da 100644
--- a/gdb/linux-nat.h
+++ b/gdb/linux-nat.h
@@ -23,20 +23,6 @@
struct arch_lwp_info;
-/* Ways to "resume" a thread. */
-
-enum resume_kind
-{
- /* Thread should continue. */
- resume_continue,
-
- /* Thread should single-step. */
- resume_step,
-
- /* Thread should be stopped. */
- resume_stop
-};
-
/* Structure describing an LWP. This is public only for the purposes
of ALL_LWPS; target-specific code should generally not access it
directly. */
diff --git a/gdb/target.c b/gdb/target.c
index 920f916..a3a8c98 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -3861,52 +3861,6 @@ debug_to_post_attach (int pid)
fprintf_unfiltered (gdb_stdlog, "target_post_attach (%d)\n", pid);
}
-/* Return a pretty printed form of target_waitstatus.
- Space for the result is malloc'd, caller must free. */
-
-char *
-target_waitstatus_to_string (const struct target_waitstatus *ws)
-{
- const char *kind_str = "status->kind = ";
-
- switch (ws->kind)
- {
- case TARGET_WAITKIND_EXITED:
- return xstrprintf ("%sexited, status = %d",
- kind_str, ws->value.integer);
- case TARGET_WAITKIND_STOPPED:
- return xstrprintf ("%sstopped, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- case TARGET_WAITKIND_SIGNALLED:
- return xstrprintf ("%ssignalled, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- case TARGET_WAITKIND_LOADED:
- return xstrprintf ("%sloaded", kind_str);
- case TARGET_WAITKIND_FORKED:
- return xstrprintf ("%sforked", kind_str);
- case TARGET_WAITKIND_VFORKED:
- return xstrprintf ("%svforked", kind_str);
- case TARGET_WAITKIND_EXECD:
- return xstrprintf ("%sexecd", kind_str);
- case TARGET_WAITKIND_VFORK_DONE:
- return xstrprintf ("%svfork-done", kind_str);
- case TARGET_WAITKIND_SYSCALL_ENTRY:
- return xstrprintf ("%sentered syscall", kind_str);
- case TARGET_WAITKIND_SYSCALL_RETURN:
- return xstrprintf ("%sexited syscall", kind_str);
- case TARGET_WAITKIND_SPURIOUS:
- return xstrprintf ("%sspurious", kind_str);
- case TARGET_WAITKIND_IGNORE:
- return xstrprintf ("%signore", kind_str);
- case TARGET_WAITKIND_NO_HISTORY:
- return xstrprintf ("%sno-history", kind_str);
- case TARGET_WAITKIND_NO_RESUMED:
- return xstrprintf ("%sno-resumed", kind_str);
- default:
- return xstrprintf ("%sunknown???", kind_str);
- }
-}
-
/* Concatenate ELEM to LIST, a comma separate list, and return the
result. The LIST incoming argument is released. */
diff --git a/gdb/target.h b/gdb/target.h
index 1bf716e..2b20703 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -57,6 +57,7 @@ struct expression;
it goes into the file stratum, which is always below the process
stratum. */
+#include "target-common.h"
#include "bfd.h"
#include "symtab.h"
#include "memattr.h"
@@ -81,106 +82,6 @@ enum thread_control_capabilities
tc_schedlock = 1, /* Can lock the thread scheduler. */
};
-/* Stuff for target_wait. */
-
-/* Generally, what has the program done? */
-enum target_waitkind
- {
- /* The program has exited. The exit status is in value.integer. */
- TARGET_WAITKIND_EXITED,
-
- /* The program has stopped with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_STOPPED,
-
- /* The program has terminated with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_SIGNALLED,
-
- /* The program is letting us know that it dynamically loaded something
- (e.g. it called load(2) on AIX). */
- TARGET_WAITKIND_LOADED,
-
- /* The program has forked. A "related" process' PTID is in
- value.related_pid. I.e., if the child forks, value.related_pid
- is the parent's ID. */
-
- TARGET_WAITKIND_FORKED,
-
- /* The program has vforked. A "related" process's PTID is in
- value.related_pid. */
-
- TARGET_WAITKIND_VFORKED,
-
- /* The program has exec'ed a new executable file. The new file's
- pathname is pointed to by value.execd_pathname. */
-
- TARGET_WAITKIND_EXECD,
-
- /* The program had previously vforked, and now the child is done
- with the shared memory region, because it exec'ed or exited.
- Note that the event is reported to the vfork parent. This is
- only used if GDB did not stay attached to the vfork child,
- otherwise, a TARGET_WAITKIND_EXECD or
- TARGET_WAITKIND_EXIT|SIGNALLED event associated with the child
- has the same effect. */
- TARGET_WAITKIND_VFORK_DONE,
-
- /* The program has entered or returned from a system call. On
- HP-UX, this is used in the hardware watchpoint implementation.
- The syscall's unique integer ID number is in value.syscall_id. */
-
- TARGET_WAITKIND_SYSCALL_ENTRY,
- TARGET_WAITKIND_SYSCALL_RETURN,
-
- /* Nothing happened, but we stopped anyway. This perhaps should be handled
- within target_wait, but I'm not sure target_wait should be resuming the
- inferior. */
- TARGET_WAITKIND_SPURIOUS,
-
- /* An event has occured, but we should wait again.
- Remote_async_wait() returns this when there is an event
- on the inferior, but the rest of the world is not interested in
- it. The inferior has not stopped, but has just sent some output
- to the console, for instance. In this case, we want to go back
- to the event loop and wait there for another event from the
- inferior, rather than being stuck in the remote_async_wait()
- function. sThis way the event loop is responsive to other events,
- like for instance the user typing. */
- TARGET_WAITKIND_IGNORE,
-
- /* The target has run out of history information,
- and cannot run backward any further. */
- TARGET_WAITKIND_NO_HISTORY,
-
- /* There are no resumed children left in the program. */
- TARGET_WAITKIND_NO_RESUMED
- };
-
-struct target_waitstatus
- {
- enum target_waitkind kind;
-
- /* Forked child pid, execd pathname, exit status, signal number or
- syscall number. */
- union
- {
- int integer;
- enum gdb_signal sig;
- ptid_t related_pid;
- char *execd_pathname;
- int syscall_number;
- }
- value;
- };
-
-/* Options that can be passed to target_wait. */
-
-/* Return immediately if there's no event already queued. If this
- options is not requested, target_wait blocks waiting for an
- event. */
-#define TARGET_WNOHANG 1
-
/* The structure below stores information about a system call.
It is basically used in the "catch syscall" command, and in
every function that gives information about a system call.
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] Share more common target structures between gdb and gdbserver
2013-07-16 18:49 [PATCH] Share more common target structures between gdb and gdbserver Luis Machado
@ 2013-07-22 17:18 ` Tom Tromey
2013-07-22 18:23 ` Luis Machado
2013-07-30 17:48 ` Pedro Alves
1 sibling, 1 reply; 9+ messages in thread
From: Tom Tromey @ 2013-07-22 17:18 UTC (permalink / raw)
To: lgustavo; +Cc: 'gdb-patches@sourceware.org'
>>>>> "Luis" == Luis Machado <lgustavo@codesourcery.com> writes:
Luis> While doing some research about the remote fork following feature, i
Luis> noticed there was some duplication of target data structures for GDB
Luis> and gdbserver.
Luis> This patch moves the shareable code/data structures to
Luis> common/target-common.* and makes both GDB and gdbserver target files
Luis> reference the header common/target-common.h.
Thanks.
Luis> OK?
A couple of trivial nits.
Luis> diff --git a/gdb/common/target-common.c b/gdb/common/target-common.c
Luis> new file mode 100644
Luis> index 0000000..a7ee3e2
Luis> --- /dev/null
Luis> +++ b/gdb/common/target-common.c
Luis> +/* Return a pretty printed form of target_waitstatus.
Luis> + Space for the result is malloc'd, caller must free. */
Luis> +
Luis> +#include "target-common.h"
I think common .c files ought to start with:
#ifdef GDBSERVER
#include "server.h"
#else
#include "defs.h"
#endif
Not pretty, but it seems to be the standard.
Luis> +/* Generally, what has the program done? */
Luis> +enum target_waitkind
Luis> +{
[...]
Luis> + };
This line is mis-indented.
I thought at first that it was this way originally, but you've
reindented the body of the enum generally, just not this line.
Luis> @@ -429,6 +427,7 @@ vec_h = $(srcdir)/../common/vec.h
Luis> gdb_vecs_h = $(srcdir)/../common/gdb_vecs.h
Luis> host_defs_h = $(srcdir)/../common/host-defs.h
Luis> libiberty_h = $(srcdir)/../../include/libiberty.h
Luis> +target_common_h = $(srcdir)/../common/target-common.h
I don't think this is needed.
This is ok with the above fixed.
Thanks for working on this.
Tom
^ permalink raw reply [flat|nested] 9+ messages in thread* Re: [PATCH] Share more common target structures between gdb and gdbserver
2013-07-22 17:18 ` Tom Tromey
@ 2013-07-22 18:23 ` Luis Machado
0 siblings, 0 replies; 9+ messages in thread
From: Luis Machado @ 2013-07-22 18:23 UTC (permalink / raw)
To: Tom Tromey; +Cc: 'gdb-patches@sourceware.org'
[-- Attachment #1: Type: text/plain, Size: 1866 bytes --]
On 07/22/2013 02:18 PM, Tom Tromey wrote:
>>>>>> "Luis" == Luis Machado <lgustavo@codesourcery.com> writes:
>
> Luis> While doing some research about the remote fork following feature, i
> Luis> noticed there was some duplication of target data structures for GDB
> Luis> and gdbserver.
>
> Luis> This patch moves the shareable code/data structures to
> Luis> common/target-common.* and makes both GDB and gdbserver target files
> Luis> reference the header common/target-common.h.
>
> Thanks.
>
> Luis> OK?
>
> A couple of trivial nits.
>
> Luis> diff --git a/gdb/common/target-common.c b/gdb/common/target-common.c
> Luis> new file mode 100644
> Luis> index 0000000..a7ee3e2
> Luis> --- /dev/null
> Luis> +++ b/gdb/common/target-common.c
>
> Luis> +/* Return a pretty printed form of target_waitstatus.
> Luis> + Space for the result is malloc'd, caller must free. */
> Luis> +
> Luis> +#include "target-common.h"
>
> I think common .c files ought to start with:
>
> #ifdef GDBSERVER
> #include "server.h"
> #else
> #include "defs.h"
> #endif
>
> Not pretty, but it seems to be the standard.
Agreed. I missed this.
>
> Luis> +/* Generally, what has the program done? */
> Luis> +enum target_waitkind
> Luis> +{
> [...]
> Luis> + };
>
> This line is mis-indented.
> I thought at first that it was this way originally, but you've
> reindented the body of the enum generally, just not this line.
>
> Luis> @@ -429,6 +427,7 @@ vec_h = $(srcdir)/../common/vec.h
> Luis> gdb_vecs_h = $(srcdir)/../common/gdb_vecs.h
> Luis> host_defs_h = $(srcdir)/../common/host-defs.h
> Luis> libiberty_h = $(srcdir)/../../include/libiberty.h
> Luis> +target_common_h = $(srcdir)/../common/target-common.h
>
> I don't think this is needed.
>
> This is ok with the above fixed.
> Thanks for working on this.
Thanks Tom. Please find attached what i plan to commit soon.
Luis
[-- Attachment #2: target.diff --]
[-- Type: text/x-patch, Size: 24617 bytes --]
2013-07-22 Luis Machado <lgustavo@codesourcery.com>
gdb/
* Makefile.in (SFILES): Add common/target-common.c.
Add common/target-common.h to headers.
(COMMON_OBS): Add target-common.o.
(target-common.o): New target.
* linux-nat.h (resume_kind): Move to common/target-common.h.
* target.c (target_waitstatus_to_string): Move to
common/target-common.c.
* target.h: Include target-common.h.
(target_waitkind): Move to common/target-common.h.
(target_waitstatus): Likewise.
(TARGET_WNOHANG): Likewise.
* common/target-common.c: New file.
* common/target-common.h: New file.
gdb/gdbserver/
* Makefile.in (SFILES): /common/target-common.c.
(OBS): Add target-common.o.
(server_h): Add $(srcdir)/../common/target-common.h.
(target-common.o): New target.
* server.c (queue_stop_reply_callback): Free
status string after use.
* target.c (target_waitstatus_to_string): Remove.
* target.h: Include target-common.h.
(resume_kind): Likewise.
(target_waitkind): Likewise.
(target_waitstatus): Likewise.
(TARGET_WNOHANG): Likewise.
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index a51afcb..2d574d4 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -774,7 +774,8 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \
regset.c sol-thread.c windows-termcap.c \
common/gdb_vecs.c common/common-utils.c common/xml-utils.c \
common/ptid.c common/buffer.c gdb-dlfcn.c common/agent.c \
- common/format.c common/filestuff.c btrace.c record-btrace.c ctf.c
+ common/format.c common/filestuff.c btrace.c record-btrace.c ctf.c \
+ common/target-common.c
LINTFILES = $(SFILES) $(YYFILES) $(CONFIG_SRCS) init.c
@@ -853,7 +854,7 @@ common/common-utils.h common/xml-utils.h common/buffer.h common/ptid.h \
common/format.h common/host-defs.h utils.h common/queue.h common/gdb_string.h \
common/linux-osdata.h gdb-dlfcn.h auto-load.h probe.h stap-probe.h \
gdb_bfd.h sparc-ravenscar-thread.h ppc-ravenscar-thread.h common/linux-btrace.h \
-ctf.h common/i386-cpuid.h common/i386-gcc-cpuid.h
+ctf.h common/i386-cpuid.h common/i386-gcc-cpuid.h common/target-common.h
# Header files that already have srcdir in them, or which are in objdir.
@@ -947,7 +948,7 @@ COMMON_OBS = $(DEPFILES) $(CONFIG_OBS) $(YYOBJ) \
inferior.o osdata.o gdb_usleep.o record.o record-full.o gcore.o \
gdb_vecs.o jit.o progspace.o skip.o probe.o \
common-utils.o buffer.o ptid.o gdb-dlfcn.o common-agent.o \
- format.o registry.o btrace.o record-btrace.o
+ format.o registry.o btrace.o record-btrace.o target-common.o
TSOBS = inflow.o
@@ -2021,6 +2022,10 @@ linux-btrace.o: ${srcdir}/common/linux-btrace.c
$(COMPILE) $(srcdir)/common/linux-btrace.c
$(POSTCOMPILE)
+target-common.o: ${srcdir}/common/target-common.c
+ $(COMPILE) $(srcdir)/common/target-common.c
+ $(POSTCOMPILE)
+
#
# gdb/tui/ dependencies
#
diff --git a/gdb/common/target-common.c b/gdb/common/target-common.c
new file mode 100644
index 0000000..2edbb2a
--- /dev/null
+++ b/gdb/common/target-common.c
@@ -0,0 +1,78 @@
+/* Common target operations for GDB and gdbserver.
+
+ Copyright (C) 1990-2013 Free Software Foundation, Inc.
+
+ Contributed by Cygnus Support.
+ Contributed by MontaVista Software.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifdef GDBSERVER
+#include "server.h"
+#else
+#include "defs.h"
+#endif
+
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
+
+#include "target-common.h"
+
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
+
+char *
+target_waitstatus_to_string (const struct target_waitstatus *ws)
+{
+ const char *kind_str = "status->kind = ";
+
+ switch (ws->kind)
+ {
+ case TARGET_WAITKIND_EXITED:
+ return xstrprintf ("%sexited, status = %d",
+ kind_str, ws->value.integer);
+ case TARGET_WAITKIND_STOPPED:
+ return xstrprintf ("%sstopped, signal = %s",
+ kind_str, gdb_signal_to_name (ws->value.sig));
+ case TARGET_WAITKIND_SIGNALLED:
+ return xstrprintf ("%ssignalled, signal = %s",
+ kind_str, gdb_signal_to_name (ws->value.sig));
+ case TARGET_WAITKIND_LOADED:
+ return xstrprintf ("%sloaded", kind_str);
+ case TARGET_WAITKIND_FORKED:
+ return xstrprintf ("%sforked", kind_str);
+ case TARGET_WAITKIND_VFORKED:
+ return xstrprintf ("%svforked", kind_str);
+ case TARGET_WAITKIND_EXECD:
+ return xstrprintf ("%sexecd", kind_str);
+ case TARGET_WAITKIND_VFORK_DONE:
+ return xstrprintf ("%svfork-done", kind_str);
+ case TARGET_WAITKIND_SYSCALL_ENTRY:
+ return xstrprintf ("%sentered syscall", kind_str);
+ case TARGET_WAITKIND_SYSCALL_RETURN:
+ return xstrprintf ("%sexited syscall", kind_str);
+ case TARGET_WAITKIND_SPURIOUS:
+ return xstrprintf ("%sspurious", kind_str);
+ case TARGET_WAITKIND_IGNORE:
+ return xstrprintf ("%signore", kind_str);
+ case TARGET_WAITKIND_NO_HISTORY:
+ return xstrprintf ("%sno-history", kind_str);
+ case TARGET_WAITKIND_NO_RESUMED:
+ return xstrprintf ("%sno-resumed", kind_str);
+ default:
+ return xstrprintf ("%sunknown???", kind_str);
+ }
+}
diff --git a/gdb/common/target-common.h b/gdb/common/target-common.h
new file mode 100644
index 0000000..d4d73f6
--- /dev/null
+++ b/gdb/common/target-common.h
@@ -0,0 +1,149 @@
+/* Interface between the debugger and target environments, including files
+ and processes, shared between GDB and gdbserver.
+
+ Copyright (C) 1990-2013 Free Software Foundation, Inc.
+
+ Contributed by Cygnus Support. Written by John Gilmore.
+
+ This file is part of GDB.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#ifndef TARGET_COMMON_H
+#define TARGET_COMMON_H
+
+#include "common-utils.h"
+#include "ptid.h"
+#include "gdb_signals.h"
+
+/* Ways to "resume" a thread. */
+
+enum resume_kind
+{
+ /* Thread should continue. */
+ resume_continue,
+
+ /* Thread should single-step. */
+ resume_step,
+
+ /* Thread should be stopped. */
+ resume_stop
+};
+
+/* Stuff for target_wait. */
+
+/* Generally, what has the program done? */
+enum target_waitkind
+{
+ /* The program has exited. The exit status is in value.integer. */
+ TARGET_WAITKIND_EXITED,
+
+ /* The program has stopped with a signal. Which signal is in
+ value.sig. */
+ TARGET_WAITKIND_STOPPED,
+
+ /* The program has terminated with a signal. Which signal is in
+ value.sig. */
+ TARGET_WAITKIND_SIGNALLED,
+
+ /* The program is letting us know that it dynamically loaded something
+ (e.g. it called load(2) on AIX). */
+ TARGET_WAITKIND_LOADED,
+
+ /* The program has forked. A "related" process' PTID is in
+ value.related_pid. I.e., if the child forks, value.related_pid
+ is the parent's ID. */
+ TARGET_WAITKIND_FORKED,
+
+ /* The program has vforked. A "related" process's PTID is in
+ value.related_pid. */
+ TARGET_WAITKIND_VFORKED,
+
+ /* The program has exec'ed a new executable file. The new file's
+ pathname is pointed to by value.execd_pathname. */
+ TARGET_WAITKIND_EXECD,
+
+ /* The program had previously vforked, and now the child is done
+ with the shared memory region, because it exec'ed or exited.
+ Note that the event is reported to the vfork parent. This is
+ only used if GDB did not stay attached to the vfork child,
+ otherwise, a TARGET_WAITKIND_EXECD or
+ TARGET_WAITKIND_EXIT|SIGNALLED event associated with the child
+ has the same effect. */
+ TARGET_WAITKIND_VFORK_DONE,
+
+ /* The program has entered or returned from a system call. On
+ HP-UX, this is used in the hardware watchpoint implementation.
+ The syscall's unique integer ID number is in value.syscall_id. */
+ TARGET_WAITKIND_SYSCALL_ENTRY,
+ TARGET_WAITKIND_SYSCALL_RETURN,
+
+ /* Nothing happened, but we stopped anyway. This perhaps should be handled
+ within target_wait, but I'm not sure target_wait should be resuming the
+ inferior. */
+ TARGET_WAITKIND_SPURIOUS,
+
+ /* An event has occured, but we should wait again.
+ Remote_async_wait() returns this when there is an event
+ on the inferior, but the rest of the world is not interested in
+ it. The inferior has not stopped, but has just sent some output
+ to the console, for instance. In this case, we want to go back
+ to the event loop and wait there for another event from the
+ inferior, rather than being stuck in the remote_async_wait()
+ function. sThis way the event loop is responsive to other events,
+ like for instance the user typing. */
+ TARGET_WAITKIND_IGNORE,
+
+ /* The target has run out of history information,
+ and cannot run backward any further. */
+ TARGET_WAITKIND_NO_HISTORY,
+
+ /* There are no resumed children left in the program. */
+ TARGET_WAITKIND_NO_RESUMED
+};
+
+struct target_waitstatus
+{
+ enum target_waitkind kind;
+
+ /* Additional information about the event. */
+ union
+ {
+ /* Exit status */
+ int integer;
+ /* Signal number */
+ enum gdb_signal sig;
+ /* Forked child pid */
+ ptid_t related_pid;
+ /* execd pathname */
+ char *execd_pathname;
+ /* Syscall number */
+ int syscall_number;
+ } value;
+};
+
+/* Options that can be passed to target_wait. */
+
+/* Return immediately if there's no event already queued. If this
+ options is not requested, target_wait blocks waiting for an
+ event. */
+#define TARGET_WNOHANG 1
+
+/* Prototypes */
+
+/* Return a pretty printed form of target_waitstatus.
+ Space for the result is malloc'd, caller must free. */
+extern char *target_waitstatus_to_string (const struct target_waitstatus *);
+
+#endif /* TARGET_COMMON_H */
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 2cbf208..b28f743 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -157,7 +157,7 @@ SFILES= $(srcdir)/gdbreplay.c $(srcdir)/inferiors.c $(srcdir)/dll.c \
$(srcdir)/common/common-utils.c $(srcdir)/common/xml-utils.c \
$(srcdir)/common/linux-osdata.c $(srcdir)/common/ptid.c \
$(srcdir)/common/buffer.c $(srcdir)/common/linux-btrace.c \
- $(srcdir)/common/filestuff.c
+ $(srcdir)/common/filestuff.c $(srcdir)/common/target-common.c
DEPFILES = @GDBSERVER_DEPFILES@
@@ -166,13 +166,11 @@ LIBOBJS = @LIBOBJS@
SOURCES = $(SFILES)
TAGFILES = $(SOURCES) ${HFILES} ${ALLPARAM} ${POSSLIBS}
-OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o target.o \
- utils.o version.o vec.o gdb_vecs.o \
- mem-break.o hostio.o event-loop.o tracepoint.o \
- xml-utils.o common-utils.o ptid.o buffer.o format.o filestuff.o \
- dll.o notif.o tdesc.o \
- $(XML_BUILTIN) \
- $(DEPFILES) $(LIBOBJS)
+OBS = agent.o ax.o inferiors.o regcache.o remote-utils.o server.o signals.o \
+ target.o target-common.o utils.o version.o vec.o gdb_vecs.o \
+ mem-break.o hostio.o event-loop.o tracepoint.o xml-utils.o \
+ common-utils.o ptid.o buffer.o format.o filestuff.o dll.o notif.o \
+ tdesc.o $(XML_BUILTIN) $(DEPFILES) $(LIBOBJS)
GDBREPLAY_OBS = gdbreplay.o version.o
GDBSERVER_LIBS = @GDBSERVER_LIBS@
XM_CLIBS = @LIBS@
@@ -438,6 +436,7 @@ server_h = $(srcdir)/server.h $(regcache_h) $(srcdir)/target.h \
$(srcdir)/../common/buffer.h \
$(srcdir)/../common/gdb_assert.h \
$(srcdir)/../common/gdb_locale.h \
+ $(srcdir)/../common/target-common.h \
$(ptid_h) \
$(signals_h) \
$(libiberty_h) \
@@ -548,6 +547,9 @@ filestuff.o: ../common/filestuff.c
agent.o: ../common/agent.c
$(COMPILE) $<
$(POSTCOMPILE)
+target-common.o: ../common/target-common.c
+ $(COMPILE) $<
+ $(POSTCOMPILE)
linux-btrace.o: ../common/linux-btrace.c $(linux_btrace_h) $(server_h)
$(CC) -c $(CPPFLAGS) $(INTERNAL_CFLAGS) $<
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index a172c98..a4b9129 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -2470,10 +2470,17 @@ queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg)
if (thread_stopped (thread))
{
if (debug_threads)
- fprintf (stderr,
- "Reporting thread %s as already stopped with %s\n",
- target_pid_to_str (entry->id),
- target_waitstatus_to_string (&thread->last_status));
+ {
+ char *status_string
+ = target_waitstatus_to_string (&thread->last_status);
+
+ fprintf (stderr,
+ "Reporting thread %s as already stopped with %s\n",
+ target_pid_to_str (entry->id),
+ status_string);
+
+ xfree (status_string);
+ }
gdb_assert (thread->last_status.kind != TARGET_WAITKIND_IGNORE);
diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c
index 3a28099..a47053c 100644
--- a/gdb/gdbserver/target.c
+++ b/gdb/gdbserver/target.c
@@ -140,48 +140,6 @@ target_pid_to_str (ptid_t ptid)
return buf;
}
-/* Return a pretty printed form of target_waitstatus. */
-
-const char *
-target_waitstatus_to_string (const struct target_waitstatus *ws)
-{
- static char buf[200];
- const char *kind_str = "status->kind = ";
-
- switch (ws->kind)
- {
- case TARGET_WAITKIND_EXITED:
- sprintf (buf, "%sexited, status = %d",
- kind_str, ws->value.integer);
- break;
- case TARGET_WAITKIND_STOPPED:
- sprintf (buf, "%sstopped, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- break;
- case TARGET_WAITKIND_SIGNALLED:
- sprintf (buf, "%ssignalled, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- break;
- case TARGET_WAITKIND_LOADED:
- sprintf (buf, "%sloaded", kind_str);
- break;
- case TARGET_WAITKIND_EXECD:
- sprintf (buf, "%sexecd", kind_str);
- break;
- case TARGET_WAITKIND_SPURIOUS:
- sprintf (buf, "%sspurious", kind_str);
- break;
- case TARGET_WAITKIND_IGNORE:
- sprintf (buf, "%signore", kind_str);
- break;
- default:
- sprintf (buf, "%sunknown???", kind_str);
- break;
- }
-
- return buf;
-}
-
int
kill_inferior (int pid)
{
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index c57cb40..d064b79 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -21,24 +21,12 @@
#ifndef TARGET_H
#define TARGET_H
+#include "target-common.h"
+
struct emit_ops;
struct btrace_target_info;
struct buffer;
-/* Ways to "resume" a thread. */
-
-enum resume_kind
-{
- /* Thread should continue. */
- resume_continue,
-
- /* Thread should single-step. */
- resume_step,
-
- /* Thread should be stopped. */
- resume_stop
-};
-
/* This structure describes how to resume a particular thread (or all
threads) based on the client's request. If thread is -1, then this
entry applies to all threads. These are passed around as an
@@ -68,57 +56,6 @@ struct thread_resume
CORE_ADDR step_range_end; /* Exclusive */
};
-/* Generally, what has the program done? */
-enum target_waitkind
- {
- /* The program has exited. The exit status is in
- value.integer. */
- TARGET_WAITKIND_EXITED,
-
- /* The program has stopped with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_STOPPED,
-
- /* The program has terminated with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_SIGNALLED,
-
- /* The program is letting us know that it dynamically loaded
- something. */
- TARGET_WAITKIND_LOADED,
-
- /* The program has exec'ed a new executable file. The new file's
- pathname is pointed to by value.execd_pathname. */
- TARGET_WAITKIND_EXECD,
-
- /* Nothing of interest to GDB happened, but we stopped anyway. */
- TARGET_WAITKIND_SPURIOUS,
-
- /* An event has occurred, but we should wait again. In this case,
- we want to go back to the event loop and wait there for another
- event from the inferior. */
- TARGET_WAITKIND_IGNORE
- };
-
-struct target_waitstatus
- {
- enum target_waitkind kind;
-
- /* Forked child pid, execd pathname, exit status or signal number. */
- union
- {
- int integer;
- enum gdb_signal sig;
- ptid_t related_pid;
- char *execd_pathname;
- }
- value;
- };
-
-/* Options that can be passed to target_ops->wait. */
-
-#define TARGET_WNOHANG 1
-
struct target_ops
{
/* Start a new process.
@@ -596,6 +533,4 @@ void set_desired_inferior (int id);
const char *target_pid_to_str (ptid_t);
-const char *target_waitstatus_to_string (const struct target_waitstatus *);
-
#endif /* TARGET_H */
diff --git a/gdb/linux-nat.h b/gdb/linux-nat.h
index 3de866d..cb8f1da 100644
--- a/gdb/linux-nat.h
+++ b/gdb/linux-nat.h
@@ -23,20 +23,6 @@
struct arch_lwp_info;
-/* Ways to "resume" a thread. */
-
-enum resume_kind
-{
- /* Thread should continue. */
- resume_continue,
-
- /* Thread should single-step. */
- resume_step,
-
- /* Thread should be stopped. */
- resume_stop
-};
-
/* Structure describing an LWP. This is public only for the purposes
of ALL_LWPS; target-specific code should generally not access it
directly. */
diff --git a/gdb/target.c b/gdb/target.c
index bc52ec4..18e10cb 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -3863,52 +3863,6 @@ debug_to_post_attach (int pid)
fprintf_unfiltered (gdb_stdlog, "target_post_attach (%d)\n", pid);
}
-/* Return a pretty printed form of target_waitstatus.
- Space for the result is malloc'd, caller must free. */
-
-char *
-target_waitstatus_to_string (const struct target_waitstatus *ws)
-{
- const char *kind_str = "status->kind = ";
-
- switch (ws->kind)
- {
- case TARGET_WAITKIND_EXITED:
- return xstrprintf ("%sexited, status = %d",
- kind_str, ws->value.integer);
- case TARGET_WAITKIND_STOPPED:
- return xstrprintf ("%sstopped, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- case TARGET_WAITKIND_SIGNALLED:
- return xstrprintf ("%ssignalled, signal = %s",
- kind_str, gdb_signal_to_name (ws->value.sig));
- case TARGET_WAITKIND_LOADED:
- return xstrprintf ("%sloaded", kind_str);
- case TARGET_WAITKIND_FORKED:
- return xstrprintf ("%sforked", kind_str);
- case TARGET_WAITKIND_VFORKED:
- return xstrprintf ("%svforked", kind_str);
- case TARGET_WAITKIND_EXECD:
- return xstrprintf ("%sexecd", kind_str);
- case TARGET_WAITKIND_VFORK_DONE:
- return xstrprintf ("%svfork-done", kind_str);
- case TARGET_WAITKIND_SYSCALL_ENTRY:
- return xstrprintf ("%sentered syscall", kind_str);
- case TARGET_WAITKIND_SYSCALL_RETURN:
- return xstrprintf ("%sexited syscall", kind_str);
- case TARGET_WAITKIND_SPURIOUS:
- return xstrprintf ("%sspurious", kind_str);
- case TARGET_WAITKIND_IGNORE:
- return xstrprintf ("%signore", kind_str);
- case TARGET_WAITKIND_NO_HISTORY:
- return xstrprintf ("%sno-history", kind_str);
- case TARGET_WAITKIND_NO_RESUMED:
- return xstrprintf ("%sno-resumed", kind_str);
- default:
- return xstrprintf ("%sunknown???", kind_str);
- }
-}
-
/* Concatenate ELEM to LIST, a comma separate list, and return the
result. The LIST incoming argument is released. */
diff --git a/gdb/target.h b/gdb/target.h
index 21e5792..f05026d 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -57,6 +57,7 @@ struct expression;
it goes into the file stratum, which is always below the process
stratum. */
+#include "target-common.h"
#include "bfd.h"
#include "symtab.h"
#include "memattr.h"
@@ -81,106 +82,6 @@ enum thread_control_capabilities
tc_schedlock = 1, /* Can lock the thread scheduler. */
};
-/* Stuff for target_wait. */
-
-/* Generally, what has the program done? */
-enum target_waitkind
- {
- /* The program has exited. The exit status is in value.integer. */
- TARGET_WAITKIND_EXITED,
-
- /* The program has stopped with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_STOPPED,
-
- /* The program has terminated with a signal. Which signal is in
- value.sig. */
- TARGET_WAITKIND_SIGNALLED,
-
- /* The program is letting us know that it dynamically loaded something
- (e.g. it called load(2) on AIX). */
- TARGET_WAITKIND_LOADED,
-
- /* The program has forked. A "related" process' PTID is in
- value.related_pid. I.e., if the child forks, value.related_pid
- is the parent's ID. */
-
- TARGET_WAITKIND_FORKED,
-
- /* The program has vforked. A "related" process's PTID is in
- value.related_pid. */
-
- TARGET_WAITKIND_VFORKED,
-
- /* The program has exec'ed a new executable file. The new file's
- pathname is pointed to by value.execd_pathname. */
-
- TARGET_WAITKIND_EXECD,
-
- /* The program had previously vforked, and now the child is done
- with the shared memory region, because it exec'ed or exited.
- Note that the event is reported to the vfork parent. This is
- only used if GDB did not stay attached to the vfork child,
- otherwise, a TARGET_WAITKIND_EXECD or
- TARGET_WAITKIND_EXIT|SIGNALLED event associated with the child
- has the same effect. */
- TARGET_WAITKIND_VFORK_DONE,
-
- /* The program has entered or returned from a system call. On
- HP-UX, this is used in the hardware watchpoint implementation.
- The syscall's unique integer ID number is in value.syscall_id. */
-
- TARGET_WAITKIND_SYSCALL_ENTRY,
- TARGET_WAITKIND_SYSCALL_RETURN,
-
- /* Nothing happened, but we stopped anyway. This perhaps should be handled
- within target_wait, but I'm not sure target_wait should be resuming the
- inferior. */
- TARGET_WAITKIND_SPURIOUS,
-
- /* An event has occured, but we should wait again.
- Remote_async_wait() returns this when there is an event
- on the inferior, but the rest of the world is not interested in
- it. The inferior has not stopped, but has just sent some output
- to the console, for instance. In this case, we want to go back
- to the event loop and wait there for another event from the
- inferior, rather than being stuck in the remote_async_wait()
- function. sThis way the event loop is responsive to other events,
- like for instance the user typing. */
- TARGET_WAITKIND_IGNORE,
-
- /* The target has run out of history information,
- and cannot run backward any further. */
- TARGET_WAITKIND_NO_HISTORY,
-
- /* There are no resumed children left in the program. */
- TARGET_WAITKIND_NO_RESUMED
- };
-
-struct target_waitstatus
- {
- enum target_waitkind kind;
-
- /* Forked child pid, execd pathname, exit status, signal number or
- syscall number. */
- union
- {
- int integer;
- enum gdb_signal sig;
- ptid_t related_pid;
- char *execd_pathname;
- int syscall_number;
- }
- value;
- };
-
-/* Options that can be passed to target_wait. */
-
-/* Return immediately if there's no event already queued. If this
- options is not requested, target_wait blocks waiting for an
- event. */
-#define TARGET_WNOHANG 1
-
/* The structure below stores information about a system call.
It is basically used in the "catch syscall" command, and in
every function that gives information about a system call.
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Share more common target structures between gdb and gdbserver
2013-07-16 18:49 [PATCH] Share more common target structures between gdb and gdbserver Luis Machado
2013-07-22 17:18 ` Tom Tromey
@ 2013-07-30 17:48 ` Pedro Alves
2013-07-30 18:11 ` Tom Tromey
2013-07-31 18:43 ` Luis Machado
1 sibling, 2 replies; 9+ messages in thread
From: Pedro Alves @ 2013-07-30 17:48 UTC (permalink / raw)
To: lgustavo; +Cc: 'gdb-patches@sourceware.org'
On 07/16/2013 07:49 PM, Luis Machado wrote:
> Hi,
>
> While doing some research about the remote fork following feature, i
> noticed there was some duplication of target data structures for GDB and
> gdbserver.
>
> This patch moves the shareable code/data structures to
> common/target-common.* and makes both GDB and gdbserver target files
> reference the header common/target-common.h.
>
> Makefiles and other files have been adjusted accordingly.
I'd very much prefer avoiding "common" in file names, instead
naming the files for what they contain, not for the fact that they're
"common" to two programs (gdb, gdbserver) presently. I think of it
this way -- when we finally end up with only one backend (or one
backend using a foo-common.c file), I'd rather avoid
renaming these files to something else, because they're no longer
"common". Or, yet IOW, think of common/ as a library. Can you
imagine if all libraries in a distro named their implementation
files "foo-common.c" ? Because that's what should happen given
they're used by lots of programs, right? :-) The direction I prefer
is, when moving things to common/ we take the opportunity to split them
into smaller, more atomic, leaner units. E.g., that's how we ended up
with ptid.h/ptid.c, instead of inferior-common.h (or some such).
If the file is just a dumping ground of misc things, then let's at
least call it that. Say, target-misc.h or target-defs.h.
Otherwise, this looks good to me.
On 07/16/2013 07:49 PM, Luis Machado wrote:
> +++ b/gdb/common/target-common.h
> @@ -0,0 +1,153 @@
> +/* Interface between the debugger and target environments, including files
> + and processes, shared between GDB and gdbserver.
> +
> + Copyright (C) 1990-2013 Free Software Foundation, Inc.
> +
> + Contributed by Cygnus Support. Written by John Gilmore.
(I have absolutely nothing again John, but this shows how
"contributed by"/"written by" lines are a disservice to future
hackers, IMO. Lot's of code here that others wrote.)
--
Pedro Alves
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Share more common target structures between gdb and gdbserver
2013-07-30 17:48 ` Pedro Alves
@ 2013-07-30 18:11 ` Tom Tromey
2013-07-31 12:16 ` Pedro Alves
2013-07-31 18:43 ` Luis Machado
1 sibling, 1 reply; 9+ messages in thread
From: Tom Tromey @ 2013-07-30 18:11 UTC (permalink / raw)
To: Pedro Alves; +Cc: lgustavo, 'gdb-patches@sourceware.org'
>>>>> "Pedro" == Pedro Alves <palves@redhat.com> writes:
Pedro> I'd very much prefer avoiding "common" in file names, instead
Pedro> naming the files for what they contain, not for the fact that they're
Pedro> "common" to two programs (gdb, gdbserver) presently. I think of it
Pedro> this way -- when we finally end up with only one backend (or one
Pedro> backend using a foo-common.c file), I'd rather avoid
Pedro> renaming these files to something else, because they're no longer
Pedro> "common". Or, yet IOW, think of common/ as a library. Can you
Pedro> imagine if all libraries in a distro named their implementation
Pedro> files "foo-common.c" ? Because that's what should happen given
Pedro> they're used by lots of programs, right? :-) The direction I prefer
Pedro> is, when moving things to common/ we take the opportunity to split them
Pedro> into smaller, more atomic, leaner units. E.g., that's how we ended up
Pedro> with ptid.h/ptid.c, instead of inferior-common.h (or some such).
This all makes sense to me.
I think it would be best to write this down in the "Common" page of the
wiki. We can add other guidelines there too. This will make it simpler
for people to work on the commonizing project.
Tom
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Share more common target structures between gdb and gdbserver
2013-07-30 17:48 ` Pedro Alves
2013-07-30 18:11 ` Tom Tromey
@ 2013-07-31 18:43 ` Luis Machado
2013-07-31 19:03 ` Pedro Alves
1 sibling, 1 reply; 9+ messages in thread
From: Luis Machado @ 2013-07-31 18:43 UTC (permalink / raw)
To: Pedro Alves; +Cc: 'gdb-patches@sourceware.org', Tom Tromey
On 07/30/2013 02:47 PM, Pedro Alves wrote:
> On 07/16/2013 07:49 PM, Luis Machado wrote:
>> Hi,
>>
>> While doing some research about the remote fork following feature, i
>> noticed there was some duplication of target data structures for GDB and
>> gdbserver.
>>
>> This patch moves the shareable code/data structures to
>> common/target-common.* and makes both GDB and gdbserver target files
>> reference the header common/target-common.h.
>>
>> Makefiles and other files have been adjusted accordingly.
>
> I'd very much prefer avoiding "common" in file names, instead
> naming the files for what they contain, not for the fact that they're
> "common" to two programs (gdb, gdbserver) presently. I think of it
> this way -- when we finally end up with only one backend (or one
> backend using a foo-common.c file), I'd rather avoid
> renaming these files to something else, because they're no longer
> "common". Or, yet IOW, think of common/ as a library. Can you
> imagine if all libraries in a distro named their implementation
> files "foo-common.c" ? Because that's what should happen given
> they're used by lots of programs, right? :-) The direction I prefer
> is, when moving things to common/ we take the opportunity to split them
> into smaller, more atomic, leaner units. E.g., that's how we ended up
> with ptid.h/ptid.c, instead of inferior-common.h (or some such).
It makes sense to me, though i think we may have to think about creating
directories of subsystems instead of laying files the old way in a flat
directory structure.
We still have a handful of files in common, so maybe it is a good
starting point for that.
> If the file is just a dumping ground of misc things, then let's at
> least call it that. Say, target-misc.h or target-defs.h.
I'll declare them target-defs.h and target-misc.h/target-misc.c. How
does that sound?
>
> Otherwise, this looks good to me.
>
> On 07/16/2013 07:49 PM, Luis Machado wrote:
>> +++ b/gdb/common/target-common.h
>> @@ -0,0 +1,153 @@
>> +/* Interface between the debugger and target environments, including files
>> + and processes, shared between GDB and gdbserver.
>> +
>> + Copyright (C) 1990-2013 Free Software Foundation, Inc.
>> +
>> + Contributed by Cygnus Support. Written by John Gilmore.
>
> (I have absolutely nothing again John, but this shows how
> "contributed by"/"written by" lines are a disservice to future
> hackers, IMO. Lot's of code here that others wrote.)
>
Not wanting to offend John, but should i just remove this line in the
upcoming patch?
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] Share more common target structures between gdb and gdbserver
2013-07-31 18:43 ` Luis Machado
@ 2013-07-31 19:03 ` Pedro Alves
0 siblings, 0 replies; 9+ messages in thread
From: Pedro Alves @ 2013-07-31 19:03 UTC (permalink / raw)
To: lgustavo; +Cc: 'gdb-patches@sourceware.org', Tom Tromey
On 07/31/2013 07:43 PM, Luis Machado wrote:
> On 07/30/2013 02:47 PM, Pedro Alves wrote:
>> On 07/16/2013 07:49 PM, Luis Machado wrote:
>>> Hi,
>>>
>>> While doing some research about the remote fork following feature, i
>>> noticed there was some duplication of target data structures for GDB and
>>> gdbserver.
>>>
>>> This patch moves the shareable code/data structures to
>>> common/target-common.* and makes both GDB and gdbserver target files
>>> reference the header common/target-common.h.
>>>
>>> Makefiles and other files have been adjusted accordingly.
>>
>> I'd very much prefer avoiding "common" in file names, instead
>> naming the files for what they contain, not for the fact that they're
>> "common" to two programs (gdb, gdbserver) presently. I think of it
>> this way -- when we finally end up with only one backend (or one
>> backend using a foo-common.c file), I'd rather avoid
>> renaming these files to something else, because they're no longer
>> "common". Or, yet IOW, think of common/ as a library. Can you
>> imagine if all libraries in a distro named their implementation
>> files "foo-common.c" ? Because that's what should happen given
>> they're used by lots of programs, right? :-) The direction I prefer
>> is, when moving things to common/ we take the opportunity to split them
>> into smaller, more atomic, leaner units. E.g., that's how we ended up
>> with ptid.h/ptid.c, instead of inferior-common.h (or some such).
>
> It makes sense to me, though i think we may have to think about creating
> directories of subsystems instead of laying files the old way in a flat
> directory structure.
Agreed.
My bare-minimal initial idea was to end up with the target backend stuff
in its own dir:
gdb/common/ (utils.c, etc., host independent bits.)
gdb/target/ (the backends)
(Given git is smart enough to understand moves automatically, I no
longer worry about losing cvs history when doing file moves these days.)
> We still have a handful of files in common, so maybe it is a good
> starting point for that.
>
>> If the file is just a dumping ground of misc things, then let's at
>> least call it that. Say, target-misc.h or target-defs.h.
>
> I'll declare them target-defs.h and target-misc.h/target-misc.c. How
> does that sound?
No real objection, but is target-waitstatus.h/target-waitstatus.c too
fine-grained?
>> (I have absolutely nothing again John, but this shows how
>> "contributed by"/"written by" lines are a disservice to future
>> hackers, IMO. Lot's of code here that others wrote.)
>>
>
> Not wanting to offend John, but should i just remove this line in the
> upcoming patch?
IMO, yes. This new file holds bits that are newer than the
original target vector.
>>> +/* Interface between the debugger and target environments, including files
>>> + and processes, shared between GDB and gdbserver.
The leading comment should be adjusted as well. This file does
not really hold the target interface definition.
--
Pedro Alves
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2013-07-31 19:03 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-16 18:49 [PATCH] Share more common target structures between gdb and gdbserver Luis Machado
2013-07-22 17:18 ` Tom Tromey
2013-07-22 18:23 ` Luis Machado
2013-07-30 17:48 ` Pedro Alves
2013-07-30 18:11 ` Tom Tromey
2013-07-31 12:16 ` Pedro Alves
2013-07-31 15:22 ` Tom Tromey
2013-07-31 18:43 ` Luis Machado
2013-07-31 19:03 ` Pedro Alves
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox