X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftop.c;h=a9f9a384f7e1ecc1f2f8dfad2289b795754c2f19;hb=404f29021abaef86a341663444fb069eb1f0282a;hp=bacd684dbaaf005e95226c4222829d9f250ac300;hpb=8a522c6cab56bd55f1454638786f999f6f636354;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/top.c b/gdb/top.c index bacd684dba..a9f9a384f7 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -34,12 +34,12 @@ #include "expression.h" #include "value.h" #include "language.h" -#include "terminal.h" /* For job_control. */ -#include "common/job-control.h" +#include "terminal.h" +#include "gdbsupport/job-control.h" #include "annotate.h" #include "completer.h" #include "top.h" -#include "common/version.h" +#include "gdbsupport/version.h" #include "serial.h" #include "main.h" #include "event-loop.h" @@ -50,9 +50,10 @@ #include "maint.h" #include "filenames.h" #include "frame.h" -#include "common/buffer.h" +#include "gdbsupport/buffer.h" #include "gdb_select.h" -#include "common/scope-exit.h" +#include "gdbsupport/scope-exit.h" +#include "gdbarch.h" /* readline include files. */ #include "readline/readline.h" @@ -107,10 +108,6 @@ gen_ret_current_ui_field_ptr (struct ui_file *, gdb_stderr) gen_ret_current_ui_field_ptr (struct ui_file *, gdb_stdlog) gen_ret_current_ui_field_ptr (struct ui_out *, current_uiout) -/* Initialization file name for gdb. This is host-dependent. */ - -const char gdbinit[] = GDBINIT; - int inhibit_gdbinit = 0; extern char lang_frame_mismatch_warn[]; /* language.c */ @@ -134,8 +131,26 @@ show_confirm (struct ui_file *file, int from_tty, char *current_directory; /* The last command line executed on the console. Used for command - repetitions. */ -char *saved_command_line; + repetitions when the user enters an empty line. */ + +static char *saved_command_line; + +/* If not NULL, the arguments that should be passed if + saved_command_line is repeated. */ + +static const char *repeat_arguments; + +/* The previous last command line executed on the console. Used for command + repetitions when a command wants to relaunch the previously launched + command. We need this as when a command is running, saved_command_line + already contains the line of the currently executing command. */ + +char *previous_saved_command_line; + +/* If not NULL, the arguments that should be passed if the + previous_saved_command_line is repeated. */ + +static const char *previous_repeat_arguments; /* Nonzero if the current command is modified by "server ". This affects things like recording into the command history, commands @@ -222,11 +237,6 @@ void (*deprecated_readline_end_hook) (void); void (*deprecated_attach_hook) (void); void (*deprecated_detach_hook) (void); -/* Called during long calculations to allow GUI to repair window - damage, and to check for stop buttons, etc... */ - -void (*deprecated_interactive_hook) (void); - /* Called when going to wait for the target. Usually allows the GUI to run while waiting for target events. */ @@ -327,8 +337,6 @@ open_terminal_stream (const char *name) static void new_ui_command (const char *args, int from_tty) { - gdb_file_up stream[3]; - int i; int argc; const char *interpreter_name; const char *tty_name; @@ -347,13 +355,13 @@ new_ui_command (const char *args, int from_tty) { scoped_restore save_ui = make_scoped_restore (¤t_ui); - /* Open specified terminal, once for each of - stdin/stdout/stderr. */ - for (i = 0; i < 3; i++) - stream[i] = open_terminal_stream (tty_name); + /* Open specified terminal. Note: we used to open it three times, + once for each of stdin/stdout/stderr, but that does not work + with Windows named pipes. */ + gdb_file_up stream = open_terminal_stream (tty_name); std::unique_ptr ui - (new struct ui (stream[0].get (), stream[1].get (), stream[2].get ())); + (new struct ui (stream.get (), stream.get (), stream.get ())); ui->async = 1; @@ -363,10 +371,8 @@ new_ui_command (const char *args, int from_tty) interp_pre_command_loop (top_level_interpreter ()); - /* Make sure the files are not closed. */ - stream[0].release (); - stream[1].release (); - stream[2].release (); + /* Make sure the file is not closed. */ + stream.release (); ui.release (); } @@ -521,11 +527,6 @@ maybe_wait_sync_command_done (int was_sync) wait_sync_command_done (); } -/* If not NULL, the arguments that should be passed if the current - command is repeated. */ - -static const char *repeat_arguments; - /* See command.h. */ void @@ -547,10 +548,6 @@ execute_command (const char *p, int from_tty) auto cleanup_if_error = make_scope_exit (bpstat_clear_actions); scoped_value_mark cleanup = prepare_execute_command (); - /* Force cleanup of any alloca areas if using C alloca instead of - a builtin alloca. */ - alloca (0); - /* This can happen when command_line_input hits end of file. */ if (p == NULL) { @@ -652,13 +649,12 @@ execute_command (const char *p, int from_tty) cleanup_if_error.release (); } -/* Run execute_command for P and FROM_TTY. Capture its output into the - returned string, do not display it to the screen. BATCH_FLAG will be +/* Run execute_command for P and FROM_TTY. Sends its output to FILE, + do not display it to the screen. BATCH_FLAG will be temporarily set to true. */ -std::string -execute_command_to_string (const char *p, int from_tty, - bool term_out) +void +execute_command_to_ui_file (struct ui_file *file, const char *p, int from_tty) { /* GDB_STDOUT should be better already restored during these restoration callbacks. */ @@ -666,26 +662,36 @@ execute_command_to_string (const char *p, int from_tty, scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); - string_file str_file (term_out); - { - current_uiout->redirect (&str_file); + current_uiout->redirect (file); ui_out_redirect_pop redirect_popper (current_uiout); scoped_restore save_stdout - = make_scoped_restore (&gdb_stdout, &str_file); + = make_scoped_restore (&gdb_stdout, file); scoped_restore save_stderr - = make_scoped_restore (&gdb_stderr, &str_file); + = make_scoped_restore (&gdb_stderr, file); scoped_restore save_stdlog - = make_scoped_restore (&gdb_stdlog, &str_file); + = make_scoped_restore (&gdb_stdlog, file); scoped_restore save_stdtarg - = make_scoped_restore (&gdb_stdtarg, &str_file); + = make_scoped_restore (&gdb_stdtarg, file); scoped_restore save_stdtargerr - = make_scoped_restore (&gdb_stdtargerr, &str_file); + = make_scoped_restore (&gdb_stdtargerr, file); execute_command (p, from_tty); } +} + +/* Run execute_command for P and FROM_TTY. Capture its output into the + returned string, do not display it to the screen. BATCH_FLAG will be + temporarily set to true. */ + +std::string +execute_command_to_string (const char *p, int from_tty, + bool term_out) +{ + string_file str_file (term_out); + execute_command_to_ui_file (&str_file, p, from_tty); return std::move (str_file.string ()); } @@ -695,7 +701,7 @@ execute_command_to_string (const char *p, int from_tty, static int suppress_dont_repeat = 0; -/* Commands call this if they do not want to be repeated by null lines. */ +/* See command.h */ void dont_repeat (void) @@ -709,11 +715,32 @@ dont_repeat (void) thing read from stdin in line and don't want to delete it. Null lines won't repeat here in any case. */ if (ui->instream == ui->stdin_stream) - *saved_command_line = 0; + { + *saved_command_line = 0; + repeat_arguments = NULL; + } +} + +/* See command.h */ + +const char * +repeat_previous () +{ + /* Do not repeat this command, as this command is a repeating command. */ + dont_repeat (); + + /* We cannot free saved_command_line, as this line is being executed, + so swap it with previous_saved_command_line. */ + std::swap (previous_saved_command_line, saved_command_line); + std::swap (previous_repeat_arguments, repeat_arguments); + + const char *prev = skip_spaces (get_saved_command_line ()); + if (*prev == '\0') + error (_("No previous command to relaunch")); + return prev; } -/* Prevent dont_repeat from working, and return a cleanup that - restores the previous state. */ +/* See command.h. */ scoped_restore_tmpl prevent_dont_repeat (void) @@ -721,6 +748,26 @@ prevent_dont_repeat (void) return make_scoped_restore (&suppress_dont_repeat, 1); } +/* See command.h. */ + +char * +get_saved_command_line () +{ + return saved_command_line; +} + +/* See command.h. */ + +void +save_command_line (const char *cmd) +{ + xfree (previous_saved_command_line); + previous_saved_command_line = saved_command_line; + previous_repeat_arguments = repeat_arguments; + saved_command_line = xstrdup (cmd); + repeat_arguments = NULL; +} + /* Read a line from the stream "instream" without command line editing. @@ -1415,15 +1462,6 @@ This GDB was configured as follows:\n\ --without-intel-pt\n\ ")); #endif -#if HAVE_LIBMCHECK - fprintf_filtered (stream, _("\ - --enable-libmcheck\n\ -")); -#else - fprintf_filtered (stream, _("\ - --disable-libmcheck\n\ -")); -#endif #if HAVE_LIBMPFR fprintf_filtered (stream, _("\ --with-mpfr\n\ @@ -2172,13 +2210,16 @@ input settings."), c = add_cmd ("new-ui", class_support, new_ui_command, _("\ Create a new UI. It takes two arguments:\n\ The first argument is the name of the interpreter to run.\n\ -The second argument is the terminal the UI runs on.\n"), &cmdlist); +The second argument is the terminal the UI runs on."), &cmdlist); set_cmd_completer (c, interpreter_completer); } void gdb_init (char *argv0) { + saved_command_line = xstrdup (""); + previous_saved_command_line = xstrdup (""); + if (pre_init_ui_hook) pre_init_ui_hook (); @@ -2207,7 +2248,6 @@ gdb_init (char *argv0) initialize_progspace (); initialize_inferiors (); initialize_current_architecture (); - init_cli_cmds(); init_main (); /* But that omits this file! Do it now. */ initialize_stdin_serial ();