X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftop.h;h=e7659b65ffe4c619291d5fb5456546708ff85ae8;hb=268a13a5a3f7c6b9b6ffc5ac2d1b24eb41f3fbdc;hp=e5445143ff8c1c4b87c6cfb2424108ec2d63a0e9;hpb=694ec099d2fca9e7d47848e8a7fc40ea3aa47a32;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/top.h b/gdb/top.h index e5445143ff..e7659b65ff 100644 --- a/gdb/top.h +++ b/gdb/top.h @@ -1,6 +1,6 @@ /* Top level stuff for GDB, the GNU debugger. - Copyright (C) 1986-2016 Free Software Foundation, Inc. + Copyright (C) 1986-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -20,11 +20,30 @@ #ifndef TOP_H #define TOP_H -#include "buffer.h" +#include "gdbsupport/buffer.h" #include "event-loop.h" +#include "value.h" struct tl_interp_info; +/* 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 @@ -36,9 +55,18 @@ struct tl_interp_info; 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; @@ -53,7 +81,12 @@ struct ui /* The function to invoke when a complete line of input is ready for processing. */ - void (*input_handler) (char *); + void (*input_handler) (gdb::unique_xmalloc_ptr &&); + + /* 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; @@ -68,6 +101,13 @@ struct ui "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 @@ -82,6 +122,14 @@ struct ui 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. */ @@ -98,6 +146,9 @@ struct ui *_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. @@ -111,47 +162,82 @@ extern struct ui *current_ui; /* The list of all UIs. */ extern struct ui *ui_list; -/* State for SWITCH_THRU_ALL_UIS. Declared here because it is meant - to be created on the stack, but should be treated as opaque. */ -struct switch_thru_all_uis +/* State for SWITCH_THRU_ALL_UIS. */ +class switch_thru_all_uis { - struct ui *iter; - struct cleanup *old_chain; +public: + + switch_thru_all_uis () : m_iter (ui_list), m_save_ui (¤t_ui) + { + current_ui = ui_list; + } + + /* 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: + + /* No need for these. They are intentionally not defined + anywhere. */ + switch_thru_all_uis &operator= (const switch_thru_all_uis &); + switch_thru_all_uis (const switch_thru_all_uis &); + + /* Used to iterate through the UIs. */ + struct ui *m_iter; + + /* Save and restore current_ui. */ + scoped_restore_tmpl m_save_ui; }; -/* Functions to drive SWITCH_THRU_ALL_UIS. Though declared here by - necessity, these functions should not be used other than via the - SWITCH_THRU_ALL_UIS macro defined below. */ -extern void switch_thru_all_uis_init (struct switch_thru_all_uis *state); -extern int switch_thru_all_uis_cond (struct switch_thru_all_uis *state); -extern void switch_thru_all_uis_next (struct switch_thru_all_uis *state); - /* Traverse through all UI, and switch the current UI to the one being iterated. */ -#define SWITCH_THRU_ALL_UIS(STATE) \ - for (switch_thru_all_uis_init (&STATE); \ - switch_thru_all_uis_cond (&STATE); \ - switch_thru_all_uis_next (&STATE)) +#define SWITCH_THRU_ALL_UIS() \ + for (switch_thru_all_uis stau_state; !stau_state.done (); stau_state.next ()) + +/* Traverse over all UIs. */ +#define ALL_UIS(UI) \ + for (UI = ui_list; UI; UI = UI->next) \ + +/* 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 char *saved_command_line; -extern int in_user_command; extern int confirm; -extern char gdb_dirbuf[1024]; extern int inhibit_gdbinit; extern const char gdbinit[]; -extern void print_gdb_version (struct ui_file *); +/* 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 (char *, int); -extern void quit_command (char *, int); +extern void quit_force (int *, int); +extern void quit_command (const char *, int); extern void quit_cover (void); -extern void execute_command (char *, int); +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 @@ -169,7 +255,7 @@ 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 struct cleanup *prepare_execute_command (void); +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. */ @@ -179,12 +265,14 @@ extern char *get_prompt (void); by gdb for its command prompt. */ extern void set_prompt (const char *s); -/* Return 1 if the current input handler is a secondary prompt, 0 otherwise. */ +/* Return 1 if UI's current input handler is a secondary prompt, 0 + otherwise. */ -extern int gdb_in_secondary_prompt_p (void); +extern int gdb_in_secondary_prompt_p (struct ui *ui); /* From random places. */ extern int readnow_symbol_files; +extern int readnever_symbol_files; /* Perform _initialize initialization. */ extern void gdb_init (char *); @@ -192,25 +280,23 @@ extern void gdb_init (char *); /* For use by event-top.c. */ /* Variables from top.c. */ extern int source_line_number; -extern const char *source_file_name; +extern std::string source_file_name; extern int history_expansion_p; extern int server_command; extern char *lim_at_start; extern void gdb_add_history (const char *); -extern void show_commands (char *args, int from_tty); - -extern void set_history (char *, int); +extern void show_commands (const char *args, int from_tty); -extern void show_history (char *, int); +extern void set_history (const char *, int); -extern void set_verbose (char *, int, struct cmd_list_element *); +extern void show_history (const char *, int); -extern void do_restore_instream_cleanup (void *stream); +extern void set_verbose (const char *, int, struct cmd_list_element *); extern char *handle_line_of_input (struct buffer *cmd_line_buffer, - char *rl, int repeat, - char *annotation_suffix); + const char *rl, int repeat, + const char *annotation_suffix); #endif