1 /* MI Interpreter Definitions and Commands for GDB, the GNU debugger.
3 Copyright (C) 2002-2005, 2007-2012 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21 #include "gdb_string.h"
23 #include "event-top.h"
24 #include "event-loop.h"
28 #include "exceptions.h"
32 #include "mi-console.h"
33 #include "mi-common.h"
35 #include "gdbthread.h"
39 /* These are the interpreter setup, etc. functions for the MI
42 static void mi_execute_command_wrapper (char *cmd);
43 static void mi_execute_command_input_handler (char *cmd);
44 static void mi_command_loop (int mi_version);
46 /* These are hooks that we put in place while doing interpreter_exec
47 so we can report interesting things that happened "behind the MI's
48 back" in this command. */
50 static int mi_interp_query_hook (const char *ctlstr, va_list ap)
51 ATTRIBUTE_PRINTF (1, 0);
53 static void mi3_command_loop (void);
54 static void mi2_command_loop (void);
55 static void mi1_command_loop (void);
57 static void mi_insert_notify_hooks (void);
58 static void mi_remove_notify_hooks (void);
59 static void mi_on_normal_stop (struct bpstats *bs, int print_frame);
61 static void mi_new_thread (struct thread_info *t);
62 static void mi_thread_exit (struct thread_info *t, int silent);
63 static void mi_record_changed (struct inferior*, int);
64 static void mi_inferior_added (struct inferior *inf);
65 static void mi_inferior_appeared (struct inferior *inf);
66 static void mi_inferior_exit (struct inferior *inf);
67 static void mi_inferior_removed (struct inferior *inf);
68 static void mi_on_resume (ptid_t ptid);
69 static void mi_solib_loaded (struct so_list *solib);
70 static void mi_solib_unloaded (struct so_list *solib);
71 static void mi_about_to_proceed (void);
72 static void mi_traceframe_changed (int tfnum, int tpnum);
73 static void mi_tsv_created (const char *name, LONGEST value);
74 static void mi_tsv_deleted (const char *name);
75 static void mi_breakpoint_created (struct breakpoint *b);
76 static void mi_breakpoint_deleted (struct breakpoint *b);
77 static void mi_breakpoint_modified (struct breakpoint *b);
78 static void mi_command_param_changed (const char *param, const char *value);
80 static int report_initial_inferior (struct inferior *inf, void *closure);
83 mi_interpreter_init (struct interp *interp, int top_level)
85 struct mi_interp *mi = XMALLOC (struct mi_interp);
89 /* Assign the output channel created at startup to its own global,
90 so that we can create a console channel that encapsulates and
91 prefixes all gdb_output-type bits coming from the rest of the
94 raw_stdout = gdb_stdout;
96 /* Create MI console channels, each with a different prefix so they
97 can be distinguished. */
98 mi->out = mi_console_file_new (raw_stdout, "~", '"');
99 mi->err = mi_console_file_new (raw_stdout, "&", '"');
101 mi->targ = mi_console_file_new (raw_stdout, "@", '"');
102 mi->event_channel = mi_console_file_new (raw_stdout, "=", 0);
104 name = interp_name (interp);
105 /* INTERP_MI selects the most recent released version. "mi2" was
106 released as part of GDB 6.0. */
107 if (strcmp (name, INTERP_MI) == 0)
109 else if (strcmp (name, INTERP_MI1) == 0)
111 else if (strcmp (name, INTERP_MI2) == 0)
113 else if (strcmp (name, INTERP_MI3) == 0)
116 gdb_assert_not_reached ("unhandled MI version");
118 mi->uiout = mi_out_new (mi_version);
122 observer_attach_new_thread (mi_new_thread);
123 observer_attach_thread_exit (mi_thread_exit);
124 observer_attach_inferior_added (mi_inferior_added);
125 observer_attach_inferior_appeared (mi_inferior_appeared);
126 observer_attach_inferior_exit (mi_inferior_exit);
127 observer_attach_inferior_removed (mi_inferior_removed);
128 observer_attach_record_changed (mi_record_changed);
129 observer_attach_normal_stop (mi_on_normal_stop);
130 observer_attach_target_resumed (mi_on_resume);
131 observer_attach_solib_loaded (mi_solib_loaded);
132 observer_attach_solib_unloaded (mi_solib_unloaded);
133 observer_attach_about_to_proceed (mi_about_to_proceed);
134 observer_attach_traceframe_changed (mi_traceframe_changed);
135 observer_attach_tsv_created (mi_tsv_created);
136 observer_attach_tsv_deleted (mi_tsv_deleted);
137 observer_attach_breakpoint_created (mi_breakpoint_created);
138 observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
139 observer_attach_breakpoint_modified (mi_breakpoint_modified);
140 observer_attach_command_param_changed (mi_command_param_changed);
142 /* The initial inferior is created before this function is
143 called, so we need to report it explicitly. Use iteration in
144 case future version of GDB creates more than one inferior
146 iterate_over_inferiors (report_initial_inferior, mi);
153 mi_interpreter_resume (void *data)
155 struct mi_interp *mi = data;
157 /* As per hack note in mi_interpreter_init, swap in the output
159 gdb_setup_readline ();
161 /* These overwrite some of the initialization done in
162 _intialize_event_loop. */
163 call_readline = gdb_readline2;
164 input_handler = mi_execute_command_input_handler;
165 add_file_handler (input_fd, stdin_event_handler, 0);
166 async_command_editing_p = 0;
167 /* FIXME: This is a total hack for now. PB's use of the MI
168 implicitly relies on a bug in the async support which allows
169 asynchronous commands to leak through the commmand loop. The bug
170 involves (but is not limited to) the fact that sync_execution was
171 erroneously initialized to 0. Duplicate by initializing it thus
175 gdb_stdout = mi->out;
176 /* Route error and log output through the MI. */
177 gdb_stderr = mi->err;
178 gdb_stdlog = mi->log;
179 /* Route target output through the MI. */
180 gdb_stdtarg = mi->targ;
181 /* Route target error through the MI as well. */
182 gdb_stdtargerr = mi->targ;
184 /* Replace all the hooks that we know about. There really needs to
185 be a better way of doing this... */
186 clear_interpreter_hooks ();
188 deprecated_show_load_progress = mi_load_progress;
190 /* If we're _the_ interpreter, take control. */
191 if (current_interp_named_p (INTERP_MI1))
192 deprecated_command_loop_hook = mi1_command_loop;
193 else if (current_interp_named_p (INTERP_MI2))
194 deprecated_command_loop_hook = mi2_command_loop;
195 else if (current_interp_named_p (INTERP_MI3))
196 deprecated_command_loop_hook = mi3_command_loop;
198 deprecated_command_loop_hook = mi2_command_loop;
204 mi_interpreter_suspend (void *data)
206 gdb_disable_readline ();
210 static struct gdb_exception
211 mi_interpreter_exec (void *data, const char *command)
213 char *tmp = alloca (strlen (command) + 1);
215 strcpy (tmp, command);
216 mi_execute_command_wrapper (tmp);
217 return exception_none;
220 /* Never display the default GDB prompt in MI case. */
223 mi_interpreter_prompt_p (void *data)
229 mi_cmd_interpreter_exec (char *command, char **argv, int argc)
231 struct interp *interp_to_use;
233 char *mi_error_message = NULL;
234 struct cleanup *old_chain;
237 error (_("-interpreter-exec: "
238 "Usage: -interpreter-exec interp command"));
240 interp_to_use = interp_lookup (argv[0]);
241 if (interp_to_use == NULL)
242 error (_("-interpreter-exec: could not find interpreter \"%s\""),
245 if (!interp_exec_p (interp_to_use))
246 error (_("-interpreter-exec: interpreter \"%s\" "
247 "does not support command execution"),
250 /* Insert the MI out hooks, making sure to also call the
251 interpreter's hooks if it has any. */
252 /* KRS: We shouldn't need this... Events should be installed and
253 they should just ALWAYS fire something out down the MI
255 mi_insert_notify_hooks ();
257 /* Now run the code. */
259 old_chain = make_cleanup (null_cleanup, 0);
260 for (i = 1; i < argc; i++)
262 struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
266 mi_error_message = xstrdup (e.message);
267 make_cleanup (xfree, mi_error_message);
272 mi_remove_notify_hooks ();
274 if (mi_error_message != NULL)
275 error ("%s", mi_error_message);
276 do_cleanups (old_chain);
279 /* This inserts a number of hooks that are meant to produce
280 async-notify ("=") MI messages while running commands in another
281 interpreter using mi_interpreter_exec. The canonical use for this
282 is to allow access to the gdb CLI interpreter from within the MI,
283 while still producing MI style output when actions in the CLI
284 command change GDB's state. */
287 mi_insert_notify_hooks (void)
289 deprecated_query_hook = mi_interp_query_hook;
293 mi_remove_notify_hooks (void)
295 deprecated_query_hook = NULL;
299 mi_interp_query_hook (const char *ctlstr, va_list ap)
305 mi_execute_command_wrapper (char *cmd)
307 mi_execute_command (cmd, stdin == instream);
310 /* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER. */
313 mi_execute_command_input_handler (char *cmd)
315 mi_execute_command_wrapper (cmd);
317 fputs_unfiltered ("(gdb) \n", raw_stdout);
318 gdb_flush (raw_stdout);
322 mi1_command_loop (void)
328 mi2_command_loop (void)
334 mi3_command_loop (void)
340 mi_command_loop (int mi_version)
342 /* Turn off 8 bit strings in quoted output. Any character with the
343 high bit set is printed using C's octal format. */
344 sevenbit_strings = 1;
346 /* Tell the world that we're alive. */
347 fputs_unfiltered ("(gdb) \n", raw_stdout);
348 gdb_flush (raw_stdout);
354 mi_new_thread (struct thread_info *t)
356 struct mi_interp *mi = top_level_interpreter_data ();
357 struct inferior *inf = find_inferior_pid (ptid_get_pid (t->ptid));
361 fprintf_unfiltered (mi->event_channel,
362 "thread-created,id=\"%d\",group-id=\"i%d\"",
364 gdb_flush (mi->event_channel);
368 mi_thread_exit (struct thread_info *t, int silent)
370 struct mi_interp *mi;
371 struct inferior *inf;
376 inf = find_inferior_pid (ptid_get_pid (t->ptid));
378 mi = top_level_interpreter_data ();
379 target_terminal_ours ();
380 fprintf_unfiltered (mi->event_channel,
381 "thread-exited,id=\"%d\",group-id=\"i%d\"",
383 gdb_flush (mi->event_channel);
386 /* Emit notification on changing the state of record. */
389 mi_record_changed (struct inferior *inferior, int started)
391 struct mi_interp *mi = top_level_interpreter_data ();
393 fprintf_unfiltered (mi->event_channel, "record-%s,thread-group=\"i%d\"",
394 started ? "started" : "stopped", inferior->num);
396 gdb_flush (mi->event_channel);
400 mi_inferior_added (struct inferior *inf)
402 struct mi_interp *mi = top_level_interpreter_data ();
404 target_terminal_ours ();
405 fprintf_unfiltered (mi->event_channel,
406 "thread-group-added,id=\"i%d\"",
408 gdb_flush (mi->event_channel);
412 mi_inferior_appeared (struct inferior *inf)
414 struct mi_interp *mi = top_level_interpreter_data ();
416 target_terminal_ours ();
417 fprintf_unfiltered (mi->event_channel,
418 "thread-group-started,id=\"i%d\",pid=\"%d\"",
420 gdb_flush (mi->event_channel);
424 mi_inferior_exit (struct inferior *inf)
426 struct mi_interp *mi = top_level_interpreter_data ();
428 target_terminal_ours ();
429 if (inf->has_exit_code)
430 fprintf_unfiltered (mi->event_channel,
431 "thread-group-exited,id=\"i%d\",exit-code=\"%s\"",
432 inf->num, int_string (inf->exit_code, 8, 0, 0, 1));
434 fprintf_unfiltered (mi->event_channel,
435 "thread-group-exited,id=\"i%d\"", inf->num);
437 gdb_flush (mi->event_channel);
441 mi_inferior_removed (struct inferior *inf)
443 struct mi_interp *mi = top_level_interpreter_data ();
445 target_terminal_ours ();
446 fprintf_unfiltered (mi->event_channel,
447 "thread-group-removed,id=\"i%d\"",
449 gdb_flush (mi->event_channel);
453 mi_on_normal_stop (struct bpstats *bs, int print_frame)
455 /* Since this can be called when CLI command is executing,
456 using cli interpreter, be sure to use MI uiout for output,
457 not the current one. */
458 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
464 if (current_uiout != mi_uiout)
466 /* The normal_stop function has printed frame information
467 into CLI uiout, or some other non-MI uiout. There's no
468 way we can extract proper fields from random uiout
469 object, so we print the frame again. In practice, this
470 can only happen when running a CLI command in MI. */
471 struct ui_out *saved_uiout = current_uiout;
472 struct target_waitstatus last;
475 current_uiout = mi_uiout;
477 get_last_target_status (&last_ptid, &last);
478 bpstat_print (bs, last.kind);
480 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
481 current_uiout = saved_uiout;
484 ui_out_field_int (mi_uiout, "thread-id",
485 pid_to_thread_id (inferior_ptid));
488 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end
489 (mi_uiout, "stopped-threads");
491 ui_out_field_int (mi_uiout, NULL,
492 pid_to_thread_id (inferior_ptid));
493 do_cleanups (back_to);
496 ui_out_field_string (mi_uiout, "stopped-threads", "all");
498 core = target_core_of_thread (inferior_ptid);
500 ui_out_field_int (mi_uiout, "core", core);
503 fputs_unfiltered ("*stopped", raw_stdout);
504 mi_out_put (mi_uiout, raw_stdout);
505 mi_out_rewind (mi_uiout);
506 mi_print_timing_maybe ();
507 fputs_unfiltered ("\n", raw_stdout);
508 gdb_flush (raw_stdout);
512 mi_about_to_proceed (void)
514 /* Suppress output while calling an inferior function. */
516 if (!ptid_equal (inferior_ptid, null_ptid))
518 struct thread_info *tp = inferior_thread ();
520 if (tp->control.in_infcall)
527 /* When the element is non-zero, no MI notifications will be emitted in
528 response to the corresponding observers. */
530 struct mi_suppress_notification mi_suppress_notification =
537 /* Emit notification on changing a traceframe. */
540 mi_traceframe_changed (int tfnum, int tpnum)
542 struct mi_interp *mi = top_level_interpreter_data ();
544 if (mi_suppress_notification.traceframe)
547 target_terminal_ours ();
550 fprintf_unfiltered (mi->event_channel, "traceframe-changed,"
551 "num=\"%d\",tracepoint=\"%d\"\n",
554 fprintf_unfiltered (mi->event_channel, "traceframe-changed,end");
556 gdb_flush (mi->event_channel);
559 /* Emit notification on creating a trace state variable. */
562 mi_tsv_created (const char *name, LONGEST value)
564 struct mi_interp *mi = top_level_interpreter_data ();
566 target_terminal_ours ();
568 fprintf_unfiltered (mi->event_channel, "tsv-created,"
569 "name=\"%s\",value=\"%s\"\n",
570 name, plongest (value));
572 gdb_flush (mi->event_channel);
575 /* Emit notification on deleting a trace state variable. */
578 mi_tsv_deleted (const char *name)
580 struct mi_interp *mi = top_level_interpreter_data ();
582 target_terminal_ours ();
585 fprintf_unfiltered (mi->event_channel, "tsv-deleted,"
586 "name=\"%s\"\n", name);
588 fprintf_unfiltered (mi->event_channel, "tsv-deleted\n");
590 gdb_flush (mi->event_channel);
593 /* Emit notification about a created breakpoint. */
596 mi_breakpoint_created (struct breakpoint *b)
598 struct mi_interp *mi = top_level_interpreter_data ();
599 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
600 volatile struct gdb_exception e;
602 if (mi_suppress_notification.breakpoint)
608 target_terminal_ours ();
609 fprintf_unfiltered (mi->event_channel,
610 "breakpoint-created");
611 /* We want the output from gdb_breakpoint_query to go to
612 mi->event_channel. One approach would be to just call
613 gdb_breakpoint_query, and then use mi_out_put to send the current
614 content of mi_outout into mi->event_channel. However, that will
615 break if anything is output to mi_uiout prior to calling the
616 breakpoint_created notifications. So, we use
618 ui_out_redirect (mi_uiout, mi->event_channel);
619 TRY_CATCH (e, RETURN_MASK_ERROR)
620 gdb_breakpoint_query (mi_uiout, b->number, NULL);
621 ui_out_redirect (mi_uiout, NULL);
623 gdb_flush (mi->event_channel);
626 /* Emit notification about deleted breakpoint. */
629 mi_breakpoint_deleted (struct breakpoint *b)
631 struct mi_interp *mi = top_level_interpreter_data ();
633 if (mi_suppress_notification.breakpoint)
639 target_terminal_ours ();
641 fprintf_unfiltered (mi->event_channel, "breakpoint-deleted,id=\"%d\"",
644 gdb_flush (mi->event_channel);
647 /* Emit notification about modified breakpoint. */
650 mi_breakpoint_modified (struct breakpoint *b)
652 struct mi_interp *mi = top_level_interpreter_data ();
653 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
654 volatile struct gdb_exception e;
656 if (mi_suppress_notification.breakpoint)
662 target_terminal_ours ();
663 fprintf_unfiltered (mi->event_channel,
664 "breakpoint-modified");
665 /* We want the output from gdb_breakpoint_query to go to
666 mi->event_channel. One approach would be to just call
667 gdb_breakpoint_query, and then use mi_out_put to send the current
668 content of mi_outout into mi->event_channel. However, that will
669 break if anything is output to mi_uiout prior to calling the
670 breakpoint_created notifications. So, we use
672 ui_out_redirect (mi_uiout, mi->event_channel);
673 TRY_CATCH (e, RETURN_MASK_ERROR)
674 gdb_breakpoint_query (mi_uiout, b->number, NULL);
675 ui_out_redirect (mi_uiout, NULL);
677 gdb_flush (mi->event_channel);
681 mi_output_running_pid (struct thread_info *info, void *arg)
685 if (ptid_get_pid (*ptid) == ptid_get_pid (info->ptid))
686 fprintf_unfiltered (raw_stdout,
687 "*running,thread-id=\"%d\"\n",
694 mi_inferior_count (struct inferior *inf, void *arg)
706 mi_on_resume (ptid_t ptid)
708 struct thread_info *tp = NULL;
710 if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
711 tp = inferior_thread ();
713 tp = find_thread_ptid (ptid);
715 /* Suppress output while calling an inferior function. */
716 if (tp->control.in_infcall)
719 /* To cater for older frontends, emit ^running, but do it only once
720 per each command. We do it here, since at this point we know
721 that the target was successfully resumed, and in non-async mode,
722 we won't return back to MI interpreter code until the target
723 is done running, so delaying the output of "^running" until then
724 will make it impossible for frontend to know what's going on.
726 In future (MI3), we'll be outputting "^done" here. */
727 if (!running_result_record_printed && mi_proceeded)
729 fprintf_unfiltered (raw_stdout, "%s^running\n",
730 current_token ? current_token : "");
733 if (PIDGET (ptid) == -1)
734 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"all\"\n");
735 else if (ptid_is_pid (ptid))
739 /* Backwards compatibility. If there's only one inferior,
740 output "all", otherwise, output each resumed thread
742 iterate_over_inferiors (mi_inferior_count, &count);
745 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"all\"\n");
747 iterate_over_threads (mi_output_running_pid, &ptid);
751 struct thread_info *ti = find_thread_ptid (ptid);
754 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"%d\"\n", ti->num);
757 if (!running_result_record_printed && mi_proceeded)
759 running_result_record_printed = 1;
760 /* This is what gdb used to do historically -- printing prompt even if
761 it cannot actually accept any input. This will be surely removed
762 for MI3, and may be removed even earler. */
763 /* FIXME: review the use of target_is_async_p here -- is that
765 if (!target_is_async_p ())
766 fputs_unfiltered ("(gdb) \n", raw_stdout);
768 gdb_flush (raw_stdout);
772 mi_solib_loaded (struct so_list *solib)
774 struct mi_interp *mi = top_level_interpreter_data ();
776 target_terminal_ours ();
777 if (gdbarch_has_global_solist (target_gdbarch))
778 fprintf_unfiltered (mi->event_channel,
779 "library-loaded,id=\"%s\",target-name=\"%s\","
780 "host-name=\"%s\",symbols-loaded=\"%d\"",
781 solib->so_original_name, solib->so_original_name,
782 solib->so_name, solib->symbols_loaded);
784 fprintf_unfiltered (mi->event_channel,
785 "library-loaded,id=\"%s\",target-name=\"%s\","
786 "host-name=\"%s\",symbols-loaded=\"%d\","
787 "thread-group=\"i%d\"",
788 solib->so_original_name, solib->so_original_name,
789 solib->so_name, solib->symbols_loaded,
790 current_inferior ()->num);
792 gdb_flush (mi->event_channel);
796 mi_solib_unloaded (struct so_list *solib)
798 struct mi_interp *mi = top_level_interpreter_data ();
800 target_terminal_ours ();
801 if (gdbarch_has_global_solist (target_gdbarch))
802 fprintf_unfiltered (mi->event_channel,
803 "library-unloaded,id=\"%s\",target-name=\"%s\","
805 solib->so_original_name, solib->so_original_name,
808 fprintf_unfiltered (mi->event_channel,
809 "library-unloaded,id=\"%s\",target-name=\"%s\","
810 "host-name=\"%s\",thread-group=\"i%d\"",
811 solib->so_original_name, solib->so_original_name,
812 solib->so_name, current_inferior ()->num);
814 gdb_flush (mi->event_channel);
817 /* Emit notification about the command parameter change. */
820 mi_command_param_changed (const char *param, const char *value)
822 struct mi_interp *mi = top_level_interpreter_data ();
823 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
825 if (mi_suppress_notification.cmd_param_changed)
828 target_terminal_ours ();
830 fprintf_unfiltered (mi->event_channel,
831 "cmd-param-changed");
833 ui_out_redirect (mi_uiout, mi->event_channel);
835 ui_out_field_string (mi_uiout, "param", param);
836 ui_out_field_string (mi_uiout, "value", value);
838 ui_out_redirect (mi_uiout, NULL);
840 gdb_flush (mi->event_channel);
844 report_initial_inferior (struct inferior *inf, void *closure)
846 /* This function is called from mi_intepreter_init, and since
847 mi_inferior_added assumes that inferior is fully initialized
848 and top_level_interpreter_data is set, we cannot call
850 struct mi_interp *mi = closure;
852 target_terminal_ours ();
853 fprintf_unfiltered (mi->event_channel,
854 "thread-group-added,id=\"i%d\"",
856 gdb_flush (mi->event_channel);
860 static struct ui_out *
861 mi_ui_out (struct interp *interp)
863 struct mi_interp *mi = interp_data (interp);
868 /* Save the original value of raw_stdout here when logging, so we can
869 restore correctly when done. */
871 static struct ui_file *saved_raw_stdout;
873 /* Do MI-specific logging actions; save raw_stdout, and change all
874 the consoles to use the supplied ui-file(s). */
877 mi_set_logging (struct interp *interp, int start_log,
878 struct ui_file *out, struct ui_file *logfile)
880 struct mi_interp *mi = interp_data (interp);
887 /* The tee created already is based on gdb_stdout, which for MI
888 is a console and so we end up in an infinite loop of console
889 writing to ui_file writing to console etc. So discard the
890 existing tee (it hasn't been used yet, and MI won't ever use
891 it), and create one based on raw_stdout instead. */
894 ui_file_delete (out);
895 out = tee_file_new (raw_stdout, 0, logfile, 0);
898 saved_raw_stdout = raw_stdout;
903 raw_stdout = saved_raw_stdout;
904 saved_raw_stdout = NULL;
907 mi_console_set_raw (mi->out, raw_stdout);
908 mi_console_set_raw (mi->err, raw_stdout);
909 mi_console_set_raw (mi->log, raw_stdout);
910 mi_console_set_raw (mi->targ, raw_stdout);
911 mi_console_set_raw (mi->event_channel, raw_stdout);
916 extern initialize_file_ftype _initialize_mi_interp; /* -Wmissing-prototypes */
919 _initialize_mi_interp (void)
921 static const struct interp_procs procs =
923 mi_interpreter_init, /* init_proc */
924 mi_interpreter_resume, /* resume_proc */
925 mi_interpreter_suspend, /* suspend_proc */
926 mi_interpreter_exec, /* exec_proc */
927 mi_interpreter_prompt_p, /* prompt_proc_p */
928 mi_ui_out, /* ui_out_proc */
929 mi_set_logging /* set_logging_proc */
932 /* The various interpreter levels. */
933 interp_add (interp_new (INTERP_MI1, &procs));
934 interp_add (interp_new (INTERP_MI2, &procs));
935 interp_add (interp_new (INTERP_MI3, &procs));
936 interp_add (interp_new (INTERP_MI, &procs));