X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Finferior.h;h=f4b79a68cf80725a26a9350a680584f3caad5296;hb=708e4b9f189a86d542519b35e36e3f087b36b524;hp=e39a80c50472f9fb124a930fa90dff8acfa50cd9;hpb=9bcb1f1630b05594fa86bfd017639cfcc966b11c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/inferior.h b/gdb/inferior.h index e39a80c504..f4b79a68cf 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -1,7 +1,7 @@ /* Variables that describe the inferior process running under GDB: Where it is, why it stopped, and how to step it. - Copyright (C) 1986-2017 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -30,8 +30,9 @@ struct regcache; struct ui_out; struct terminal_info; struct target_desc_info; -struct gdb_environ; struct continuation; +struct inferior; +struct thread_info; /* For bpstat. */ #include "breakpoint.h" @@ -42,36 +43,75 @@ struct continuation; /* For struct frame_id. */ #include "frame.h" +/* For gdb_environ. */ +#include "gdbsupport/environ.h" + #include "progspace.h" #include "registry.h" #include "symfile-add-flags.h" +#include "gdbsupport/refcounted-object.h" +#include "gdbsupport/forward-scope-exit.h" + +#include "gdbsupport/common-inferior.h" +#include "gdbthread.h" +#include "thread-map.h" struct infcall_suspend_state; struct infcall_control_state; -extern struct infcall_suspend_state *save_infcall_suspend_state (void); -extern struct infcall_control_state *save_infcall_control_state (void); - extern void restore_infcall_suspend_state (struct infcall_suspend_state *); extern void restore_infcall_control_state (struct infcall_control_state *); -extern struct cleanup *make_cleanup_restore_infcall_suspend_state - (struct infcall_suspend_state *); -extern struct cleanup *make_cleanup_restore_infcall_control_state - (struct infcall_control_state *); +/* 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_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); + } +}; + +/* A unique_ptr specialization for infcall_control_state. */ +typedef std::unique_ptr + infcall_control_state_up; + +extern infcall_control_state_up save_infcall_control_state (); extern void discard_infcall_suspend_state (struct infcall_suspend_state *); extern void discard_infcall_control_state (struct infcall_control_state *); -extern struct regcache * +extern readonly_detached_regcache * get_infcall_suspend_state_regcache (struct infcall_suspend_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 void set_sigint_trap (void); extern void clear_sigint_trap (void); @@ -82,7 +122,7 @@ 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, ptid_get_pid (inferior_ptid) will be 0. */ + no inferior, inferior_ptid.pid () will be 0. */ extern ptid_t inferior_ptid; @@ -120,42 +160,28 @@ extern void default_print_float_info (struct gdbarch *gdbarch, extern void child_terminal_info (struct target_ops *self, const char *, int); -extern void term_info (char *, int); - extern void child_terminal_ours (struct target_ops *self); extern void child_terminal_ours_for_output (struct target_ops *self); extern void child_terminal_inferior (struct target_ops *self); +extern void child_terminal_save_inferior (struct target_ops *self); + extern void child_terminal_init (struct target_ops *self); extern void child_terminal_init_with_pgrp (int pgrp); -/* From fork-child.c */ - -/* Report an error that happened when starting to trace the inferior - (i.e., when the "traceme_fun" callback is called on fork_inferior) - and bail out. This function does not return. */ +extern void child_pass_ctrlc (struct target_ops *self); -extern void trace_start_error (const char *fmt, ...) - ATTRIBUTE_NORETURN; - -/* Like "trace_start_error", but the error message is constructed by - combining STRING with the system error message for errno. This - function does not return. */ - -extern void trace_start_error_with_name (const char *string) - ATTRIBUTE_NORETURN; - -extern int fork_inferior (const char *, const std::string &, char **, - void (*)(void), - void (*)(int), void (*)(void), char *, - void (*)(const char *, - char * const *, char * const *)); +extern void child_interrupt (struct target_ops *self); +/* From fork-child.c */ -extern void startup_inferior (int); +/* 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 char *construct_inferior_arguments (int, char **); @@ -169,25 +195,26 @@ extern void setup_inferior (int from_tty); extern void post_create_inferior (struct target_ops *, int); -extern void attach_command (char *, int); +extern void attach_command (const char *, int); -extern char *get_inferior_args (void); +extern const char *get_inferior_args (void); -extern void set_inferior_args (char *); +extern void set_inferior_args (const char *); extern void set_inferior_args_vector (int, char **); -extern void registers_info (char *, int); +extern void registers_info (const char *, int); extern void continue_1 (int all_threads); extern void interrupt_target_1 (int all_threads); -extern void delete_longjmp_breakpoint_cleanup (void *arg); +using delete_longjmp_breakpoint_cleanup + = FORWARD_SCOPE_EXIT (delete_longjmp_breakpoint); -extern void detach_command (char *, int); +extern void detach_command (const char *, int); -extern void notice_new_inferior (ptid_t, int, int); +extern void notice_new_inferior (struct thread_info *, int, int); extern struct value *get_return_value (struct value *function, struct type *value_type); @@ -199,29 +226,6 @@ extern struct value *get_return_value (struct value *function, extern void prepare_execution_command (struct target_ops *target, int background); -/* Whether to start up the debuggee under a shell. - - If startup-with-shell is set, GDB's "run" will attempt to start up - the debuggee 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 may be handy to bypass the shell - in some cases. To disable this feature, do "set startup-with-shell - false". - - The catch-exec traps expected during start-up will be one more if - the target is started up with a shell. */ -extern int startup_with_shell; - -/* Address at which inferior stopped. */ - -extern CORE_ADDR stop_pc; - /* Nonzero if stopped due to completion of a stack dummy routine. */ extern enum stop_stack_kind stop_stack_dummy; @@ -231,16 +235,9 @@ extern enum stop_stack_kind stop_stack_dummy; extern int stopped_by_random_signal; -/* 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 - }; +/* Print notices on inferior events (attach, detach, etc.), set with + `set print inferior-events'. */ +extern bool print_inferior_events; /* Anything but NO_STOP_QUIETLY means we expect a trap and the caller will handle it themselves. STOP_QUIETLY is used when running in @@ -280,13 +277,12 @@ enum stop_kind #define ON_STACK 1 #define AT_ENTRY_POINT 4 -/* Number of traps that happen between exec'ing the shell to run an - inferior and when we finally get to the inferior code, not counting - the exec for the shell. This is 1 on all supported - implementations. */ -#define START_INFERIOR_TRAPS_EXPECTED 1 +/* Base class for target-specific inferior data. */ -struct private_inferior; +struct private_inferior +{ + virtual ~private_inferior () = 0; +}; /* Inferior process specific part of `struct infcall_control_state'. @@ -294,10 +290,25 @@ struct private_inferior; struct inferior_control_state { + inferior_control_state () + : stop_soon (NO_STOP_QUIETLY) + { + } + + 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 @@ -305,17 +316,54 @@ struct inferior_control_state 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. */ - -class inferior + 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. */ + ptid_thread_map thread_map; + + /* Returns a range adapter covering the inferior's threads, + including exited threads. Used like this: + + for (thread_info *thr : inf->threads ()) + { .... } + */ + all_thread_map_range threads () + { return all_thread_map_range (this->thread_map); } + + /* Returns a range adapter covering the inferior's non-exited + threads. Used like this: + + for (thread_info *thr : inf->non_exited_threads ()) + { .... } + */ + non_exited_thread_map_range non_exited_threads () + { return non_exited_thread_map_range (this->thread_map); } + /* Convenient handle (GDB inferior id). Unique across all inferiors. */ int num = 0; @@ -331,7 +379,7 @@ public: /* State of GDB control of inferior process execution. See `struct inferior_control_state'. */ - inferior_control_state control {NO_STOP_QUIETLY}; + 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 @@ -357,12 +405,20 @@ public: should never be freed. */ char **argv = NULL; + /* The current working directory that will be used when starting + this inferior. */ + gdb::unique_xmalloc_ptr 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 = NULL; + gdb_environ environment; /* True if this child process was attached rather than forked. */ bool attach_flag = false; @@ -401,7 +457,7 @@ public: bool needs_setup = false; /* Private data used by the target vector implementation. */ - private_inferior *priv = NULL; + std::unique_ptr priv; /* HAS_EXIT_CODE is true if the inferior exited with an exit code. In this case, the EXIT_CODE field is also valid. */ @@ -429,6 +485,9 @@ public: this gdbarch. */ struct gdbarch *gdbarch = NULL; + /* Data related to displaced stepping. */ + displaced_step_inferior_state displaced_step_state; + /* Per inferior data-pointers required by other GDB modules. */ REGISTRY_FIELDS; }; @@ -451,11 +510,11 @@ extern struct inferior *add_inferior_silent (int pid); extern void delete_inferior (struct inferior *todel); /* Delete an existing inferior list entry, due to inferior detaching. */ -extern void detach_inferior (int pid); +extern void detach_inferior (inferior *inf); -extern void exit_inferior (int pid); +extern void exit_inferior (inferior *inf); -extern void exit_inferior_silent (int pid); +extern void exit_inferior_silent (inferior *inf); extern void exit_inferior_num_silent (int num); @@ -464,21 +523,6 @@ extern void inferior_appeared (struct inferior *inf, int pid); /* Get rid of all inferiors. */ extern void discard_all_inferiors (void); -/* 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); - -/* 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); - -/* Boolean test for an already-known pid. */ -extern int in_inferior_list (int pid); - -/* Boolean test for an already-known inferior id (GDB's homegrown id, - not the system's). */ -extern int valid_gdb_inferior_id (int num); - /* Search function to lookup an inferior by target 'pid'. */ extern struct inferior *find_inferior_pid (int pid); @@ -517,27 +561,71 @@ extern int number_of_live_inferiors (void); (not cores, not executables, real live processes). */ extern int have_live_inferiors (void); -/* 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); +/* Save/restore the current inferior. */ -extern void set_current_inferior (struct inferior *); +class scoped_restore_current_inferior +{ +public: + scoped_restore_current_inferior () + : m_saved_inf (current_inferior ()) + {} -extern struct cleanup *save_current_inferior (void); + ~scoped_restore_current_inferior () + { set_current_inferior (m_saved_inf); } -/* Traverse all inferiors. */ + DISABLE_COPY_AND_ASSIGN (scoped_restore_current_inferior); -#define ALL_INFERIORS(I) \ - for ((I) = inferior_list; (I); (I) = (I)->next) +private: + inferior *m_saved_inf; +}; -/* Traverse all non-exited inferiors. */ -#define ALL_NON_EXITED_INFERIORS(I) \ - ALL_INFERIORS (I) \ - if ((I)->pid != 0) +/* Traverse all inferiors. */ extern struct inferior *inferior_list; +/* Pull in the internals of the inferiors ranges and iterators. Must + be done after struct inferior is defined. */ +#include "inferior-iter.h" + +/* 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: + + for (inferior *inf : all_inferiors_safe ()) + if (some_condition ()) + delete inf; +*/ + +inline all_inferiors_safe_range +all_inferiors_safe () +{ + return {}; +} + +/* Returns a range representing all inferiors, suitable to use with + range-for, like this: + + for (inferior *inf : all_inferiors ()) + [...] +*/ + +inline all_inferiors_range +all_inferiors () +{ + return {}; +} + +/* Return a range that can be used to walk over all inferiors with PID + not zero, with range-for. */ + +inline all_non_exited_inferiors_range +all_non_exited_inferiors () +{ + return {}; +} + /* Prune away automatically added inferiors that aren't required anymore. */ extern void prune_inferiors (void);