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.
This commit is contained in:
parent
7e8b059be6
commit
3360c0bf75
12 changed files with 290 additions and 284 deletions
|
@ -1,3 +1,19 @@
|
|||
2013-07-24 Luis Machado <lgustavo@codesourcery.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2013-07-24 Doug Evans <dje@google.com>
|
||||
|
||||
* dwarf2read.c (lookup_dwo_cutu): Change missing DWO complaint to
|
||||
|
|
|
@ -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
|
||||
#
|
||||
|
|
78
gdb/common/target-common.c
Normal file
78
gdb/common/target-common.c
Normal file
|
@ -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);
|
||||
}
|
||||
}
|
149
gdb/common/target-common.h
Normal file
149
gdb/common/target-common.h
Normal file
|
@ -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 */
|
|
@ -1,3 +1,18 @@
|
|||
2013-07-24 Luis Machado <lgustavo@codesourcery.com>
|
||||
|
||||
* 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.
|
||||
|
||||
2013-07-04 Yao Qi <yao@codesourcery.com>
|
||||
|
||||
* Makefile.in (host_alias): Use @host_noncanonical@.
|
||||
|
|
|
@ -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) $<
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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. */
|
||||
|
|
46
gdb/target.c
46
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. */
|
||||
|
||||
|
|
101
gdb/target.h
101
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.
|
||||
|
|
Loading…
Reference in a new issue