1 /* MI Interpreter Definitions and Commands for GDB, the GNU debugger.
3 Copyright (C) 2002-2019 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/>. */
22 #include "event-top.h"
23 #include "event-loop.h"
31 #include "mi-console.h"
32 #include "mi-common.h"
33 #include "observable.h"
34 #include "gdbthread.h"
37 #include "tracepoint.h"
39 #include "thread-fsm.h"
40 #include "cli/cli-interp.h"
41 #include "common/scope-exit.h"
43 /* These are the interpreter setup, etc. functions for the MI
46 static void mi_execute_command_wrapper (const char *cmd);
47 static void mi_execute_command_input_handler
48 (gdb::unique_xmalloc_ptr<char> &&cmd);
50 /* These are hooks that we put in place while doing interpreter_exec
51 so we can report interesting things that happened "behind the MI's
52 back" in this command. */
54 static int mi_interp_query_hook (const char *ctlstr, va_list ap)
55 ATTRIBUTE_PRINTF (1, 0);
57 static void mi_insert_notify_hooks (void);
58 static void mi_remove_notify_hooks (void);
60 static void mi_on_signal_received (enum gdb_signal siggnal);
61 static void mi_on_end_stepping_range (void);
62 static void mi_on_signal_exited (enum gdb_signal siggnal);
63 static void mi_on_exited (int exitstatus);
64 static void mi_on_normal_stop (struct bpstats *bs, int print_frame);
65 static void mi_on_no_history (void);
67 static void mi_new_thread (struct thread_info *t);
68 static void mi_thread_exit (struct thread_info *t, int silent);
69 static void mi_record_changed (struct inferior*, int, const char *,
71 static void mi_inferior_added (struct inferior *inf);
72 static void mi_inferior_appeared (struct inferior *inf);
73 static void mi_inferior_exit (struct inferior *inf);
74 static void mi_inferior_removed (struct inferior *inf);
75 static void mi_on_resume (ptid_t ptid);
76 static void mi_solib_loaded (struct so_list *solib);
77 static void mi_solib_unloaded (struct so_list *solib);
78 static void mi_about_to_proceed (void);
79 static void mi_traceframe_changed (int tfnum, int tpnum);
80 static void mi_tsv_created (const struct trace_state_variable *tsv);
81 static void mi_tsv_deleted (const struct trace_state_variable *tsv);
82 static void mi_tsv_modified (const struct trace_state_variable *tsv);
83 static void mi_breakpoint_created (struct breakpoint *b);
84 static void mi_breakpoint_deleted (struct breakpoint *b);
85 static void mi_breakpoint_modified (struct breakpoint *b);
86 static void mi_command_param_changed (const char *param, const char *value);
87 static void mi_memory_changed (struct inferior *inf, CORE_ADDR memaddr,
88 ssize_t len, const bfd_byte *myaddr);
89 static void mi_on_sync_execution_done (void);
91 static int report_initial_inferior (struct inferior *inf, void *closure);
93 /* Display the MI prompt. */
96 display_mi_prompt (struct mi_interp *mi)
98 struct ui *ui = current_ui;
100 fputs_unfiltered ("(gdb) \n", mi->raw_stdout);
101 gdb_flush (mi->raw_stdout);
102 ui->prompt_state = PROMPTED;
105 /* Returns the INTERP's data cast as mi_interp if INTERP is an MI, and
106 returns NULL otherwise. */
108 static struct mi_interp *
109 as_mi_interp (struct interp *interp)
111 return dynamic_cast<mi_interp *> (interp);
115 mi_interp::init (bool top_level)
117 mi_interp *mi = this;
119 /* Store the current output channel, so that we can create a console
120 channel that encapsulates and prefixes all gdb_output-type bits
121 coming from the rest of the debugger. */
122 mi->raw_stdout = gdb_stdout;
124 /* Create MI console channels, each with a different prefix so they
125 can be distinguished. */
126 mi->out = new mi_console_file (mi->raw_stdout, "~", '"');
127 mi->err = new mi_console_file (mi->raw_stdout, "&", '"');
129 mi->targ = new mi_console_file (mi->raw_stdout, "@", '"');
130 mi->event_channel = new mi_console_file (mi->raw_stdout, "=", 0);
131 mi->mi_uiout = mi_out_new (name ());
132 gdb_assert (mi->mi_uiout != nullptr);
133 mi->cli_uiout = cli_out_new (mi->out);
137 /* The initial inferior is created before this function is
138 called, so we need to report it explicitly. Use iteration in
139 case future version of GDB creates more than one inferior
141 iterate_over_inferiors (report_initial_inferior, mi);
148 struct mi_interp *mi = this;
149 struct ui *ui = current_ui;
151 /* As per hack note in mi_interpreter_init, swap in the output
153 gdb_setup_readline (0);
155 ui->call_readline = gdb_readline_no_editing_callback;
156 ui->input_handler = mi_execute_command_input_handler;
158 gdb_stdout = mi->out;
159 /* Route error and log output through the MI. */
160 gdb_stderr = mi->err;
161 gdb_stdlog = mi->log;
162 /* Route target output through the MI. */
163 gdb_stdtarg = mi->targ;
164 /* Route target error through the MI as well. */
165 gdb_stdtargerr = mi->targ;
167 /* Replace all the hooks that we know about. There really needs to
168 be a better way of doing this... */
169 clear_interpreter_hooks ();
171 deprecated_show_load_progress = mi_load_progress;
175 mi_interp::suspend ()
177 gdb_disable_readline ();
181 mi_interp::exec (const char *command)
183 mi_execute_command_wrapper (command);
184 return exception_none;
188 mi_cmd_interpreter_exec (const char *command, char **argv, int argc)
190 struct interp *interp_to_use;
194 error (_("-interpreter-exec: "
195 "Usage: -interpreter-exec interp command"));
197 interp_to_use = interp_lookup (current_ui, argv[0]);
198 if (interp_to_use == NULL)
199 error (_("-interpreter-exec: could not find interpreter \"%s\""),
202 /* Note that unlike the CLI version of this command, we don't
203 actually set INTERP_TO_USE as the current interpreter, as we
204 still want gdb_stdout, etc. to point at MI streams. */
206 /* Insert the MI out hooks, making sure to also call the
207 interpreter's hooks if it has any. */
208 /* KRS: We shouldn't need this... Events should be installed and
209 they should just ALWAYS fire something out down the MI
211 mi_insert_notify_hooks ();
213 /* Now run the code. */
217 mi_remove_notify_hooks ();
220 for (i = 1; i < argc; i++)
222 struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
225 error ("%s", e.what ());
229 /* This inserts a number of hooks that are meant to produce
230 async-notify ("=") MI messages while running commands in another
231 interpreter using mi_interpreter_exec. The canonical use for this
232 is to allow access to the gdb CLI interpreter from within the MI,
233 while still producing MI style output when actions in the CLI
234 command change GDB's state. */
237 mi_insert_notify_hooks (void)
239 deprecated_query_hook = mi_interp_query_hook;
243 mi_remove_notify_hooks (void)
245 deprecated_query_hook = NULL;
249 mi_interp_query_hook (const char *ctlstr, va_list ap)
255 mi_execute_command_wrapper (const char *cmd)
257 struct ui *ui = current_ui;
259 mi_execute_command (cmd, ui->instream == ui->stdin_stream);
262 /* Observer for the synchronous_command_done notification. */
265 mi_on_sync_execution_done (void)
267 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
272 /* If MI is sync, then output the MI prompt now, indicating we're
273 ready for further input. */
275 display_mi_prompt (mi);
278 /* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER. */
281 mi_execute_command_input_handler (gdb::unique_xmalloc_ptr<char> &&cmd)
283 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
284 struct ui *ui = current_ui;
286 ui->prompt_state = PROMPT_NEEDED;
288 mi_execute_command_wrapper (cmd.get ());
290 /* Print a prompt, indicating we're ready for further input, unless
291 we just started a synchronous command. In that case, we're about
292 to go back to the event loop and will output the prompt in the
293 'synchronous_command_done' observer when the target next
295 if (ui->prompt_state == PROMPT_NEEDED)
296 display_mi_prompt (mi);
300 mi_interp::pre_command_loop ()
302 struct mi_interp *mi = this;
304 /* Turn off 8 bit strings in quoted output. Any character with the
305 high bit set is printed using C's octal format. */
306 sevenbit_strings = 1;
308 /* Tell the world that we're alive. */
309 display_mi_prompt (mi);
313 mi_new_thread (struct thread_info *t)
315 SWITCH_THRU_ALL_UIS ()
317 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
322 target_terminal::scoped_restore_terminal_state term_state;
323 target_terminal::ours_for_output ();
325 fprintf_unfiltered (mi->event_channel,
326 "thread-created,id=\"%d\",group-id=\"i%d\"",
327 t->global_num, t->inf->num);
328 gdb_flush (mi->event_channel);
333 mi_thread_exit (struct thread_info *t, int silent)
338 SWITCH_THRU_ALL_UIS ()
340 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
345 target_terminal::scoped_restore_terminal_state term_state;
346 target_terminal::ours_for_output ();
347 fprintf_unfiltered (mi->event_channel,
348 "thread-exited,id=\"%d\",group-id=\"i%d\"",
349 t->global_num, t->inf->num);
350 gdb_flush (mi->event_channel);
354 /* Emit notification on changing the state of record. */
357 mi_record_changed (struct inferior *inferior, int started, const char *method,
360 SWITCH_THRU_ALL_UIS ()
362 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
367 target_terminal::scoped_restore_terminal_state term_state;
368 target_terminal::ours_for_output ();
374 fprintf_unfiltered (mi->event_channel,
375 "record-started,thread-group=\"i%d\","
376 "method=\"%s\",format=\"%s\"",
377 inferior->num, method, format);
381 fprintf_unfiltered (mi->event_channel,
382 "record-started,thread-group=\"i%d\","
384 inferior->num, method);
389 fprintf_unfiltered (mi->event_channel,
390 "record-stopped,thread-group=\"i%d\"",
394 gdb_flush (mi->event_channel);
399 mi_inferior_added (struct inferior *inf)
401 SWITCH_THRU_ALL_UIS ()
403 struct interp *interp;
404 struct mi_interp *mi;
406 /* We'll be called once for the initial inferior, before the top
407 level interpreter is set. */
408 interp = top_level_interpreter ();
412 mi = as_mi_interp (interp);
416 target_terminal::scoped_restore_terminal_state term_state;
417 target_terminal::ours_for_output ();
419 fprintf_unfiltered (mi->event_channel,
420 "thread-group-added,id=\"i%d\"",
422 gdb_flush (mi->event_channel);
427 mi_inferior_appeared (struct inferior *inf)
429 SWITCH_THRU_ALL_UIS ()
431 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
436 target_terminal::scoped_restore_terminal_state term_state;
437 target_terminal::ours_for_output ();
439 fprintf_unfiltered (mi->event_channel,
440 "thread-group-started,id=\"i%d\",pid=\"%d\"",
442 gdb_flush (mi->event_channel);
447 mi_inferior_exit (struct inferior *inf)
449 SWITCH_THRU_ALL_UIS ()
451 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
456 target_terminal::scoped_restore_terminal_state term_state;
457 target_terminal::ours_for_output ();
459 if (inf->has_exit_code)
460 fprintf_unfiltered (mi->event_channel,
461 "thread-group-exited,id=\"i%d\",exit-code=\"%s\"",
462 inf->num, int_string (inf->exit_code, 8, 0, 0, 1));
464 fprintf_unfiltered (mi->event_channel,
465 "thread-group-exited,id=\"i%d\"", inf->num);
467 gdb_flush (mi->event_channel);
472 mi_inferior_removed (struct inferior *inf)
474 SWITCH_THRU_ALL_UIS ()
476 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
481 target_terminal::scoped_restore_terminal_state term_state;
482 target_terminal::ours_for_output ();
484 fprintf_unfiltered (mi->event_channel,
485 "thread-group-removed,id=\"i%d\"",
487 gdb_flush (mi->event_channel);
491 /* Return the MI interpreter, if it is active -- either because it's
492 the top-level interpreter or the interpreter executing the current
493 command. Returns NULL if the MI interpreter is not being used. */
495 static struct mi_interp *
496 find_mi_interp (void)
498 struct mi_interp *mi;
500 mi = as_mi_interp (top_level_interpreter ());
504 mi = as_mi_interp (command_interp ());
511 /* Observers for several run control events that print why the
512 inferior has stopped to both the MI event channel and to the MI
513 console. If the MI interpreter is not active, print nothing. */
515 /* Observer for the signal_received notification. */
518 mi_on_signal_received (enum gdb_signal siggnal)
520 SWITCH_THRU_ALL_UIS ()
522 struct mi_interp *mi = find_mi_interp ();
527 print_signal_received_reason (mi->mi_uiout, siggnal);
528 print_signal_received_reason (mi->cli_uiout, siggnal);
532 /* Observer for the end_stepping_range notification. */
535 mi_on_end_stepping_range (void)
537 SWITCH_THRU_ALL_UIS ()
539 struct mi_interp *mi = find_mi_interp ();
544 print_end_stepping_range_reason (mi->mi_uiout);
545 print_end_stepping_range_reason (mi->cli_uiout);
549 /* Observer for the signal_exited notification. */
552 mi_on_signal_exited (enum gdb_signal siggnal)
554 SWITCH_THRU_ALL_UIS ()
556 struct mi_interp *mi = find_mi_interp ();
561 print_signal_exited_reason (mi->mi_uiout, siggnal);
562 print_signal_exited_reason (mi->cli_uiout, siggnal);
566 /* Observer for the exited notification. */
569 mi_on_exited (int exitstatus)
571 SWITCH_THRU_ALL_UIS ()
573 struct mi_interp *mi = find_mi_interp ();
578 print_exited_reason (mi->mi_uiout, exitstatus);
579 print_exited_reason (mi->cli_uiout, exitstatus);
583 /* Observer for the no_history notification. */
586 mi_on_no_history (void)
588 SWITCH_THRU_ALL_UIS ()
590 struct mi_interp *mi = find_mi_interp ();
595 print_no_history_reason (mi->mi_uiout);
596 print_no_history_reason (mi->cli_uiout);
601 mi_on_normal_stop_1 (struct bpstats *bs, int print_frame)
603 /* Since this can be called when CLI command is executing,
604 using cli interpreter, be sure to use MI uiout for output,
605 not the current one. */
606 struct ui_out *mi_uiout = top_level_interpreter ()->interp_ui_out ();
607 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter ();
611 struct thread_info *tp;
613 struct interp *console_interp;
615 tp = inferior_thread ();
617 if (tp->thread_fsm != NULL
618 && tp->thread_fsm->finished_p ())
620 enum async_reply_reason reason;
622 reason = tp->thread_fsm->async_reply_reason ();
623 mi_uiout->field_string ("reason", async_reason_lookup (reason));
626 console_interp = interp_lookup (current_ui, INTERP_CONSOLE);
627 /* We only want to print the displays once, and we want it to
628 look just how it would on the console, so we use this to
629 decide whether the MI stop should include them. */
630 bool console_print = should_print_stop_to_console (console_interp, tp);
631 print_stop_event (mi_uiout, !console_print);
634 print_stop_event (mi->cli_uiout);
636 mi_uiout->field_int ("thread-id", tp->global_num);
639 ui_out_emit_list list_emitter (mi_uiout, "stopped-threads");
641 mi_uiout->field_int (NULL, tp->global_num);
644 mi_uiout->field_string ("stopped-threads", "all");
646 core = target_core_of_thread (tp->ptid);
648 mi_uiout->field_int ("core", core);
651 fputs_unfiltered ("*stopped", mi->raw_stdout);
652 mi_out_put (mi_uiout, mi->raw_stdout);
653 mi_out_rewind (mi_uiout);
654 mi_print_timing_maybe (mi->raw_stdout);
655 fputs_unfiltered ("\n", mi->raw_stdout);
656 gdb_flush (mi->raw_stdout);
660 mi_on_normal_stop (struct bpstats *bs, int print_frame)
662 SWITCH_THRU_ALL_UIS ()
664 if (as_mi_interp (top_level_interpreter ()) == NULL)
667 mi_on_normal_stop_1 (bs, print_frame);
672 mi_about_to_proceed (void)
674 /* Suppress output while calling an inferior function. */
676 if (inferior_ptid != null_ptid)
678 struct thread_info *tp = inferior_thread ();
680 if (tp->control.in_infcall)
687 /* When the element is non-zero, no MI notifications will be emitted in
688 response to the corresponding observers. */
690 struct mi_suppress_notification mi_suppress_notification =
698 /* Emit notification on changing a traceframe. */
701 mi_traceframe_changed (int tfnum, int tpnum)
703 if (mi_suppress_notification.traceframe)
706 SWITCH_THRU_ALL_UIS ()
708 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
713 target_terminal::scoped_restore_terminal_state term_state;
714 target_terminal::ours_for_output ();
717 fprintf_unfiltered (mi->event_channel, "traceframe-changed,"
718 "num=\"%d\",tracepoint=\"%d\"\n",
721 fprintf_unfiltered (mi->event_channel, "traceframe-changed,end");
723 gdb_flush (mi->event_channel);
727 /* Emit notification on creating a trace state variable. */
730 mi_tsv_created (const struct trace_state_variable *tsv)
732 SWITCH_THRU_ALL_UIS ()
734 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
739 target_terminal::scoped_restore_terminal_state term_state;
740 target_terminal::ours_for_output ();
742 fprintf_unfiltered (mi->event_channel, "tsv-created,"
743 "name=\"%s\",initial=\"%s\"\n",
744 tsv->name.c_str (), plongest (tsv->initial_value));
746 gdb_flush (mi->event_channel);
750 /* Emit notification on deleting a trace state variable. */
753 mi_tsv_deleted (const struct trace_state_variable *tsv)
755 SWITCH_THRU_ALL_UIS ()
757 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
762 target_terminal::scoped_restore_terminal_state term_state;
763 target_terminal::ours_for_output ();
766 fprintf_unfiltered (mi->event_channel, "tsv-deleted,"
767 "name=\"%s\"\n", tsv->name.c_str ());
769 fprintf_unfiltered (mi->event_channel, "tsv-deleted\n");
771 gdb_flush (mi->event_channel);
775 /* Emit notification on modifying a trace state variable. */
778 mi_tsv_modified (const struct trace_state_variable *tsv)
780 SWITCH_THRU_ALL_UIS ()
782 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
783 struct ui_out *mi_uiout;
788 mi_uiout = top_level_interpreter ()->interp_ui_out ();
790 target_terminal::scoped_restore_terminal_state term_state;
791 target_terminal::ours_for_output ();
793 fprintf_unfiltered (mi->event_channel,
796 mi_uiout->redirect (mi->event_channel);
798 mi_uiout->field_string ("name", tsv->name);
799 mi_uiout->field_string ("initial",
800 plongest (tsv->initial_value));
801 if (tsv->value_known)
802 mi_uiout->field_string ("current", plongest (tsv->value));
804 mi_uiout->redirect (NULL);
806 gdb_flush (mi->event_channel);
810 /* Print breakpoint BP on MI's event channel. */
813 mi_print_breakpoint_for_event (struct mi_interp *mi, breakpoint *bp)
815 ui_out *mi_uiout = mi->interp_ui_out ();
817 /* We want the output from print_breakpoint to go to
818 mi->event_channel. One approach would be to just call
819 print_breakpoint, and then use mi_out_put to send the current
820 content of mi_uiout into mi->event_channel. However, that will
821 break if anything is output to mi_uiout prior to calling the
822 breakpoint_created notifications. So, we use
824 mi_uiout->redirect (mi->event_channel);
828 scoped_restore restore_uiout
829 = make_scoped_restore (¤t_uiout, mi_uiout);
831 print_breakpoint (bp);
833 CATCH (ex, RETURN_MASK_ALL)
835 exception_print (gdb_stderr, ex);
839 mi_uiout->redirect (NULL);
842 /* Emit notification about a created breakpoint. */
845 mi_breakpoint_created (struct breakpoint *b)
847 if (mi_suppress_notification.breakpoint)
853 SWITCH_THRU_ALL_UIS ()
855 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
860 target_terminal::scoped_restore_terminal_state term_state;
861 target_terminal::ours_for_output ();
863 fprintf_unfiltered (mi->event_channel,
864 "breakpoint-created");
865 mi_print_breakpoint_for_event (mi, b);
867 gdb_flush (mi->event_channel);
871 /* Emit notification about deleted breakpoint. */
874 mi_breakpoint_deleted (struct breakpoint *b)
876 if (mi_suppress_notification.breakpoint)
882 SWITCH_THRU_ALL_UIS ()
884 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
889 target_terminal::scoped_restore_terminal_state term_state;
890 target_terminal::ours_for_output ();
892 fprintf_unfiltered (mi->event_channel, "breakpoint-deleted,id=\"%d\"",
895 gdb_flush (mi->event_channel);
899 /* Emit notification about modified breakpoint. */
902 mi_breakpoint_modified (struct breakpoint *b)
904 if (mi_suppress_notification.breakpoint)
910 SWITCH_THRU_ALL_UIS ()
912 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
917 target_terminal::scoped_restore_terminal_state term_state;
918 target_terminal::ours_for_output ();
919 fprintf_unfiltered (mi->event_channel,
920 "breakpoint-modified");
921 mi_print_breakpoint_for_event (mi, b);
923 gdb_flush (mi->event_channel);
928 mi_output_running (struct thread_info *thread)
930 SWITCH_THRU_ALL_UIS ()
932 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
937 fprintf_unfiltered (mi->raw_stdout,
938 "*running,thread-id=\"%d\"\n",
943 /* Return true if there are multiple inferiors loaded. This is used
944 for backwards compatibility -- if there's only one inferior, output
945 "all", otherwise, output each resumed thread individually. */
948 multiple_inferiors_p ()
951 for (inferior *inf ATTRIBUTE_UNUSED : all_non_exited_inferiors ())
962 mi_on_resume_1 (struct mi_interp *mi, ptid_t ptid)
964 /* To cater for older frontends, emit ^running, but do it only once
965 per each command. We do it here, since at this point we know
966 that the target was successfully resumed, and in non-async mode,
967 we won't return back to MI interpreter code until the target
968 is done running, so delaying the output of "^running" until then
969 will make it impossible for frontend to know what's going on.
971 In future (MI3), we'll be outputting "^done" here. */
972 if (!running_result_record_printed && mi_proceeded)
974 fprintf_unfiltered (mi->raw_stdout, "%s^running\n",
975 current_token ? current_token : "");
978 /* Backwards compatibility. If doing a wildcard resume and there's
979 only one inferior, output "all", otherwise, output each resumed
980 thread individually. */
981 if ((ptid == minus_one_ptid || ptid.is_pid ())
982 && !multiple_inferiors_p ())
983 fprintf_unfiltered (mi->raw_stdout, "*running,thread-id=\"all\"\n");
985 for (thread_info *tp : all_non_exited_threads (ptid))
986 mi_output_running (tp);
988 if (!running_result_record_printed && mi_proceeded)
990 running_result_record_printed = 1;
991 /* This is what gdb used to do historically -- printing prompt
992 even if it cannot actually accept any input. This will be
993 surely removed for MI3, and may be removed even earlier. */
994 if (current_ui->prompt_state == PROMPT_BLOCKED)
995 fputs_unfiltered ("(gdb) \n", mi->raw_stdout);
997 gdb_flush (mi->raw_stdout);
1001 mi_on_resume (ptid_t ptid)
1003 struct thread_info *tp = NULL;
1005 if (ptid == minus_one_ptid || ptid.is_pid ())
1006 tp = inferior_thread ();
1008 tp = find_thread_ptid (ptid);
1010 /* Suppress output while calling an inferior function. */
1011 if (tp->control.in_infcall)
1014 SWITCH_THRU_ALL_UIS ()
1016 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1021 target_terminal::scoped_restore_terminal_state term_state;
1022 target_terminal::ours_for_output ();
1024 mi_on_resume_1 (mi, ptid);
1028 /* See mi-interp.h. */
1031 mi_output_solib_attribs (ui_out *uiout, struct so_list *solib)
1033 struct gdbarch *gdbarch = target_gdbarch ();
1035 uiout->field_string ("id", solib->so_original_name);
1036 uiout->field_string ("target-name", solib->so_original_name);
1037 uiout->field_string ("host-name", solib->so_name);
1038 uiout->field_int ("symbols-loaded", solib->symbols_loaded);
1039 if (!gdbarch_has_global_solist (target_gdbarch ()))
1040 uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num);
1042 ui_out_emit_list list_emitter (uiout, "ranges");
1043 ui_out_emit_tuple tuple_emitter (uiout, NULL);
1044 if (solib->addr_high != 0)
1046 uiout->field_core_addr ("from", gdbarch, solib->addr_low);
1047 uiout->field_core_addr ("to", gdbarch, solib->addr_high);
1052 mi_solib_loaded (struct so_list *solib)
1054 SWITCH_THRU_ALL_UIS ()
1056 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1057 struct ui_out *uiout;
1062 uiout = top_level_interpreter ()->interp_ui_out ();
1064 target_terminal::scoped_restore_terminal_state term_state;
1065 target_terminal::ours_for_output ();
1067 fprintf_unfiltered (mi->event_channel, "library-loaded");
1069 uiout->redirect (mi->event_channel);
1071 mi_output_solib_attribs (uiout, solib);
1073 uiout->redirect (NULL);
1075 gdb_flush (mi->event_channel);
1080 mi_solib_unloaded (struct so_list *solib)
1082 SWITCH_THRU_ALL_UIS ()
1084 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1085 struct ui_out *uiout;
1090 uiout = top_level_interpreter ()->interp_ui_out ();
1092 target_terminal::scoped_restore_terminal_state term_state;
1093 target_terminal::ours_for_output ();
1095 fprintf_unfiltered (mi->event_channel, "library-unloaded");
1097 uiout->redirect (mi->event_channel);
1099 uiout->field_string ("id", solib->so_original_name);
1100 uiout->field_string ("target-name", solib->so_original_name);
1101 uiout->field_string ("host-name", solib->so_name);
1102 if (!gdbarch_has_global_solist (target_gdbarch ()))
1104 uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num);
1107 uiout->redirect (NULL);
1109 gdb_flush (mi->event_channel);
1113 /* Emit notification about the command parameter change. */
1116 mi_command_param_changed (const char *param, const char *value)
1118 if (mi_suppress_notification.cmd_param_changed)
1121 SWITCH_THRU_ALL_UIS ()
1123 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1124 struct ui_out *mi_uiout;
1129 mi_uiout = top_level_interpreter ()->interp_ui_out ();
1131 target_terminal::scoped_restore_terminal_state term_state;
1132 target_terminal::ours_for_output ();
1134 fprintf_unfiltered (mi->event_channel, "cmd-param-changed");
1136 mi_uiout->redirect (mi->event_channel);
1138 mi_uiout->field_string ("param", param);
1139 mi_uiout->field_string ("value", value);
1141 mi_uiout->redirect (NULL);
1143 gdb_flush (mi->event_channel);
1147 /* Emit notification about the target memory change. */
1150 mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
1151 ssize_t len, const bfd_byte *myaddr)
1153 if (mi_suppress_notification.memory)
1156 SWITCH_THRU_ALL_UIS ()
1158 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1159 struct ui_out *mi_uiout;
1160 struct obj_section *sec;
1165 mi_uiout = top_level_interpreter ()->interp_ui_out ();
1167 target_terminal::scoped_restore_terminal_state term_state;
1168 target_terminal::ours_for_output ();
1170 fprintf_unfiltered (mi->event_channel, "memory-changed");
1172 mi_uiout->redirect (mi->event_channel);
1174 mi_uiout->field_fmt ("thread-group", "i%d", inferior->num);
1175 mi_uiout->field_core_addr ("addr", target_gdbarch (), memaddr);
1176 mi_uiout->field_fmt ("len", "%s", hex_string (len));
1178 /* Append 'type=code' into notification if MEMADDR falls in the range of
1179 sections contain code. */
1180 sec = find_pc_section (memaddr);
1181 if (sec != NULL && sec->objfile != NULL)
1183 flagword flags = bfd_get_section_flags (sec->objfile->obfd,
1184 sec->the_bfd_section);
1186 if (flags & SEC_CODE)
1187 mi_uiout->field_string ("type", "code");
1190 mi_uiout->redirect (NULL);
1192 gdb_flush (mi->event_channel);
1196 /* Emit an event when the selection context (inferior, thread, frame)
1200 mi_user_selected_context_changed (user_selected_what selection)
1202 struct thread_info *tp;
1204 /* Don't send an event if we're responding to an MI command. */
1205 if (mi_suppress_notification.user_selected_context)
1208 if (inferior_ptid != null_ptid)
1209 tp = inferior_thread ();
1213 SWITCH_THRU_ALL_UIS ()
1215 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1216 struct ui_out *mi_uiout;
1221 mi_uiout = top_level_interpreter ()->interp_ui_out ();
1223 mi_uiout->redirect (mi->event_channel);
1224 ui_out_redirect_pop redirect_popper (mi_uiout);
1226 target_terminal::scoped_restore_terminal_state term_state;
1227 target_terminal::ours_for_output ();
1229 if (selection & USER_SELECTED_INFERIOR)
1230 print_selected_inferior (mi->cli_uiout);
1233 && (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))
1235 print_selected_thread_frame (mi->cli_uiout, selection);
1237 fprintf_unfiltered (mi->event_channel,
1238 "thread-selected,id=\"%d\"",
1241 if (tp->state != THREAD_RUNNING)
1243 if (has_stack_frames ())
1244 print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL),
1249 gdb_flush (mi->event_channel);
1254 report_initial_inferior (struct inferior *inf, void *closure)
1256 /* This function is called from mi_interpreter_init, and since
1257 mi_inferior_added assumes that inferior is fully initialized
1258 and top_level_interpreter_data is set, we cannot call
1260 struct mi_interp *mi = (struct mi_interp *) closure;
1262 target_terminal::scoped_restore_terminal_state term_state;
1263 target_terminal::ours_for_output ();
1265 fprintf_unfiltered (mi->event_channel,
1266 "thread-group-added,id=\"i%d\"",
1268 gdb_flush (mi->event_channel);
1274 mi_interp::interp_ui_out ()
1276 return this->mi_uiout;
1279 /* Do MI-specific logging actions; save raw_stdout, and change all
1280 the consoles to use the supplied ui-file(s). */
1283 mi_interp::set_logging (ui_file_up logfile, bool logging_redirect)
1285 struct mi_interp *mi = this;
1287 if (logfile != NULL)
1289 mi->saved_raw_stdout = mi->raw_stdout;
1290 mi->raw_stdout = make_logging_output (mi->raw_stdout,
1291 std::move (logfile),
1297 delete mi->raw_stdout;
1298 mi->raw_stdout = mi->saved_raw_stdout;
1299 mi->saved_raw_stdout = NULL;
1302 mi->out->set_raw (mi->raw_stdout);
1303 mi->err->set_raw (mi->raw_stdout);
1304 mi->log->set_raw (mi->raw_stdout);
1305 mi->targ->set_raw (mi->raw_stdout);
1306 mi->event_channel->set_raw (mi->raw_stdout);
1309 /* Factory for MI interpreters. */
1311 static struct interp *
1312 mi_interp_factory (const char *name)
1314 return new mi_interp (name);
1318 _initialize_mi_interp (void)
1320 /* The various interpreter levels. */
1321 interp_factory_register (INTERP_MI1, mi_interp_factory);
1322 interp_factory_register (INTERP_MI2, mi_interp_factory);
1323 interp_factory_register (INTERP_MI3, mi_interp_factory);
1324 interp_factory_register (INTERP_MI, mi_interp_factory);
1326 gdb::observers::signal_received.attach (mi_on_signal_received);
1327 gdb::observers::end_stepping_range.attach (mi_on_end_stepping_range);
1328 gdb::observers::signal_exited.attach (mi_on_signal_exited);
1329 gdb::observers::exited.attach (mi_on_exited);
1330 gdb::observers::no_history.attach (mi_on_no_history);
1331 gdb::observers::new_thread.attach (mi_new_thread);
1332 gdb::observers::thread_exit.attach (mi_thread_exit);
1333 gdb::observers::inferior_added.attach (mi_inferior_added);
1334 gdb::observers::inferior_appeared.attach (mi_inferior_appeared);
1335 gdb::observers::inferior_exit.attach (mi_inferior_exit);
1336 gdb::observers::inferior_removed.attach (mi_inferior_removed);
1337 gdb::observers::record_changed.attach (mi_record_changed);
1338 gdb::observers::normal_stop.attach (mi_on_normal_stop);
1339 gdb::observers::target_resumed.attach (mi_on_resume);
1340 gdb::observers::solib_loaded.attach (mi_solib_loaded);
1341 gdb::observers::solib_unloaded.attach (mi_solib_unloaded);
1342 gdb::observers::about_to_proceed.attach (mi_about_to_proceed);
1343 gdb::observers::traceframe_changed.attach (mi_traceframe_changed);
1344 gdb::observers::tsv_created.attach (mi_tsv_created);
1345 gdb::observers::tsv_deleted.attach (mi_tsv_deleted);
1346 gdb::observers::tsv_modified.attach (mi_tsv_modified);
1347 gdb::observers::breakpoint_created.attach (mi_breakpoint_created);
1348 gdb::observers::breakpoint_deleted.attach (mi_breakpoint_deleted);
1349 gdb::observers::breakpoint_modified.attach (mi_breakpoint_modified);
1350 gdb::observers::command_param_changed.attach (mi_command_param_changed);
1351 gdb::observers::memory_changed.attach (mi_memory_changed);
1352 gdb::observers::sync_execution_done.attach (mi_on_sync_execution_done);
1353 gdb::observers::user_selected_context_changed.attach
1354 (mi_user_selected_context_changed);