xcoff slurp_armap bounds checking
[deliverable/binutils-gdb.git] / gdb / inferior.h
index b3a5f55a5e5dcf5ce00ace0ebce318dc716bb3d3..3bd9e8c3d747bec12c6c17a430970655022c0f6c 100644 (file)
@@ -1,15 +1,13 @@
 /* Variables that describe the inferior process running under GDB:
    Where it is, why it stopped, and how to step it.
 
-   Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006
-   Free Software Foundation, Inc.
+   Copyright (C) 1986-2019 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +16,7 @@
    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, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #if !defined (INFERIOR_H)
 #define INFERIOR_H 1
@@ -31,427 +27,624 @@ struct ui_file;
 struct type;
 struct gdbarch;
 struct regcache;
+struct ui_out;
+struct terminal_info;
+struct target_desc_info;
+struct continuation;
+struct inferior;
+struct thread_info;
 
 /* For bpstat.  */
 #include "breakpoint.h"
 
-/* For enum target_signal.  */
+/* For enum gdb_signal.  */
 #include "target.h"
 
 /* For struct frame_id.  */
 #include "frame.h"
 
-/* Structure in which to save the status of the inferior.  Create/Save
-   through "save_inferior_status", restore through
-   "restore_inferior_status".
+/* For gdb_environ.  */
+#include "gdbsupport/environ.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.  */
+#include "progspace.h"
+#include "registry.h"
 
-struct inferior_status;
+#include "symfile-add-flags.h"
+#include "gdbsupport/refcounted-object.h"
+#include "gdbsupport/forward-scope-exit.h"
 
-extern struct inferior_status *save_inferior_status (int);
+#include "gdbsupport/common-inferior.h"
+#include "gdbthread.h"
 
-extern void restore_inferior_status (struct inferior_status *);
+struct infcall_suspend_state;
+struct infcall_control_state;
 
-extern struct cleanup *make_cleanup_restore_inferior_status (struct inferior_status *);
+extern void restore_infcall_suspend_state (struct infcall_suspend_state *);
+extern void restore_infcall_control_state (struct infcall_control_state *);
 
-extern void discard_inferior_status (struct inferior_status *);
-
-extern void write_inferior_status_register (struct inferior_status
-                                           *inf_status, int regno,
-                                           LONGEST val);
-
-/* 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;
-
-/* The null or zero ptid, often used to indicate no process. */
-extern ptid_t null_ptid;
-
-/* 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);
-
-/* Find/Create a ptid from just a pid. */
-ptid_t pid_to_ptid (int pid);
-
-/* Fetch the pid (process id) component from a ptid. */
-int ptid_get_pid (ptid_t ptid);
+/* A deleter for infcall_suspend_state that calls
+   restore_infcall_suspend_state.  */
+struct infcall_suspend_state_deleter
+{
+  void operator() (struct infcall_suspend_state *state) const
+  {
+    try
+      {
+       restore_infcall_suspend_state (state);
+      }
+    catch (const gdb_exception_error &e)
+      {
+       /* If we are restoring the inferior state due to an exception,
+          some error message will be printed.  So, only warn the user
+          when we cannot restore during normal execution.  */
+       if (!std::uncaught_exception ())
+         warning (_("Failed to restore inferior state: %s"), e.what ());
+      }
+  }
+};
+
+/* A unique_ptr specialization for infcall_suspend_state.  */
+typedef std::unique_ptr<infcall_suspend_state, infcall_suspend_state_deleter>
+    infcall_suspend_state_up;
+
+extern infcall_suspend_state_up save_infcall_suspend_state ();
+
+/* A deleter for infcall_control_state that calls
+   restore_infcall_control_state.  */
+struct infcall_control_state_deleter
+{
+  void operator() (struct infcall_control_state *state) const
+  {
+    restore_infcall_control_state (state);
+  }
+};
 
-/* Fetch the lwp (lightweight process) component from a ptid. */
-long ptid_get_lwp (ptid_t ptid);
+/* A unique_ptr specialization for infcall_control_state.  */
+typedef std::unique_ptr<infcall_control_state, infcall_control_state_deleter>
+    infcall_control_state_up;
 
-/* Fetch the tid (thread id) component from a ptid. */
-long ptid_get_tid (ptid_t ptid);
+extern infcall_control_state_up save_infcall_control_state ();
 
-/* Compare two ptids to see if they are equal */
-extern int ptid_equal (ptid_t p1, ptid_t p2);
+extern void discard_infcall_suspend_state (struct infcall_suspend_state *);
+extern void discard_infcall_control_state (struct infcall_control_state *);
 
-/* 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);
+extern readonly_detached_regcache *
+  get_infcall_suspend_state_regcache (struct infcall_suspend_state *);
 
 extern void set_sigint_trap (void);
 
 extern void clear_sigint_trap (void);
 
-extern void set_sigio_trap (void);
-
-extern void clear_sigio_trap (void);
-
 /* Set/get file name for default use for standard in/out in the inferior.  */
 
 extern void set_inferior_io_terminal (const char *terminal_name);
 extern const char *get_inferior_io_terminal (void);
 
 /* Collected pid, tid, etc. of the debugged inferior.  When there's
-   no inferior, PIDGET (inferior_ptid) will be 0. */
+   no inferior, inferior_ptid.pid () will be 0.  */
 
 extern ptid_t inferior_ptid;
 
-/* Is the inferior running right now, as a result of a 'run&',
-   'continue&' etc command? This is used in asycn gdb to determine
-   whether a command that the user enters while the target is running
-   is allowed or not. */
-extern int target_executing;
-
-/* 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;
-
-/* This is only valid when inferior_ptid is non-zero.
-
-   If this is 0, then exec events should be noticed and responded to
-   by the debugger (i.e., be reported to the user).
-
-   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;
+extern void generic_mourn_inferior (void);
 
-/* This is only valid when inferior_ignoring_startup_exec_events is
-   zero.
+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);
 
-   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 reopen_exec_file (void);
 
-/* Inferior environment. */
+/* From misc files */
 
-extern struct gdb_environ *inferior_environ;
+extern void default_print_registers_info (struct gdbarch *gdbarch,
+                                         struct ui_file *file,
+                                         struct frame_info *frame,
+                                         int regnum, int all);
 
-extern void clear_proceed_status (void);
+/* Default implementation of gdbarch_print_float_info.  Print
+   the values of all floating point registers.  */
 
-extern void proceed (CORE_ADDR, enum target_signal, int);
+extern void default_print_float_info (struct gdbarch *gdbarch,
+                                     struct ui_file *file,
+                                     struct frame_info *frame,
+                                     const char *args);
 
-/* 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 child_terminal_info (struct target_ops *self, const char *, int);
 
-extern void kill_inferior (void);
+extern void child_terminal_ours (struct target_ops *self);
 
-extern void generic_mourn_inferior (void);
+extern void child_terminal_ours_for_output (struct target_ops *self);
 
-extern void terminal_save_ours (void);
+extern void child_terminal_inferior (struct target_ops *self);
 
-extern void terminal_ours (void);
+extern void child_terminal_save_inferior (struct target_ops *self);
 
-extern CORE_ADDR read_pc (void);
+extern void child_terminal_init (struct target_ops *self);
 
-extern CORE_ADDR read_pc_pid (ptid_t);
+extern void child_terminal_init_with_pgrp (int pgrp);
 
-extern void write_pc (CORE_ADDR);
+extern void child_pass_ctrlc (struct target_ops *self);
 
-extern void write_pc_pid (CORE_ADDR, ptid_t);
+extern void child_interrupt (struct target_ops *self);
 
-extern void generic_target_write_pc (CORE_ADDR, ptid_t);
+/* From fork-child.c */
 
-extern CORE_ADDR read_sp (void);
+/* Helper function to call STARTUP_INFERIOR with PID and NUM_TRAPS.
+   This function already calls set_executing.  Return the ptid_t from
+   STARTUP_INFERIOR.  */
+extern ptid_t gdb_startup_inferior (pid_t pid, int num_traps);
 
-extern CORE_ADDR unsigned_pointer_to_address (struct type *type,
-                                             const gdb_byte *buf);
-extern void unsigned_address_to_pointer (struct type *type, gdb_byte *buf,
-                                        CORE_ADDR addr);
-extern CORE_ADDR signed_pointer_to_address (struct type *type,
-                                           const gdb_byte *buf);
-extern void address_to_signed_pointer (struct type *type, gdb_byte *buf,
-                                      CORE_ADDR addr);
+extern char *construct_inferior_arguments (int, char **);
 
-extern void wait_for_inferior (void);
+/* From infcmd.c */
 
-extern void fetch_inferior_event (void *);
+/* Initial inferior setup.  Determines the exec file is not yet known,
+   takes any necessary post-attaching actions, fetches the target
+   description and syncs the shared library list.  */
 
-extern void init_wait_for_inferior (void);
+extern void setup_inferior (int from_tty);
 
-extern void close_exec_file (void);
+extern void post_create_inferior (struct target_ops *, int);
 
-extern void reopen_exec_file (void);
+extern void attach_command (const char *, int);
 
-/* The `resume' routine should only be called in special circumstances.
-   Normally, use `proceed', which handles a lot of bookkeeping.  */
+extern const char *get_inferior_args (void);
 
-extern void resume (int, enum target_signal);
+extern void set_inferior_args (const char *);
 
-/* From misc files */
+extern void set_inferior_args_vector (int, char **);
 
-extern void default_print_registers_info (struct gdbarch *gdbarch,
-                                         struct ui_file *file,
-                                         struct frame_info *frame,
-                                         int regnum, int all);
+extern void registers_info (const char *, int);
 
-extern void store_inferior_registers (int);
+extern void continue_1 (int all_threads);
 
-extern void fetch_inferior_registers (int);
+extern void interrupt_target_1 (int all_threads);
 
-extern void child_terminal_info (char *, int);
+using delete_longjmp_breakpoint_cleanup
+  = FORWARD_SCOPE_EXIT (delete_longjmp_breakpoint);
 
-extern void term_info (char *, int);
+extern void detach_command (const char *, int);
 
-extern void terminal_ours_for_output (void);
+extern void notice_new_inferior (struct thread_info *, int, int);
 
-extern void terminal_inferior (void);
+extern struct value *get_return_value (struct value *function,
+                                      struct type *value_type);
 
-extern void terminal_init_inferior (void);
+/* Prepare for execution command.  TARGET is the target that will run
+   the command.  BACKGROUND determines whether this is a foreground
+   (synchronous) or background (asynchronous) command.  */
 
-extern void terminal_init_inferior_with_pgrp (int pgrp);
+extern void prepare_execution_command (struct target_ops *target,
+                                      int background);
 
-/* From infptrace.c or infttrace.c */
+/* Nonzero if stopped due to completion of a stack dummy routine.  */
 
-extern int attach (int);
+extern enum stop_stack_kind stop_stack_dummy;
 
-extern void detach (int);
+/* Nonzero if program stopped due to a random (unexpected) signal in
+   inferior process.  */
 
-/* PTRACE method of waiting for inferior process.  */
-int ptrace_wait (ptid_t, int *);
+extern int stopped_by_random_signal;
 
-extern void child_resume (ptid_t, int, enum target_signal);
+/* Print notices on inferior events (attach, detach, etc.), set with
+   `set print inferior-events'.  */
+extern bool print_inferior_events;
 
-#ifndef PTRACE_ARG3_TYPE
-#define PTRACE_ARG3_TYPE PTRACE_TYPE_ARG3
-#endif
+/* 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.  */
 
-extern int call_ptrace (int, int, PTRACE_ARG3_TYPE, int);
+/* STOP_QUIETLY_NO_SIGSTOP is used to handle a tricky situation with attach.
+   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.
 
-extern void pre_fork_inferior (void);
+   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.
 
-/* From procfs.c */
+   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.  */
 
-extern int proc_iterate_over_mappings (int (*)(int, CORE_ADDR));
+enum stop_kind
+  {
+    NO_STOP_QUIETLY = 0,
+    STOP_QUIETLY,
+    STOP_QUIETLY_REMOTE,
+    STOP_QUIETLY_NO_SIGSTOP
+  };
 
-extern ptid_t procfs_first_available (void);
+\f
+/* Possible values for gdbarch_call_dummy_location.  */
+#define ON_STACK 1
+#define AT_ENTRY_POINT 4
 
-/* From fork-child.c */
+/* Base class for target-specific inferior data.  */
 
-extern void fork_inferior (char *, char *, char **,
-                          void (*)(void),
-                          void (*)(int), void (*)(void), char *);
+struct private_inferior
+{
+  virtual ~private_inferior () = 0;
+};
 
+/* Inferior process specific part of `struct infcall_control_state'.
 
-extern void startup_inferior (int);
+   Inferior thread counterpart is `struct thread_control_state'.  */
 
-extern char *construct_inferior_arguments (struct gdbarch *, int, char **);
+struct inferior_control_state
+{
+  inferior_control_state ()
+    : stop_soon (NO_STOP_QUIETLY)
+  {
+  }
 
-/* From inflow.c */
+  explicit inferior_control_state (enum stop_kind when)
+    : stop_soon (when)
+  {
+  }
+
+  /* See the definition of stop_kind above.  */
+  enum stop_kind stop_soon;
+};
+
+/* Return a pointer to the current inferior.  */
+extern inferior *current_inferior ();
+
+extern void set_current_inferior (inferior *);
+
+/* 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.
+
+   Inferiors are intrusively refcounted objects.  Unlike thread
+   objects, being the user-selected inferior is considered a strong
+   reference and is thus accounted for in the inferior object's
+   refcount (see set_current_inferior).  When GDB needs to remember
+   the selected inferior to later restore it, GDB temporarily bumps
+   the inferior object's refcount, to prevent something deleting the
+   inferior object before reverting back (e.g., due to a
+   "remove-inferiors" command (see
+   scoped_restore_current_inferior).  All other inferior
+   references are considered weak references.  Inferiors are always
+   listed exactly once in the inferior list, so placing an inferior in
+   the inferior list is an implicit, not counted strong reference.  */
+
+class inferior : public refcounted_object
+{
+public:
+  explicit inferior (int pid);
+  ~inferior ();
+
+  /* Returns true if we can delete this inferior.  */
+  bool deletable () const { return refcount () == 0; }
+
+  /* Pointer to next inferior in singly-linked list of inferiors.  */
+  struct inferior *next = NULL;
+
+  /* This inferior's thread list.  */
+  thread_info *thread_list = nullptr;
+
+  /* Returns a range adapter covering the inferior's threads,
+     including exited threads.  Used like this:
+
+       for (thread_info *thr : inf->threads ())
+        { .... }
+  */
+  inf_threads_range threads ()
+  { return inf_threads_range (this->thread_list); }
+
+  /* Returns a range adapter covering the inferior's non-exited
+     threads.  Used like this:
+
+       for (thread_info *thr : inf->non_exited_threads ())
+        { .... }
+  */
+  inf_non_exited_threads_range non_exited_threads ()
+  { return inf_non_exited_threads_range (this->thread_list); }
+
+  /* Like inferior::threads(), but returns a range adapter that can be
+     used with range-for, safely.  I.e., it is safe to delete the
+     currently-iterated thread, like this:
+
+     for (thread_info *t : inf->threads_safe ())
+       if (some_condition ())
+        delete f;
+  */
+  inline safe_inf_threads_range threads_safe ()
+  { return safe_inf_threads_range (this->thread_list); }
+
+  /* Convenient handle (GDB inferior id).  Unique across all
+     inferiors.  */
+  int num = 0;
+
+  /* Actual target inferior id, usually, a process id.  This matches
+     the ptid_t.pid member of threads of this inferior.  */
+  int pid = 0;
+  /* True if the PID was actually faked by GDB.  */
+  bool fake_pid_p = false;
+
+  /* The highest thread number this inferior ever had.  */
+  int highest_thread_num = 0;
+
+  /* State of GDB control of inferior process execution.
+     See `struct inferior_control_state'.  */
+  inferior_control_state control;
+
+  /* True if this was an auto-created inferior, e.g. created from
+     following a fork; false, if this inferior was manually added by
+     the user, and we should not attempt to prune it
+     automatically.  */
+  bool removable = false;
+
+  /* The address space bound to this inferior.  */
+  struct address_space *aspace = NULL;
+
+  /* The program space bound to this inferior.  */
+  struct program_space *pspace = NULL;
+
+  /* The arguments string to use when running.  */
+  char *args = NULL;
+
+  /* The size of elements in argv.  */
+  int argc = 0;
+
+  /* The vector version of arguments.  If ARGC is nonzero,
+     then we must compute ARGS from this (via the target).
+     This is always coming from main's argv and therefore
+     should never be freed.  */
+  char **argv = NULL;
+
+  /* The current working directory that will be used when starting
+     this inferior.  */
+  gdb::unique_xmalloc_ptr<char> cwd;
+
+  /* The name of terminal device to use for I/O.  */
+  char *terminal = NULL;
+
+  /* The terminal state as set by the last target_terminal::terminal_*
+     call.  */
+  target_terminal_state terminal_state = target_terminal_state::is_ours;
+
+  /* Environment to use for running inferior,
+     in format described in environ.h.  */
+  gdb_environ environment;
 
-extern void new_tty_prefork (const char *);
+  /* True if this child process was attached rather than forked.  */
+  bool attach_flag = false;
 
-extern int gdb_has_a_terminal (void);
+  /* If this inferior is a vfork child, then this is the pointer to
+     its vfork parent, if GDB is still attached to it.  */
+  inferior *vfork_parent = NULL;
 
-/* From infrun.c */
+  /* If this process is a vfork parent, this is the pointer to the
+     child.  Since a vfork parent is left frozen by the kernel until
+     the child execs or exits, a process can only have one vfork child
+     at a given time.  */
+  inferior *vfork_child = NULL;
 
-extern void start_remote (void);
+  /* True if this inferior should be detached when it's vfork sibling
+     exits or execs.  */
+  bool pending_detach = false;
 
-extern void normal_stop (void);
+  /* True if this inferior is a vfork parent waiting for a vfork child
+     not under our control to be done with the shared memory region,
+     either by exiting or execing.  */
+  bool waiting_for_vfork_done = false;
 
-extern int signal_stop_state (int);
+  /* True if we're in the process of detaching from this inferior.  */
+  bool detaching = false;
 
-extern int signal_print_state (int);
+  /* 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'.  */
+  continuation *continuations = NULL;
 
-extern int signal_pass_state (int);
+  /* True if setup_inferior wasn't called for this inferior yet.
+     Until that is done, we must not access inferior memory or
+     registers, as we haven't determined the target
+     architecture/description.  */
+  bool needs_setup = false;
 
-extern int signal_stop_update (int, int);
+  /* Private data used by the target vector implementation.  */
+  std::unique_ptr<private_inferior> priv;
 
-extern int signal_print_update (int, int);
+  /* HAS_EXIT_CODE is true if the inferior exited with an exit code.
+     In this case, the EXIT_CODE field is also valid.  */
+  bool has_exit_code = false;
+  LONGEST exit_code = 0;
 
-extern int signal_pass_update (int, int);
+  /* Default flags to pass to the symbol reading functions.  These are
+     used whenever a new objfile is created.  */
+  symfile_add_flags symfile_flags = 0;
 
-extern void get_last_target_status(ptid_t *ptid,
-                                   struct target_waitstatus *status);
+  /* Info about an inferior's target description (if it's fetched; the
+     user supplied description's filename, if any; etc.).  */
+  target_desc_info *tdesc_info = NULL;
 
-extern void follow_inferior_reset_breakpoints (void);
+  /* The architecture associated with the inferior through the
+     connection to the target.
 
-/* From infcmd.c */
+     The architecture vector provides some information that is really
+     a property of the inferior, accessed through a particular target:
+     ptrace operations; the layout of certain RSP packets; the
+     solib_ops vector; etc.  To differentiate architecture accesses to
+     per-inferior/target properties from
+     per-thread/per-frame/per-objfile properties, accesses to
+     per-inferior/target properties should be made through
+     this gdbarch.  */
+  struct gdbarch *gdbarch = NULL;
 
-extern void tty_command (char *, int);
+  /* Data related to displaced stepping.  */
+  displaced_step_inferior_state displaced_step_state;
 
-extern void post_create_inferior (struct target_ops *, int);
+  /* Per inferior data-pointers required by other GDB modules.  */
+  REGISTRY_FIELDS;
+};
 
-extern void attach_command (char *, int);
+/* Keep a registry of per-inferior data-pointers required by other GDB
+   modules.  */
 
-extern char *get_inferior_args (void);
+DECLARE_REGISTRY (inferior);
 
-extern char *set_inferior_args (char *);
+/* 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 void set_inferior_args_vector (int, char **);
+/* Same as add_inferior, but don't print new inferior notifications to
+   the CLI.  */
+extern struct inferior *add_inferior_silent (int pid);
 
-extern void registers_info (char *, int);
+extern void delete_inferior (struct inferior *todel);
 
-extern void nexti_command (char *, int);
+/* Delete an existing inferior list entry, due to inferior detaching.  */
+extern void detach_inferior (inferior *inf);
 
-extern void stepi_command (char *, int);
+extern void exit_inferior (inferior *inf);
 
-extern void continue_command (char *, int);
+extern void exit_inferior_silent (inferior *inf);
 
-extern void interrupt_target_command (char *args, int from_tty);
+extern void exit_inferior_num_silent (int num);
 
-/* Last signal that the inferior received (why it stopped).  */
+extern void inferior_appeared (struct inferior *inf, int pid);
 
-extern enum target_signal stop_signal;
+/* Get rid of all inferiors.  */
+extern void discard_all_inferiors (void);
 
-/* Address at which inferior stopped.  */
+/* Search function to lookup an inferior by target 'pid'.  */
+extern struct inferior *find_inferior_pid (int pid);
 
-extern CORE_ADDR stop_pc;
+/* Search function to lookup an inferior whose pid is equal to 'ptid.pid'. */
+extern struct inferior *find_inferior_ptid (ptid_t ptid);
 
-/* Chain containing status of breakpoint(s) that we have stopped at.  */
+/* Search function to lookup an inferior by GDB 'num'.  */
+extern struct inferior *find_inferior_id (int num);
 
-extern bpstat stop_bpstat;
+/* Find an inferior bound to PSPACE, giving preference to the current
+   inferior.  */
+extern struct inferior *
+  find_inferior_for_program_space (struct program_space *pspace);
 
-/* Flag indicating that a command has proceeded the inferior past the
-   current breakpoint.  */
+/* Inferior iterator function.
 
-extern int breakpoint_proceeded;
+   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.
 
-/* Nonzero if stopped due to a step command.  */
+   It is safe to delete the iterated inferior from the callback.  */
+extern struct inferior *iterate_over_inferiors (int (*) (struct inferior *,
+                                                        void *),
+                                               void *);
 
-extern int stop_step;
+/* Returns true if the inferior list is not empty.  */
+extern int have_inferiors (void);
 
-/* Nonzero if stopped due to completion of a stack dummy routine.  */
+/* Returns the number of live inferiors (real live processes).  */
+extern int number_of_live_inferiors (void);
 
-extern int stop_stack_dummy;
+/* 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);
 
-/* Nonzero if program stopped due to a random (unexpected) signal in
-   inferior process.  */
+/* Save/restore the current inferior.  */
 
-extern int stopped_by_random_signal;
+class scoped_restore_current_inferior
+{
+public:
+  scoped_restore_current_inferior ()
+    : m_saved_inf (current_inferior ())
+  {}
 
-/* 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.
+  ~scoped_restore_current_inferior ()
+  { set_current_inferior (m_saved_inf); }
 
-   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.).  */
+  DISABLE_COPY_AND_ASSIGN (scoped_restore_current_inferior);
 
-extern CORE_ADDR step_range_start;     /* Inclusive */
-extern CORE_ADDR step_range_end;       /* Exclusive */
+private:
+  inferior *m_saved_inf;
+};
 
-/* 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.  */
 
-extern struct frame_id step_frame_id;
+/* Traverse all inferiors.  */
 
-/* 1 means step over all subroutine calls.
-   -1 means step over calls to undebuggable functions.  */
+extern struct inferior *inferior_list;
 
-enum step_over_calls_kind
-  {
-    STEP_OVER_NONE,
-    STEP_OVER_ALL,
-    STEP_OVER_UNDEBUGGABLE
-  };
+/* Pull in the internals of the inferiors ranges and iterators.  Must
+   be done after struct inferior is defined.  */
+#include "inferior-iter.h"
 
-extern enum step_over_calls_kind step_over_calls;
+/* Return a range that can be used to walk over all inferiors
+   inferiors, with range-for, safely.  I.e., it is safe to delete the
+   currently-iterated inferior.  When combined with range-for, this
+   allow convenient patterns like this:
 
-/* If stepping, nonzero means step count is > 1
-   so don't print frame next time inferior stops
-   if it stops due to stepping.  */
+     for (inferior *inf : all_inferiors_safe ())
+       if (some_condition ())
+        delete inf;
+*/
 
-extern int step_multi;
+inline all_inferiors_safe_range
+all_inferiors_safe ()
+{
+  return {};
+}
 
-/* Nonzero means expecting a trap and caller will handle it
-   themselves.  It is used when running in the shell before the child
-   program has been exec'd; and when running some kinds of remote
-   stuff (FIXME?).  */
+/* Returns a range representing all inferiors, suitable to use with
+   range-for, like this:
 
-/* 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.  */
+   for (inferior *inf : all_inferiors ())
+     [...]
+*/
 
-enum stop_kind
-  {
-    NO_STOP_QUIETLY = 0,
-    STOP_QUIETLY,
-    STOP_QUIETLY_NO_SIGSTOP
-  };
+inline all_inferiors_range
+all_inferiors ()
+{
+  return {};
+}
 
-extern enum stop_kind stop_soon;
+/* Return a range that can be used to walk over all inferiors with PID
+   not zero, with range-for.  */
 
-/* Nonzero if proceed is being used for a "finish" command or a similar
-   situation when stop_registers should be saved.  */
+inline all_non_exited_inferiors_range
+all_non_exited_inferiors ()
+{
+  return {};
+}
 
-extern int proceed_to_finish;
+/* Prune away automatically added inferiors that aren't required
+   anymore.  */
+extern void prune_inferiors (void);
 
-/* 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).  */
+extern int number_of_inferiors (void);
 
-extern struct regcache *stop_registers;
+extern struct inferior *add_inferior_with_spaces (void);
 
-/* Nonzero if the child process in inferior_ptid was attached rather
-   than forked.  */
+/* Print the current selected inferior.  */
+extern void print_selected_inferior (struct ui_out *uiout);
 
-extern int attach_flag;
-\f
-/* Possible values for CALL_DUMMY_LOCATION.  */
-#define ON_STACK 1
-#define AT_ENTRY_POINT 4
-#define AT_SYMBOL 5
-
-/* 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) */
This page took 0.043756 seconds and 4 git commands to generate.