From b9df521b0b9c5ec5920b070016ecdcbc1557c075 Mon Sep 17 00:00:00 2001 From: Luis Machado Date: Mon, 19 Aug 2013 16:54:10 +0000 Subject: gdb/ * Makefile.in (SFILES): Remove common/target-common.c and add target/waitstatus.c. (HFILES_NO_SRCDIR): Remove common/target-common.h and add target/resume.h, target/wait.h and target/waitstatus.h. (COMMON_OBS): Remove target-common.o and add waitstatus.o. (target-common.o): Remove. (waitstatus.o): New target object file. * common/target-common.c: Move contents to target/waitstatus.c and remove. * common/target-common.h: Move contents to other files and remove. (enum resume_kind: Move to target/resume.h. (TARGET_WNOHANG): Move to target/wait.h. (enum target_waitkind): Move to target/waitstatus.h. (struct target_waitstatus): Likewise. * target.h: Do not include target-common.h and include target/resume.h, target/wait.h and target/waitstatus.h. * target/resume.h: New file. * target/wait.h: New file. * target/waitstatus.h: New file. * target/waitstatus.c: New file. gdb/gdbserver/ * Makefile.in (INCLUDE_CFLAGS): Include -I$(srcdir)/../. (SFILES): Remove $(srcdir)/common/target-common.c and add $(srcdir)/target/waitstatus.c. (OBS): Remove target-common.o and add waitstatus.o. (server_h): Remove $(srcdir)/../common/target-common.h and add $(srcdir)/../target/resume.h, $(srcdir)/../target/wait.h and $(srcdir)/../target/waitstatus.h. (target-common.o): Remove. (waitstatus.o): New target object file. * target.h: Do not include target-common.h and include target/resume.h, target/wait.h and target/waitstatus.h. --- gdb/target/resume.h | 37 ++++++++++++++ gdb/target/wait.h | 30 ++++++++++++ gdb/target/waitstatus.c | 72 +++++++++++++++++++++++++++ gdb/target/waitstatus.h | 126 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 265 insertions(+) create mode 100644 gdb/target/resume.h create mode 100644 gdb/target/wait.h create mode 100644 gdb/target/waitstatus.c create mode 100644 gdb/target/waitstatus.h (limited to 'gdb/target') diff --git a/gdb/target/resume.h b/gdb/target/resume.h new file mode 100644 index 00000000000..bb7a38c63c0 --- /dev/null +++ b/gdb/target/resume.h @@ -0,0 +1,37 @@ +/* Target resumption definitions and prototypes. + + Copyright (C) 1990-2013 Free Software Foundation, Inc. + + 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 RESUME_H +#define RESUME_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 +}; + +#endif /* RESUME_H */ diff --git a/gdb/target/wait.h b/gdb/target/wait.h new file mode 100644 index 00000000000..a5f18b522d9 --- /dev/null +++ b/gdb/target/wait.h @@ -0,0 +1,30 @@ +/* Target wait definitions and prototypes. + + Copyright (C) 1990-2013 Free Software Foundation, Inc. + + 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 WAIT_H +#define WAIT_H + +/* 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 + +#endif /* WAIT_H */ diff --git a/gdb/target/waitstatus.c b/gdb/target/waitstatus.c new file mode 100644 index 00000000000..e6b850268b6 --- /dev/null +++ b/gdb/target/waitstatus.c @@ -0,0 +1,72 @@ +/* Target waitstatus implementations. + + Copyright (C) 1990-2013 Free Software Foundation, Inc. + + 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 + +#include "waitstatus.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/target/waitstatus.h b/gdb/target/waitstatus.h new file mode 100644 index 00000000000..cafbf15e6e6 --- /dev/null +++ b/gdb/target/waitstatus.h @@ -0,0 +1,126 @@ +/* Target waitstatus definitions and prototypes. + + Copyright (C) 1990-2013 Free Software Foundation, Inc. + + 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 WAITSTATUS_H +#define WAITSTATUS_H + +#include "common-utils.h" +#include "ptid.h" +#include "gdb_signals.h" + +/* 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; +}; + +/* 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 /* WAITSTATUS_H */ -- cgit v1.2.1