From 4389a95abbef3cf59d29e0fe15458335a0b3f0ab Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Thu, 6 Feb 2003 01:19:12 +0000 Subject: [PATCH] 2003-02-05 Jim Ingham Keith Seitz Elena Zannoni Andrew Cagney * Makefile.in (SUBDIR_CLI_OBS): Add "cli-interp.o". (SUBDIR_CLI_SRCS): Add "cli/cli-interp.c". (SUBDIR_MI_OBS): Add "mi-interp.o". (SUBDIR_MI_SRCS): Add "mi/mi-interp.c". (SFILES): Add "interps.c". (COMMON_OBS): Add "interps.o". (interps_h, mi_main_h): Define. (interps.o, cli-interp.o, mi-interp.o): Add dependencies. (mi-main.o, main.o, event-top.o): Update dependencies. * cli/cli-interp.c: New file. * interps.h, interps.c: New files. * top.c: (gdb_init): Don't install the default interpreter, handed by captured_main. * main.c: Include "interps.h". (interpreter_p): Note that it should malloc'ed. (captured_command_loop): Call current_interp_command_loop. (captured_main): Initialize interpreter_p to INTERP_CONSOLE. Use xfree and xstrdup when updating interpreter_p. Install the default interpreter. Add hack to stop mi1's copyright notice being encoded. * event-top.h (gdb_setup_readline): Declare. (gdb_disable_readline): Declare. * event-top.c: Include "interps.h". (display_gdb_prompt): Call current_interp_display_prompt_p. (gdb_setup_readline): Initialize gdb_stdout, gdb_stderr, gdb_stdlog, and gdb_stdtarg. (_initialize_event_loop): Don't call gdb_setup_readline. * cli-out.c (cli_out_set_stream): New function. * cli-out.h (cli_out_set_stream): Declare. --- gdb/ChangeLog | 35 ++++++++ gdb/Makefile.in | 25 +++++- gdb/cli-out.c | 9 +++ gdb/cli-out.h | 3 + gdb/event-top.c | 14 ++-- gdb/event-top.h | 2 + gdb/main.c | 75 ++++++++++++++--- gdb/mi/ChangeLog | 31 ++++++- gdb/mi/mi-cmds.c | 7 +- gdb/mi/mi-cmds.h | 11 ++- gdb/mi/mi-console.c | 18 ++++- gdb/mi/mi-console.h | 4 +- gdb/mi/mi-main.c | 193 ++++++++++---------------------------------- gdb/top.c | 15 ---- gdb/wrapper.h | 2 + 15 files changed, 248 insertions(+), 196 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0e4ae512a1..74a942e5da 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,38 @@ +2003-02-05 Jim Ingham + Keith Seitz + Elena Zannoni + Andrew Cagney + + * Makefile.in (SUBDIR_CLI_OBS): Add "cli-interp.o". + (SUBDIR_CLI_SRCS): Add "cli/cli-interp.c". + (SUBDIR_MI_OBS): Add "mi-interp.o". + (SUBDIR_MI_SRCS): Add "mi/mi-interp.c". + (SFILES): Add "interps.c". + (COMMON_OBS): Add "interps.o". + (interps_h, mi_main_h): Define. + (interps.o, cli-interp.o, mi-interp.o): Add dependencies. + (mi-main.o, main.o, event-top.o): Update dependencies. + * cli/cli-interp.c: New file. + * interps.h, interps.c: New files. + * top.c: (gdb_init): Don't install the default interpreter, handed + by captured_main. + * main.c: Include "interps.h". + (interpreter_p): Note that it should malloc'ed. + (captured_command_loop): Call current_interp_command_loop. + (captured_main): Initialize interpreter_p to INTERP_CONSOLE. Use + xfree and xstrdup when updating interpreter_p. Install the + default interpreter. Add hack to stop mi1's copyright notice + being encoded. + * event-top.h (gdb_setup_readline): Declare. + (gdb_disable_readline): Declare. + * event-top.c: Include "interps.h". + (display_gdb_prompt): Call current_interp_display_prompt_p. + (gdb_setup_readline): Initialize gdb_stdout, gdb_stderr, + gdb_stdlog, and gdb_stdtarg. + (_initialize_event_loop): Don't call gdb_setup_readline. + * cli-out.c (cli_out_set_stream): New function. + * cli-out.h (cli_out_set_stream): Declare. + 2003-02-06 Mark Kettenis * configure.tgt (i[3456]86-*-sysv4.2*, i[3456]86-*-sysv4*, diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8eee1c269d..4a67706e38 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -146,9 +146,11 @@ TARGET_SYSTEM_ROOT_DEFINE = @TARGET_SYSTEM_ROOT_DEFINE@ SUBDIR_CLI_OBS = \ cli-dump.o \ cli-decode.o cli-script.o cli-cmds.o cli-setshow.o cli-utils.o + cli-interp.o SUBDIR_CLI_SRCS = \ cli/cli-dump.c \ cli/cli-decode.c cli/cli-script.c cli/cli-cmds.c cli/cli-setshow.c \ + cli/cli-interp.c \ cli/cli-utils.c SUBDIR_CLI_DEPS = SUBDIR_CLI_INITS = \ @@ -167,12 +169,14 @@ SUBDIR_MI_OBS = \ mi-out.o mi-console.o \ mi-cmds.o mi-cmd-env.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \ mi-cmd-disas.o \ + mi-interp.o \ mi-main.o mi-parse.o mi-getopt.o SUBDIR_MI_SRCS = \ mi/mi-out.c mi/mi-console.c \ mi/mi-cmds.c mi/mi-cmd-env.c \ mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \ mi/mi-cmd-disas.c \ + mi/mi-interp.c \ mi/mi-main.c mi/mi-parse.c mi/mi-getopt.c SUBDIR_MI_DEPS = SUBDIR_MI_INITS = \ @@ -517,6 +521,7 @@ SFILES = ada-exp.y ada-lang.c ada-typeprint.c ada-valprint.c ada-tasks.c \ gdbarch.c arch-utils.c gdbtypes.c gnu-v2-abi.c gnu-v3-abi.c \ hpacc-abi.c \ inf-loop.c infcmd.c inflow.c infrun.c \ + interps.c \ jv-exp.y jv-lang.c jv-valprint.c jv-typeprint.c \ kod.c kod-cisco.c \ language.c linespec.c \ @@ -655,6 +660,7 @@ i386_tdep_h = i386-tdep.h i387_tdep_h = i387-tdep.h inf_loop_h = inf-loop.h inferior_h = inferior.h $(breakpoint_h) $(target_h) $(frame_h) +interps_h = interps.h jv_lang_h = jv-lang.h kod_h = kod.h language_h = language.h @@ -740,6 +746,7 @@ cli_utils_h = $(srcdir)/cli/cli-utils.h mi_cmds_h = $(srcdir)/mi/mi-cmds.h mi_console_h = $(srcdir)/mi/mi-console.h mi_getopt_h = $(srcdir)/mi/mi-getopt.h +mi_main_h = $(srcdir)/mi/mi-main.h mi_out_h = $(srcdir)/mi/mi-out.h mi_parse_h = $(srcdir)/mi/mi-parse.h @@ -816,6 +823,7 @@ COMMON_OBS = version.o blockframe.o breakpoint.o findvar.o regcache.o \ source.o values.o eval.o valops.o valarith.o valprint.o printcmd.o \ symtab.o symfile.o symmisc.o linespec.o infcmd.o infrun.o \ expprint.o environ.o stack.o thread.o \ + interps.o \ macrotab.o macrocmd.o macroexp.o macroscope.o \ event-loop.o event-top.o inf-loop.o completer.o \ gdbarch.o arch-utils.o gdbtypes.o osabi.o copying.o $(DEPFILES) \ @@ -1636,7 +1644,8 @@ eval.o: eval.c $(defs_h) $(gdb_string_h) $(symtab_h) $(gdbtypes_h) \ event-loop.o: event-loop.c $(defs_h) $(event_loop_h) $(event_top_h) \ $(gdb_string_h) event-top.o: event-top.c $(defs_h) $(top_h) $(inferior_h) $(target_h) \ - $(terminal_h) $(event_loop_h) $(event_top_h) $(gdbcmd_h) $(readline_h) + $(terminal_h) $(event_loop_h) $(event_top_h) $(interps_h) \ + $(gdbcmd_h) exec.o: exec.c $(defs_h) $(frame_h) $(inferior_h) $(target_h) $(gdbcmd_h) \ $(language_h) $(symfile_h) $(objfiles_h) $(completer_h) $(value_h) \ $(gdb_string_h) $(gdbcore_h) $(gdb_stat_h) $(xcoffsolib_h) \ @@ -1793,6 +1802,9 @@ inftarg.o: inftarg.c $(defs_h) $(frame_h) $(inferior_h) $(target_h) \ $(gdbcore_h) $(command_h) $(gdb_stat_h) $(gdb_wait_h) infttrace.o: infttrace.c $(defs_h) $(frame_h) $(inferior_h) $(target_h) \ $(gdb_string_h) $(gdb_wait_h) $(command_h) $(gdbcore_h) +interps.o: interps.c $(defs_h) $(gdbcmd_h) $(ui_out_h) $(event_loop_h) \ + $(event_top_h) $(interps_h) $(completer_h) $(gdb_string_h) \ + $(gdb_events_h) $(gdb_assert_h) $(top_h) irix4-nat.o: irix4-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) $(regcache_h) \ $(gregset_h) irix5-nat.o: irix5-nat.c $(defs_h) $(inferior_h) $(gdbcore_h) $(target_h) \ @@ -1868,7 +1880,7 @@ macrotab.o: macrotab.c $(defs_h) $(gdb_obstack_h) $(splay_tree_h) \ $(bcache_h) $(complaints_h) main.o: main.c $(defs_h) $(top_h) $(target_h) $(inferior_h) $(symfile_h) \ $(gdbcore_h) $(getopt_h) $(gdb_stat_h) $(gdb_string_h) \ - $(event_loop_h) $(ui_out_h) $(main_h) + $(event_loop_h) $(ui_out_h) $(interps_h) $(main_h) maint.o: maint.c $(defs_h) $(command_h) $(gdbcmd_h) $(symtab_h) \ $(gdbtypes_h) $(demangle_h) $(gdbcore_h) $(expression_h) \ $(language_h) $(symfile_h) $(objfiles_h) $(value_h) $(cli_decode_h) @@ -2311,6 +2323,9 @@ cli-dump.o: $(srcdir)/cli/cli-dump.c $(defs_h) $(gdb_string_h) \ $(cli_decode_h) $(cli_cmds_h) $(value_h) $(completer_h) \ $(cli_dump_h) $(gdb_assert_h) $(target_h) $(readline_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-dump.c +cli-interp.o: $(srcdir)/cli/cli-interp.c $(defs_h) $(interps_h) $(wrapper_h) \ + $(event_top_h) $(ui_out_h) $(cli_out_h) $(top_h) $(gdb_string_h) + $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/cli/cli-interp.c cli-script.o: $(srcdir)/cli/cli-script.c $(defs_h) $(value_h) $(language_h) \ $(ui_out_h) $(gdb_string_h) $(top_h) $(cli_cmds_h) $(cli_decode_h) \ $(cli_script_h) @@ -2495,9 +2510,13 @@ mi-console.o: $(srcdir)/mi/mi-console.c $(defs_h) $(mi_console_h) \ mi-getopt.o: $(srcdir)/mi/mi-getopt.c $(defs_h) $(mi_getopt_h) \ $(gdb_string_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-getopt.c +mi-interp.o: $(srcdir)/mi/mi-interp.c $(defs_h) $(gdb_string_h) $(interps_h) \ + $(event_top_h) $(event_loop_h) $(inferior_h) $(ui_out_h) $(top_h) \ + $(mi_main_h) $(mi_cmds_h) $(mi_out_h) $(mi_console_h) + $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-interp.c mi-main.o: $(srcdir)/mi/mi-main.c $(defs_h) $(target_h) $(inferior_h) \ $(gdb_string_h) $(top_h) $(gdbthread_h) $(mi_cmds_h) $(mi_parse_h) \ - $(mi_getopt_h) $(mi_console_h) $(ui_out_h) $(mi_out_h) \ + $(mi_getopt_h) $(mi_console_h) $(ui_out_h) $(mi_out_h) $(interps_h) \ $(event_loop_h) $(event_top_h) $(gdbcore_h) $(value_h) $(regcache_h) \ $(gdb_h) $(frame_h) $(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-main.c diff --git a/gdb/cli-out.c b/gdb/cli-out.c index bd079f250b..e3b45cdd53 100644 --- a/gdb/cli-out.c +++ b/gdb/cli-out.c @@ -365,6 +365,15 @@ cli_out_new (struct ui_file *stream) return ui_out_new (&cli_ui_out_impl, data, flags); } +struct ui_file * +cli_out_set_stream (struct ui_out *uiout, struct ui_file *stream) +{ + struct ui_out_data *data = ui_out_data (uiout); + struct ui_file *old = data->stream; + data->stream = stream; + return old; +} + /* standard gdb initialization hook */ void _initialize_cli_out (void) diff --git a/gdb/cli-out.h b/gdb/cli-out.h index 723b7260cb..a984d05839 100644 --- a/gdb/cli-out.h +++ b/gdb/cli-out.h @@ -24,4 +24,7 @@ extern struct ui_out *cli_out_new (struct ui_file *stream); +extern struct ui_file *cli_out_set_stream (struct ui_out *uiout, + struct ui_file *stream); + #endif diff --git a/gdb/event-top.c b/gdb/event-top.c index 8f39998ed9..2b2c4ff278 100644 --- a/gdb/event-top.c +++ b/gdb/event-top.c @@ -26,6 +26,7 @@ #include "terminal.h" /* for job_control */ #include "event-loop.h" #include "event-top.h" +#include "interps.h" #include /* For dont_repeat() */ @@ -250,9 +251,9 @@ display_gdb_prompt (char *new_prompt) int prompt_length = 0; char *gdb_prompt = get_prompt (); - /* When an alternative interpreter has been installed, do not - display the comand prompt. */ - if (interpreter_p) + /* Each interpreter has its own rules on displaying the command + prompt. */ + if (!current_interp_display_prompt_p ()) return; if (target_executing && sync_execution) @@ -1125,6 +1126,11 @@ gdb_setup_readline (void) if (event_loop_p) { + gdb_stdout = stdio_fileopen (stdout); + gdb_stderr = stdio_fileopen (stderr); + gdb_stdlog = gdb_stderr; /* for moment */ + gdb_stdtarg = gdb_stderr; /* for moment */ + /* If the input stream is connected to a terminal, turn on editing. */ if (ISATTY (instream)) @@ -1197,8 +1203,6 @@ gdb_disable_readline (void) void _initialize_event_loop (void) { - gdb_setup_readline (); - /* Tell gdb to use the cli_command_loop as the main loop. */ if (event_loop_p && command_loop_hook == NULL) command_loop_hook = cli_command_loop; diff --git a/gdb/event-top.h b/gdb/event-top.h index 24044a57ba..d8c0a96398 100644 --- a/gdb/event-top.h +++ b/gdb/event-top.h @@ -71,6 +71,8 @@ struct prompts FIXME: these should really go into top.h. */ extern void display_gdb_prompt (char *new_prompt); +void gdb_setup_readline (void); +void gdb_disable_readline (void); extern void async_init_signals (void); extern void set_async_editing_command (char *args, int from_tty, struct cmd_list_element *c); diff --git a/gdb/main.c b/gdb/main.c index 6c4feaef2e..73c17f573c 100644 --- a/gdb/main.c +++ b/gdb/main.c @@ -1,7 +1,8 @@ /* Top level stuff for GDB, the GNU debugger. - Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, - 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 - Free Software Foundation, Inc. + + Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, + 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software + Foundation, Inc. This file is part of GDB. @@ -37,6 +38,7 @@ #include "event-loop.h" #include "ui-out.h" +#include "interps.h" #include "main.h" /* If nonzero, display time usage both at startup and for each command. */ @@ -53,7 +55,9 @@ int display_space; processes UI events asynchronously. */ int event_loop_p = 1; -/* Has an interpreter been specified and if so, which. */ +/* The selected interpreter. This will be used as a set command + variable, so it should always be malloc'ed - since + do_setshow_command will free it. */ char *interpreter_p; /* Whether this is the command line version or not */ @@ -93,10 +97,7 @@ extern char *external_editor_command; static int captured_command_loop (void *data) { - if (command_loop_hook == NULL) - command_loop (); - else - command_loop_hook (); + current_interp_command_loop (); /* FIXME: cagney/1999-11-05: A correct command_loop() implementaton would clean things up (restoring the cleanup chain) to the state they were just prior to the call. Technically, this means that @@ -227,6 +228,12 @@ captured_main (void *data) #endif #endif + /* There will always be an interpreter. Either the one passed into + this captured main (not yet implemented), or one specified by the + user at start up, or the console. Make life easier by always + initializing the interpreter to something. */ + interpreter_p = xstrdup (INTERP_CONSOLE); + /* Parse arguments and options. */ { int c; @@ -381,7 +388,8 @@ extern int gdbtk_test (char *); } #endif /* GDBTK */ case 'i': - interpreter_p = optarg; + xfree (interpreter_p); + interpreter_p = xstrdup (optarg); break; case 'd': dirarg[ndir++] = optarg; @@ -509,7 +517,10 @@ extern int gdbtk_test (char *); gdb_init (argv[0]); /* Do these (and anything which might call wrap_here or *_filtered) - after initialize_all_files. */ + after initialize_all_files() but before the interpreter has been + installed. Otherwize the help/version messages will be eaten by + the interpreter's output handler. */ + if (print_version) { print_gdb_version (gdb_stdout); @@ -525,7 +536,49 @@ extern int gdbtk_test (char *); exit (0); } - if (!quiet) + /* FIXME: cagney/2003-02-03: The big hack (part 1 of 2) that lets + GDB retain the old MI1 interpreter startup behavior. Output the + copyright message before the interpreter is installed. That way + it isn't encapsulated in MI output. */ + if (!quiet && strcmp (interpreter_p, INTERP_MI1) == 0) + { + /* Print all the junk at the top, with trailing "..." if we are about + to read a symbol file (possibly slowly). */ + print_gdb_version (gdb_stdout); + if (symarg) + printf_filtered (".."); + wrap_here (""); + gdb_flush (gdb_stdout); /* Force to screen during slow operations */ + } + + + /* Install the default UI. All the interpreters should have had a + look at things by now. Initialize the default interpreter. */ + + { + /* Find it. */ + struct interp *interp = interp_lookup (interpreter_p); + if (interp == NULL) + { + fprintf_unfiltered (gdb_stderr, "Interpreter `%s' unrecognized.\n", + interpreter_p); + exit (1); + } + /* Install it. */ + if (!interp_set (interp)) + { + fprintf_unfiltered (gdb_stderr, + "Interpreter `%s' failed to initialize.\n", + interpreter_p); + exit (1); + } + } + + /* FIXME: cagney/2003-02-03: The big hack (part 2 of 2) that lets + GDB retain the old MI1 interpreter startup behavior. Output the + copyright message after the interpreter is installed when it is + any sane interpreter. */ + if (!quiet && !current_interp_named_p (INTERP_MI1)) { /* Print all the junk at the top, with trailing "..." if we are about to read a symbol file (possibly slowly). */ diff --git a/gdb/mi/ChangeLog b/gdb/mi/ChangeLog index 58a1ce95af..e79398c15a 100644 --- a/gdb/mi/ChangeLog +++ b/gdb/mi/ChangeLog @@ -1,3 +1,33 @@ +2003-02-04 Jim Ingham + Keith Seitz + Elena Zannoni + Andrew Cagney + + * mi-main.h: New file. + * mi-interp.c: New file. + * mi-main.c: Include "interps.h". + (mi_error_message): Make global. + (mi_input): Delete static function, moved to "mi-interp.c". + (mi_execute_command, mi_execute_command_wrapper): Ditto. + (mi_command_loop, mi1_command_loop, mi2_command_loop): Ditto. + (mi_load_progress): Make non-static. + (mi_error_last_message): New function. + (captured_mi_execute_command): If the interpreter changed, don't + print anything. + (mi_load_progress): Use current_interp_named_p. + (mi_init_ui): Delete function. + (_initialize_mi_main): Don't install the mi interpreter, handled + by "mi-interp.c". + (mi_exec_async_cli_cmd_continuation): Make static. + * mi-console.h (mi_console_file_new): Add `quote' parameter. + * mi-console.c (struct mi_console_file): Add `quote'. + (mi_console_file_new): Add `quote' parameter. Initialize `quote'. + (mi_console_raw_packet): Only quote the output when `quote'. + * mi-cmds.h (mi_cmd_interpreter_exec): Declare. + (mi_error_message, mi_error_last_message): Declare. + (mi_execute_command): Declare. + * mi-cmds.c: Add `interpreter-exec' command. + 2003-02-04 Andrew Cagney From Keith Seitz : @@ -144,7 +174,6 @@ 2002-07-29 Andrew Cagney - * mi-cmd-var.c: Include "gdb_string.h". * mi-cmd-disas.c: Ditto. diff --git a/gdb/mi/mi-cmds.c b/gdb/mi/mi-cmds.c index 699937d0ff..5a0bf50754 100644 --- a/gdb/mi/mi-cmds.c +++ b/gdb/mi/mi-cmds.c @@ -1,5 +1,7 @@ -/* MI Command Set. - Copyright 2000, 2001 Free Software Foundation, Inc. +/* MI Command Set for GDB, the GNU debugger. + + Copyright 2000, 2001, 2003 Free Software Foundation, Inc. + Contributed by Cygnus Solutions (a Red Hat company). This file is part of GDB. @@ -88,6 +90,7 @@ struct mi_cmd mi_cmds[] = {"gdb-show", "show %s", 0}, {"gdb-source", 0, 0}, {"gdb-version", "show version", 0}, + {"interpreter-exec", 0, 0, mi_cmd_interpreter_exec}, {"kod-info", 0, 0}, {"kod-list", 0, 0}, {"kod-list-object-types", 0, 0}, diff --git a/gdb/mi/mi-cmds.h b/gdb/mi/mi-cmds.h index f4fe64d279..3eb6153694 100644 --- a/gdb/mi/mi-cmds.h +++ b/gdb/mi/mi-cmds.h @@ -1,5 +1,7 @@ -/* MI Command Set. - Copyright 2000 Free Software Foundation, Inc. +/* MI Command Set for GDB, the GNU debugger. + + Copyright 2000, 2003 Free Software Foundation, Inc. + Contributed by Cygnus Solutions (a Red Hat company). This file is part of GDB. @@ -79,6 +81,7 @@ extern mi_cmd_args_ftype mi_cmd_exec_step_instruction; extern mi_cmd_args_ftype mi_cmd_exec_until; extern mi_cmd_args_ftype mi_cmd_exec_interrupt; extern mi_cmd_argv_ftype mi_cmd_gdb_exit; +extern mi_cmd_argv_ftype mi_cmd_interpreter_exec; extern mi_cmd_argv_ftype mi_cmd_stack_info_depth; extern mi_cmd_argv_ftype mi_cmd_stack_list_args; extern mi_cmd_argv_ftype mi_cmd_stack_list_frames; @@ -126,4 +129,8 @@ extern int mi_debug_p; /* Raw console output - FIXME: should this be a parameter? */ extern struct ui_file *raw_stdout; +extern char *mi_error_message; +extern void mi_error_last_message (void); +extern void mi_execute_command (char *cmd, int from_tty); + #endif diff --git a/gdb/mi/mi-console.c b/gdb/mi/mi-console.c index c1b6e9f7b3..aca008640f 100644 --- a/gdb/mi/mi-console.c +++ b/gdb/mi/mi-console.c @@ -37,13 +37,14 @@ struct mi_console_file struct ui_file *raw; struct ui_file *buffer; const char *prefix; + char quote; }; int mi_console_file_magic; struct ui_file * mi_console_file_new (struct ui_file *raw, - const char *prefix) + const char *prefix, char quote) { struct ui_file *ui_file = ui_file_new (); struct mi_console_file *mi_console = XMALLOC (struct mi_console_file); @@ -51,6 +52,7 @@ mi_console_file_new (struct ui_file *raw, mi_console->raw = raw; mi_console->buffer = mem_fileopen (); mi_console->prefix = prefix; + mi_console->quote = quote; set_ui_file_fputs (ui_file, mi_console_file_fputs); set_ui_file_flush (ui_file, mi_console_file_flush); set_ui_file_data (ui_file, mi_console, mi_console_file_delete); @@ -96,9 +98,17 @@ mi_console_raw_packet (void *data, if (length_buf > 0) { fputs_unfiltered (mi_console->prefix, mi_console->raw); - fputs_unfiltered ("\"", mi_console->raw); - fputstrn_unfiltered (buf, length_buf, '"', mi_console->raw); - fputs_unfiltered ("\"\n", mi_console->raw); + if (mi_console->quote) + { + fputs_unfiltered ("\"", mi_console->raw); + fputstrn_unfiltered (buf, length_buf, mi_console->quote, mi_console->raw); + fputs_unfiltered ("\"\n", mi_console->raw); + } + else + { + fputstrn_unfiltered (buf, length_buf, 0, mi_console->raw); + fputs_unfiltered ("\n", mi_console->raw); + } gdb_flush (mi_console->raw); } } diff --git a/gdb/mi/mi-console.h b/gdb/mi/mi-console.h index 6bd03cbd92..bc6c008539 100644 --- a/gdb/mi/mi-console.h +++ b/gdb/mi/mi-console.h @@ -22,6 +22,8 @@ #ifndef MI_CONSOLE_H #define MI_CONSOLE_H -extern struct ui_file *mi_console_file_new (struct ui_file *raw, const char *prefix); +extern struct ui_file *mi_console_file_new (struct ui_file *raw, + const char *prefix, + char quote); #endif diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index 96030b71ab..8a54108bca 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -33,6 +33,7 @@ #include "mi-console.h" #include "ui-out.h" #include "mi-out.h" +#include "interps.h" #include "event-loop.h" #include "event-top.h" #include "gdbcore.h" /* for write_memory() */ @@ -79,27 +80,29 @@ struct ui_file *raw_stdout; /* The token of the last asynchronous command */ static char *last_async_command; static char *previous_async_command; -static char *mi_error_message; +char *mi_error_message; static char *old_regs; extern void _initialize_mi_main (void); -static char *mi_input (char *); -static void mi_execute_command (char *cmd, int from_tty); static enum mi_cmd_result mi_cmd_execute (struct mi_parse *parse); static void mi_execute_cli_command (const char *cli, char *args); static enum mi_cmd_result mi_execute_async_cli_command (char *mi, char *args, int from_tty); -static void mi_execute_command_wrapper (char *cmd); -void mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg); +static void mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg); static int register_changed_p (int regnum); static int get_register (int regnum, int format); -static void mi_load_progress (const char *section_name, - unsigned long sent_so_far, - unsigned long total_section, - unsigned long total_sent, - unsigned long grand_total); + +/* A helper function which will set mi_error_message to + error_last_message. */ +void +mi_error_last_message (void) +{ + char *s = error_last_message (); + xasprintf (&mi_error_message, s); + xfree (s); +} /* Command implementations. FIXME: Is this libgdb? No. This is the MI layer that calls libgdb. Any operation used in the below should be @@ -1098,7 +1101,12 @@ captured_mi_execute_command (struct ui_out *uiout, void *data) if (!target_can_async_p () || !target_executing) { - /* print the result if there were no errors */ + /* print the result if there were no errors + + Remember that on the way out of executing a command, you have + to directly use the mi_interp's uiout, since the command could + have reset the interpreter, in which case the current uiout + will most likely crash in the mi_out_* routines. */ if (args->rc == MI_CMD_DONE) { fputs_unfiltered (context->token, raw_stdout); @@ -1146,15 +1154,21 @@ captured_mi_execute_command (struct ui_out *uiout, void *data) /* FIXME: If the command string has something that looks like a format spec (e.g. %s) we will get a core dump */ mi_execute_cli_command ("%s", context->command); - /* print the result */ - /* FIXME: Check for errors here. */ - fputs_unfiltered (context->token, raw_stdout); - fputs_unfiltered ("^done", raw_stdout); - mi_out_put (uiout, raw_stdout); - mi_out_rewind (uiout); - fputs_unfiltered ("\n", raw_stdout); - args->action = EXECUTE_COMMAND_DISPLAY_PROMPT; - args->rc = MI_CMD_DONE; + + /* If we changed interpreters, DON'T print out anything. */ + if (current_interp_named_p (INTERP_MI) + || current_interp_named_p (INTERP_MI1)) + { + /* print the result */ + /* FIXME: Check for errors here. */ + fputs_unfiltered (context->token, raw_stdout); + fputs_unfiltered ("^done", raw_stdout); + mi_out_put (uiout, raw_stdout); + mi_out_rewind (uiout); + fputs_unfiltered ("\n", raw_stdout); + args->action = EXECUTE_COMMAND_DISPLAY_PROMPT; + args->rc = MI_CMD_DONE; + } break; } @@ -1169,7 +1183,7 @@ mi_execute_command (char *cmd, int from_tty) struct mi_parse *command; struct captured_mi_execute_command_args args; struct ui_out *saved_uiout = uiout; - int result, rc; + int result; /* This is to handle EOF (^D). We just quit gdb. */ /* FIXME: we should call some API function here. */ @@ -1277,12 +1291,6 @@ mi_cmd_execute (struct mi_parse *parse) } } -static void -mi_execute_command_wrapper (char *cmd) -{ - mi_execute_command (cmd, stdin == instream); -} - /* FIXME: This is just a hack so we can get some extra commands going. We don't want to channel things through the CLI, but call libgdb directly */ /* Use only for synchronous commands */ @@ -1385,13 +1393,7 @@ mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg) do_exec_cleanups (ALL_CLEANUPS); } -static char * -mi_input (char *buf) -{ - return gdb_readline (NULL); -} - -static void +void mi_load_progress (const char *section_name, unsigned long sent_so_far, unsigned long total_section, @@ -1403,7 +1405,8 @@ mi_load_progress (const char *section_name, static char *previous_sect_name = NULL; int new_section; - if (!interpreter_p || strncmp (interpreter_p, "mi", 2) != 0) + if (!current_interp_named_p (INTERP_MI) + && !current_interp_named_p (INTERP_MI1)) return; update_threshold.tv_sec = 0; @@ -1462,131 +1465,17 @@ mi_load_progress (const char *section_name, } } -static void -mi_command_loop (int mi_version) -{ - if (mi_version <= 1) - { - /* HACK: Force stdout/stderr to point at the console. This avoids - any potential side effects caused by legacy code that is still - using the TUI / fputs_unfiltered_hook */ - raw_stdout = stdio_fileopen (stdout); - /* Route normal output through the MIx */ - gdb_stdout = mi_console_file_new (raw_stdout, "~"); - } - - /* Route error and log output through the MI */ - gdb_stderr = mi_console_file_new (raw_stdout, "&"); - gdb_stdlog = gdb_stderr; - /* Route target output through the MI. */ - gdb_stdtarg = mi_console_file_new (raw_stdout, "@"); - - /* HACK: Poke the ui_out table directly. Should we be creating a - mi_out object wired up to the above gdb_stdout / gdb_stderr? */ - uiout = mi_out_new (mi_version); - - /* HACK: Override any other interpreter hooks. We need to create a - real event table and pass in that. */ - init_ui_hook = 0; - /* command_loop_hook = 0; */ - print_frame_info_listing_hook = 0; - query_hook = 0; - warning_hook = 0; - create_breakpoint_hook = 0; - delete_breakpoint_hook = 0; - modify_breakpoint_hook = 0; - interactive_hook = 0; - registers_changed_hook = 0; - readline_begin_hook = 0; - readline_hook = 0; - readline_end_hook = 0; - register_changed_hook = 0; - memory_changed_hook = 0; - context_hook = 0; - target_wait_hook = 0; - call_command_hook = 0; - error_hook = 0; - error_begin_hook = 0; - show_load_progress = mi_load_progress; - - /* Turn off 8 bit strings in quoted output. Any character with the - high bit set is printed using C's octal format. */ - sevenbit_strings = 1; - - /* Tell the world that we're alive */ - fputs_unfiltered ("(gdb) \n", raw_stdout); - gdb_flush (raw_stdout); - - if (!event_loop_p) - simplified_command_loop (mi_input, mi_execute_command); - else - start_event_loop (); -} - -static void -mi1_command_loop (void) -{ - mi_command_loop (1); -} - -static void -mi2_command_loop (void) -{ - mi_command_loop (2); -} - -static void -setup_architecture_data (void) +void +mi_setup_architecture_data (void) { /* don't trust REGISTER_BYTES to be zero. */ old_regs = xmalloc (REGISTER_BYTES + 1); memset (old_regs, 0, REGISTER_BYTES + 1); } -static void -mi_init_ui (char *arg0) -{ - if (strlen (interpreter_p) <= 2 || - interpreter_p[2] > '1') - { - /* HACK: Force stdout/stderr to point at the console. This avoids - any potential side effects caused by legacy code that is still - using the TUI / fputs_unfiltered_hook */ - raw_stdout = stdio_fileopen (stdout); - /* Route normal output through the MIx */ - gdb_stdout = mi_console_file_new (raw_stdout, "~"); - } -} - void _initialize_mi_main (void) { - if (interpreter_p == NULL) - return; - - /* If we're _the_ interpreter, take control. */ - if (strcmp (interpreter_p, "mi") == 0) - command_loop_hook = mi2_command_loop; - else if (strcmp (interpreter_p, "mi1") == 0) - command_loop_hook = mi1_command_loop; - else if (strcmp (interpreter_p, "mi2") == 0) - command_loop_hook = mi2_command_loop; - else - return; - - init_ui_hook = mi_init_ui; - setup_architecture_data (); register_gdbarch_swap (&old_regs, sizeof (old_regs), NULL); - register_gdbarch_swap (NULL, 0, setup_architecture_data); - if (event_loop_p) - { - /* These overwrite some of the initialization done in - _intialize_event_loop. */ - call_readline = gdb_readline2; - input_handler = mi_execute_command_wrapper; - add_file_handler (input_fd, stdin_event_handler, 0); - async_command_editing_p = 0; - } - /* FIXME: Should we notify main that we are here as a possible - interpreter? */ + register_gdbarch_swap (NULL, 0, mi_setup_architecture_data); } diff --git a/gdb/top.c b/gdb/top.c index dcffb05143..fea71dfd87 100644 --- a/gdb/top.c +++ b/gdb/top.c @@ -2124,19 +2124,4 @@ gdb_init (char *argv0) it wants GDB to revert to the CLI, it should clear init_ui_hook. */ if (init_ui_hook) init_ui_hook (argv0); - - /* Install the default UI */ - if (!init_ui_hook) - { - uiout = cli_out_new (gdb_stdout); - - /* All the interpreters should have had a look at things by now. - Initialize the selected interpreter. */ - if (interpreter_p) - { - fprintf_unfiltered (gdb_stderr, "Interpreter `%s' unrecognized.\n", - interpreter_p); - exit (1); - } - } } diff --git a/gdb/wrapper.h b/gdb/wrapper.h index 977a77d04c..b287b29db1 100644 --- a/gdb/wrapper.h +++ b/gdb/wrapper.h @@ -21,6 +21,8 @@ #include "gdb.h" struct value; +struct expression; +struct block; /* Use this struct to pass arguments to wrapper routines. */ struct gdb_wrapper_arguments; -- 2.34.1