diff options
author | Luis Machado <luisgpm@br.ibm.com> | 2013-07-24 16:20:12 +0000 |
---|---|---|
committer | Luis Machado <luisgpm@br.ibm.com> | 2013-07-24 16:20:12 +0000 |
commit | 3360c0bf75c98188a29b2ea29183a0bdc33b5801 (patch) | |
tree | 0a1144597538d9f9a1b9c4fca782944bbb8c7128 /gdb/common | |
parent | 7e8b059be6b6b97b611b034e90f576c1479bdf75 (diff) | |
download | gdb-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.c | 78 | ||||
-rw-r--r-- | gdb/common/target-common.h | 149 |
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 */ |