From 3360c0bf75c98188a29b2ea29183a0bdc33b5801 Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Wed, 24 Jul 2013 16:20:12 +0000 Subject: 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. --- gdb/common/target-common.c | 78 ++++++++++++++++++++++++ gdb/common/target-common.h | 149 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 227 insertions(+) create mode 100644 gdb/common/target-common.c create mode 100644 gdb/common/target-common.h (limited to 'gdb/common') 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 . */ + +#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 . */ + +#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 */ -- cgit v1.1