/* Variables that describe the inferior process running under GDB:
Where it is, why it stopped, and how to step it.
- Copyright 1986, 1989, 1992, 1996, 1998 Free Software Foundation, Inc.
-This file is part of GDB.
+ Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996,
+ 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009
+ Free Software Foundation, Inc.
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
+ This file is part of GDB.
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>. */
#if !defined (INFERIOR_H)
#define INFERIOR_H 1
+struct target_waitstatus;
+struct frame_info;
+struct ui_file;
+struct type;
+struct gdbarch;
+struct regcache;
+struct ui_out;
+struct terminal_info;
+
/* For bpstat. */
#include "breakpoint.h"
/* For enum target_signal. */
#include "target.h"
-/* Structure in which to save the status of the inferior. Create/Save
- through "save_inferior_status", restore through
- "restore_inferior_status".
+/* For struct frame_id. */
+#include "frame.h"
- This pair of routines should be called around any transfer of
- control to the inferior which you don't want showing up in your
- control variables. */
+/* Two structures are used to record inferior state.
-#ifdef __STDC__
-struct inferior_status;
-#endif
+ inferior_thread_state contains state about the program itself like its
+ registers and any signal it received when it last stopped.
+ This state must be restored regardless of how the inferior function call
+ ends (either successfully, or after it hits a breakpoint or signal)
+ if the program is to properly continue where it left off.
-extern struct inferior_status *save_inferior_status PARAMS ((int));
+ inferior_status contains state regarding gdb's control of the inferior
+ itself like stepping control. It also contains session state like the
+ user's currently selected frame.
-extern void restore_inferior_status PARAMS ((struct inferior_status *));
+ Call these routines around hand called functions, including function calls
+ in conditional breakpoints for example. */
-extern void discard_inferior_status PARAMS ((struct inferior_status *));
+struct inferior_thread_state;
+struct inferior_status;
-extern void write_inferior_status_register PARAMS ((struct inferior_status *inf_status, int regno, LONGEST val));
+extern struct inferior_thread_state *save_inferior_thread_state (void);
+extern struct inferior_status *save_inferior_status (void);
-/* This macro gives the number of registers actually in use by the
- inferior. This may be less than the total number of registers,
- perhaps depending on the actual CPU in use or program being run. */
+extern void restore_inferior_thread_state (struct inferior_thread_state *);
+extern void restore_inferior_status (struct inferior_status *);
-#ifndef ARCH_NUM_REGS
-#define ARCH_NUM_REGS NUM_REGS
-#endif
+extern struct cleanup *make_cleanup_restore_inferior_thread_state (struct inferior_thread_state *);
+extern struct cleanup *make_cleanup_restore_inferior_status (struct inferior_status *);
-extern void set_sigint_trap PARAMS ((void));
+extern void discard_inferior_thread_state (struct inferior_thread_state *);
+extern void discard_inferior_status (struct inferior_status *);
-extern void clear_sigint_trap PARAMS ((void));
+extern struct regcache *get_inferior_thread_state_regcache (struct inferior_thread_state *);
-extern void set_sigio_trap PARAMS ((void));
+/* The -1 ptid, often used to indicate either an error condition
+ or a "don't care" condition, i.e, "run all threads." */
+extern ptid_t minus_one_ptid;
-extern void clear_sigio_trap PARAMS ((void));
+/* The null or zero ptid, often used to indicate no process. */
+extern ptid_t null_ptid;
-/* File name for default use for standard in/out in the inferior. */
+/* Attempt to find and return an existing ptid with the given PID, LWP,
+ and TID components. If none exists, create a new one and return
+ that. */
+ptid_t ptid_build (int pid, long lwp, long tid);
-extern char *inferior_io_terminal;
+/* Find/Create a ptid from just a pid. */
+ptid_t pid_to_ptid (int pid);
-/* Pid of our debugged inferior, or 0 if no inferior now. */
+/* Fetch the pid (process id) component from a ptid. */
+int ptid_get_pid (ptid_t ptid);
-extern int inferior_pid;
+/* Fetch the lwp (lightweight process) component from a ptid. */
+long ptid_get_lwp (ptid_t ptid);
-/* This is only valid when inferior_pid is non-zero.
+/* Fetch the tid (thread id) component from a ptid. */
+long ptid_get_tid (ptid_t ptid);
- If this is 0, then exec events should be noticed and responded to
- by the debugger (i.e., be reported to the user).
+/* Compare two ptids to see if they are equal */
+extern int ptid_equal (ptid_t p1, ptid_t p2);
- If this is > 0, then that many subsequent exec events should be
- ignored (i.e., not be reported to the user).
- */
-extern int inferior_ignoring_startup_exec_events;
+/* Return true if PTID represents a process id. */
+extern int ptid_is_pid (ptid_t ptid);
-/* This is only valid when inferior_ignoring_startup_exec_events is
- zero.
+/* Save value of inferior_ptid so that it may be restored by
+ a later call to do_cleanups(). Returns the struct cleanup
+ pointer needed for later doing the cleanup. */
+extern struct cleanup * save_inferior_ptid (void);
- Some targets (stupidly) report more than one exec event per actual
- call to an event() system call. If only the last such exec event
- need actually be noticed and responded to by the debugger (i.e.,
- be reported to the user), then this is the number of "leading"
- exec events which should be ignored.
- */
-extern int inferior_ignoring_leading_exec_events;
+extern void set_sigint_trap (void);
-/* Inferior environment. */
+extern void clear_sigint_trap (void);
-extern struct environ *inferior_environ;
+/* Set/get file name for default use for standard in/out in the inferior. */
-/* Character array containing an image of the inferior programs'
- registers. */
+extern void set_inferior_io_terminal (const char *terminal_name);
+extern const char *get_inferior_io_terminal (void);
-extern char *registers;
+/* Collected pid, tid, etc. of the debugged inferior. When there's
+ no inferior, PIDGET (inferior_ptid) will be 0. */
-/* Character array containing the current state of each register
- (unavailable<0, valid=0, invalid>0). */
+extern ptid_t inferior_ptid;
-extern signed char *register_valid;
+/* Are we simulating synchronous execution? This is used in async gdb
+ to implement the 'run', 'continue' etc commands, which will not
+ redisplay the prompt until the execution is actually over. */
+extern int sync_execution;
-extern void clear_proceed_status PARAMS ((void));
-
-extern void proceed PARAMS ((CORE_ADDR, enum target_signal, int));
-
-extern void kill_inferior PARAMS ((void));
+/* Inferior environment. */
-extern void generic_mourn_inferior PARAMS ((void));
+extern struct gdb_environ *inferior_environ;
-extern void terminal_ours PARAMS ((void));
+extern void clear_proceed_status (void);
-extern int run_stack_dummy PARAMS ((CORE_ADDR, char*));
+extern void proceed (CORE_ADDR, enum target_signal, int);
-extern CORE_ADDR read_pc PARAMS ((void));
+extern int sched_multi;
-extern CORE_ADDR read_pc_pid PARAMS ((int));
+/* When set, stop the 'step' command if we enter a function which has
+ no line number information. The normal behavior is that we step
+ over such function. */
+extern int step_stop_if_no_debug;
-extern void write_pc PARAMS ((CORE_ADDR));
+/* If set, the inferior should be controlled in non-stop mode. In
+ this mode, each thread is controlled independently. Execution
+ commands apply only to the the selected thread by default, and stop
+ events stop only the thread that had the event -- the other threads
+ are kept running freely. */
+extern int non_stop;
-extern void write_pc_pid PARAMS ((CORE_ADDR, int));
+extern void generic_mourn_inferior (void);
-extern CORE_ADDR read_sp PARAMS ((void));
+extern void terminal_save_ours (void);
-extern void write_sp PARAMS ((CORE_ADDR));
+extern void terminal_ours (void);
-extern CORE_ADDR read_fp PARAMS ((void));
+extern CORE_ADDR unsigned_pointer_to_address (struct gdbarch *gdbarch,
+ struct type *type,
+ const gdb_byte *buf);
+extern void unsigned_address_to_pointer (struct gdbarch *gdbarch,
+ struct type *type, gdb_byte *buf,
+ CORE_ADDR addr);
+extern CORE_ADDR signed_pointer_to_address (struct gdbarch *gdbarch,
+ struct type *type,
+ const gdb_byte *buf);
+extern void address_to_signed_pointer (struct gdbarch *gdbarch,
+ struct type *type, gdb_byte *buf,
+ CORE_ADDR addr);
-extern void write_fp PARAMS ((CORE_ADDR));
+extern void wait_for_inferior (int treat_exec_as_sigtrap);
-extern void wait_for_inferior PARAMS ((void));
+extern void fetch_inferior_event (void *);
-extern void init_wait_for_inferior PARAMS ((void));
+extern void init_wait_for_inferior (void);
-extern void close_exec_file PARAMS ((void));
+extern void close_exec_file (void);
-extern void reopen_exec_file PARAMS ((void));
+extern void reopen_exec_file (void);
/* The `resume' routine should only be called in special circumstances.
Normally, use `proceed', which handles a lot of bookkeeping. */
-extern void resume PARAMS ((int, enum target_signal));
+extern void resume (int, enum target_signal);
/* From misc files */
-extern void store_inferior_registers PARAMS ((int));
+extern void default_print_registers_info (struct gdbarch *gdbarch,
+ struct ui_file *file,
+ struct frame_info *frame,
+ int regnum, int all);
-extern void fetch_inferior_registers PARAMS ((int));
+extern void child_terminal_info (char *, int);
-extern void solib_create_inferior_hook PARAMS ((void));
+extern void term_info (char *, int);
-extern void child_terminal_info PARAMS ((char *, int));
+extern void terminal_ours_for_output (void);
-extern void term_info PARAMS ((char *, int));
+extern void terminal_inferior (void);
-extern void terminal_ours_for_output PARAMS ((void));
+extern void terminal_init_inferior (void);
-extern void terminal_inferior PARAMS ((void));
+extern void terminal_init_inferior_with_pgrp (int pgrp);
-extern void terminal_init_inferior PARAMS ((void));
+/* From fork-child.c */
-extern void terminal_init_inferior_with_pgrp PARAMS ((int pgrp));
+extern int fork_inferior (char *, char *, char **,
+ void (*)(void),
+ void (*)(int), void (*)(void), char *);
-/* From infptrace.c or infttrace.c */
-extern int attach PARAMS ((int));
+extern void startup_inferior (int);
-#if !defined(REQUIRE_ATTACH)
-#define REQUIRE_ATTACH attach
-#endif
+extern char *construct_inferior_arguments (int, char **);
-#if !defined(REQUIRE_DETACH)
-#define REQUIRE_DETACH(pid,siggnal) detach (siggnal)
-#endif
+/* From infrun.c */
-extern void detach PARAMS ((int));
+extern void start_remote (int from_tty);
-/* PTRACE method of waiting for inferior process. */
-int ptrace_wait PARAMS ((int, int *));
+extern void normal_stop (void);
-extern void child_resume PARAMS ((int, int, enum target_signal));
+extern int signal_stop_state (int);
-#ifndef PTRACE_ARG3_TYPE
-#define PTRACE_ARG3_TYPE int /* Correct definition for most systems. */
-#endif
+extern int signal_print_state (int);
-extern int call_ptrace PARAMS ((int, int, PTRACE_ARG3_TYPE, int));
+extern int signal_pass_state (int);
-extern void pre_fork_inferior PARAMS ((void));
+extern int signal_stop_update (int, int);
-/* From procfs.c */
+extern int signal_print_update (int, int);
-extern int proc_iterate_over_mappings PARAMS ((int (*)(int, CORE_ADDR)));
+extern int signal_pass_update (int, int);
-extern int procfs_first_available PARAMS ((void));
+extern void get_last_target_status(ptid_t *ptid,
+ struct target_waitstatus *status);
-extern int procfs_get_pid_fd PARAMS ((int));
+extern void follow_inferior_reset_breakpoints (void);
-/* From fork-child.c */
+/* Throw an error indicating the current thread is running. */
+extern void error_is_running (void);
-extern void fork_inferior PARAMS ((char *, char *, char **,
- void (*)(void),
- void (*)(int),
- void (*)(void),
- char *));
+/* Calls error_is_running if the current thread is running. */
+extern void ensure_not_running (void);
+void set_step_info (struct frame_info *frame, struct symtab_and_line sal);
-extern void
-clone_and_follow_inferior PARAMS ((int, int *));
+/* From infcmd.c */
-extern void startup_inferior PARAMS ((int));
+extern void tty_command (char *, int);
-/* From inflow.c */
+extern void post_create_inferior (struct target_ops *, int);
-extern void new_tty_prefork PARAMS ((char *));
+extern void attach_command (char *, int);
-extern int gdb_has_a_terminal PARAMS ((void));
+extern char *get_inferior_args (void);
-/* From infrun.c */
+extern char *set_inferior_args (char *);
-extern void start_remote PARAMS ((void));
+extern void set_inferior_args_vector (int, char **);
-extern void normal_stop PARAMS ((void));
+extern void registers_info (char *, int);
-extern int signal_stop_state PARAMS ((int));
+extern void nexti_command (char *, int);
-extern int signal_print_state PARAMS ((int));
+extern void stepi_command (char *, int);
-extern int signal_pass_state PARAMS ((int));
+extern void continue_1 (int all_threads);
-/* From infcmd.c */
+extern void continue_command (char *, int);
-extern void tty_command PARAMS ((char *, int));
+extern void interrupt_target_command (char *args, int from_tty);
-extern void attach_command PARAMS ((char *, int));
+extern void interrupt_target_1 (int all_threads);
-/* Last signal that the inferior received (why it stopped). */
+extern void detach_command (char *, int);
-extern enum target_signal stop_signal;
+extern void notice_new_inferior (ptid_t, int, int);
/* Address at which inferior stopped. */
extern CORE_ADDR stop_pc;
-/* Chain containing status of breakpoint(s) that we have stopped at. */
-
-extern bpstat stop_bpstat;
-
-/* Flag indicating that a command has proceeded the inferior past the
- current breakpoint. */
-
-extern int breakpoint_proceeded;
-
-/* Nonzero if stopped due to a step command. */
-
-extern int stop_step;
-
/* Nonzero if stopped due to completion of a stack dummy routine. */
extern int stop_stack_dummy;
extern int stopped_by_random_signal;
-/* Range to single step within.
- If this is nonzero, respond to a single-step signal
- by continuing to step if the pc is in this range.
+/* STEP_OVER_ALL means step over all subroutine calls.
+ STEP_OVER_UNDEBUGGABLE means step over calls to undebuggable functions.
+ STEP_OVER_NONE means don't step over any subroutine calls. */
+
+enum step_over_calls_kind
+ {
+ STEP_OVER_NONE,
+ STEP_OVER_ALL,
+ STEP_OVER_UNDEBUGGABLE
+ };
+
+/* Anything but NO_STOP_QUIETLY means we expect a trap and the caller
+ will handle it themselves. STOP_QUIETLY is used when running in
+ the shell before the child program has been exec'd and when running
+ through shared library loading. STOP_QUIETLY_REMOTE is used when
+ setting up a remote connection; it is like STOP_QUIETLY_NO_SIGSTOP
+ except that there is no need to hide a signal. */
+
+/* It is also used after attach, due to attaching to a process. This
+ is a bit trickier. When doing an attach, the kernel stops the
+ debuggee with a SIGSTOP. On newer GNU/Linux kernels (>= 2.5.61)
+ the handling of SIGSTOP for a ptraced process has changed. Earlier
+ versions of the kernel would ignore these SIGSTOPs, while now
+ SIGSTOP is treated like any other signal, i.e. it is not muffled.
+
+ If the gdb user does a 'continue' after the 'attach', gdb passes
+ the global variable stop_signal (which stores the signal from the
+ attach, SIGSTOP) to the ptrace(PTRACE_CONT,...) call. This is
+ problematic, because the kernel doesn't ignore such SIGSTOP
+ now. I.e. it is reported back to gdb, which in turn presents it
+ back to the user.
+
+ To avoid the problem, we use STOP_QUIETLY_NO_SIGSTOP, which allows
+ gdb to clear the value of stop_signal after the attach, so that it
+ is not passed back down to the kernel. */
+
+enum stop_kind
+ {
+ NO_STOP_QUIETLY = 0,
+ STOP_QUIETLY,
+ STOP_QUIETLY_REMOTE,
+ STOP_QUIETLY_NO_SIGSTOP
+ };
+
+/* Reverse execution. */
+enum exec_direction_kind
+ {
+ EXEC_FORWARD,
+ EXEC_REVERSE,
+ EXEC_ERROR
+ };
+
+extern enum exec_direction_kind execution_direction;
+
+/* Save register contents here when executing a "finish" command or are
+ about to pop a stack dummy frame, if-and-only-if proceed_to_finish is set.
+ Thus this contains the return value from the called function (assuming
+ values are returned in a register). */
- If step_range_start and step_range_end are both 1, it means to step for
- a single instruction (FIXME: it might clean up wait_for_inferior in a
- minor way if this were changed to the address of the instruction and
- that address plus one. But maybe not.). */
+extern struct regcache *stop_registers;
-extern CORE_ADDR step_range_start; /* Inclusive */
-extern CORE_ADDR step_range_end;/* Exclusive */
+/* True if we are debugging displaced stepping. */
+extern int debug_displaced;
-/* Stack frame address as of when stepping command was issued.
- This is how we know when we step into a subroutine call,
- and how to set the frame for the breakpoint used to step out. */
+/* Dump LEN bytes at BUF in hex to FILE, followed by a newline. */
+void displaced_step_dump_bytes (struct ui_file *file,
+ const gdb_byte *buf, size_t len);
-extern CORE_ADDR step_frame_address;
+\f
+/* Possible values for gdbarch_call_dummy_location. */
+#define ON_STACK 1
+#define AT_ENTRY_POINT 4
+#define AT_SYMBOL 5
-/* Our notion of the current stack pointer. */
+/* If STARTUP_WITH_SHELL is set, GDB's "run"
+ will attempts to start up the debugee under a shell.
+ This is in order for argument-expansion to occur. E.g.,
+ (gdb) run *
+ The "*" gets expanded by the shell into a list of files.
+ While this is a nice feature, it turns out to interact badly
+ with some of the catch-fork/catch-exec features we have added.
+ In particular, if the shell does any fork/exec's before
+ the exec of the target program, that can confuse GDB.
+ To disable this feature, set STARTUP_WITH_SHELL to 0.
+ To enable this feature, set STARTUP_WITH_SHELL to 1.
+ The catch-exec traps expected during start-up will
+ be 1 if target is not started up with a shell, 2 if it is.
+ - RT
+ If you disable this, you need to decrement
+ START_INFERIOR_TRAPS_EXPECTED in tm.h. */
+#define STARTUP_WITH_SHELL 1
+#if !defined(START_INFERIOR_TRAPS_EXPECTED)
+#define START_INFERIOR_TRAPS_EXPECTED 2
+#endif
-extern CORE_ADDR step_sp;
+struct private_inferior;
-/* 1 means step over all subroutine calls.
- -1 means step over calls to undebuggable functions. */
+/* GDB represents the state of each program execution with an object
+ called an inferior. An inferior typically corresponds to a process
+ but is more general and applies also to targets that do not have a
+ notion of processes. Each run of an executable creates a new
+ inferior, as does each attachment to an existing process.
+ Inferiors have unique internal identifiers that are different from
+ target process ids. Each inferior may in turn have multiple
+ threads running in it. */
-extern int step_over_calls;
+struct inferior
+{
+ /* Pointer to next inferior in singly-linked list of inferiors. */
+ struct inferior *next;
-/* If stepping, nonzero means step count is > 1
- so don't print frame next time inferior stops
- if it stops due to stepping. */
+ /* Convenient handle (GDB inferior id). Unique across all
+ inferiors. */
+ int num;
-extern int step_multi;
+ /* Actual target inferior id, usually, a process id. This matches
+ the ptid_t.pid member of threads of this inferior. */
+ int pid;
-/* Nonzero means expecting a trap and caller will handle it themselves.
- It is used after attach, due to attaching to a process;
- when running in the shell before the child program has been exec'd;
- and when running some kinds of remote stuff (FIXME?). */
+ /* See the definition of stop_kind above. */
+ enum stop_kind stop_soon;
-extern int stop_soon_quietly;
+ /* Nonzero if this child process was attached rather than
+ forked. */
+ int attach_flag;
-/* Nonzero if proceed is being used for a "finish" command or a similar
- situation when stop_registers should be saved. */
+ /* What is left to do for an execution command after any thread of
+ this inferior stops. For continuations associated with a
+ specific thread, see `struct thread_info'. */
+ struct continuation *continuations;
-extern int proceed_to_finish;
+ /* Terminal info and state managed by inflow.c. */
+ struct terminal_info *terminal_info;
-/* Save register contents here when about to pop a stack dummy frame,
- if-and-only-if proceed_to_finish is set.
- Thus this contains the return value from the called function (assuming
- values are returned in a register). */
+ /* Private data used by the target vector implementation. */
+ struct private_inferior *private;
+};
-extern char *stop_registers;
+/* Create an empty inferior list, or empty the existing one. */
+extern void init_inferior_list (void);
-/* Nonzero if the child process in inferior_pid was attached rather
- than forked. */
+/* Add an inferior to the inferior list, print a message that a new
+ inferior is found, and return the pointer to the new inferior.
+ Caller may use this pointer to initialize the private inferior
+ data. */
+extern struct inferior *add_inferior (int pid);
-extern int attach_flag;
-\f
-/* Sigtramp is a routine that the kernel calls (which then calls the
- signal handler). On most machines it is a library routine that
- is linked into the executable.
-
- This macro, given a program counter value and the name of the
- function in which that PC resides (which can be null if the
- name is not known), returns nonzero if the PC and name show
- that we are in sigtramp.
-
- On most machines just see if the name is sigtramp (and if we have
- no name, assume we are not in sigtramp). */
-#if !defined (IN_SIGTRAMP)
-#if defined (SIGTRAMP_START)
-#define IN_SIGTRAMP(pc, name) \
- ((pc) >= SIGTRAMP_START(pc) \
- && (pc) < SIGTRAMP_END(pc) \
- )
-#else
-#define IN_SIGTRAMP(pc, name) \
- (name && STREQ ("_sigtramp", name))
-#endif
-#endif
-\f
-/* Possible values for CALL_DUMMY_LOCATION. */
-#define ON_STACK 1
-#define BEFORE_TEXT_END 2
-#define AFTER_TEXT_END 3
-#define AT_ENTRY_POINT 4
+/* Same as add_inferior, but don't print new inferior notifications to
+ the CLI. */
+extern struct inferior *add_inferior_silent (int pid);
-#if !defined (USE_GENERIC_DUMMY_FRAMES)
-#define USE_GENERIC_DUMMY_FRAMES 0
-#endif
+/* Delete an existing inferior list entry, due to inferior exit. */
+extern void delete_inferior (int pid);
-#if !defined (CALL_DUMMY_LOCATION)
-#define CALL_DUMMY_LOCATION ON_STACK
-#endif /* No CALL_DUMMY_LOCATION. */
+/* Same as delete_inferior, but don't print new inferior notifications
+ to the CLI. */
+extern void delete_inferior_silent (int pid);
-#if !defined (CALL_DUMMY_ADDRESS)
-#define CALL_DUMMY_ADDRESS() (abort (), 0) /* anything to abort GDB */
-#endif
-#if !defined (CALL_DUMMY_START_OFFSET)
-#define CALL_DUMMY_START_OFFSET (abort (), 0) /* anything to abort GDB */
-#endif
-#if !defined (CALL_DUMMY_BREAKPOINT_OFFSET)
-#define CALL_DUMMY_BREAKPOINT_OFFSET_P (0)
-#define CALL_DUMMY_BREAKPOINT_OFFSET (abort (), 0) /* anything to abort GDB */
-#endif
-#if !defined CALL_DUMMY_BREAKPOINT_OFFSET_P
-#define CALL_DUMMY_BREAKPOINT_OFFSET_P (1)
-#endif
-#if !defined (CALL_DUMMY_LENGTH)
-#define CALL_DUMMY_LENGTH (abort (), 0) /* anything to abort GDB */
-#endif
+/* Delete an existing inferior list entry, due to inferior detaching. */
+extern void detach_inferior (int pid);
-#if defined (CALL_DUMMY_STACK_ADJUST)
-#if !defined (CALL_DUMMY_STACK_ADJUST_P)
-#define CALL_DUMMY_STACK_ADJUST_P (1)
-#endif
-#endif
-#if !defined (CALL_DUMMY_STACK_ADJUST)
-#define CALL_DUMMY_STACK_ADJUST (abort (), 0)
-#endif
-#if !defined (CALL_DUMMY_STACK_ADJUST_P)
-#define CALL_DUMMY_STACK_ADJUST_P (0)
-#endif
+/* Get rid of all inferiors. */
+extern void discard_all_inferiors (void);
-#if !defined (CALL_DUMMY_P)
-#if defined (CALL_DUMMY)
-#define CALL_DUMMY_P 1
-#else
-#define CALL_DUMMY_P 0
-#endif
-#endif
+/* Translate the integer inferior id (GDB's homegrown id, not the system's)
+ into a "pid" (which may be overloaded with extra inferior information). */
+extern int gdb_inferior_id_to_pid (int);
-#if !defined (CALL_DUMMY_WORDS)
-#if defined (CALL_DUMMY)
-extern LONGEST call_dummy_words[];
-#define CALL_DUMMY_WORDS (call_dummy_words)
-#else
-#define CALL_DUMMY_WORDS (abort (), (void*) 0) /* anything to abort GDB */
-#endif
-#endif
+/* Translate a target 'pid' into the integer inferior id (GDB's
+ homegrown id, not the system's). */
+extern int pid_to_gdb_inferior_id (int pid);
-#if !defined (SIZEOF_CALL_DUMMY_WORDS)
-#if defined (CALL_DUMMY)
-extern int sizeof_call_dummy_words;
-#define SIZEOF_CALL_DUMMY_WORDS (sizeof_call_dummy_words)
-#else
-#define SIZEOF_CALL_DUMMY_WORDS (abort (), 0) /* anything to abort GDB */
-#endif
-#endif
+/* Boolean test for an already-known pid. */
+extern int in_inferior_list (int pid);
-#if !defined PUSH_DUMMY_FRAME
-#define PUSH_DUMMY_FRAME (abort ())
-#endif
+/* Boolean test for an already-known inferior id (GDB's homegrown id,
+ not the system's). */
+extern int valid_gdb_inferior_id (int num);
-#if !defined FIX_CALL_DUMMY
-#define FIX_CALL_DUMMY(a1,a2,a3,a4,a5,a6,a7) (abort ())
-#endif
+/* Search function to lookup a inferior by target 'pid'. */
+extern struct inferior *find_inferior_pid (int pid);
-#if !defined STORE_STRUCT_RETURN
-#define STORE_STRUCT_RETURN(a1,a2) (abort ())
-#endif
+/* Inferior iterator function.
+ Calls a callback function once for each inferior, so long as the
+ callback function returns false. If the callback function returns
+ true, the iteration will end and the current inferior will be
+ returned. This can be useful for implementing a search for a
+ inferior with arbitrary attributes, or for applying some operation
+ to every inferior.
-/* Are we in a call dummy? */
+ It is safe to delete the iterated inferior from the callback. */
+extern struct inferior *iterate_over_inferiors (int (*) (struct inferior *,
+ void *),
+ void *);
-extern int pc_in_call_dummy_before_text_end PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address));
-#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == BEFORE_TEXT_END
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_before_text_end (pc, sp, frame_address)
-#endif /* Before text_end. */
+/* Prints the list of inferiors and their details on UIOUT.
-extern int pc_in_call_dummy_after_text_end PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address));
-#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == AFTER_TEXT_END
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_after_text_end (pc, sp, frame_address)
-#endif
+ If REQUESTED_INFERIOR is not -1, it's the GDB id of the inferior
+ that should be printed. Otherwise, all inferiors are printed. */
+extern void print_inferior (struct ui_out *uiout, int requested_inferior);
-extern int pc_in_call_dummy_on_stack PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address));
-#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == ON_STACK
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_on_stack (pc, sp, frame_address)
-#endif
+/* Returns true if the inferior list is not empty. */
+extern int have_inferiors (void);
-extern int pc_in_call_dummy_at_entry_point PARAMS ((CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address));
-#if !defined (PC_IN_CALL_DUMMY) && CALL_DUMMY_LOCATION == AT_ENTRY_POINT
-#define PC_IN_CALL_DUMMY(pc, sp, frame_address) pc_in_call_dummy_at_entry_point (pc, sp, frame_address)
-#endif
+/* Returns true if there are any live inferiors in the inferior list
+ (not cores, not executables, real live processes). */
+extern int have_live_inferiors (void);
-/* It's often not enough for our clients to know whether the PC is merely
- somewhere within the call dummy. They may need to know whether the
- call dummy has actually completed. (For example, wait_for_inferior
- wants to know when it should truly stop because the call dummy has
- completed. If we're single-stepping because of slow watchpoints,
- then we may find ourselves stopped at the entry of the call dummy,
- and want to continue stepping until we reach the end.)
-
- Note that this macro is intended for targets (like HP-UX) which
- require more than a single breakpoint in their call dummies, and
- therefore cannot use the CALL_DUMMY_BREAKPOINT_OFFSET mechanism.
-
- If a target does define CALL_DUMMY_BREAKPOINT_OFFSET, then this
- default implementation of CALL_DUMMY_HAS_COMPLETED is sufficient.
- Else, a target may wish to supply an implementation that works in
- the presense of multiple breakpoints in its call dummy.
- */
-#if !defined(CALL_DUMMY_HAS_COMPLETED)
-#define CALL_DUMMY_HAS_COMPLETED(pc, sp, frame_address) \
- PC_IN_CALL_DUMMY((pc), (sp), (frame_address))
-#endif
+/* Return a pointer to the current inferior. It is an error to call
+ this if there is no current inferior. */
+extern struct inferior *current_inferior (void);
-/* If STARTUP_WITH_SHELL is set, GDB's "run"
- will attempts to start up the debugee under a shell.
- This is in order for argument-expansion to occur. E.g.,
- (gdb) run *
- The "*" gets expanded by the shell into a list of files.
- While this is a nice feature, it turns out to interact badly
- with some of the catch-fork/catch-exec features we have added.
- In particular, if the shell does any fork/exec's before
- the exec of the target program, that can confuse GDB.
- To disable this feature, set STARTUP_WITH_SHELL to 0.
- To enable this feature, set STARTUP_WITH_SHELL to 1.
- The catch-exec traps expected during start-up will
- be 1 if target is not started up with a shell, 2 if it is.
- - RT
- If you disable this, you need to decrement
- START_INFERIOR_TRAPS_EXPECTED in tm.h. */
-#define STARTUP_WITH_SHELL 1
-#if !defined(START_INFERIOR_TRAPS_EXPECTED)
-#define START_INFERIOR_TRAPS_EXPECTED 2
-#endif
#endif /* !defined (INFERIOR_H) */