aboutsummaryrefslogtreecommitdiff
path: root/gdb/common
diff options
context:
space:
mode:
authorLuis Machado <luisgpm@br.ibm.com>2013-07-24 16:20:12 +0000
committerLuis Machado <luisgpm@br.ibm.com>2013-07-24 16:20:12 +0000
commit3360c0bf75c98188a29b2ea29183a0bdc33b5801 (patch)
tree0a1144597538d9f9a1b9c4fca782944bbb8c7128 /gdb/common
parent7e8b059be6b6b97b611b034e90f576c1479bdf75 (diff)
downloadgdb-3360c0bf75c98188a29b2ea29183a0bdc33b5801.zip
gdb-3360c0bf75c98188a29b2ea29183a0bdc33b5801.tar.gz
gdb-3360c0bf75c98188a29b2ea29183a0bdc33b5801.tar.bz2
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.
Diffstat (limited to 'gdb/common')
-rw-r--r--gdb/common/target-common.c78
-rw-r--r--gdb/common/target-common.h149
2 files changed, 227 insertions, 0 deletions
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 */