import gdb-2000-01-10 snapshot
This commit is contained in:
parent
3b7c8b7414
commit
0d06e24ba7
29 changed files with 1163 additions and 721 deletions
|
@ -1,3 +1,88 @@
|
||||||
|
2000-01-09 Christopher Faylor <cgf@cygnus.com>
|
||||||
|
|
||||||
|
* win32nat.c (handle_exceptions): Handle various arithmetic exceptions.
|
||||||
|
* configure.in: Add an additional library to cygwin link.
|
||||||
|
* configure: Regenerate.
|
||||||
|
|
||||||
|
Patch from Egor Duda <deo@logos-m.ru>:
|
||||||
|
* coffread.c (coff_symfile_read): Reinstate ability to recognize "pe"
|
||||||
|
type.
|
||||||
|
|
||||||
|
2000-01-07 Michael Snyder <msnyder@cleaver.cygnus.com>
|
||||||
|
|
||||||
|
* uw-thread.c: New file to support UnixWare user-mode threads:
|
||||||
|
contributed by Nickolas Duffek <nsd@cygnus.com>.
|
||||||
|
* target.h (struct target_ops): New vector, to_extra_thread_info,
|
||||||
|
allows back-ends to give extra details in info thread display.
|
||||||
|
(target_extra_thread_info): define new macro.
|
||||||
|
(target_find_new_threads): simplify macro. Cleanup comments.
|
||||||
|
* target.c (to_extra_thread_info): default and inherit new vector.
|
||||||
|
(cleanup_target): eliminate PARAMS, break up long lines,
|
||||||
|
provide default definition for to_extra_thread_info, and
|
||||||
|
to_find_new_threads. Default to_thread_alive and to_query
|
||||||
|
to return_zero, not target_ignore (they each return int not void).
|
||||||
|
(debug_to_find_new_threads): new debug entry.
|
||||||
|
(setup_target_debug): add debug_to_find_new_threads.
|
||||||
|
* gdbthread.h: export struct thread_info, find_thread_pid, and
|
||||||
|
iterate_over_threads. Add comments. Eliminate PARAMS. Update
|
||||||
|
copyright. Add new private data pointer for use by target back-ends.
|
||||||
|
* thread.c (struct thread_info): move definition to gdbthread.h.
|
||||||
|
(find_thread_pid): new exported function for thread lookup.
|
||||||
|
(iterate_over_threads): new exported function for applying
|
||||||
|
arbitrary operations to threads. Update copyright to 2000.
|
||||||
|
(info_threads_command): use new target_extra_thread_info vector
|
||||||
|
to display extra information about each thread (if implemented).
|
||||||
|
* config/i386/tm-i386v42mp.h: remove obsolete #defines for procfs.
|
||||||
|
Add defines for PIDGET, etc.
|
||||||
|
* config/i386/tm-i386sol2.h: ditto.
|
||||||
|
* config/sparc/tm-sun4sol2.h: ditto.
|
||||||
|
* config/i386/i386v42mp.mh: add uw-thread.o to NATDEPFILES.
|
||||||
|
* testsuite/gdb.threads/pthreads.exp: Try to link with -lthread
|
||||||
|
if -lpthread and -lpthreads fail.
|
||||||
|
|
||||||
|
* procfs.c: (PIDGET, TIDGET, MERGEPID): change default to no-op.
|
||||||
|
(proc_flags): combine flags that UnixWare splits into two locations.
|
||||||
|
(proc_modify_flag): add support for PR_KLC (kill on last close).
|
||||||
|
(proc_[un]set_kill_on_last_close): new functions.
|
||||||
|
|
||||||
|
2000-01-06 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* remote.c (remote_open_1): Fix message so it does not imply a
|
||||||
|
specific syntax for serial ports, as it is OS dependent.
|
||||||
|
(remote_async_open_1): Ibid.
|
||||||
|
(init_remote_ops): Ibid.
|
||||||
|
|
||||||
|
2000-01-06 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* rdi-share/serdrv.c (SerialOpen): Use speed from "-b" argument or
|
||||||
|
"set remotebaud" command (if set) when no speed is specified on
|
||||||
|
the "target rdi" command.
|
||||||
|
|
||||||
|
2000-01-06 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* rdi-share/serdrv.c (find_baud_rate): Add entries for 57600 and
|
||||||
|
115200.
|
||||||
|
(baud_options[]): Ibid.
|
||||||
|
|
||||||
|
2000-01-06 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* rdi-share/unixcomm.c: Fix SERIAL_PREFIX so it matches the prefix
|
||||||
|
used by each operating system.
|
||||||
|
|
||||||
|
2000-01-06 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* breakpoint.c (until_break_command): Add an argument for the
|
||||||
|
continuation, the beginning of the cleanups set up by this
|
||||||
|
command.
|
||||||
|
(until_break_command_continuation): Do cleanups until the one
|
||||||
|
passed in as argument instead of doing all of them.
|
||||||
|
|
||||||
|
* infcmd.c (finish_command_continuation): Expect a new argument,
|
||||||
|
which indicates up to where to do cleanups. Update calls to
|
||||||
|
do_exec_cleanups to use this marker, instead of ALL_CLEANUPS.
|
||||||
|
(finish_command): Add another argument for the continuation: the
|
||||||
|
starting cleanup for this command.
|
||||||
|
|
||||||
2000-01-05 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
2000-01-05 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
From Grant Edwards <grante@visi.com> (original patch from Thomas
|
From Grant Edwards <grante@visi.com> (original patch from Thomas
|
||||||
|
|
|
@ -229,7 +229,7 @@ CDEPS = $(XM_CDEPS) $(TM_CDEPS) $(NAT_CDEPS) $(SIM) $(BFD) $(READLINE) \
|
||||||
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
ADD_FILES = $(REGEX) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
||||||
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
ADD_DEPS = $(REGEX1) $(XM_ADD_FILES) $(TM_ADD_FILES) $(NAT_ADD_FILES)
|
||||||
|
|
||||||
VERSION = 20000105
|
VERSION = 20000110
|
||||||
DIST=gdb
|
DIST=gdb
|
||||||
|
|
||||||
LINT=/usr/5bin/lint
|
LINT=/usr/5bin/lint
|
||||||
|
|
|
@ -5215,10 +5215,10 @@ awatch_command (arg, from_tty)
|
||||||
static void
|
static void
|
||||||
until_break_command_continuation (struct continuation_arg *arg)
|
until_break_command_continuation (struct continuation_arg *arg)
|
||||||
{
|
{
|
||||||
/* Do all the exec cleanups, which at this point should only be the
|
struct cleanup *cleanups;
|
||||||
one set up in the first part of the until_break_command
|
|
||||||
function. */
|
cleanups = (struct cleanup *) arg->data;
|
||||||
do_exec_cleanups (ALL_CLEANUPS);
|
do_exec_cleanups (cleanups);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
|
@ -5232,6 +5232,8 @@ until_break_command (arg, from_tty)
|
||||||
struct frame_info *prev_frame = get_prev_frame (selected_frame);
|
struct frame_info *prev_frame = get_prev_frame (selected_frame);
|
||||||
struct breakpoint *breakpoint;
|
struct breakpoint *breakpoint;
|
||||||
struct cleanup *old_chain;
|
struct cleanup *old_chain;
|
||||||
|
struct continuation_arg *arg1;
|
||||||
|
|
||||||
|
|
||||||
clear_proceed_status ();
|
clear_proceed_status ();
|
||||||
|
|
||||||
|
@ -5262,7 +5264,7 @@ until_break_command (arg, from_tty)
|
||||||
old_chain = make_cleanup ((make_cleanup_func) delete_breakpoint,
|
old_chain = make_cleanup ((make_cleanup_func) delete_breakpoint,
|
||||||
breakpoint);
|
breakpoint);
|
||||||
else
|
else
|
||||||
make_exec_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
|
old_chain = make_exec_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
|
||||||
|
|
||||||
/* If we are running asynchronously, and the target supports async
|
/* If we are running asynchronously, and the target supports async
|
||||||
execution, we are not waiting for the target to stop, in the call
|
execution, we are not waiting for the target to stop, in the call
|
||||||
|
@ -5273,11 +5275,16 @@ until_break_command (arg, from_tty)
|
||||||
|
|
||||||
if (event_loop_p && target_can_async_p ())
|
if (event_loop_p && target_can_async_p ())
|
||||||
{
|
{
|
||||||
/* In this case we don't need args for the continuation, because
|
/* In this case the arg for the continuation is just the point
|
||||||
all it needs to do is do the cleanups in the
|
in the exec_cleanups chain from where to start doing
|
||||||
exec_cleanup_chain, which will be only those inserted by this
|
cleanups, because all the continuation does is the cleanups in
|
||||||
function. We can get away by using ALL_CLEANUPS. */
|
the exec_cleanup_chain. */
|
||||||
add_continuation (until_break_command_continuation, NULL);
|
arg1 =
|
||||||
|
(struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
|
||||||
|
arg1->next = NULL;
|
||||||
|
arg1->data = (PTR) old_chain;
|
||||||
|
|
||||||
|
add_continuation (until_break_command_continuation, arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Keep within the current frame */
|
/* Keep within the current frame */
|
||||||
|
|
|
@ -645,9 +645,9 @@ coff_symfile_read (objfile, mainline)
|
||||||
from the section address, rather than as absolute addresses.
|
from the section address, rather than as absolute addresses.
|
||||||
FIXME: We should use BFD to read the symbol table, and thus avoid
|
FIXME: We should use BFD to read the symbol table, and thus avoid
|
||||||
this problem. */
|
this problem. */
|
||||||
pe_file = !
|
pe_file =
|
||||||
( strncmp (bfd_get_target (objfile->obfd), "pe", 2)
|
strncmp (bfd_get_target (objfile->obfd), "pe", 2) == 0
|
||||||
| strncmp (bfd_get_target (objfile->obfd), "epoc-pe", 7));
|
|| strncmp (bfd_get_target (objfile->obfd), "epoc-pe", 7) == 0;
|
||||||
|
|
||||||
/* End of warning */
|
/* End of warning */
|
||||||
|
|
||||||
|
|
|
@ -9,5 +9,5 @@ XM_CLIBS= -lsocket -lnsl
|
||||||
# appropriate for i386v42mp
|
# appropriate for i386v42mp
|
||||||
NAT_FILE= nm-i386v42mp.h
|
NAT_FILE= nm-i386v42mp.h
|
||||||
NATDEPFILES= corelow.o core-regset.o solib.o fork-child.o i386v4-nat.o \
|
NATDEPFILES= corelow.o core-regset.o solib.o fork-child.o i386v4-nat.o \
|
||||||
procfs.o proc_api.o proc_events.o proc_flags.o proc_why.o
|
procfs.o proc_api.o proc_events.o proc_flags.o proc_why.o uw-thread.o
|
||||||
|
|
||||||
|
|
|
@ -46,18 +46,4 @@ extern char *sunpro_static_transform_name PARAMS ((char *));
|
||||||
#define PIDGET(pid) ((pid) & 0xffff)
|
#define PIDGET(pid) ((pid) & 0xffff)
|
||||||
#define TIDGET(pid) (((pid) >> 16) & 0xffff)
|
#define TIDGET(pid) (((pid) >> 16) & 0xffff)
|
||||||
|
|
||||||
/* Macro to extract carry from given regset. */
|
|
||||||
#define PS_FLAG_CARRY 0x1 /* Carry bit in PS */
|
|
||||||
#define PROCFS_GET_CARRY(regset) ((regset)[EFL] & PS_FLAG_CARRY)
|
|
||||||
|
|
||||||
#ifdef HAVE_THREAD_DB_LIB
|
|
||||||
|
|
||||||
extern char *solaris_pid_to_str PARAMS ((int pid));
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
extern char *procfs_pid_to_str PARAMS ((int pid));
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* ifndef TM_I386SOL2_H */
|
#endif /* ifndef TM_I386SOL2_H */
|
||||||
|
|
|
@ -26,20 +26,39 @@
|
||||||
|
|
||||||
#include "i386/tm-i386v4.h"
|
#include "i386/tm-i386v4.h"
|
||||||
|
|
||||||
/* procfs on this architecture has multiple fds (ctl, as, map, status)
|
/* define to select for other sysv4.2mp weirdness (see procfs.c) */
|
||||||
including a control fd */
|
|
||||||
|
|
||||||
#ifndef HAVE_MULTIPLE_PROC_FDS
|
|
||||||
#define HAVE_MULTIPLE_PROC_FDS
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* procfs on this architecture communicates with read/write instead
|
|
||||||
of ioctl */
|
|
||||||
|
|
||||||
#define PROCFS_USE_READ_WRITE
|
|
||||||
|
|
||||||
/* define to select for other sysv4.2mp weirdness */
|
|
||||||
|
|
||||||
#define UNIXWARE
|
#define UNIXWARE
|
||||||
|
|
||||||
|
/* The following macros extract process and lwp/thread ids from a
|
||||||
|
composite id.
|
||||||
|
|
||||||
|
For consistency with UnixWare core files, allocate bits 0-15 for
|
||||||
|
process ids and bits 16 and up for lwp ids. Reserve bit 31 for
|
||||||
|
negative return values to indicate exceptions, and use bit 30 as a
|
||||||
|
flag to indicate a user-mode thread, leaving 14 bits for lwp
|
||||||
|
ids. */
|
||||||
|
|
||||||
|
/* Number of bits in composite id allocated to process number. */
|
||||||
|
#define PIDBITS 16
|
||||||
|
|
||||||
|
/* Return the process id stored in composite PID. */
|
||||||
|
#define PIDGET(PID) (((PID) & ((1 << PIDBITS) - 1)))
|
||||||
|
|
||||||
|
/* Return the thread or lwp id stored in composite PID. */
|
||||||
|
#define TIDGET(PID) (((PID) & 0x3fffffff) >> PIDBITS)
|
||||||
|
#define LIDGET(PID) TIDGET(PID)
|
||||||
|
|
||||||
|
/* Construct a composite id from lwp LID and the process portion of
|
||||||
|
composite PID. */
|
||||||
|
#define MERGEPID(PID, LID) (PIDGET(PID) | ((LID) << PIDBITS))
|
||||||
|
#define MKLID(PID, LID) MERGEPID(PID, LID)
|
||||||
|
|
||||||
|
/* Construct a composite id from thread TID and the process portion of
|
||||||
|
composite PID. */
|
||||||
|
#define MKTID(PID, TID) (MERGEPID(PID, TID) | 0x40000000)
|
||||||
|
|
||||||
|
/* Return whether PID contains a user-space thread id. */
|
||||||
|
#define ISTID(PID) ((PID) & 0x40000000)
|
||||||
|
|
||||||
#endif /* ifndef TM_I386V42MP_H */
|
#endif /* ifndef TM_I386V42MP_H */
|
||||||
|
|
|
@ -79,15 +79,3 @@ extern char *sunpro_static_transform_name PARAMS ((char *));
|
||||||
#define PIDGET(pid) ((pid) & 0xffff)
|
#define PIDGET(pid) ((pid) & 0xffff)
|
||||||
#define TIDGET(pid) (((pid) >> 16) & 0xffff)
|
#define TIDGET(pid) (((pid) >> 16) & 0xffff)
|
||||||
|
|
||||||
/* Macro to extract carry from given regset. */
|
|
||||||
#define PROCFS_GET_CARRY(regset) ((regset)[R_PSR] & PS_FLAG_CARRY)
|
|
||||||
|
|
||||||
#ifdef HAVE_THREAD_DB_LIB
|
|
||||||
|
|
||||||
extern char *solaris_pid_to_str PARAMS ((int pid));
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
extern char *procfs_pid_to_str PARAMS ((int pid));
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
561
gdb/configure
vendored
561
gdb/configure
vendored
File diff suppressed because it is too large
Load diff
|
@ -488,7 +488,7 @@ AC_SUBST(TERM_LIB)
|
||||||
# libreadline needs libuser32.a in a cygwin environment
|
# libreadline needs libuser32.a in a cygwin environment
|
||||||
WIN32LIBS=
|
WIN32LIBS=
|
||||||
if test x$gdb_cv_os_cygwin = xyes; then
|
if test x$gdb_cv_os_cygwin = xyes; then
|
||||||
WIN32LIBS="-luser32"
|
WIN32LIBS="-luser32 -limagehlp"
|
||||||
fi
|
fi
|
||||||
AC_SUBST(WIN32LIBS)
|
AC_SUBST(WIN32LIBS)
|
||||||
|
|
||||||
|
|
|
@ -169,6 +169,7 @@ mips64*-big-*) gdb_target=bigmips64 ;;
|
||||||
mips*-big-*) gdb_target=bigmips ;;
|
mips*-big-*) gdb_target=bigmips ;;
|
||||||
mips*-dec-mach3*) gdb_target=mach3 ;;
|
mips*-dec-mach3*) gdb_target=mach3 ;;
|
||||||
mips*-dec-*) gdb_target=decstation ;;
|
mips*-dec-*) gdb_target=decstation ;;
|
||||||
|
mips*-*-pe) gdb_target=mips-pe ;;
|
||||||
mips64*el-*-ecoff*) gdb_target=embedl64 ;;
|
mips64*el-*-ecoff*) gdb_target=embedl64 ;;
|
||||||
mips64*-*-ecoff*) gdb_target=embed64 ;;
|
mips64*-*-ecoff*) gdb_target=embed64 ;;
|
||||||
mips64*vr4xxx*el-*-elf*)gdb_target=vr4xxxel ;;
|
mips64*vr4xxx*el-*-elf*)gdb_target=vr4xxxel ;;
|
||||||
|
|
119
gdb/gdbthread.h
119
gdb/gdbthread.h
|
@ -1,5 +1,5 @@
|
||||||
/* Multi-process/thread control defs for GDB, the GNU debugger.
|
/* Multi-process/thread control defs for GDB, the GNU debugger.
|
||||||
Copyright 1987, 88, 89, 90, 91, 92, 1993, 1998
|
Copyright 1987, 88, 89, 90, 91, 92, 1993, 1998, 1999, 2000
|
||||||
|
|
||||||
Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA.
|
Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA.
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
@ -27,31 +27,114 @@
|
||||||
/* For bpstat */
|
/* For bpstat */
|
||||||
#include "breakpoint.h"
|
#include "breakpoint.h"
|
||||||
|
|
||||||
extern void init_thread_list PARAMS ((void));
|
struct thread_info
|
||||||
|
{
|
||||||
|
struct thread_info *next;
|
||||||
|
int pid; /* "Actual process id";
|
||||||
|
In fact, this may be overloaded with
|
||||||
|
kernel thread id, etc. */
|
||||||
|
int num; /* Convenient handle (GDB thread id) */
|
||||||
|
/* State from wait_for_inferior */
|
||||||
|
CORE_ADDR prev_pc;
|
||||||
|
CORE_ADDR prev_func_start;
|
||||||
|
char *prev_func_name;
|
||||||
|
struct breakpoint *step_resume_breakpoint;
|
||||||
|
struct breakpoint *through_sigtramp_breakpoint;
|
||||||
|
CORE_ADDR step_range_start;
|
||||||
|
CORE_ADDR step_range_end;
|
||||||
|
CORE_ADDR step_frame_address;
|
||||||
|
int trap_expected;
|
||||||
|
int handling_longjmp;
|
||||||
|
int another_trap;
|
||||||
|
|
||||||
extern void add_thread PARAMS ((int pid));
|
/* This is set TRUE when a catchpoint of a shared library event
|
||||||
|
triggers. Since we don't wish to leave the inferior in the
|
||||||
|
solib hook when we report the event, we step the inferior
|
||||||
|
back to user code before stopping and reporting the event. */
|
||||||
|
int stepping_through_solib_after_catch;
|
||||||
|
|
||||||
extern void delete_thread PARAMS ((int));
|
/* When stepping_through_solib_after_catch is TRUE, this is a
|
||||||
|
list of the catchpoints that should be reported as triggering
|
||||||
|
when we finally do stop stepping. */
|
||||||
|
bpstat stepping_through_solib_catchpoints;
|
||||||
|
|
||||||
extern int thread_id_to_pid PARAMS ((int));
|
/* This is set to TRUE when this thread is in a signal handler
|
||||||
|
trampoline and we're single-stepping through it. */
|
||||||
|
int stepping_through_sigtramp;
|
||||||
|
|
||||||
extern int in_thread_list PARAMS ((int pid));
|
/* Private data used by the target vector implementation. */
|
||||||
|
struct private_thread_info *private;
|
||||||
|
};
|
||||||
|
|
||||||
extern int pid_to_thread_id PARAMS ((int pid));
|
/* Create an empty thread list, or empty the existing one. */
|
||||||
|
extern void init_thread_list (void);
|
||||||
|
|
||||||
extern int valid_thread_id PARAMS ((int thread));
|
/* Add a thread to the thread list.
|
||||||
|
Note that add_thread now returns the handle of the new thread,
|
||||||
|
so that the caller may initialize the private thread data. */
|
||||||
|
extern struct thread_info *add_thread (int pid);
|
||||||
|
|
||||||
extern void load_infrun_state PARAMS ((int, CORE_ADDR *, CORE_ADDR *, char **,
|
/* Delete an existing thread list entry. */
|
||||||
int *, struct breakpoint **,
|
extern void delete_thread (int);
|
||||||
struct breakpoint **, CORE_ADDR *,
|
|
||||||
CORE_ADDR *, CORE_ADDR *, int *, int *,
|
|
||||||
int *, bpstat *, int *));
|
|
||||||
|
|
||||||
extern void save_infrun_state PARAMS ((int, CORE_ADDR, CORE_ADDR, char *,
|
/* Translate the integer thread id (GDB's homegrown id, not the system's)
|
||||||
int, struct breakpoint *,
|
into a "pid" (which may be overloaded with extra thread information). */
|
||||||
struct breakpoint *, CORE_ADDR,
|
extern int thread_id_to_pid (int);
|
||||||
CORE_ADDR, CORE_ADDR, int, int,
|
|
||||||
int, bpstat, int));
|
/* Translate a 'pid' (which may be overloaded with extra thread information)
|
||||||
|
into the integer thread id (GDB's homegrown id, not the system's). */
|
||||||
|
extern int pid_to_thread_id (int pid);
|
||||||
|
|
||||||
|
/* Boolean test for an already-known pid (which may be overloaded with
|
||||||
|
extra thread information). */
|
||||||
|
extern int in_thread_list (int pid);
|
||||||
|
|
||||||
|
/* Boolean test for an already-known thread id (GDB's homegrown id,
|
||||||
|
not the system's). */
|
||||||
|
extern int valid_thread_id (int thread);
|
||||||
|
|
||||||
|
/* Search function to lookup a thread by 'pid'. */
|
||||||
|
extern struct thread_info *find_thread_pid (int pid);
|
||||||
|
|
||||||
|
/* Iterator function to call a user-provided callback function
|
||||||
|
once for each known thread. */
|
||||||
|
typedef int (*thread_callback_func) (struct thread_info *, void *);
|
||||||
|
extern struct thread_info *iterate_over_threads (thread_callback_func, void *);
|
||||||
|
|
||||||
|
/* infrun context switch: save the debugger state for the given thread. */
|
||||||
|
extern void save_infrun_state (int pid,
|
||||||
|
CORE_ADDR prev_pc,
|
||||||
|
CORE_ADDR prev_func_start,
|
||||||
|
char *prev_func_name,
|
||||||
|
int trap_expected,
|
||||||
|
struct breakpoint *step_resume_breakpoint,
|
||||||
|
struct breakpoint *through_sigtramp_breakpoint,
|
||||||
|
CORE_ADDR step_range_start,
|
||||||
|
CORE_ADDR step_range_end,
|
||||||
|
CORE_ADDR step_frame_address,
|
||||||
|
int handling_longjmp,
|
||||||
|
int another_trap,
|
||||||
|
int stepping_through_solib_after_catch,
|
||||||
|
bpstat stepping_through_solib_catchpoints,
|
||||||
|
int stepping_through_sigtramp);
|
||||||
|
|
||||||
|
/* infrun context switch: load the debugger state previously saved
|
||||||
|
for the given thread. */
|
||||||
|
extern void load_infrun_state (int pid,
|
||||||
|
CORE_ADDR *prev_pc,
|
||||||
|
CORE_ADDR *prev_func_start,
|
||||||
|
char **prev_func_name,
|
||||||
|
int *trap_expected,
|
||||||
|
struct breakpoint **step_resume_breakpoint,
|
||||||
|
struct breakpoint **through_sigtramp_breakpoint,
|
||||||
|
CORE_ADDR *step_range_start,
|
||||||
|
CORE_ADDR *step_range_end,
|
||||||
|
CORE_ADDR *step_frame_address,
|
||||||
|
int *handling_longjmp,
|
||||||
|
int *another_trap,
|
||||||
|
int *stepping_through_solib_affter_catch,
|
||||||
|
bpstat *stepping_through_solib_catchpoints,
|
||||||
|
int *stepping_through_sigtramp);
|
||||||
|
|
||||||
/* Commands with a prefix of `thread'. */
|
/* Commands with a prefix of `thread'. */
|
||||||
extern struct cmd_list_element *thread_cmd_list;
|
extern struct cmd_list_element *thread_cmd_list;
|
||||||
|
|
22
gdb/infcmd.c
22
gdb/infcmd.c
|
@ -595,8 +595,10 @@ step_1_continuation (arg)
|
||||||
static void
|
static void
|
||||||
step_once (int skip_subroutines, int single_inst, int count)
|
step_once (int skip_subroutines, int single_inst, int count)
|
||||||
{
|
{
|
||||||
struct continuation_arg *arg1; struct continuation_arg *arg2;
|
struct continuation_arg *arg1;
|
||||||
struct continuation_arg *arg3; struct frame_info *frame;
|
struct continuation_arg *arg2;
|
||||||
|
struct continuation_arg *arg3;
|
||||||
|
struct frame_info *frame;
|
||||||
|
|
||||||
if (count > 0)
|
if (count > 0)
|
||||||
{
|
{
|
||||||
|
@ -1049,9 +1051,11 @@ finish_command_continuation (arg)
|
||||||
{
|
{
|
||||||
register struct symbol *function;
|
register struct symbol *function;
|
||||||
struct breakpoint *breakpoint;
|
struct breakpoint *breakpoint;
|
||||||
|
struct cleanup *cleanups;
|
||||||
|
|
||||||
breakpoint = (struct breakpoint *) arg->data;
|
breakpoint = (struct breakpoint *) arg->data;
|
||||||
function = (struct symbol *) (arg->next)->data;
|
function = (struct symbol *) (arg->next)->data;
|
||||||
|
cleanups = (struct cleanup *) (arg->next->next)->data;
|
||||||
|
|
||||||
if (bpstat_find_breakpoint (stop_bpstat, breakpoint) != NULL
|
if (bpstat_find_breakpoint (stop_bpstat, breakpoint) != NULL
|
||||||
&& function != 0)
|
&& function != 0)
|
||||||
|
@ -1066,7 +1070,7 @@ finish_command_continuation (arg)
|
||||||
|
|
||||||
if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
|
if (TYPE_CODE (value_type) == TYPE_CODE_VOID)
|
||||||
{
|
{
|
||||||
do_exec_cleanups (ALL_CLEANUPS);
|
do_exec_cleanups (cleanups);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1079,7 +1083,7 @@ finish_command_continuation (arg)
|
||||||
|
|
||||||
print_return_value (struct_return, value_type);
|
print_return_value (struct_return, value_type);
|
||||||
}
|
}
|
||||||
do_exec_cleanups (ALL_CLEANUPS);
|
do_exec_cleanups (cleanups);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* "finish": Set a temporary breakpoint at the place
|
/* "finish": Set a temporary breakpoint at the place
|
||||||
|
@ -1095,7 +1099,7 @@ finish_command (arg, from_tty)
|
||||||
register struct symbol *function;
|
register struct symbol *function;
|
||||||
struct breakpoint *breakpoint;
|
struct breakpoint *breakpoint;
|
||||||
struct cleanup *old_chain;
|
struct cleanup *old_chain;
|
||||||
struct continuation_arg *arg1, *arg2;
|
struct continuation_arg *arg1, *arg2, *arg3;
|
||||||
|
|
||||||
int async_exec = 0;
|
int async_exec = 0;
|
||||||
|
|
||||||
|
@ -1137,7 +1141,7 @@ finish_command (arg, from_tty)
|
||||||
if (!event_loop_p || !target_can_async_p ())
|
if (!event_loop_p || !target_can_async_p ())
|
||||||
old_chain = make_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
|
old_chain = make_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
|
||||||
else
|
else
|
||||||
make_exec_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
|
old_chain = make_exec_cleanup ((make_cleanup_func) delete_breakpoint, breakpoint);
|
||||||
|
|
||||||
/* Find the function we will return from. */
|
/* Find the function we will return from. */
|
||||||
|
|
||||||
|
@ -1161,10 +1165,14 @@ finish_command (arg, from_tty)
|
||||||
(struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
|
(struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
|
||||||
arg2 =
|
arg2 =
|
||||||
(struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
|
(struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
|
||||||
|
arg3 =
|
||||||
|
(struct continuation_arg *) xmalloc (sizeof (struct continuation_arg));
|
||||||
arg1->next = arg2;
|
arg1->next = arg2;
|
||||||
arg2->next = NULL;
|
arg2->next = arg3;
|
||||||
|
arg3->next = NULL;
|
||||||
arg1->data = (PTR) breakpoint;
|
arg1->data = (PTR) breakpoint;
|
||||||
arg2->data = (PTR) function;
|
arg2->data = (PTR) function;
|
||||||
|
arg3->data = (PTR) old_chain;
|
||||||
add_continuation (finish_command_continuation, arg1);
|
add_continuation (finish_command_continuation, arg1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
110
gdb/procfs.c
110
gdb/procfs.c
|
@ -170,11 +170,7 @@ init_procfs_ops ()
|
||||||
#ifdef NEW_PROC_API
|
#ifdef NEW_PROC_API
|
||||||
extern int write_with_trace PARAMS ((int, void *, size_t, char *, int));
|
extern int write_with_trace PARAMS ((int, void *, size_t, char *, int));
|
||||||
extern off_t lseek_with_trace PARAMS ((int, off_t, int, char *, int));
|
extern off_t lseek_with_trace PARAMS ((int, off_t, int, char *, int));
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define write(X,Y,Z) write_with_trace (X, Y, Z, __FILE__, __LINE__)
|
#define write(X,Y,Z) write_with_trace (X, Y, Z, __FILE__, __LINE__)
|
||||||
#endif
|
|
||||||
|
|
||||||
#define lseek(X,Y,Z) lseek_with_trace (X, Y, Z, __FILE__, __LINE__)
|
#define lseek(X,Y,Z) lseek_with_trace (X, Y, Z, __FILE__, __LINE__)
|
||||||
#else
|
#else
|
||||||
extern int ioctl_with_trace PARAMS ((int, long, void *, char *, int));
|
extern int ioctl_with_trace PARAMS ((int, long, void *, char *, int));
|
||||||
|
@ -183,8 +179,6 @@ extern int ioctl_with_trace PARAMS ((int, long, void *, char *, int));
|
||||||
#define open(X,Y) open_with_trace (X, Y, __FILE__, __LINE__)
|
#define open(X,Y) open_with_trace (X, Y, __FILE__, __LINE__)
|
||||||
#define close(X) close_with_trace (X, __FILE__, __LINE__)
|
#define close(X) close_with_trace (X, __FILE__, __LINE__)
|
||||||
#define wait(X) wait_with_trace (X, __FILE__, __LINE__)
|
#define wait(X) wait_with_trace (X, __FILE__, __LINE__)
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define PROCFS_NOTE(X) procfs_note (X, __FILE__, __LINE__)
|
#define PROCFS_NOTE(X) procfs_note (X, __FILE__, __LINE__)
|
||||||
#define PROC_PRETTYFPRINT_STATUS(X,Y,Z,T) \
|
#define PROC_PRETTYFPRINT_STATUS(X,Y,Z,T) \
|
||||||
proc_prettyfprint_status (X, Y, Z, T)
|
proc_prettyfprint_status (X, Y, Z, T)
|
||||||
|
@ -193,16 +187,6 @@ proc_prettyfprint_status (X, Y, Z, T)
|
||||||
#define PROC_PRETTYFPRINT_STATUS(X,Y,Z,T)
|
#define PROC_PRETTYFPRINT_STATUS(X,Y,Z,T)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
|
||||||
#define PROCFS_NOTE(X)
|
|
||||||
#define PROC_PRETTYFPRINT_STATUS(X,Y,Z,T)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* temp: */
|
|
||||||
#undef PROCFS_NOTE
|
|
||||||
#define PROCFS_NOTE(X)
|
|
||||||
/* suppress */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* World Unification:
|
* World Unification:
|
||||||
|
@ -297,20 +281,13 @@ typedef prstatus_t gdb_lwpstatus_t;
|
||||||
typedef fpregset_t gdb_fpregset_t;
|
typedef fpregset_t gdb_fpregset_t;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* The PIDs that we pass to and from GDB will be composed from
|
/* Provide default composite pid manipulation macros for systems that
|
||||||
the actual PID plus the LWPID. These macros will be used to
|
don't have threads. */
|
||||||
compose and decompose them. */
|
|
||||||
|
|
||||||
#ifndef PIDGET
|
#ifndef PIDGET
|
||||||
#define PIDGET(PID) (((PID) & 0xffff))
|
#define PIDGET(PID) (PID)
|
||||||
#endif
|
#define TIDGET(PID) (PID)
|
||||||
|
#define MERGEPID(PID, TID) (PID)
|
||||||
#ifndef TIDGET
|
|
||||||
#define TIDGET(PID) (((PID) & 0x7fffffff) >> 16)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef MERGEPID
|
|
||||||
#define MERGEPID(PID, TID) (((PID) & 0xffff) | ((TID) << 16))
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct procinfo {
|
typedef struct procinfo {
|
||||||
|
@ -611,7 +588,7 @@ create_procinfo (pid, tid)
|
||||||
{
|
{
|
||||||
procinfo *pi, *parent;
|
procinfo *pi, *parent;
|
||||||
|
|
||||||
if (pi = find_procinfo (pid, tid))
|
if ((pi = find_procinfo (pid, tid)))
|
||||||
return pi; /* Already exists, nothing to do. */
|
return pi; /* Already exists, nothing to do. */
|
||||||
|
|
||||||
/* find parent before doing malloc, to save having to cleanup */
|
/* find parent before doing malloc, to save having to cleanup */
|
||||||
|
@ -959,7 +936,14 @@ proc_flags (pi)
|
||||||
return 0; /* FIXME: not a good failure value (but what is?) */
|
return 0; /* FIXME: not a good failure value (but what is?) */
|
||||||
|
|
||||||
#ifdef NEW_PROC_API
|
#ifdef NEW_PROC_API
|
||||||
|
# ifdef UNIXWARE
|
||||||
|
/* UnixWare 7.1 puts process status flags, e.g. PR_ASYNC, in
|
||||||
|
pstatus_t and LWP status flags, e.g. PR_STOPPED, in lwpstatus_t.
|
||||||
|
The two sets of flags don't overlap. */
|
||||||
|
return pi->prstatus.pr_flags | pi->prstatus.pr_lwp.pr_flags;
|
||||||
|
# else
|
||||||
return pi->prstatus.pr_lwp.pr_flags;
|
return pi->prstatus.pr_lwp.pr_flags;
|
||||||
|
# endif
|
||||||
#else
|
#else
|
||||||
return pi->prstatus.pr_flags;
|
return pi->prstatus.pr_flags;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1093,7 +1077,7 @@ proc_cursig (struct procinfo *pi)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function: proc_modify_flags
|
* Function: proc_modify_flag
|
||||||
*
|
*
|
||||||
* === I appologize for the messiness of this function.
|
* === I appologize for the messiness of this function.
|
||||||
* === This is an area where the different versions of
|
* === This is an area where the different versions of
|
||||||
|
@ -1102,6 +1086,7 @@ proc_cursig (struct procinfo *pi)
|
||||||
* Set or reset any of the following process flags:
|
* Set or reset any of the following process flags:
|
||||||
* PR_FORK -- forked child will inherit trace flags
|
* PR_FORK -- forked child will inherit trace flags
|
||||||
* PR_RLC -- traced process runs when last /proc file closed.
|
* PR_RLC -- traced process runs when last /proc file closed.
|
||||||
|
* PR_KLC -- traced process is killed when last /proc file closed.
|
||||||
* PR_ASYNC -- LWP's get to run/stop independently.
|
* PR_ASYNC -- LWP's get to run/stop independently.
|
||||||
*
|
*
|
||||||
* There are three methods for doing this function:
|
* There are three methods for doing this function:
|
||||||
|
@ -1113,6 +1098,7 @@ proc_cursig (struct procinfo *pi)
|
||||||
* [OSF, Sol5]
|
* [OSF, Sol5]
|
||||||
*
|
*
|
||||||
* Note: Irix does not define PR_ASYNC.
|
* Note: Irix does not define PR_ASYNC.
|
||||||
|
* Note: OSF does not define PR_KLC.
|
||||||
* Note: OSF is the only one that can ONLY use the oldest method.
|
* Note: OSF is the only one that can ONLY use the oldest method.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
|
@ -1217,6 +1203,9 @@ proc_modify_flag (pi, flag, mode)
|
||||||
flag == PR_RLC ? "PR_RLC" :
|
flag == PR_RLC ? "PR_RLC" :
|
||||||
#ifdef PR_ASYNC
|
#ifdef PR_ASYNC
|
||||||
flag == PR_ASYNC ? "PR_ASYNC" :
|
flag == PR_ASYNC ? "PR_ASYNC" :
|
||||||
|
#endif
|
||||||
|
#ifdef PR_KLC
|
||||||
|
flag == PR_KLC ? "PR_KLC" :
|
||||||
#endif
|
#endif
|
||||||
"<unknown flag>",
|
"<unknown flag>",
|
||||||
mode == FLAG_RESET ? "off" : "on");
|
mode == FLAG_RESET ? "off" : "on");
|
||||||
|
@ -1258,6 +1247,42 @@ proc_unset_run_on_last_close (pi)
|
||||||
return proc_modify_flag (pi, PR_RLC, FLAG_RESET);
|
return proc_modify_flag (pi, PR_RLC, FLAG_RESET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef PR_KLC
|
||||||
|
/*
|
||||||
|
* Function: proc_set_kill_on_last_close
|
||||||
|
*
|
||||||
|
* Set the kill_on_last_close flag.
|
||||||
|
* Process with all threads will be killed when debugger
|
||||||
|
* closes all /proc fds (or debugger exits or dies).
|
||||||
|
*
|
||||||
|
* Returns non-zero for success, zero for failure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
proc_set_kill_on_last_close (pi)
|
||||||
|
procinfo *pi;
|
||||||
|
{
|
||||||
|
return proc_modify_flag (pi, PR_KLC, FLAG_SET);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Function: proc_unset_kill_on_last_close
|
||||||
|
*
|
||||||
|
* Reset the kill_on_last_close flag.
|
||||||
|
* Process will NOT be killed when debugger
|
||||||
|
* closes its file handles (or exits or dies).
|
||||||
|
*
|
||||||
|
* Returns non-zero for success, zero for failure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
int
|
||||||
|
proc_unset_kill_on_last_close (pi)
|
||||||
|
procinfo *pi;
|
||||||
|
{
|
||||||
|
return proc_modify_flag (pi, PR_KLC, FLAG_RESET);
|
||||||
|
}
|
||||||
|
#endif /* PR_KLC */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function: proc_set_inherit_on_fork
|
* Function: proc_set_inherit_on_fork
|
||||||
*
|
*
|
||||||
|
@ -2601,7 +2626,9 @@ proc_iterate_over_mappings (func)
|
||||||
{
|
{
|
||||||
struct prmap *map;
|
struct prmap *map;
|
||||||
procinfo *pi;
|
procinfo *pi;
|
||||||
|
#ifndef NEW_PROC_API /* avoid compiler warning */
|
||||||
int nmaps = 0, i;
|
int nmaps = 0, i;
|
||||||
|
#endif
|
||||||
int funcstat = 0;
|
int funcstat = 0;
|
||||||
int fd, map_fd;
|
int fd, map_fd;
|
||||||
char pathname[MAX_PROC_NAME_SIZE];
|
char pathname[MAX_PROC_NAME_SIZE];
|
||||||
|
@ -3390,7 +3417,6 @@ do_detach (signo)
|
||||||
int signo;
|
int signo;
|
||||||
{
|
{
|
||||||
procinfo *pi;
|
procinfo *pi;
|
||||||
long pflags;
|
|
||||||
|
|
||||||
/* Find procinfo for the main process */
|
/* Find procinfo for the main process */
|
||||||
pi = find_procinfo_or_die (PIDGET (inferior_pid), 0); /* FIXME: threads */
|
pi = find_procinfo_or_die (PIDGET (inferior_pid), 0); /* FIXME: threads */
|
||||||
|
@ -3650,18 +3676,6 @@ wait_again:
|
||||||
why = proc_why (pi);
|
why = proc_why (pi);
|
||||||
what = proc_what (pi);
|
what = proc_what (pi);
|
||||||
|
|
||||||
#if 0
|
|
||||||
{
|
|
||||||
int stopped_pc = read_pc ();
|
|
||||||
if (stopped_pc != 0x10c68 &&
|
|
||||||
stopped_pc != 0x10c6c &&
|
|
||||||
stopped_pc != 0x10c70 &&
|
|
||||||
stopped_pc != 0x22768 &&
|
|
||||||
stopped_pc != 0x10c74)
|
|
||||||
printf ("%x,%d,%d\n", stopped_pc, why, what);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (flags & (PR_STOPPED | PR_ISTOP))
|
if (flags & (PR_STOPPED | PR_ISTOP))
|
||||||
{
|
{
|
||||||
#ifdef PR_ASYNC
|
#ifdef PR_ASYNC
|
||||||
|
@ -3895,7 +3909,7 @@ wait_again:
|
||||||
temp = MERGEPID (pi->pid, temp);
|
temp = MERGEPID (pi->pid, temp);
|
||||||
if (!in_thread_list (temp))
|
if (!in_thread_list (temp))
|
||||||
{
|
{
|
||||||
printf_filtered ("[*New %s]\n",
|
printf_filtered ("[New %s]\n",
|
||||||
target_pid_to_str (temp));
|
target_pid_to_str (temp));
|
||||||
add_thread (temp);
|
add_thread (temp);
|
||||||
}
|
}
|
||||||
|
@ -4427,9 +4441,9 @@ unconditionally_kill_inferior (pi)
|
||||||
/* FIXME: should we use waitpid to make sure we get the right event?
|
/* FIXME: should we use waitpid to make sure we get the right event?
|
||||||
Should we check the returned event? */
|
Should we check the returned event? */
|
||||||
{
|
{
|
||||||
|
#if 0
|
||||||
int status, ret;
|
int status, ret;
|
||||||
|
|
||||||
#if 0
|
|
||||||
ret = waitpid (pi->pid, &status, 0);
|
ret = waitpid (pi->pid, &status, 0);
|
||||||
#else
|
#else
|
||||||
wait (NULL);
|
wait (NULL);
|
||||||
|
@ -4547,6 +4561,10 @@ procfs_init_inferior (pid)
|
||||||
if ((fail = procfs_debug_inferior (pi)) != 0)
|
if ((fail = procfs_debug_inferior (pi)) != 0)
|
||||||
proc_error (pi, "init_inferior (procfs_debug_inferior)", fail);
|
proc_error (pi, "init_inferior (procfs_debug_inferior)", fail);
|
||||||
|
|
||||||
|
/* FIXME: logically, we should really be turning OFF run-on-last-close,
|
||||||
|
and possibly even turning ON kill-on-last-close at this point. But
|
||||||
|
I can't make that change without careful testing which I don't have
|
||||||
|
time to do right now... */
|
||||||
/* Turn on run-on-last-close flag so that the child
|
/* Turn on run-on-last-close flag so that the child
|
||||||
will die if GDB goes away for some reason. */
|
will die if GDB goes away for some reason. */
|
||||||
if (!proc_set_run_on_last_close (pi))
|
if (!proc_set_run_on_last_close (pi))
|
||||||
|
@ -4561,7 +4579,7 @@ procfs_init_inferior (pid)
|
||||||
#else
|
#else
|
||||||
/* One trap to exec the shell, one to exec the program being debugged. */
|
/* One trap to exec the shell, one to exec the program being debugged. */
|
||||||
startup_inferior (2);
|
startup_inferior (2);
|
||||||
#endif
|
#endif /* START_INFERIOR_TRAPS_EXPECTED */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
#include "params.h"
|
#include "params.h"
|
||||||
#include "logging.h"
|
#include "logging.h"
|
||||||
|
|
||||||
|
extern int baud_rate; /* From gdb/top.c */
|
||||||
|
|
||||||
#ifdef COMPILING_ON_WINDOWS
|
#ifdef COMPILING_ON_WINDOWS
|
||||||
# undef ERROR
|
# undef ERROR
|
||||||
# undef IGNORE
|
# undef IGNORE
|
||||||
|
@ -83,8 +85,11 @@ static struct writestate wstate;
|
||||||
* The set of parameter options supported by the device
|
* The set of parameter options supported by the device
|
||||||
*/
|
*/
|
||||||
static unsigned int baud_options[] = {
|
static unsigned int baud_options[] = {
|
||||||
#ifdef __hpux
|
#ifdef B115200 || __hpux
|
||||||
115200, 57600,
|
115200,
|
||||||
|
#endif
|
||||||
|
#ifdef B57600 || __hpux
|
||||||
|
57600,
|
||||||
#endif
|
#endif
|
||||||
38400, 19200, 9600
|
38400, 19200, 9600
|
||||||
};
|
};
|
||||||
|
@ -229,6 +234,12 @@ static int SerialOpen(const char *name, const char *arg)
|
||||||
printf( "could not understand baud rate %s\n", arg );
|
printf( "could not understand baud rate %s\n", arg );
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
else if (baud_rate > 0)
|
||||||
|
{
|
||||||
|
/* If the user specified a baud rate on the command line "-b" or via
|
||||||
|
the "set remotebaud" command then try to use that one */
|
||||||
|
process_baud_rate( baud_rate );
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef COMPILING_ON_WINDOWS
|
#ifdef COMPILING_ON_WINDOWS
|
||||||
{
|
{
|
||||||
|
@ -514,6 +525,13 @@ static int find_baud_rate( unsigned int *speed )
|
||||||
} possibleBaudRates[] = {
|
} possibleBaudRates[] = {
|
||||||
#if defined(__hpux)
|
#if defined(__hpux)
|
||||||
{115200,_B115200}, {57600,_B57600},
|
{115200,_B115200}, {57600,_B57600},
|
||||||
|
#else
|
||||||
|
#ifdef B115200
|
||||||
|
{115200,B115200},
|
||||||
|
#endif
|
||||||
|
#ifdef B57600
|
||||||
|
{57600,B57600},
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#ifdef COMPILING_ON_WINDOWS
|
#ifdef COMPILING_ON_WINDOWS
|
||||||
{38400,CBR_38400}, {19200,CBR_19200}, {9600, CBR_9600}, {0,0}
|
{38400,CBR_38400}, {19200,CBR_19200}, {9600, CBR_9600}, {0,0}
|
||||||
|
|
|
@ -68,6 +68,7 @@
|
||||||
#define PP_TIMEOUT 1 /* seconds */
|
#define PP_TIMEOUT 1 /* seconds */
|
||||||
|
|
||||||
#ifdef sun
|
#ifdef sun
|
||||||
|
#define SERIAL_PREFIX "/dev/tty"
|
||||||
#define SERPORT1 "/dev/ttya"
|
#define SERPORT1 "/dev/ttya"
|
||||||
#define SERPORT2 "/dev/ttyb"
|
#define SERPORT2 "/dev/ttyb"
|
||||||
#define PARPORT1 "/dev/bpp0"
|
#define PARPORT1 "/dev/bpp0"
|
||||||
|
@ -75,6 +76,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __hpux
|
#ifdef __hpux
|
||||||
|
#define SERIAL_PREFIX "/dev/tty"
|
||||||
#define SERPORT1 "/dev/tty00"
|
#define SERPORT1 "/dev/tty00"
|
||||||
#define SERPORT2 "/dev/tty01"
|
#define SERPORT2 "/dev/tty01"
|
||||||
#define PARPORT1 "/dev/ptr_parallel"
|
#define PARPORT1 "/dev/ptr_parallel"
|
||||||
|
@ -82,6 +84,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
#define SERIAL_PREFIX "/dev/ttyS"
|
||||||
#define SERPORT1 "/dev/ttyS0"
|
#define SERPORT1 "/dev/ttyS0"
|
||||||
#define SERPORT2 "/dev/ttyS1"
|
#define SERPORT2 "/dev/ttyS1"
|
||||||
#define PARPORT1 "/dev/par0"
|
#define PARPORT1 "/dev/par0"
|
||||||
|
@ -89,6 +92,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (bsdi)
|
#if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (bsdi)
|
||||||
|
#define SERIAL_PREFIX "/dev/cuaa"
|
||||||
#define SERPORT1 "/dev/cuaa0"
|
#define SERPORT1 "/dev/cuaa0"
|
||||||
#define SERPORT2 "/dev/cuaa1"
|
#define SERPORT2 "/dev/cuaa1"
|
||||||
#define PARPORT1 "/dev/lpt0"
|
#define PARPORT1 "/dev/lpt0"
|
||||||
|
@ -96,14 +100,12 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define SERIAL_PREFIX "/dev/tty"
|
|
||||||
#if defined(_WIN32) || defined (__CYGWIN32__)
|
#if defined(_WIN32) || defined (__CYGWIN32__)
|
||||||
|
#define SERIAL_PREFIX "com"
|
||||||
#define SERPORT1 "com1"
|
#define SERPORT1 "com1"
|
||||||
#define SERPORT2 "com2"
|
#define SERPORT2 "com2"
|
||||||
#define PARPORT1 "lpt1"
|
#define PARPORT1 "lpt1"
|
||||||
#define PARPORT2 "lpt2"
|
#define PARPORT2 "lpt2"
|
||||||
#undef SERIAL_PREFIX
|
|
||||||
#define SERIAL_PREFIX "com"
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1921,7 +1921,8 @@ remote_open_1 (name, from_tty, target, extended_p)
|
||||||
{
|
{
|
||||||
if (name == 0)
|
if (name == 0)
|
||||||
error ("To open a remote debug connection, you need to specify what\n\
|
error ("To open a remote debug connection, you need to specify what\n\
|
||||||
serial device is attached to the remote system (e.g. /dev/ttya).");
|
serial device is attached to the remote system\n\
|
||||||
|
(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).");
|
||||||
|
|
||||||
/* See FIXME above */
|
/* See FIXME above */
|
||||||
wait_forever_enabled_p = 1;
|
wait_forever_enabled_p = 1;
|
||||||
|
@ -2007,7 +2008,8 @@ remote_async_open_1 (name, from_tty, target, extended_p)
|
||||||
{
|
{
|
||||||
if (name == 0)
|
if (name == 0)
|
||||||
error ("To open a remote debug connection, you need to specify what\n\
|
error ("To open a remote debug connection, you need to specify what\n\
|
||||||
serial device is attached to the remote system (e.g. /dev/ttya).");
|
serial device is attached to the remote system\n\
|
||||||
|
(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).");
|
||||||
|
|
||||||
target_preopen (from_tty);
|
target_preopen (from_tty);
|
||||||
|
|
||||||
|
@ -4855,7 +4857,8 @@ init_remote_ops ()
|
||||||
remote_ops.to_longname = "Remote serial target in gdb-specific protocol";
|
remote_ops.to_longname = "Remote serial target in gdb-specific protocol";
|
||||||
remote_ops.to_doc =
|
remote_ops.to_doc =
|
||||||
"Use a remote computer via a serial line, using a gdb-specific protocol.\n\
|
"Use a remote computer via a serial line, using a gdb-specific protocol.\n\
|
||||||
Specify the serial device it is connected to (e.g. /dev/ttya).";
|
Specify the serial device it is connected to\n\
|
||||||
|
(e.g. /dev/ttyS0, /dev/ttya, COM1, etc.).";
|
||||||
remote_ops.to_open = remote_open;
|
remote_ops.to_open = remote_open;
|
||||||
remote_ops.to_close = remote_close;
|
remote_ops.to_close = remote_close;
|
||||||
remote_ops.to_detach = remote_detach;
|
remote_ops.to_detach = remote_detach;
|
||||||
|
|
246
gdb/target.c
246
gdb/target.c
|
@ -397,69 +397,181 @@ cleanup_target (t)
|
||||||
{
|
{
|
||||||
|
|
||||||
#define de_fault(field, value) \
|
#define de_fault(field, value) \
|
||||||
if (!t->field) t->field = value
|
if (!t->field) \
|
||||||
|
t->field = value
|
||||||
|
|
||||||
/* FIELD DEFAULT VALUE */
|
de_fault (to_open,
|
||||||
|
(void (*) (char *, int))
|
||||||
de_fault (to_open, (void (*)PARAMS ((char *, int))) tcomplain);
|
tcomplain);
|
||||||
de_fault (to_close, (void (*)PARAMS ((int))) target_ignore);
|
de_fault (to_close,
|
||||||
de_fault (to_attach, maybe_kill_then_attach);
|
(void (*) (int))
|
||||||
de_fault (to_post_attach, (void (*)PARAMS ((int))) target_ignore);
|
target_ignore);
|
||||||
de_fault (to_require_attach, maybe_kill_then_attach);
|
de_fault (to_attach,
|
||||||
de_fault (to_detach, (void (*)PARAMS ((char *, int))) target_ignore);
|
maybe_kill_then_attach);
|
||||||
de_fault (to_require_detach, (void (*)PARAMS ((int, char *, int))) target_ignore);
|
de_fault (to_post_attach,
|
||||||
de_fault (to_resume, (void (*)PARAMS ((int, int, enum target_signal))) noprocess);
|
(void (*) (int))
|
||||||
de_fault (to_wait, (int (*)PARAMS ((int, struct target_waitstatus *))) noprocess);
|
target_ignore);
|
||||||
de_fault (to_post_wait, (void (*)PARAMS ((int, int))) target_ignore);
|
de_fault (to_require_attach,
|
||||||
de_fault (to_fetch_registers, (void (*)PARAMS ((int))) target_ignore);
|
maybe_kill_then_attach);
|
||||||
de_fault (to_store_registers, (void (*)PARAMS ((int))) noprocess);
|
de_fault (to_detach,
|
||||||
de_fault (to_prepare_to_store, (void (*)PARAMS ((void))) noprocess);
|
(void (*) (char *, int))
|
||||||
de_fault (to_xfer_memory, (int (*)PARAMS ((CORE_ADDR, char *, int, int, struct target_ops *))) nomemory);
|
target_ignore);
|
||||||
de_fault (to_files_info, (void (*)PARAMS ((struct target_ops *))) target_ignore);
|
de_fault (to_require_detach,
|
||||||
de_fault (to_insert_breakpoint, memory_insert_breakpoint);
|
(void (*) (int, char *, int))
|
||||||
de_fault (to_remove_breakpoint, memory_remove_breakpoint);
|
target_ignore);
|
||||||
de_fault (to_terminal_init, (void (*)PARAMS ((void))) target_ignore);
|
de_fault (to_resume,
|
||||||
de_fault (to_terminal_inferior, (void (*)PARAMS ((void))) target_ignore);
|
(void (*) (int, int, enum target_signal))
|
||||||
de_fault (to_terminal_ours_for_output, (void (*)PARAMS ((void))) target_ignore);
|
noprocess);
|
||||||
de_fault (to_terminal_ours, (void (*)PARAMS ((void))) target_ignore);
|
de_fault (to_wait,
|
||||||
de_fault (to_terminal_info, default_terminal_info);
|
(int (*) (int, struct target_waitstatus *))
|
||||||
de_fault (to_kill, (void (*)PARAMS ((void))) noprocess);
|
noprocess);
|
||||||
de_fault (to_load, (void (*)PARAMS ((char *, int))) tcomplain);
|
de_fault (to_post_wait,
|
||||||
de_fault (to_lookup_symbol, (int (*)PARAMS ((char *, CORE_ADDR *))) nosymbol);
|
(void (*) (int, int))
|
||||||
de_fault (to_create_inferior, maybe_kill_then_create_inferior);
|
target_ignore);
|
||||||
de_fault (to_post_startup_inferior, (void (*)PARAMS ((int))) target_ignore);
|
de_fault (to_fetch_registers,
|
||||||
de_fault (to_acknowledge_created_inferior, (void (*)PARAMS ((int))) target_ignore);
|
(void (*) (int))
|
||||||
de_fault (to_clone_and_follow_inferior, default_clone_and_follow_inferior);
|
target_ignore);
|
||||||
de_fault (to_post_follow_inferior_by_clone, (void (*)PARAMS ((void))) target_ignore);
|
de_fault (to_store_registers,
|
||||||
de_fault (to_insert_fork_catchpoint, (int (*)PARAMS ((int))) tcomplain);
|
(void (*) (int))
|
||||||
de_fault (to_remove_fork_catchpoint, (int (*)PARAMS ((int))) tcomplain);
|
noprocess);
|
||||||
de_fault (to_insert_vfork_catchpoint, (int (*)PARAMS ((int))) tcomplain);
|
de_fault (to_prepare_to_store,
|
||||||
de_fault (to_remove_vfork_catchpoint, (int (*)PARAMS ((int))) tcomplain);
|
(void (*) (void))
|
||||||
de_fault (to_has_forked, (int (*)PARAMS ((int, int *))) return_zero);
|
noprocess);
|
||||||
de_fault (to_has_vforked, (int (*)PARAMS ((int, int *))) return_zero);
|
de_fault (to_xfer_memory,
|
||||||
de_fault (to_can_follow_vfork_prior_to_exec, (int (*)PARAMS ((void))) return_zero);
|
(int (*) (CORE_ADDR, char *, int, int, struct target_ops *))
|
||||||
de_fault (to_post_follow_vfork, (void (*)PARAMS ((int, int, int, int))) target_ignore);
|
nomemory);
|
||||||
de_fault (to_insert_exec_catchpoint, (int (*)PARAMS ((int))) tcomplain);
|
de_fault (to_files_info,
|
||||||
de_fault (to_remove_exec_catchpoint, (int (*)PARAMS ((int))) tcomplain);
|
(void (*) (struct target_ops *))
|
||||||
de_fault (to_has_execd, (int (*)PARAMS ((int, char **))) return_zero);
|
target_ignore);
|
||||||
de_fault (to_reported_exec_events_per_exec_call, (int (*)PARAMS ((void))) return_one);
|
de_fault (to_insert_breakpoint,
|
||||||
de_fault (to_has_syscall_event, (int (*)PARAMS ((int, enum target_waitkind *, int *))) return_zero);
|
memory_insert_breakpoint);
|
||||||
de_fault (to_has_exited, (int (*)PARAMS ((int, int, int *))) return_zero);
|
de_fault (to_remove_breakpoint,
|
||||||
de_fault (to_mourn_inferior, (void (*)PARAMS ((void))) noprocess);
|
memory_remove_breakpoint);
|
||||||
de_fault (to_can_run, return_zero);
|
de_fault (to_terminal_init,
|
||||||
de_fault (to_notice_signals, (void (*)PARAMS ((int))) target_ignore);
|
(void (*) (void))
|
||||||
de_fault (to_thread_alive, (int (*)PARAMS ((int))) target_ignore);
|
target_ignore);
|
||||||
de_fault (to_stop, (void (*)PARAMS ((void))) target_ignore);
|
de_fault (to_terminal_inferior,
|
||||||
de_fault (to_query, (int (*)PARAMS ((int /*char */ , char *, char *, int *))) target_ignore);
|
(void (*) (void))
|
||||||
de_fault (to_rcmd, (void (*) (char *, struct gdb_file *)) tcomplain);
|
target_ignore);
|
||||||
de_fault (to_enable_exception_callback, (struct symtab_and_line * (*)PARAMS ((enum exception_event_kind, int))) nosupport_runtime);
|
de_fault (to_terminal_ours_for_output,
|
||||||
de_fault (to_get_current_exception_event, (struct exception_event_record * (*)PARAMS ((void))) nosupport_runtime);
|
(void (*) (void))
|
||||||
|
target_ignore);
|
||||||
de_fault (to_pid_to_exec_file, (char *(*)PARAMS ((int))) return_zero);
|
de_fault (to_terminal_ours,
|
||||||
de_fault (to_core_file_to_sym_file, (char *(*)PARAMS ((char *))) return_zero);
|
(void (*) (void))
|
||||||
de_fault (to_can_async_p, (int (*) (void)) return_zero);
|
target_ignore);
|
||||||
de_fault (to_is_async_p, (int (*) (void)) return_zero);
|
de_fault (to_terminal_info,
|
||||||
de_fault (to_async, (void (*) (void (*) (enum inferior_event_type, void*), void*)) tcomplain);
|
default_terminal_info);
|
||||||
|
de_fault (to_kill,
|
||||||
|
(void (*) (void))
|
||||||
|
noprocess);
|
||||||
|
de_fault (to_load,
|
||||||
|
(void (*) (char *, int))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_lookup_symbol,
|
||||||
|
(int (*) (char *, CORE_ADDR *))
|
||||||
|
nosymbol);
|
||||||
|
de_fault (to_create_inferior,
|
||||||
|
maybe_kill_then_create_inferior);
|
||||||
|
de_fault (to_post_startup_inferior,
|
||||||
|
(void (*) (int))
|
||||||
|
target_ignore);
|
||||||
|
de_fault (to_acknowledge_created_inferior,
|
||||||
|
(void (*) (int))
|
||||||
|
target_ignore);
|
||||||
|
de_fault (to_clone_and_follow_inferior,
|
||||||
|
default_clone_and_follow_inferior);
|
||||||
|
de_fault (to_post_follow_inferior_by_clone,
|
||||||
|
(void (*) (void))
|
||||||
|
target_ignore);
|
||||||
|
de_fault (to_insert_fork_catchpoint,
|
||||||
|
(int (*) (int))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_remove_fork_catchpoint,
|
||||||
|
(int (*) (int))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_insert_vfork_catchpoint,
|
||||||
|
(int (*) (int))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_remove_vfork_catchpoint,
|
||||||
|
(int (*) (int))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_has_forked,
|
||||||
|
(int (*) (int, int *))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_has_vforked,
|
||||||
|
(int (*) (int, int *))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_can_follow_vfork_prior_to_exec,
|
||||||
|
(int (*) (void))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_post_follow_vfork,
|
||||||
|
(void (*) (int, int, int, int))
|
||||||
|
target_ignore);
|
||||||
|
de_fault (to_insert_exec_catchpoint,
|
||||||
|
(int (*) (int))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_remove_exec_catchpoint,
|
||||||
|
(int (*) (int))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_has_execd,
|
||||||
|
(int (*) (int, char **))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_reported_exec_events_per_exec_call,
|
||||||
|
(int (*) (void))
|
||||||
|
return_one);
|
||||||
|
de_fault (to_has_syscall_event,
|
||||||
|
(int (*) (int, enum target_waitkind *, int *))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_has_exited,
|
||||||
|
(int (*) (int, int, int *))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_mourn_inferior,
|
||||||
|
(void (*) (void))
|
||||||
|
noprocess);
|
||||||
|
de_fault (to_can_run,
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_notice_signals,
|
||||||
|
(void (*) (int))
|
||||||
|
target_ignore);
|
||||||
|
de_fault (to_thread_alive,
|
||||||
|
(int (*) (int))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_find_new_threads,
|
||||||
|
(void (*) (void))
|
||||||
|
target_ignore);
|
||||||
|
de_fault (to_extra_thread_info,
|
||||||
|
(char *(*) (struct thread_info *))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_stop,
|
||||||
|
(void (*) (void))
|
||||||
|
target_ignore);
|
||||||
|
de_fault (to_query,
|
||||||
|
(int (*) (int, char *, char *, int *))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_rcmd,
|
||||||
|
(void (*) (char *, struct gdb_file *))
|
||||||
|
tcomplain);
|
||||||
|
de_fault (to_enable_exception_callback,
|
||||||
|
(struct symtab_and_line * (*) (enum exception_event_kind, int))
|
||||||
|
nosupport_runtime);
|
||||||
|
de_fault (to_get_current_exception_event,
|
||||||
|
(struct exception_event_record * (*) (void))
|
||||||
|
nosupport_runtime);
|
||||||
|
de_fault (to_pid_to_exec_file,
|
||||||
|
(char *(*) (int))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_core_file_to_sym_file,
|
||||||
|
(char *(*) (char *))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_can_async_p,
|
||||||
|
(int (*) (void))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_is_async_p,
|
||||||
|
(int (*) (void))
|
||||||
|
return_zero);
|
||||||
|
de_fault (to_async,
|
||||||
|
(void (*) (void (*) (enum inferior_event_type, void*), void*))
|
||||||
|
tcomplain);
|
||||||
#undef de_fault
|
#undef de_fault
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -537,6 +649,7 @@ update_current_target ()
|
||||||
INHERIT (to_thread_alive, t);
|
INHERIT (to_thread_alive, t);
|
||||||
INHERIT (to_find_new_threads, t);
|
INHERIT (to_find_new_threads, t);
|
||||||
INHERIT (to_pid_to_str, t);
|
INHERIT (to_pid_to_str, t);
|
||||||
|
INHERIT (to_extra_thread_info, t);
|
||||||
INHERIT (to_stop, t);
|
INHERIT (to_stop, t);
|
||||||
INHERIT (to_query, t);
|
INHERIT (to_query, t);
|
||||||
INHERIT (to_rcmd, t);
|
INHERIT (to_rcmd, t);
|
||||||
|
@ -2745,6 +2858,14 @@ debug_to_thread_alive (pid)
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
debug_to_find_new_threads ()
|
||||||
|
{
|
||||||
|
debug_target.to_find_new_threads ();
|
||||||
|
|
||||||
|
fputs_unfiltered ("target_find_new_threads ()\n", gdb_stdlog);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
debug_to_stop ()
|
debug_to_stop ()
|
||||||
{
|
{
|
||||||
|
@ -2880,6 +3001,7 @@ setup_target_debug ()
|
||||||
current_target.to_can_run = debug_to_can_run;
|
current_target.to_can_run = debug_to_can_run;
|
||||||
current_target.to_notice_signals = debug_to_notice_signals;
|
current_target.to_notice_signals = debug_to_notice_signals;
|
||||||
current_target.to_thread_alive = debug_to_thread_alive;
|
current_target.to_thread_alive = debug_to_thread_alive;
|
||||||
|
current_target.to_find_new_threads = debug_to_find_new_threads;
|
||||||
current_target.to_stop = debug_to_stop;
|
current_target.to_stop = debug_to_stop;
|
||||||
current_target.to_query = debug_to_query;
|
current_target.to_query = debug_to_query;
|
||||||
current_target.to_rcmd = debug_to_rcmd;
|
current_target.to_rcmd = debug_to_rcmd;
|
||||||
|
|
182
gdb/target.h
182
gdb/target.h
|
@ -69,7 +69,8 @@ enum target_waitkind
|
||||||
/* The program has exited. The exit status is in value.integer. */
|
/* The program has exited. The exit status is in value.integer. */
|
||||||
TARGET_WAITKIND_EXITED,
|
TARGET_WAITKIND_EXITED,
|
||||||
|
|
||||||
/* The program has stopped with a signal. Which signal is in value.sig. */
|
/* The program has stopped with a signal. Which signal is in
|
||||||
|
value.sig. */
|
||||||
TARGET_WAITKIND_STOPPED,
|
TARGET_WAITKIND_STOPPED,
|
||||||
|
|
||||||
/* The program has terminated with a signal. Which signal is in
|
/* The program has terminated with a signal. Which signal is in
|
||||||
|
@ -80,24 +81,26 @@ enum target_waitkind
|
||||||
(e.g. it called load(2) on AIX). */
|
(e.g. it called load(2) on AIX). */
|
||||||
TARGET_WAITKIND_LOADED,
|
TARGET_WAITKIND_LOADED,
|
||||||
|
|
||||||
/* The program has forked. A "related" process' ID is in value.related_pid.
|
/* The program has forked. A "related" process' ID is in
|
||||||
I.e., if the child forks, value.related_pid is the parent's ID.
|
value.related_pid. I.e., if the child forks, value.related_pid
|
||||||
*/
|
is the parent's ID. */
|
||||||
|
|
||||||
TARGET_WAITKIND_FORKED,
|
TARGET_WAITKIND_FORKED,
|
||||||
|
|
||||||
/* The program has vforked. A "related" process's ID is in value.related_pid.
|
/* The program has vforked. A "related" process's ID is in
|
||||||
*/
|
value.related_pid. */
|
||||||
|
|
||||||
TARGET_WAITKIND_VFORKED,
|
TARGET_WAITKIND_VFORKED,
|
||||||
|
|
||||||
/* The program has exec'ed a new executable file. The new file's pathname
|
/* The program has exec'ed a new executable file. The new file's
|
||||||
is pointed to by value.execd_pathname.
|
pathname is pointed to by value.execd_pathname. */
|
||||||
*/
|
|
||||||
TARGET_WAITKIND_EXECD,
|
TARGET_WAITKIND_EXECD,
|
||||||
|
|
||||||
/* The program has entered or returned from a system call. On HP-UX, this
|
/* The program has entered or returned from a system call. On
|
||||||
is used in the hardware watchpoint implementation. The syscall's unique
|
HP-UX, this is used in the hardware watchpoint implementation.
|
||||||
integer ID number is in value.syscall_id;
|
The syscall's unique integer ID number is in value.syscall_id */
|
||||||
*/
|
|
||||||
TARGET_WAITKIND_SYSCALL_ENTRY,
|
TARGET_WAITKIND_SYSCALL_ENTRY,
|
||||||
TARGET_WAITKIND_SYSCALL_RETURN,
|
TARGET_WAITKIND_SYSCALL_RETURN,
|
||||||
|
|
||||||
|
@ -315,6 +318,8 @@ extern int target_activity_fd;
|
||||||
/* Returns zero to leave the inferior alone, one to interrupt it. */
|
/* Returns zero to leave the inferior alone, one to interrupt it. */
|
||||||
extern int (*target_activity_function) PARAMS ((void));
|
extern int (*target_activity_function) PARAMS ((void));
|
||||||
|
|
||||||
|
struct thread_info; /* fwd decl for parameter list below: */
|
||||||
|
|
||||||
struct target_ops
|
struct target_ops
|
||||||
{
|
{
|
||||||
char *to_shortname; /* Name this target type */
|
char *to_shortname; /* Name this target type */
|
||||||
|
@ -368,7 +373,9 @@ struct target_ops
|
||||||
not, add INCREMENT to the search address and keep trying until
|
not, add INCREMENT to the search address and keep trying until
|
||||||
the search address is outside of the range [LORANGE,HIRANGE).
|
the search address is outside of the range [LORANGE,HIRANGE).
|
||||||
|
|
||||||
If we don't find anything, set *ADDR_FOUND to (CORE_ADDR)0 and return. */
|
If we don't find anything, set *ADDR_FOUND to (CORE_ADDR)0 and
|
||||||
|
return. */
|
||||||
|
|
||||||
void (*to_search) PARAMS ((int len, char *data, char *mask,
|
void (*to_search) PARAMS ((int len, char *data, char *mask,
|
||||||
CORE_ADDR startaddr, int increment,
|
CORE_ADDR startaddr, int increment,
|
||||||
CORE_ADDR lorange, CORE_ADDR hirange,
|
CORE_ADDR lorange, CORE_ADDR hirange,
|
||||||
|
@ -415,6 +422,7 @@ struct target_ops
|
||||||
int (*to_thread_alive) PARAMS ((int pid));
|
int (*to_thread_alive) PARAMS ((int pid));
|
||||||
void (*to_find_new_threads) PARAMS ((void));
|
void (*to_find_new_threads) PARAMS ((void));
|
||||||
char *(*to_pid_to_str) PARAMS ((int));
|
char *(*to_pid_to_str) PARAMS ((int));
|
||||||
|
char *(*to_extra_thread_info) PARAMS ((struct thread_info *));
|
||||||
void (*to_stop) PARAMS ((void));
|
void (*to_stop) PARAMS ((void));
|
||||||
int (*to_query) PARAMS ((int /*char */ , char *, char *, int *));
|
int (*to_query) PARAMS ((int /*char */ , char *, char *, int *));
|
||||||
void (*to_rcmd) (char *command, struct gdb_file *output);
|
void (*to_rcmd) (char *command, struct gdb_file *output);
|
||||||
|
@ -438,10 +446,12 @@ struct target_ops
|
||||||
/* ASYNC target controls */
|
/* ASYNC target controls */
|
||||||
int (*to_can_async_p) (void);
|
int (*to_can_async_p) (void);
|
||||||
int (*to_is_async_p) (void);
|
int (*to_is_async_p) (void);
|
||||||
void (*to_async) (void (*cb) (enum inferior_event_type, void *context), void *context);
|
void (*to_async) (void (*cb) (enum inferior_event_type, void *context),
|
||||||
|
void *context);
|
||||||
int to_async_mask_value;
|
int to_async_mask_value;
|
||||||
int to_magic;
|
int to_magic;
|
||||||
/* Need sub-structure for target machine related rather than comm related? */
|
/* Need sub-structure for target machine related rather than comm related?
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Magic number for checking ops size. If a struct doesn't end with this
|
/* Magic number for checking ops size. If a struct doesn't end with this
|
||||||
|
@ -475,6 +485,7 @@ extern struct target_stack_item *target_stack;
|
||||||
/* The open routine takes the rest of the parameters from the command,
|
/* The open routine takes the rest of the parameters from the command,
|
||||||
and (if successful) pushes a new target onto the stack.
|
and (if successful) pushes a new target onto the stack.
|
||||||
Targets should supply this routine, if only to provide an error message. */
|
Targets should supply this routine, if only to provide an error message. */
|
||||||
|
|
||||||
#define target_open(name, from_tty) \
|
#define target_open(name, from_tty) \
|
||||||
(*current_target.to_open) (name, from_tty)
|
(*current_target.to_open) (name, from_tty)
|
||||||
|
|
||||||
|
@ -504,8 +515,7 @@ extern struct target_stack_item *target_stack;
|
||||||
and stops the process.
|
and stops the process.
|
||||||
|
|
||||||
This operation provides a target-specific hook that allows the
|
This operation provides a target-specific hook that allows the
|
||||||
necessary bookkeeping to be performed after an attach completes.
|
necessary bookkeeping to be performed after an attach completes. */
|
||||||
*/
|
|
||||||
#define target_post_attach(pid) \
|
#define target_post_attach(pid) \
|
||||||
(*current_target.to_post_attach) (pid)
|
(*current_target.to_post_attach) (pid)
|
||||||
|
|
||||||
|
@ -572,8 +582,7 @@ target_detach PARAMS ((char *, int));
|
||||||
knowledge of what earlier events in the sequence have been seen.
|
knowledge of what earlier events in the sequence have been seen.
|
||||||
|
|
||||||
This operation provides a target-specific hook that allows the
|
This operation provides a target-specific hook that allows the
|
||||||
necessary bookkeeping to be performed to track such sequences.
|
necessary bookkeeping to be performed to track such sequences. */
|
||||||
*/
|
|
||||||
|
|
||||||
#define target_post_wait(pid, status) \
|
#define target_post_wait(pid, status) \
|
||||||
(*current_target.to_post_wait) (pid, status)
|
(*current_target.to_post_wait) (pid, status)
|
||||||
|
@ -772,19 +781,19 @@ print_section_info PARAMS ((struct target_ops *, bfd *));
|
||||||
#define target_kill() \
|
#define target_kill() \
|
||||||
(*current_target.to_kill) ()
|
(*current_target.to_kill) ()
|
||||||
|
|
||||||
/* Load an executable file into the target process. This is expected to
|
/* Load an executable file into the target process. This is expected
|
||||||
not only bring new code into the target process, but also to update
|
to not only bring new code into the target process, but also to
|
||||||
GDB's symbol tables to match. */
|
update GDB's symbol tables to match. */
|
||||||
|
|
||||||
extern void target_load (char *arg, int from_tty);
|
extern void target_load (char *arg, int from_tty);
|
||||||
|
|
||||||
/* Look up a symbol in the target's symbol table. NAME is the symbol
|
/* Look up a symbol in the target's symbol table. NAME is the symbol
|
||||||
name. ADDRP is a CORE_ADDR * pointing to where the value of the symbol
|
name. ADDRP is a CORE_ADDR * pointing to where the value of the
|
||||||
should be returned. The result is 0 if successful, nonzero if the
|
symbol should be returned. The result is 0 if successful, nonzero
|
||||||
symbol does not exist in the target environment. This function should
|
if the symbol does not exist in the target environment. This
|
||||||
not call error() if communication with the target is interrupted, since
|
function should not call error() if communication with the target
|
||||||
it is called from symbol reading, but should return nonzero, possibly
|
is interrupted, since it is called from symbol reading, but should
|
||||||
doing a complain(). */
|
return nonzero, possibly doing a complain(). */
|
||||||
|
|
||||||
#define target_lookup_symbol(name, addrp) \
|
#define target_lookup_symbol(name, addrp) \
|
||||||
(*current_target.to_lookup_symbol) (name, addrp)
|
(*current_target.to_lookup_symbol) (name, addrp)
|
||||||
|
@ -807,14 +816,14 @@ extern void target_load (char *arg, int from_tty);
|
||||||
exec for each of those commands, and we will see each such fork
|
exec for each of those commands, and we will see each such fork
|
||||||
event. Very bad.)
|
event. Very bad.)
|
||||||
|
|
||||||
Such targets will supply an appropriate definition for this function.
|
Such targets will supply an appropriate definition for this function. */
|
||||||
*/
|
|
||||||
#define target_post_startup_inferior(pid) \
|
#define target_post_startup_inferior(pid) \
|
||||||
(*current_target.to_post_startup_inferior) (pid)
|
(*current_target.to_post_startup_inferior) (pid)
|
||||||
|
|
||||||
/* On some targets, the sequence of starting up an inferior requires
|
/* On some targets, the sequence of starting up an inferior requires
|
||||||
some synchronization between gdb and the new inferior process, PID.
|
some synchronization between gdb and the new inferior process, PID. */
|
||||||
*/
|
|
||||||
#define target_acknowledge_created_inferior(pid) \
|
#define target_acknowledge_created_inferior(pid) \
|
||||||
(*current_target.to_acknowledge_created_inferior) (pid)
|
(*current_target.to_acknowledge_created_inferior) (pid)
|
||||||
|
|
||||||
|
@ -827,8 +836,8 @@ extern void target_load (char *arg, int from_tty);
|
||||||
to determine which they are, if need be.)
|
to determine which they are, if need be.)
|
||||||
|
|
||||||
(This is not a terribly useful feature without a GUI to prevent
|
(This is not a terribly useful feature without a GUI to prevent
|
||||||
the two debuggers from competing for shell input.)
|
the two debuggers from competing for shell input.) */
|
||||||
*/
|
|
||||||
#define target_clone_and_follow_inferior(child_pid,followed_child) \
|
#define target_clone_and_follow_inferior(child_pid,followed_child) \
|
||||||
(*current_target.to_clone_and_follow_inferior) (child_pid, followed_child)
|
(*current_target.to_clone_and_follow_inferior) (child_pid, followed_child)
|
||||||
|
|
||||||
|
@ -840,15 +849,15 @@ extern void target_load (char *arg, int from_tty);
|
||||||
clone has attached to it.
|
clone has attached to it.
|
||||||
|
|
||||||
On some targets, this requires a bit of cleanup to make it work
|
On some targets, this requires a bit of cleanup to make it work
|
||||||
correctly.
|
correctly. */
|
||||||
*/
|
|
||||||
#define target_post_follow_inferior_by_clone() \
|
#define target_post_follow_inferior_by_clone() \
|
||||||
(*current_target.to_post_follow_inferior_by_clone) ()
|
(*current_target.to_post_follow_inferior_by_clone) ()
|
||||||
|
|
||||||
/* On some targets, we can catch an inferior fork or vfork event when it
|
/* On some targets, we can catch an inferior fork or vfork event when
|
||||||
occurs. These functions insert/remove an already-created catchpoint for
|
it occurs. These functions insert/remove an already-created
|
||||||
such events.
|
catchpoint for such events. */
|
||||||
*/
|
|
||||||
#define target_insert_fork_catchpoint(pid) \
|
#define target_insert_fork_catchpoint(pid) \
|
||||||
(*current_target.to_insert_fork_catchpoint) (pid)
|
(*current_target.to_insert_fork_catchpoint) (pid)
|
||||||
|
|
||||||
|
@ -863,15 +872,15 @@ extern void target_load (char *arg, int from_tty);
|
||||||
|
|
||||||
/* Returns TRUE if PID has invoked the fork() system call. And,
|
/* Returns TRUE if PID has invoked the fork() system call. And,
|
||||||
also sets CHILD_PID to the process id of the other ("child")
|
also sets CHILD_PID to the process id of the other ("child")
|
||||||
inferior process that was created by that call.
|
inferior process that was created by that call. */
|
||||||
*/
|
|
||||||
#define target_has_forked(pid,child_pid) \
|
#define target_has_forked(pid,child_pid) \
|
||||||
(*current_target.to_has_forked) (pid,child_pid)
|
(*current_target.to_has_forked) (pid,child_pid)
|
||||||
|
|
||||||
/* Returns TRUE if PID has invoked the vfork() system call. And,
|
/* Returns TRUE if PID has invoked the vfork() system call. And,
|
||||||
also sets CHILD_PID to the process id of the other ("child")
|
also sets CHILD_PID to the process id of the other ("child")
|
||||||
inferior process that was created by that call.
|
inferior process that was created by that call. */
|
||||||
*/
|
|
||||||
#define target_has_vforked(pid,child_pid) \
|
#define target_has_vforked(pid,child_pid) \
|
||||||
(*current_target.to_has_vforked) (pid,child_pid)
|
(*current_target.to_has_vforked) (pid,child_pid)
|
||||||
|
|
||||||
|
@ -882,8 +891,8 @@ extern void target_load (char *arg, int from_tty);
|
||||||
|
|
||||||
This function should be defined to return 1 by those targets
|
This function should be defined to return 1 by those targets
|
||||||
which can allow the debugger to immediately follow a vforked
|
which can allow the debugger to immediately follow a vforked
|
||||||
child, and 0 if they cannot.
|
child, and 0 if they cannot. */
|
||||||
*/
|
|
||||||
#define target_can_follow_vfork_prior_to_exec() \
|
#define target_can_follow_vfork_prior_to_exec() \
|
||||||
(*current_target.to_can_follow_vfork_prior_to_exec) ()
|
(*current_target.to_can_follow_vfork_prior_to_exec) ()
|
||||||
|
|
||||||
|
@ -893,15 +902,15 @@ extern void target_load (char *arg, int from_tty);
|
||||||
target-specific trickery to track the sequence of reported events.
|
target-specific trickery to track the sequence of reported events.
|
||||||
If so, this function should be defined by those targets that
|
If so, this function should be defined by those targets that
|
||||||
require the debugger to perform cleanup or initialization after
|
require the debugger to perform cleanup or initialization after
|
||||||
the vfork follow.
|
the vfork follow. */
|
||||||
*/
|
|
||||||
#define target_post_follow_vfork(parent_pid,followed_parent,child_pid,followed_child) \
|
#define target_post_follow_vfork(parent_pid,followed_parent,child_pid,followed_child) \
|
||||||
(*current_target.to_post_follow_vfork) (parent_pid,followed_parent,child_pid,followed_child)
|
(*current_target.to_post_follow_vfork) (parent_pid,followed_parent,child_pid,followed_child)
|
||||||
|
|
||||||
/* On some targets, we can catch an inferior exec event when it
|
/* On some targets, we can catch an inferior exec event when it
|
||||||
occurs. These functions insert/remove an already-created catchpoint
|
occurs. These functions insert/remove an already-created
|
||||||
for such events.
|
catchpoint for such events. */
|
||||||
*/
|
|
||||||
#define target_insert_exec_catchpoint(pid) \
|
#define target_insert_exec_catchpoint(pid) \
|
||||||
(*current_target.to_insert_exec_catchpoint) (pid)
|
(*current_target.to_insert_exec_catchpoint) (pid)
|
||||||
|
|
||||||
|
@ -909,37 +918,36 @@ extern void target_load (char *arg, int from_tty);
|
||||||
(*current_target.to_remove_exec_catchpoint) (pid)
|
(*current_target.to_remove_exec_catchpoint) (pid)
|
||||||
|
|
||||||
/* Returns TRUE if PID has invoked a flavor of the exec() system call.
|
/* Returns TRUE if PID has invoked a flavor of the exec() system call.
|
||||||
And, also sets EXECD_PATHNAME to the pathname of the executable file
|
And, also sets EXECD_PATHNAME to the pathname of the executable
|
||||||
that was passed to exec(), and is now being executed.
|
file that was passed to exec(), and is now being executed. */
|
||||||
*/
|
|
||||||
#define target_has_execd(pid,execd_pathname) \
|
#define target_has_execd(pid,execd_pathname) \
|
||||||
(*current_target.to_has_execd) (pid,execd_pathname)
|
(*current_target.to_has_execd) (pid,execd_pathname)
|
||||||
|
|
||||||
/* Returns the number of exec events that are reported when a process
|
/* Returns the number of exec events that are reported when a process
|
||||||
invokes a flavor of the exec() system call on this target, if exec
|
invokes a flavor of the exec() system call on this target, if exec
|
||||||
events are being reported.
|
events are being reported. */
|
||||||
*/
|
|
||||||
#define target_reported_exec_events_per_exec_call() \
|
#define target_reported_exec_events_per_exec_call() \
|
||||||
(*current_target.to_reported_exec_events_per_exec_call) ()
|
(*current_target.to_reported_exec_events_per_exec_call) ()
|
||||||
|
|
||||||
/* Returns TRUE if PID has reported a syscall event. And, also sets
|
/* Returns TRUE if PID has reported a syscall event. And, also sets
|
||||||
KIND to the appropriate TARGET_WAITKIND_, and sets SYSCALL_ID to
|
KIND to the appropriate TARGET_WAITKIND_, and sets SYSCALL_ID to
|
||||||
the unique integer ID of the syscall.
|
the unique integer ID of the syscall. */
|
||||||
*/
|
|
||||||
#define target_has_syscall_event(pid,kind,syscall_id) \
|
#define target_has_syscall_event(pid,kind,syscall_id) \
|
||||||
(*current_target.to_has_syscall_event) (pid,kind,syscall_id)
|
(*current_target.to_has_syscall_event) (pid,kind,syscall_id)
|
||||||
|
|
||||||
/* Returns TRUE if PID has exited. And, also sets EXIT_STATUS to the
|
/* Returns TRUE if PID has exited. And, also sets EXIT_STATUS to the
|
||||||
exit code of PID, if any.
|
exit code of PID, if any. */
|
||||||
*/
|
|
||||||
#define target_has_exited(pid,wait_status,exit_status) \
|
#define target_has_exited(pid,wait_status,exit_status) \
|
||||||
(*current_target.to_has_exited) (pid,wait_status,exit_status)
|
(*current_target.to_has_exited) (pid,wait_status,exit_status)
|
||||||
|
|
||||||
/* The debugger has completed a blocking wait() call. There is now
|
/* The debugger has completed a blocking wait() call. There is now
|
||||||
some process event that must be processed. This function should
|
some process event that must be processed. This function should
|
||||||
be defined by those targets that require the debugger to perform
|
be defined by those targets that require the debugger to perform
|
||||||
cleanup or internal state changes in response to the process event.
|
cleanup or internal state changes in response to the process event. */
|
||||||
*/
|
|
||||||
|
|
||||||
/* The inferior process has died. Do what is right. */
|
/* The inferior process has died. Do what is right. */
|
||||||
|
|
||||||
|
@ -964,14 +972,11 @@ extern void target_load (char *arg, int from_tty);
|
||||||
/* Query for new threads and add them to the thread list. */
|
/* Query for new threads and add them to the thread list. */
|
||||||
|
|
||||||
#define target_find_new_threads() \
|
#define target_find_new_threads() \
|
||||||
do { \
|
|
||||||
if (current_target.to_find_new_threads) \
|
|
||||||
(*current_target.to_find_new_threads) (); \
|
(*current_target.to_find_new_threads) (); \
|
||||||
} while (0);
|
|
||||||
|
|
||||||
/* Make target stop in a continuable fashion. (For instance, under Unix, this
|
/* Make target stop in a continuable fashion. (For instance, under
|
||||||
should act like SIGSTOP). This function is normally used by GUIs to
|
Unix, this should act like SIGSTOP). This function is normally
|
||||||
implement a stop button. */
|
used by GUIs to implement a stop button. */
|
||||||
|
|
||||||
#define target_stop current_target.to_stop
|
#define target_stop current_target.to_stop
|
||||||
|
|
||||||
|
@ -1063,7 +1068,8 @@ extern void target_load (char *arg, int from_tty);
|
||||||
#define target_is_async_p() (current_target.to_is_async_p())
|
#define target_is_async_p() (current_target.to_is_async_p())
|
||||||
|
|
||||||
/* Put the target in async mode with the specified callback function. */
|
/* Put the target in async mode with the specified callback function. */
|
||||||
#define target_async(CALLBACK,CONTEXT) (current_target.to_async((CALLBACK), (CONTEXT)))
|
#define target_async(CALLBACK,CONTEXT) \
|
||||||
|
(current_target.to_async((CALLBACK), (CONTEXT)))
|
||||||
|
|
||||||
/* This is to be used ONLY within run_stack_dummy(). It
|
/* This is to be used ONLY within run_stack_dummy(). It
|
||||||
provides a workaround, to have inferior function calls done in
|
provides a workaround, to have inferior function calls done in
|
||||||
|
@ -1099,6 +1105,12 @@ extern void target_link PARAMS ((char *, CORE_ADDR *));
|
||||||
extern char *normal_pid_to_str PARAMS ((int pid));
|
extern char *normal_pid_to_str PARAMS ((int pid));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Return a short string describing extra information about PID,
|
||||||
|
e.g. "sleeping", "runnable", "running on LWP 3". Null return value
|
||||||
|
is okay. */
|
||||||
|
|
||||||
|
#define target_extra_thread_info(TP) \
|
||||||
|
(current_target.to_extra_thread_info (TP))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* New Objfile Event Hook:
|
* New Objfile Event Hook:
|
||||||
|
@ -1140,8 +1152,7 @@ extern void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
Else, a pointer to a character string containing the pathname
|
Else, a pointer to a character string containing the pathname
|
||||||
is returned. This string should be copied into a buffer by
|
is returned. This string should be copied into a buffer by
|
||||||
the client if the string will not be immediately used, or if
|
the client if the string will not be immediately used, or if
|
||||||
it must persist.
|
it must persist. */
|
||||||
*/
|
|
||||||
|
|
||||||
#define target_pid_to_exec_file(pid) \
|
#define target_pid_to_exec_file(pid) \
|
||||||
(current_target.to_pid_to_exec_file) (pid)
|
(current_target.to_pid_to_exec_file) (pid)
|
||||||
|
@ -1170,8 +1181,8 @@ extern void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
|
|
||||||
/* HP-UX supplies these operations, which respectively disable and enable
|
/* HP-UX supplies these operations, which respectively disable and enable
|
||||||
the memory page-protections that are used to implement hardware watchpoints
|
the memory page-protections that are used to implement hardware watchpoints
|
||||||
on that platform. See wait_for_inferior's use of these.
|
on that platform. See wait_for_inferior's use of these. */
|
||||||
*/
|
|
||||||
#if !defined(TARGET_DISABLE_HW_WATCHPOINTS)
|
#if !defined(TARGET_DISABLE_HW_WATCHPOINTS)
|
||||||
#define TARGET_DISABLE_HW_WATCHPOINTS(pid)
|
#define TARGET_DISABLE_HW_WATCHPOINTS(pid)
|
||||||
#endif
|
#endif
|
||||||
|
@ -1201,8 +1212,8 @@ extern void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
scope, and hence should be unwatched. On some targets, this may have
|
scope, and hence should be unwatched. On some targets, this may have
|
||||||
severe performance penalties, such that we might as well use regular
|
severe performance penalties, such that we might as well use regular
|
||||||
watchpoints, and save (possibly precious) hardware watchpoints for other
|
watchpoints, and save (possibly precious) hardware watchpoints for other
|
||||||
locations.
|
locations. */
|
||||||
*/
|
|
||||||
#if !defined(TARGET_RANGE_PROFITABLE_FOR_HW_WATCHPOINT)
|
#if !defined(TARGET_RANGE_PROFITABLE_FOR_HW_WATCHPOINT)
|
||||||
#define TARGET_RANGE_PROFITABLE_FOR_HW_WATCHPOINT(pid,start,len) 0
|
#define TARGET_RANGE_PROFITABLE_FOR_HW_WATCHPOINT(pid,start,len) 0
|
||||||
#endif
|
#endif
|
||||||
|
@ -1236,8 +1247,8 @@ extern void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
/* Sometimes gdb may pick up what appears to be a valid target address
|
/* Sometimes gdb may pick up what appears to be a valid target address
|
||||||
from a minimal symbol, but the value really means, essentially,
|
from a minimal symbol, but the value really means, essentially,
|
||||||
"This is an index into a table which is populated when the inferior
|
"This is an index into a table which is populated when the inferior
|
||||||
is run. Therefore, do not attempt to use this as a PC."
|
is run. Therefore, do not attempt to use this as a PC." */
|
||||||
*/
|
|
||||||
#if !defined(PC_REQUIRES_RUN_BEFORE_USE)
|
#if !defined(PC_REQUIRES_RUN_BEFORE_USE)
|
||||||
#define PC_REQUIRES_RUN_BEFORE_USE(pc) (0)
|
#define PC_REQUIRES_RUN_BEFORE_USE(pc) (0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -1248,8 +1259,7 @@ extern void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
On some targets (such as HP-UX 10.20 and earlier), resuming a newly vforked
|
On some targets (such as HP-UX 10.20 and earlier), resuming a newly vforked
|
||||||
child process after it has exec'd, causes the parent process to resume as
|
child process after it has exec'd, causes the parent process to resume as
|
||||||
well. To prevent the parent from running spontaneously, such targets should
|
well. To prevent the parent from running spontaneously, such targets should
|
||||||
define this to a function that prevents that from happening.
|
define this to a function that prevents that from happening. */
|
||||||
*/
|
|
||||||
#if !defined(ENSURE_VFORKING_PARENT_REMAINS_STOPPED)
|
#if !defined(ENSURE_VFORKING_PARENT_REMAINS_STOPPED)
|
||||||
#define ENSURE_VFORKING_PARENT_REMAINS_STOPPED(PID) (0)
|
#define ENSURE_VFORKING_PARENT_REMAINS_STOPPED(PID) (0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -1259,8 +1269,8 @@ extern void (*target_new_objfile_hook) PARAMS ((struct objfile *));
|
||||||
|
|
||||||
On some targets (such as HP-UX 10.20 and earlier), a newly vforked child
|
On some targets (such as HP-UX 10.20 and earlier), a newly vforked child
|
||||||
process must be resumed when it delivers its exec event, before the parent
|
process must be resumed when it delivers its exec event, before the parent
|
||||||
vfork event will be delivered to us.
|
vfork event will be delivered to us. */
|
||||||
*/
|
|
||||||
#if !defined(RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK)
|
#if !defined(RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK)
|
||||||
#define RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK() (0)
|
#define RESUME_EXECD_VFORKING_CHILD_TO_GET_PARENT_VFORK() (0)
|
||||||
#endif
|
#endif
|
||||||
|
@ -1328,7 +1338,8 @@ extern int default_memory_insert_breakpoint PARAMS ((CORE_ADDR, char *));
|
||||||
|
|
||||||
extern breakpoint_from_pc_fn memory_breakpoint_from_pc;
|
extern breakpoint_from_pc_fn memory_breakpoint_from_pc;
|
||||||
#ifndef BREAKPOINT_FROM_PC
|
#ifndef BREAKPOINT_FROM_PC
|
||||||
#define BREAKPOINT_FROM_PC(pcptr, lenptr) memory_breakpoint_from_pc (pcptr, lenptr)
|
#define BREAKPOINT_FROM_PC(pcptr, lenptr) \
|
||||||
|
memory_breakpoint_from_pc (pcptr, lenptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -1392,6 +1403,7 @@ extern void store_waitstatus PARAMS ((struct target_waitstatus *, int));
|
||||||
In this context ``target_signal'' refers to GDB's internal
|
In this context ``target_signal'' refers to GDB's internal
|
||||||
representation of the target's set of signals while ``host signal''
|
representation of the target's set of signals while ``host signal''
|
||||||
refers to the target operating system's signal. Confused? */
|
refers to the target operating system's signal. Confused? */
|
||||||
|
|
||||||
extern int target_signal_to_host_p (enum target_signal signo);
|
extern int target_signal_to_host_p (enum target_signal signo);
|
||||||
|
|
||||||
/* Convert between host signal numbers and enum target_signal's.
|
/* Convert between host signal numbers and enum target_signal's.
|
||||||
|
@ -1402,6 +1414,7 @@ extern int target_signal_to_host_p (enum target_signal signo);
|
||||||
Similarly, ``enum target_signal'' is named incorrectly, ``enum
|
Similarly, ``enum target_signal'' is named incorrectly, ``enum
|
||||||
gdb_signal'' would probably be better as it is refering to GDB's
|
gdb_signal'' would probably be better as it is refering to GDB's
|
||||||
internal representation of a target operating system's signal. */
|
internal representation of a target operating system's signal. */
|
||||||
|
|
||||||
extern enum target_signal target_signal_from_host PARAMS ((int));
|
extern enum target_signal target_signal_from_host PARAMS ((int));
|
||||||
extern int target_signal_to_host PARAMS ((enum target_signal));
|
extern int target_signal_to_host PARAMS ((enum target_signal));
|
||||||
|
|
||||||
|
@ -1415,7 +1428,8 @@ extern void push_remote_target PARAMS ((char *name, int from_tty));
|
||||||
|
|
||||||
#ifndef SOFTWARE_SINGLE_STEP_P
|
#ifndef SOFTWARE_SINGLE_STEP_P
|
||||||
#define SOFTWARE_SINGLE_STEP_P 0
|
#define SOFTWARE_SINGLE_STEP_P 0
|
||||||
#define SOFTWARE_SINGLE_STEP(sig,bp_p) (internal_error ("SOFTWARE_SINGLE_STEP"), 0)
|
#define SOFTWARE_SINGLE_STEP(sig,bp_p) \
|
||||||
|
(internal_error ("SOFTWARE_SINGLE_STEP"), 0)
|
||||||
#endif /* SOFTWARE_SINGLE_STEP_P */
|
#endif /* SOFTWARE_SINGLE_STEP_P */
|
||||||
|
|
||||||
/* Blank target vector entries are initialized to target_ignore. */
|
/* Blank target vector entries are initialized to target_ignore. */
|
||||||
|
|
|
@ -1,3 +1,24 @@
|
||||||
|
2000-01-10 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/so-indr-cl.exp: Don't execute the test if not on HPUX.
|
||||||
|
Don't use xfail's because that affects only the following test.
|
||||||
|
|
||||||
|
* gdb.base/so-impl-ld.exp: Don't execute the tests if not on hpux,
|
||||||
|
solaris or linux.
|
||||||
|
|
||||||
|
* gdb.base/selftest.exp: Update to reflect changes to main.c.
|
||||||
|
|
||||||
|
2000-01-07 Michael Snyder <msnyder@cleaver.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/display.exp: Some yacc parsers like to say
|
||||||
|
"A syntax error" rather than "A parse error". Accept both.
|
||||||
|
|
||||||
|
2000-01-06 Fernando Nasser <fnasser@totem.to.cygnus.com>
|
||||||
|
|
||||||
|
* gdb.base/default.exp: Remove OS dependent string from "target
|
||||||
|
remote" test.
|
||||||
|
* gdb.base/help.exp: Same for "help target remote" test.
|
||||||
|
|
||||||
2000-01-04 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
2000-01-04 Elena Zannoni <ezannoni@kwikemart.cygnus.com>
|
||||||
|
|
||||||
From Jim Kingdon <kingdon@redhat.com>:
|
From Jim Kingdon <kingdon@redhat.com>:
|
||||||
|
|
|
@ -727,7 +727,7 @@ gdb_expect {
|
||||||
if ![istarget "*-*-udi*"] then {
|
if ![istarget "*-*-udi*"] then {
|
||||||
send_gdb "target remote\n"
|
send_gdb "target remote\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "To open a remote debug connection, you need to specify what.*serial.*device is attached to the remote system .e.g. /dev/ttya.*$gdb_prompt $"\
|
-re "To open a remote debug connection, you need to specify what.*serial.*device is attached to the remote system .e.g. .*$gdb_prompt $"\
|
||||||
{ pass "target remote" }
|
{ pass "target remote" }
|
||||||
-re ".*A program is being debugged already. Kill it. .y or n.*$" {
|
-re ".*A program is being debugged already. Kill it. .y or n.*$" {
|
||||||
send_gdb "n\n"
|
send_gdb "n\n"
|
||||||
|
|
|
@ -191,7 +191,7 @@ gdb_test "p/a &sum" ".*= $hex.*<sum>.*"
|
||||||
# this test will (incorrectly) fail. So use a small number.
|
# this test will (incorrectly) fail. So use a small number.
|
||||||
gdb_test "p/a main+4" ".*= $hex.*<.*>.*"
|
gdb_test "p/a main+4" ".*= $hex.*<.*>.*"
|
||||||
gdb_test "p/a \$pc" ".*= $hex.*<do_vars+.*>.*"
|
gdb_test "p/a \$pc" ".*= $hex.*<do_vars+.*>.*"
|
||||||
gdb_test "p/a &&j" ".*A parse error.*"
|
gdb_test "p/a &&j" ".*A .* error in expression.*"
|
||||||
|
|
||||||
# Done!
|
# Done!
|
||||||
#
|
#
|
||||||
|
|
|
@ -504,7 +504,7 @@ gdb_test "help target core" ".*Use a core file as a target.*Specify the filename
|
||||||
# test help target exec
|
# test help target exec
|
||||||
gdb_test "help target exec" "Use an executable file as a target..*\[\r\n\]+Specify the filename of the executable file." "help target exec"
|
gdb_test "help target exec" "Use an executable file as a target..*\[\r\n\]+Specify the filename of the executable file." "help target exec"
|
||||||
# test help target remote
|
# test help target remote
|
||||||
gdb_test "help target remote" "Use a remote computer via a serial line, using a gdb-specific protocol..*\[\r\n\]+Specify the serial device it is connected to .e.g. /dev/ttya..*" "help target remote"
|
gdb_test "help target remote" "Use a remote computer via a serial line, using a gdb-specific protocol..*\[\r\n\]+Specify the serial device it is connected to .e.g. .*" "help target remote"
|
||||||
# test help target
|
# test help target
|
||||||
# the child process target may be "target child" or "target procfs"
|
# the child process target may be "target child" or "target procfs"
|
||||||
gdb_test "help target" "Connect to a target machine or process..*\[\r\n\]+The first argument is the type or protocol of the target machine..*\[\r\n\]+Remaining arguments are interpreted by the target protocol. For more.*\[\r\n\]+information on the arguments for a particular protocol, type.*\[\r\n\]+`help target ' followed by the protocol name..*\[\r\n\]+List of target subcommands:.*\[\r\n\]+target exec -- Use an executable file as a target.*\[\r\n\]+Type \"help target\" followed by target subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help target"
|
gdb_test "help target" "Connect to a target machine or process..*\[\r\n\]+The first argument is the type or protocol of the target machine..*\[\r\n\]+Remaining arguments are interpreted by the target protocol. For more.*\[\r\n\]+information on the arguments for a particular protocol, type.*\[\r\n\]+`help target ' followed by the protocol name..*\[\r\n\]+List of target subcommands:.*\[\r\n\]+target exec -- Use an executable file as a target.*\[\r\n\]+Type \"help target\" followed by target subcommand name for full documentation..*\[\r\n\]+Command name abbreviations are allowed if unambiguous." "help target"
|
||||||
|
|
|
@ -51,9 +51,29 @@ proc do_steps_and_nexts {} {
|
||||||
|
|
||||||
gdb_reinitialize_dir $srcdir/..
|
gdb_reinitialize_dir $srcdir/..
|
||||||
|
|
||||||
for {set count 0} {$count < 20} {incr count} {
|
for {set count 0} {$count < 22} {incr count} {
|
||||||
send_gdb "list\n"
|
send_gdb "list\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
|
-re ".*context = data.*$gdb_prompt $" {
|
||||||
|
set description "step over context initialization"
|
||||||
|
set command "step"
|
||||||
|
}
|
||||||
|
-re ".*argc = context->argc.*$gdb_prompt $" {
|
||||||
|
set description "step over argc initialization"
|
||||||
|
set command "step"
|
||||||
|
}
|
||||||
|
-re ".*argv = context->argv.*$gdb_prompt $" {
|
||||||
|
set description "step over argv initialization"
|
||||||
|
set command "step"
|
||||||
|
}
|
||||||
|
-re ".*quiet = 0.*$gdb_prompt $" {
|
||||||
|
set description "step over quiet initialization"
|
||||||
|
set command "step"
|
||||||
|
}
|
||||||
|
-re ".*batch = 0.*$gdb_prompt $" {
|
||||||
|
set description "step over batch initialization"
|
||||||
|
set command "step"
|
||||||
|
}
|
||||||
-re ".*symarg = NULL.*$gdb_prompt $" {
|
-re ".*symarg = NULL.*$gdb_prompt $" {
|
||||||
set description "step over symarg initialization"
|
set description "step over symarg initialization"
|
||||||
set command "step"
|
set command "step"
|
||||||
|
@ -74,10 +94,6 @@ proc do_steps_and_nexts {} {
|
||||||
set description "step over ttyarg initialization"
|
set description "step over ttyarg initialization"
|
||||||
set command "step"
|
set command "step"
|
||||||
}
|
}
|
||||||
-re ".*interparg = NULL.*$gdb_prompt $" {
|
|
||||||
set description "step over interparg initialization"
|
|
||||||
set command "step"
|
|
||||||
}
|
|
||||||
-re ".*time_at_startup = get_run_time.*$gdb_prompt $" {
|
-re ".*time_at_startup = get_run_time.*$gdb_prompt $" {
|
||||||
set description "next over get_run_time and everything it calls"
|
set description "next over get_run_time and everything it calls"
|
||||||
set command "next"
|
set command "next"
|
||||||
|
@ -106,10 +122,6 @@ proc do_steps_and_nexts {} {
|
||||||
set description "next over conditional stack alignment alloca"
|
set description "next over conditional stack alignment alloca"
|
||||||
set command "next"
|
set command "next"
|
||||||
}
|
}
|
||||||
-re ".*SET_TOP_LEVEL.*$gdb_prompt $" {
|
|
||||||
set description "next over SET_TOP_LEVEL call"
|
|
||||||
set command "next"
|
|
||||||
}
|
|
||||||
-re ".*cmdsize = 1.*$gdb_prompt $" {
|
-re ".*cmdsize = 1.*$gdb_prompt $" {
|
||||||
set description "step over cmdsize initialization"
|
set description "step over cmdsize initialization"
|
||||||
set command "next"
|
set command "next"
|
||||||
|
@ -199,9 +211,9 @@ proc test_with_self { executable } {
|
||||||
"Disassemble main"
|
"Disassemble main"
|
||||||
|
|
||||||
# Set a breakpoint at main
|
# Set a breakpoint at main
|
||||||
gdb_test "break main" \
|
gdb_test "break captured_main" \
|
||||||
"Breakpoint.*at.* file.*, line.*" \
|
"Breakpoint.*at.* file.*, line.*" \
|
||||||
"breakpoint in main"
|
"breakpoint in captured_main"
|
||||||
|
|
||||||
# We'll need this when we send a ^C to GDB. Need to do it before we
|
# We'll need this when we send a ^C to GDB. Need to do it before we
|
||||||
# run the program and gdb starts saving and restoring tty states.
|
# run the program and gdb starts saving and restoring tty states.
|
||||||
|
@ -222,13 +234,13 @@ proc test_with_self { executable } {
|
||||||
# so we bump it back up for the duration of this command.
|
# so we bump it back up for the duration of this command.
|
||||||
set timeout 600
|
set timeout 600
|
||||||
|
|
||||||
set description "run until breakpoint at main"
|
set description "run until breakpoint at captured_main"
|
||||||
send_gdb "run -nw\n"
|
send_gdb "run -nw\n"
|
||||||
gdb_expect {
|
gdb_expect {
|
||||||
-re "Starting program.*Breakpoint \[0-9\]+,.*main .argc.*argv.* at .*main.c:.*$gdb_prompt $" {
|
-re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.* at .*main.c:.*$gdb_prompt $" {
|
||||||
pass "$description"
|
pass "$description"
|
||||||
}
|
}
|
||||||
-re "Starting program.*Breakpoint \[0-9\]+,.*main .argc.*argv.*$gdb_prompt $" {
|
-re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.*$gdb_prompt $" {
|
||||||
xfail "$description (line numbers scrambled?)"
|
xfail "$description (line numbers scrambled?)"
|
||||||
}
|
}
|
||||||
-re "vfork: No more processes.*$gdb_prompt $" {
|
-re "vfork: No more processes.*$gdb_prompt $" {
|
||||||
|
|
|
@ -32,9 +32,13 @@ if ![isnative] then {
|
||||||
# This test is presently only valid on HP-UX, since it requires
|
# This test is presently only valid on HP-UX, since it requires
|
||||||
# that we use HP-UX-specific compiler & linker options to build
|
# that we use HP-UX-specific compiler & linker options to build
|
||||||
# the testcase.
|
# the testcase.
|
||||||
#
|
# Actually this test works on solaris, and linux too.
|
||||||
setup_xfail "*-*-*"
|
|
||||||
clear_xfail "hppa*-*-*hpux*"
|
if {! ([istarget "hppa*-*-*hpux*"]
|
||||||
|
|| [istarget "sparc-sun-solaris*"]
|
||||||
|
|| [istarget " *-*-linux-gnu"]) } {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
set libfile "solib"
|
set libfile "solib"
|
||||||
set testfile "so-impl-ld"
|
set testfile "so-impl-ld"
|
||||||
|
@ -160,3 +164,9 @@ gdb_expect {
|
||||||
|
|
||||||
gdb_exit
|
gdb_exit
|
||||||
return 0
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -33,8 +33,9 @@ if ![isnative] then {
|
||||||
# that we use HP-UX-specific compiler & linker options to build
|
# that we use HP-UX-specific compiler & linker options to build
|
||||||
# the testcase.
|
# the testcase.
|
||||||
#
|
#
|
||||||
setup_xfail "*-*-*"
|
if {! [istarget "hppa*-*-*hpux*"] } {
|
||||||
clear_xfail "hppa*-*-*hpux*"
|
return
|
||||||
|
}
|
||||||
|
|
||||||
set libfile "solib"
|
set libfile "solib"
|
||||||
set testfile "so-indr-cl"
|
set testfile "so-indr-cl"
|
||||||
|
|
|
@ -46,7 +46,7 @@ if [istarget "*-*-linux"] then {
|
||||||
set target_cflags ""
|
set target_cflags ""
|
||||||
}
|
}
|
||||||
set why_msg "unrecognized error"
|
set why_msg "unrecognized error"
|
||||||
foreach lib {-lpthreads -lpthread} {
|
foreach lib {-lpthreads -lpthread -lthread} {
|
||||||
set options "debug"
|
set options "debug"
|
||||||
lappend options "incdir=${objdir}/${subdir}"
|
lappend options "incdir=${objdir}/${subdir}"
|
||||||
lappend options "libs=$lib"
|
lappend options "libs=$lib"
|
||||||
|
|
98
gdb/thread.c
98
gdb/thread.c
|
@ -1,5 +1,5 @@
|
||||||
/* Multi-process/thread control for GDB, the GNU debugger.
|
/* Multi-process/thread control for GDB, the GNU debugger.
|
||||||
Copyright 1986, 1987, 1988, 1993, 1998
|
Copyright 1986, 1987, 1988, 1993, 1998, 1999, 2000
|
||||||
|
|
||||||
Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA.
|
Contributed by Lynx Real-Time Systems, Inc. Los Gatos, CA.
|
||||||
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
||||||
|
@ -38,41 +38,7 @@
|
||||||
|
|
||||||
/*#include "lynxos-core.h" */
|
/*#include "lynxos-core.h" */
|
||||||
|
|
||||||
struct thread_info
|
/* Definition of struct thread_info exported to gdbthread.h */
|
||||||
{
|
|
||||||
struct thread_info *next;
|
|
||||||
int pid; /* Actual process id */
|
|
||||||
int num; /* Convenient handle */
|
|
||||||
CORE_ADDR prev_pc; /* State from wait_for_inferior */
|
|
||||||
CORE_ADDR prev_func_start;
|
|
||||||
char *prev_func_name;
|
|
||||||
struct breakpoint *step_resume_breakpoint;
|
|
||||||
struct breakpoint *through_sigtramp_breakpoint;
|
|
||||||
CORE_ADDR step_range_start;
|
|
||||||
CORE_ADDR step_range_end;
|
|
||||||
CORE_ADDR step_frame_address;
|
|
||||||
int trap_expected;
|
|
||||||
int handling_longjmp;
|
|
||||||
int another_trap;
|
|
||||||
|
|
||||||
/* This is set TRUE when a catchpoint of a shared library event
|
|
||||||
triggers. Since we don't wish to leave the inferior in the
|
|
||||||
solib hook when we report the event, we step the inferior
|
|
||||||
back to user code before stopping and reporting the event.
|
|
||||||
*/
|
|
||||||
int stepping_through_solib_after_catch;
|
|
||||||
|
|
||||||
/* When stepping_through_solib_after_catch is TRUE, this is a
|
|
||||||
list of the catchpoints that should be reported as triggering
|
|
||||||
when we finally do stop stepping.
|
|
||||||
*/
|
|
||||||
bpstat stepping_through_solib_catchpoints;
|
|
||||||
|
|
||||||
/* This is set to TRUE when this thread is in a signal handler
|
|
||||||
trampoline and we're single-stepping through it */
|
|
||||||
int stepping_through_sigtramp;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
/* Prototypes for exported functions. */
|
/* Prototypes for exported functions. */
|
||||||
|
|
||||||
|
@ -112,7 +78,10 @@ init_thread_list ()
|
||||||
highest_thread_num = 0;
|
highest_thread_num = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
/* add_thread now returns a pointer to the new thread_info,
|
||||||
|
so that back_ends can initialize their private data. */
|
||||||
|
|
||||||
|
struct thread_info *
|
||||||
add_thread (pid)
|
add_thread (pid)
|
||||||
int pid;
|
int pid;
|
||||||
{
|
{
|
||||||
|
@ -138,6 +107,7 @@ add_thread (pid)
|
||||||
tp->stepping_through_sigtramp = 0;
|
tp->stepping_through_sigtramp = 0;
|
||||||
tp->next = thread_list;
|
tp->next = thread_list;
|
||||||
thread_list = tp;
|
thread_list = tp;
|
||||||
|
return tp;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -165,6 +135,11 @@ delete_thread (pid)
|
||||||
if (tp->step_resume_breakpoint)
|
if (tp->step_resume_breakpoint)
|
||||||
delete_breakpoint (tp->step_resume_breakpoint);
|
delete_breakpoint (tp->step_resume_breakpoint);
|
||||||
|
|
||||||
|
/* FIXME: do I ever need to call the back-end to give it a
|
||||||
|
chance at this private data before deleting the thread? */
|
||||||
|
if (tp->private)
|
||||||
|
free (tp->private);
|
||||||
|
|
||||||
free (tp);
|
free (tp);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -183,6 +158,48 @@ find_thread_id (num)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Find a thread_info by matching 'pid'. */
|
||||||
|
struct thread_info *
|
||||||
|
find_thread_pid (pid)
|
||||||
|
int pid;
|
||||||
|
{
|
||||||
|
struct thread_info *tp;
|
||||||
|
|
||||||
|
for (tp = thread_list; tp; tp = tp->next)
|
||||||
|
if (tp->pid == pid)
|
||||||
|
return tp;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Thread iterator function.
|
||||||
|
*
|
||||||
|
* Calls a callback function once for each thread, so long as
|
||||||
|
* the callback function returns false. If the callback function
|
||||||
|
* returns true, the iteration will end and the current thread
|
||||||
|
* will be returned. This can be useful for implementing a
|
||||||
|
* search for a thread with arbitrary attributes, or for applying
|
||||||
|
* some operation to every thread.
|
||||||
|
*
|
||||||
|
* FIXME: some of the existing functionality, such as
|
||||||
|
* "Thread apply all", might be rewritten using this functionality.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct thread_info *
|
||||||
|
iterate_over_threads (callback, data)
|
||||||
|
int (*callback) ();
|
||||||
|
void *data;
|
||||||
|
{
|
||||||
|
struct thread_info *tp;
|
||||||
|
|
||||||
|
for (tp = thread_list; tp; tp = tp->next)
|
||||||
|
if ((*callback) (tp, data))
|
||||||
|
return tp;
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
valid_thread_id (num)
|
valid_thread_id (num)
|
||||||
int num;
|
int num;
|
||||||
|
@ -380,6 +397,7 @@ info_threads_command (arg, from_tty)
|
||||||
struct frame_info *cur_frame;
|
struct frame_info *cur_frame;
|
||||||
int saved_frame_level = selected_frame_level;
|
int saved_frame_level = selected_frame_level;
|
||||||
int counter;
|
int counter;
|
||||||
|
char *extra_info;
|
||||||
|
|
||||||
/* Avoid coredumps which would happen if we tried to access a NULL
|
/* Avoid coredumps which would happen if we tried to access a NULL
|
||||||
selected_frame. */
|
selected_frame. */
|
||||||
|
@ -401,6 +419,12 @@ info_threads_command (arg, from_tty)
|
||||||
#else
|
#else
|
||||||
printf_filtered ("%d %s", tp->num, target_pid_to_str (tp->pid));
|
printf_filtered ("%d %s", tp->num, target_pid_to_str (tp->pid));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extra_info = target_extra_thread_info (tp);
|
||||||
|
if (extra_info)
|
||||||
|
printf_filtered (" (%s)", extra_info);
|
||||||
|
puts_filtered (" ");
|
||||||
|
|
||||||
switch_to_thread (tp->pid);
|
switch_to_thread (tp->pid);
|
||||||
if (selected_frame)
|
if (selected_frame)
|
||||||
print_only_stack_frame (selected_frame, -1, 0);
|
print_only_stack_frame (selected_frame, -1, 0);
|
||||||
|
|
|
@ -571,6 +571,15 @@ handle_exception (struct target_waitstatus *ourstatus)
|
||||||
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
ourstatus->value.sig = TARGET_SIGNAL_SEGV;
|
||||||
continue_status = DBG_EXCEPTION_NOT_HANDLED;
|
continue_status = DBG_EXCEPTION_NOT_HANDLED;
|
||||||
break;
|
break;
|
||||||
|
case STATUS_FLOAT_UNDERFLOW:
|
||||||
|
case STATUS_FLOAT_DIVIDE_BY_ZERO:
|
||||||
|
case STATUS_FLOAT_OVERFLOW:
|
||||||
|
case STATUS_INTEGER_DIVIDE_BY_ZERO:
|
||||||
|
DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08x\n",
|
||||||
|
current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
||||||
|
ourstatus->value.sig = TARGET_SIGNAL_FPE;
|
||||||
|
continue_status = DBG_EXCEPTION_NOT_HANDLED;
|
||||||
|
break;
|
||||||
case STATUS_STACK_OVERFLOW:
|
case STATUS_STACK_OVERFLOW:
|
||||||
DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08x\n",
|
DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08x\n",
|
||||||
current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
current_event.u.Exception.ExceptionRecord.ExceptionAddress));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue