123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- /* Top level stuff for GDB, the GNU debugger.
- Copyright (C) 1986-2022 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 3 of the License, or
- (at your option) any later version.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>. */
- #ifndef TOP_H
- #define TOP_H
- #include "gdbsupport/buffer.h"
- #include "gdbsupport/event-loop.h"
- #include "gdbsupport/next-iterator.h"
- #include "value.h"
- /* Prompt state. */
- enum prompt_state
- {
- /* The command line is blocked simulating synchronous execution.
- This is used to implement the foreground execution commands
- ('run', 'continue', etc.). We won't display the prompt and
- accept further commands until the execution is actually over. */
- PROMPT_BLOCKED,
- /* The command finished; display the prompt before returning back to
- the top level. */
- PROMPT_NEEDED,
- /* We've displayed the prompt already, ready for input. */
- PROMPTED,
- };
- /* All about a user interface instance. Each user interface has its
- own I/O files/streams, readline state, its own top level
- interpreter (for the main UI, this is the interpreter specified
- with -i on the command line) and secondary interpreters (for
- interpreter-exec ...), etc. There's always one UI associated with
- stdin/stdout/stderr, but the user can create secondary UIs, for
- example, to create a separate MI channel on its own stdio
- streams. */
- struct ui
- {
- /* Create a new UI. */
- ui (FILE *instream, FILE *outstream, FILE *errstream);
- ~ui ();
- DISABLE_COPY_AND_ASSIGN (ui);
- /* Pointer to next in singly-linked list. */
- struct ui *next;
- /* Convenient handle (UI number). Unique across all UIs. */
- int num;
- /* The UI's command line buffer. This is to used to accumulate
- input until we have a whole command line. */
- struct buffer line_buffer;
- /* The callback used by the event loop whenever an event is detected
- on the UI's input file descriptor. This function incrementally
- builds a buffer where it accumulates the line read up to the
- point of invocation. In the special case in which the character
- read is newline, the function invokes the INPUT_HANDLER callback
- (see below). */
- void (*call_readline) (gdb_client_data);
- /* The function to invoke when a complete line of input is ready for
- processing. */
- void (*input_handler) (gdb::unique_xmalloc_ptr<char> &&);
- /* True if this UI is using the readline library for command
- editing; false if using GDB's own simple readline emulation, with
- no editing support. */
- int command_editing;
- /* Each UI has its own independent set of interpreters. */
- struct ui_interp_info *interp_info;
- /* True if the UI is in async mode, false if in sync mode. If in
- sync mode, a synchronous execution command (e.g, "next") does not
- return until the command is finished. If in async mode, then
- running a synchronous command returns right after resuming the
- target. Waiting for the command's completion is later done on
- the top event loop. For the main UI, this starts out disabled,
- until all the explicit command line arguments (e.g., `gdb -ex
- "start" -ex "next"') are processed. */
- int async;
- /* The number of nested readline secondary prompts that are
- currently active. */
- int secondary_prompt_depth;
- /* The UI's stdin. Set to stdin for the main UI. */
- FILE *stdin_stream;
- /* stdio stream that command input is being read from. Set to stdin
- normally. Set by source_command to the file we are sourcing.
- Set to NULL if we are executing a user-defined command or
- interacting via a GUI. */
- FILE *instream;
- /* Standard output stream. */
- FILE *outstream;
- /* Standard error stream. */
- FILE *errstream;
- /* The file descriptor for the input stream, so that we can register
- it with the event loop. */
- int input_fd;
- /* Whether ISATTY returns true on input_fd. Cached here because
- quit_force needs to know this _after_ input_fd might be
- closed. */
- int input_interactive_p;
- /* See enum prompt_state's description. */
- enum prompt_state prompt_state;
- /* The fields below that start with "m_" are "private". They're
- meant to be accessed through wrapper macros that make them look
- like globals. */
- /* The ui_file streams. */
- /* Normal results */
- struct ui_file *m_gdb_stdout;
- /* Input stream */
- struct ui_file *m_gdb_stdin;
- /* Serious error notifications */
- struct ui_file *m_gdb_stderr;
- /* Log/debug/trace messages that should bypass normal stdout/stderr
- filtering. For moment, always call this stream using
- *_unfiltered. In the very near future that restriction shall be
- removed - either call shall be unfiltered. (cagney 1999-06-13). */
- struct ui_file *m_gdb_stdlog;
- /* The current ui_out. */
- struct ui_out *m_current_uiout;
- };
- /* The main UI. This is the UI that is bound to stdin/stdout/stderr.
- It always exists and is created automatically when GDB starts
- up. */
- extern struct ui *main_ui;
- /* The current UI. */
- extern struct ui *current_ui;
- /* The list of all UIs. */
- extern struct ui *ui_list;
- /* State for SWITCH_THRU_ALL_UIS. */
- class switch_thru_all_uis
- {
- public:
- switch_thru_all_uis () : m_iter (ui_list), m_save_ui (¤t_ui)
- {
- current_ui = ui_list;
- }
- DISABLE_COPY_AND_ASSIGN (switch_thru_all_uis);
- /* If done iterating, return true; otherwise return false. */
- bool done () const
- {
- return m_iter == NULL;
- }
- /* Move to the next UI, setting current_ui if iteration is not yet
- complete. */
- void next ()
- {
- m_iter = m_iter->next;
- if (m_iter != NULL)
- current_ui = m_iter;
- }
- private:
- /* Used to iterate through the UIs. */
- struct ui *m_iter;
- /* Save and restore current_ui. */
- scoped_restore_tmpl<struct ui *> m_save_ui;
- };
- /* Traverse through all UI, and switch the current UI to the one
- being iterated. */
- #define SWITCH_THRU_ALL_UIS() \
- for (switch_thru_all_uis stau_state; !stau_state.done (); stau_state.next ())
- using ui_range = next_range<ui>;
- /* An adapter that can be used to traverse over all UIs. */
- static inline
- ui_range all_uis ()
- {
- return ui_range (ui_list);
- }
- /* Register the UI's input file descriptor in the event loop. */
- extern void ui_register_input_event_handler (struct ui *ui);
- /* Unregister the UI's input file descriptor from the event loop. */
- extern void ui_unregister_input_event_handler (struct ui *ui);
- /* From top.c. */
- extern bool confirm;
- extern int inhibit_gdbinit;
- /* Print the GDB version banner to STREAM. If INTERACTIVE is false,
- then information referring to commands (e.g., "show configuration")
- is omitted; this mode is used for the --version command line
- option. If INTERACTIVE is true, then interactive commands are
- mentioned. */
- extern void print_gdb_version (struct ui_file *stream, bool interactive);
- extern void print_gdb_configuration (struct ui_file *);
- extern void read_command_file (FILE *);
- extern void init_history (void);
- extern void command_loop (void);
- extern int quit_confirm (void);
- extern void quit_force (int *, int);
- extern void quit_command (const char *, int);
- extern void quit_cover (void);
- extern void execute_command (const char *, int);
- /* If the interpreter is in sync mode (we're running a user command's
- list, running command hooks or similars), and we just ran a
- synchronous command that started the target, wait for that command
- to end. WAS_SYNC indicates whether sync_execution was set before
- the command was run. */
- extern void maybe_wait_sync_command_done (int was_sync);
- /* Wait for a synchronous execution command to end. */
- extern void wait_sync_command_done (void);
- extern void check_frame_language_change (void);
- /* Prepare for execution of a command.
- Call this before every command, CLI or MI.
- Returns a cleanup to be run after the command is completed. */
- extern scoped_value_mark prepare_execute_command (void);
- /* This function returns a pointer to the string that is used
- by gdb for its command prompt. */
- extern const std::string &get_prompt ();
- /* This function returns a pointer to the string that is used
- by gdb for its command prompt. */
- extern void set_prompt (const char *s);
- /* Return 1 if UI's current input handler is a secondary prompt, 0
- otherwise. */
- extern int gdb_in_secondary_prompt_p (struct ui *ui);
- /* Perform _initialize initialization. */
- extern void gdb_init ();
- /* For use by event-top.c. */
- /* Variables from top.c. */
- extern int source_line_number;
- extern std::string source_file_name;
- extern bool history_expansion_p;
- extern bool server_command;
- extern char *lim_at_start;
- extern void gdb_add_history (const char *);
- extern void show_commands (const char *args, int from_tty);
- extern void set_verbose (const char *, int, struct cmd_list_element *);
- extern char *handle_line_of_input (struct buffer *cmd_line_buffer,
- const char *rl, int repeat,
- const char *annotation_suffix);
- /* Call at startup to see if the user has requested that gdb start up
- quietly. */
- extern bool check_quiet_mode ();
- #endif
|