]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/mi/mi-interp.c
cf3d738edce9fffc9c917ff919a83966857df9cd
[thirdparty/binutils-gdb.git] / gdb / mi / mi-interp.c
1 /* MI Interpreter Definitions and Commands for GDB, the GNU debugger.
2
3 Copyright (C) 2002-2023 Free Software Foundation, Inc.
4
5 This file is part of GDB.
6
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.
11
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.
16
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/>. */
19
20 #include "defs.h"
21
22 #include "mi-interp.h"
23
24 #include "interps.h"
25 #include "event-top.h"
26 #include "gdbsupport/event-loop.h"
27 #include "inferior.h"
28 #include "infrun.h"
29 #include "ui-out.h"
30 #include "top.h"
31 #include "mi-main.h"
32 #include "mi-cmds.h"
33 #include "mi-out.h"
34 #include "mi-console.h"
35 #include "mi-common.h"
36 #include "observable.h"
37 #include "gdbthread.h"
38 #include "solist.h"
39 #include "objfiles.h"
40 #include "tracepoint.h"
41 #include "cli-out.h"
42 #include "thread-fsm.h"
43 #include "cli/cli-interp.h"
44 #include "gdbsupport/scope-exit.h"
45
46 /* These are the interpreter setup, etc. functions for the MI
47 interpreter. */
48
49 static void mi_execute_command_wrapper (const char *cmd);
50 static void mi_execute_command_input_handler
51 (gdb::unique_xmalloc_ptr<char> &&cmd);
52
53 /* These are hooks that we put in place while doing interpreter_exec
54 so we can report interesting things that happened "behind the MI's
55 back" in this command. */
56
57 static int mi_interp_query_hook (const char *ctlstr, va_list ap)
58 ATTRIBUTE_PRINTF (1, 0);
59
60 static void mi_insert_notify_hooks (void);
61 static void mi_remove_notify_hooks (void);
62
63 static void mi_on_signal_received (enum gdb_signal siggnal);
64 static void mi_on_end_stepping_range (void);
65 static void mi_on_signal_exited (enum gdb_signal siggnal);
66 static void mi_on_exited (int exitstatus);
67 static void mi_on_normal_stop (struct bpstat *bs, int print_frame);
68 static void mi_on_no_history (void);
69
70 static void mi_new_thread (struct thread_info *t);
71 static void mi_thread_exit (struct thread_info *t, int silent);
72 static void mi_record_changed (struct inferior*, int, const char *,
73 const char *);
74 static void mi_inferior_added (struct inferior *inf);
75 static void mi_inferior_appeared (struct inferior *inf);
76 static void mi_inferior_exit (struct inferior *inf);
77 static void mi_inferior_removed (struct inferior *inf);
78 static void mi_on_resume (ptid_t ptid);
79 static void mi_solib_loaded (struct so_list *solib);
80 static void mi_solib_unloaded (struct so_list *solib);
81 static void mi_about_to_proceed (void);
82 static void mi_traceframe_changed (int tfnum, int tpnum);
83 static void mi_tsv_created (const struct trace_state_variable *tsv);
84 static void mi_tsv_deleted (const struct trace_state_variable *tsv);
85 static void mi_tsv_modified (const struct trace_state_variable *tsv);
86 static void mi_breakpoint_created (struct breakpoint *b);
87 static void mi_breakpoint_deleted (struct breakpoint *b);
88 static void mi_breakpoint_modified (struct breakpoint *b);
89 static void mi_command_param_changed (const char *param, const char *value);
90 static void mi_memory_changed (struct inferior *inf, CORE_ADDR memaddr,
91 ssize_t len, const bfd_byte *myaddr);
92 static void mi_on_sync_execution_done (void);
93
94 /* Display the MI prompt. */
95
96 static void
97 display_mi_prompt (struct mi_interp *mi)
98 {
99 struct ui *ui = current_ui;
100
101 gdb_puts ("(gdb) \n", mi->raw_stdout);
102 gdb_flush (mi->raw_stdout);
103 ui->prompt_state = PROMPTED;
104 }
105
106 /* Returns the INTERP's data cast as mi_interp if INTERP is an MI, and
107 returns NULL otherwise. */
108
109 static struct mi_interp *
110 as_mi_interp (struct interp *interp)
111 {
112 return dynamic_cast<mi_interp *> (interp);
113 }
114
115 /* Observer for the command_error notification. */
116
117 static void
118 mi_on_command_error ()
119 {
120 mi_interp *mi = as_mi_interp (top_level_interpreter ());
121 if (mi != nullptr)
122 display_mi_prompt (mi);
123 }
124
125 void
126 mi_interp::init (bool top_level)
127 {
128 mi_interp *mi = this;
129
130 /* Store the current output channel, so that we can create a console
131 channel that encapsulates and prefixes all gdb_output-type bits
132 coming from the rest of the debugger. */
133 mi->raw_stdout = gdb_stdout;
134
135 /* Create MI console channels, each with a different prefix so they
136 can be distinguished. */
137 mi->out = new mi_console_file (mi->raw_stdout, "~", '"');
138 mi->err = new mi_console_file (mi->raw_stdout, "&", '"');
139 mi->log = mi->err;
140 mi->targ = new mi_console_file (mi->raw_stdout, "@", '"');
141 mi->event_channel = new mi_console_file (mi->raw_stdout, "=", 0);
142 mi->mi_uiout = mi_out_new (name ());
143 gdb_assert (mi->mi_uiout != nullptr);
144 mi->cli_uiout = new cli_ui_out (mi->out);
145
146 if (top_level)
147 {
148 /* The initial inferior is created before this function is called, so we
149 need to report it explicitly when initializing the top-level MI
150 interpreter.
151
152 This is also called when additional MI interpreters are added (using
153 the new-ui command), when multiple inferiors possibly exist, so we need
154 to use iteration to report all the inferiors. mi_inferior_added can't
155 be used, because it would print the event on all the other MI UIs. */
156
157 for (inferior *inf : all_inferiors ())
158 {
159 target_terminal::scoped_restore_terminal_state term_state;
160 target_terminal::ours_for_output ();
161
162 gdb_printf (mi->event_channel,
163 "thread-group-added,id=\"i%d\"",
164 inf->num);
165
166 gdb_flush (mi->event_channel);
167 }
168 }
169 }
170
171 void
172 mi_interp::resume ()
173 {
174 struct mi_interp *mi = this;
175 struct ui *ui = current_ui;
176
177 /* As per hack note in mi_interpreter_init, swap in the output
178 channels... */
179 gdb_setup_readline (0);
180
181 ui->call_readline = gdb_readline_no_editing_callback;
182 ui->input_handler = mi_execute_command_input_handler;
183
184 gdb_stdout = mi->out;
185 /* Route error and log output through the MI. */
186 gdb_stderr = mi->err;
187 gdb_stdlog = mi->log;
188 /* Route target output through the MI. */
189 gdb_stdtarg = mi->targ;
190 /* Route target error through the MI as well. */
191 gdb_stdtargerr = mi->targ;
192
193 deprecated_show_load_progress = mi_load_progress;
194 }
195
196 void
197 mi_interp::suspend ()
198 {
199 gdb_disable_readline ();
200 }
201
202 gdb_exception
203 mi_interp::exec (const char *command)
204 {
205 mi_execute_command_wrapper (command);
206 return gdb_exception ();
207 }
208
209 void
210 mi_cmd_interpreter_exec (const char *command, char **argv, int argc)
211 {
212 struct interp *interp_to_use;
213 int i;
214
215 if (argc < 2)
216 error (_("-interpreter-exec: "
217 "Usage: -interpreter-exec interp command"));
218
219 interp_to_use = interp_lookup (current_ui, argv[0]);
220 if (interp_to_use == NULL)
221 error (_("-interpreter-exec: could not find interpreter \"%s\""),
222 argv[0]);
223
224 /* Note that unlike the CLI version of this command, we don't
225 actually set INTERP_TO_USE as the current interpreter, as we
226 still want gdb_stdout, etc. to point at MI streams. */
227
228 /* Insert the MI out hooks, making sure to also call the
229 interpreter's hooks if it has any. */
230 /* KRS: We shouldn't need this... Events should be installed and
231 they should just ALWAYS fire something out down the MI
232 channel. */
233 mi_insert_notify_hooks ();
234
235 /* Now run the code. */
236
237 SCOPE_EXIT
238 {
239 mi_remove_notify_hooks ();
240 };
241
242 for (i = 1; i < argc; i++)
243 {
244 struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
245
246 if (e.reason < 0)
247 error ("%s", e.what ());
248 }
249 }
250
251 /* This inserts a number of hooks that are meant to produce
252 async-notify ("=") MI messages while running commands in another
253 interpreter using mi_interpreter_exec. The canonical use for this
254 is to allow access to the gdb CLI interpreter from within the MI,
255 while still producing MI style output when actions in the CLI
256 command change GDB's state. */
257
258 static void
259 mi_insert_notify_hooks (void)
260 {
261 deprecated_query_hook = mi_interp_query_hook;
262 }
263
264 static void
265 mi_remove_notify_hooks (void)
266 {
267 deprecated_query_hook = NULL;
268 }
269
270 static int
271 mi_interp_query_hook (const char *ctlstr, va_list ap)
272 {
273 return 1;
274 }
275
276 static void
277 mi_execute_command_wrapper (const char *cmd)
278 {
279 struct ui *ui = current_ui;
280
281 mi_execute_command (cmd, ui->instream == ui->stdin_stream);
282 }
283
284 /* Observer for the synchronous_command_done notification. */
285
286 static void
287 mi_on_sync_execution_done (void)
288 {
289 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
290
291 if (mi == NULL)
292 return;
293
294 /* If MI is sync, then output the MI prompt now, indicating we're
295 ready for further input. */
296 if (!mi_async_p ())
297 display_mi_prompt (mi);
298 }
299
300 /* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER. */
301
302 static void
303 mi_execute_command_input_handler (gdb::unique_xmalloc_ptr<char> &&cmd)
304 {
305 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
306 struct ui *ui = current_ui;
307
308 ui->prompt_state = PROMPT_NEEDED;
309
310 mi_execute_command_wrapper (cmd.get ());
311
312 /* Print a prompt, indicating we're ready for further input, unless
313 we just started a synchronous command. In that case, we're about
314 to go back to the event loop and will output the prompt in the
315 'synchronous_command_done' observer when the target next
316 stops. */
317 if (ui->prompt_state == PROMPT_NEEDED)
318 display_mi_prompt (mi);
319 }
320
321 void
322 mi_interp::pre_command_loop ()
323 {
324 struct mi_interp *mi = this;
325
326 /* Turn off 8 bit strings in quoted output. Any character with the
327 high bit set is printed using C's octal format. */
328 sevenbit_strings = 1;
329
330 /* Tell the world that we're alive. */
331 display_mi_prompt (mi);
332 }
333
334 static void
335 mi_new_thread (struct thread_info *t)
336 {
337 SWITCH_THRU_ALL_UIS ()
338 {
339 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
340
341 if (mi == NULL)
342 continue;
343
344 target_terminal::scoped_restore_terminal_state term_state;
345 target_terminal::ours_for_output ();
346
347 gdb_printf (mi->event_channel,
348 "thread-created,id=\"%d\",group-id=\"i%d\"",
349 t->global_num, t->inf->num);
350 gdb_flush (mi->event_channel);
351 }
352 }
353
354 static void
355 mi_thread_exit (struct thread_info *t, int silent)
356 {
357 SWITCH_THRU_ALL_UIS ()
358 {
359 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
360
361 if (mi == NULL)
362 continue;
363
364 target_terminal::scoped_restore_terminal_state term_state;
365 target_terminal::ours_for_output ();
366 gdb_printf (mi->event_channel,
367 "thread-exited,id=\"%d\",group-id=\"i%d\"",
368 t->global_num, t->inf->num);
369 gdb_flush (mi->event_channel);
370 }
371 }
372
373 /* Emit notification on changing the state of record. */
374
375 static void
376 mi_record_changed (struct inferior *inferior, int started, const char *method,
377 const char *format)
378 {
379 SWITCH_THRU_ALL_UIS ()
380 {
381 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
382
383 if (mi == NULL)
384 continue;
385
386 target_terminal::scoped_restore_terminal_state term_state;
387 target_terminal::ours_for_output ();
388
389 if (started)
390 {
391 if (format != NULL)
392 {
393 gdb_printf (mi->event_channel,
394 "record-started,thread-group=\"i%d\","
395 "method=\"%s\",format=\"%s\"",
396 inferior->num, method, format);
397 }
398 else
399 {
400 gdb_printf (mi->event_channel,
401 "record-started,thread-group=\"i%d\","
402 "method=\"%s\"",
403 inferior->num, method);
404 }
405 }
406 else
407 {
408 gdb_printf (mi->event_channel,
409 "record-stopped,thread-group=\"i%d\"",
410 inferior->num);
411 }
412
413 gdb_flush (mi->event_channel);
414 }
415 }
416
417 static void
418 mi_inferior_added (struct inferior *inf)
419 {
420 SWITCH_THRU_ALL_UIS ()
421 {
422 struct interp *interp;
423 struct mi_interp *mi;
424
425 /* We'll be called once for the initial inferior, before the top
426 level interpreter is set. */
427 interp = top_level_interpreter ();
428 if (interp == NULL)
429 continue;
430
431 mi = as_mi_interp (interp);
432 if (mi == NULL)
433 continue;
434
435 target_terminal::scoped_restore_terminal_state term_state;
436 target_terminal::ours_for_output ();
437
438 gdb_printf (mi->event_channel,
439 "thread-group-added,id=\"i%d\"",
440 inf->num);
441 gdb_flush (mi->event_channel);
442 }
443 }
444
445 static void
446 mi_inferior_appeared (struct inferior *inf)
447 {
448 SWITCH_THRU_ALL_UIS ()
449 {
450 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
451
452 if (mi == NULL)
453 continue;
454
455 target_terminal::scoped_restore_terminal_state term_state;
456 target_terminal::ours_for_output ();
457
458 gdb_printf (mi->event_channel,
459 "thread-group-started,id=\"i%d\",pid=\"%d\"",
460 inf->num, inf->pid);
461 gdb_flush (mi->event_channel);
462 }
463 }
464
465 static void
466 mi_inferior_exit (struct inferior *inf)
467 {
468 SWITCH_THRU_ALL_UIS ()
469 {
470 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
471
472 if (mi == NULL)
473 continue;
474
475 target_terminal::scoped_restore_terminal_state term_state;
476 target_terminal::ours_for_output ();
477
478 if (inf->has_exit_code)
479 gdb_printf (mi->event_channel,
480 "thread-group-exited,id=\"i%d\",exit-code=\"%s\"",
481 inf->num, int_string (inf->exit_code, 8, 0, 0, 1));
482 else
483 gdb_printf (mi->event_channel,
484 "thread-group-exited,id=\"i%d\"", inf->num);
485
486 gdb_flush (mi->event_channel);
487 }
488 }
489
490 static void
491 mi_inferior_removed (struct inferior *inf)
492 {
493 SWITCH_THRU_ALL_UIS ()
494 {
495 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
496
497 if (mi == NULL)
498 continue;
499
500 target_terminal::scoped_restore_terminal_state term_state;
501 target_terminal::ours_for_output ();
502
503 gdb_printf (mi->event_channel,
504 "thread-group-removed,id=\"i%d\"",
505 inf->num);
506 gdb_flush (mi->event_channel);
507 }
508 }
509
510 /* Return the MI interpreter, if it is active -- either because it's
511 the top-level interpreter or the interpreter executing the current
512 command. Returns NULL if the MI interpreter is not being used. */
513
514 static struct mi_interp *
515 find_mi_interp (void)
516 {
517 struct mi_interp *mi;
518
519 mi = as_mi_interp (top_level_interpreter ());
520 if (mi != NULL)
521 return mi;
522
523 mi = as_mi_interp (command_interp ());
524 if (mi != NULL)
525 return mi;
526
527 return NULL;
528 }
529
530 /* Observers for several run control events that print why the
531 inferior has stopped to both the MI event channel and to the MI
532 console. If the MI interpreter is not active, print nothing. */
533
534 /* Observer for the signal_received notification. */
535
536 static void
537 mi_on_signal_received (enum gdb_signal siggnal)
538 {
539 SWITCH_THRU_ALL_UIS ()
540 {
541 struct mi_interp *mi = find_mi_interp ();
542
543 if (mi == NULL)
544 continue;
545
546 print_signal_received_reason (mi->mi_uiout, siggnal);
547 print_signal_received_reason (mi->cli_uiout, siggnal);
548 }
549 }
550
551 /* Observer for the end_stepping_range notification. */
552
553 static void
554 mi_on_end_stepping_range (void)
555 {
556 SWITCH_THRU_ALL_UIS ()
557 {
558 struct mi_interp *mi = find_mi_interp ();
559
560 if (mi == NULL)
561 continue;
562
563 print_end_stepping_range_reason (mi->mi_uiout);
564 print_end_stepping_range_reason (mi->cli_uiout);
565 }
566 }
567
568 /* Observer for the signal_exited notification. */
569
570 static void
571 mi_on_signal_exited (enum gdb_signal siggnal)
572 {
573 SWITCH_THRU_ALL_UIS ()
574 {
575 struct mi_interp *mi = find_mi_interp ();
576
577 if (mi == NULL)
578 continue;
579
580 print_signal_exited_reason (mi->mi_uiout, siggnal);
581 print_signal_exited_reason (mi->cli_uiout, siggnal);
582 }
583 }
584
585 /* Observer for the exited notification. */
586
587 static void
588 mi_on_exited (int exitstatus)
589 {
590 SWITCH_THRU_ALL_UIS ()
591 {
592 struct mi_interp *mi = find_mi_interp ();
593
594 if (mi == NULL)
595 continue;
596
597 print_exited_reason (mi->mi_uiout, exitstatus);
598 print_exited_reason (mi->cli_uiout, exitstatus);
599 }
600 }
601
602 /* Observer for the no_history notification. */
603
604 static void
605 mi_on_no_history (void)
606 {
607 SWITCH_THRU_ALL_UIS ()
608 {
609 struct mi_interp *mi = find_mi_interp ();
610
611 if (mi == NULL)
612 continue;
613
614 print_no_history_reason (mi->mi_uiout);
615 print_no_history_reason (mi->cli_uiout);
616 }
617 }
618
619 static void
620 mi_on_normal_stop_1 (struct bpstat *bs, int print_frame)
621 {
622 /* Since this can be called when CLI command is executing,
623 using cli interpreter, be sure to use MI uiout for output,
624 not the current one. */
625 struct ui_out *mi_uiout = top_level_interpreter ()->interp_ui_out ();
626 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter ();
627
628 if (print_frame)
629 {
630 struct thread_info *tp;
631 int core;
632 struct interp *console_interp;
633
634 tp = inferior_thread ();
635
636 if (tp->thread_fsm () != nullptr
637 && tp->thread_fsm ()->finished_p ())
638 {
639 enum async_reply_reason reason;
640
641 reason = tp->thread_fsm ()->async_reply_reason ();
642 mi_uiout->field_string ("reason", async_reason_lookup (reason));
643 }
644
645 console_interp = interp_lookup (current_ui, INTERP_CONSOLE);
646 /* We only want to print the displays once, and we want it to
647 look just how it would on the console, so we use this to
648 decide whether the MI stop should include them. */
649 bool console_print = should_print_stop_to_console (console_interp, tp);
650 print_stop_event (mi_uiout, !console_print);
651
652 if (console_print)
653 print_stop_event (mi->cli_uiout);
654
655 mi_uiout->field_signed ("thread-id", tp->global_num);
656 if (non_stop)
657 {
658 ui_out_emit_list list_emitter (mi_uiout, "stopped-threads");
659
660 mi_uiout->field_signed (NULL, tp->global_num);
661 }
662 else
663 mi_uiout->field_string ("stopped-threads", "all");
664
665 core = target_core_of_thread (tp->ptid);
666 if (core != -1)
667 mi_uiout->field_signed ("core", core);
668 }
669
670 gdb_puts ("*stopped", mi->raw_stdout);
671 mi_out_put (mi_uiout, mi->raw_stdout);
672 mi_out_rewind (mi_uiout);
673 mi_print_timing_maybe (mi->raw_stdout);
674 gdb_puts ("\n", mi->raw_stdout);
675 gdb_flush (mi->raw_stdout);
676 }
677
678 static void
679 mi_on_normal_stop (struct bpstat *bs, int print_frame)
680 {
681 SWITCH_THRU_ALL_UIS ()
682 {
683 if (as_mi_interp (top_level_interpreter ()) == NULL)
684 continue;
685
686 mi_on_normal_stop_1 (bs, print_frame);
687 }
688 }
689
690 static void
691 mi_about_to_proceed (void)
692 {
693 /* Suppress output while calling an inferior function. */
694
695 if (inferior_ptid != null_ptid)
696 {
697 struct thread_info *tp = inferior_thread ();
698
699 if (tp->control.in_infcall)
700 return;
701 }
702
703 mi_proceeded = 1;
704 }
705
706 /* When the element is non-zero, no MI notifications will be emitted in
707 response to the corresponding observers. */
708
709 struct mi_suppress_notification mi_suppress_notification =
710 {
711 0,
712 0,
713 0,
714 0,
715 };
716
717 /* Emit notification on changing a traceframe. */
718
719 static void
720 mi_traceframe_changed (int tfnum, int tpnum)
721 {
722 if (mi_suppress_notification.traceframe)
723 return;
724
725 SWITCH_THRU_ALL_UIS ()
726 {
727 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
728
729 if (mi == NULL)
730 continue;
731
732 target_terminal::scoped_restore_terminal_state term_state;
733 target_terminal::ours_for_output ();
734
735 if (tfnum >= 0)
736 gdb_printf (mi->event_channel, "traceframe-changed,"
737 "num=\"%d\",tracepoint=\"%d\"",
738 tfnum, tpnum);
739 else
740 gdb_printf (mi->event_channel, "traceframe-changed,end");
741
742 gdb_flush (mi->event_channel);
743 }
744 }
745
746 /* Emit notification on creating a trace state variable. */
747
748 static void
749 mi_tsv_created (const struct trace_state_variable *tsv)
750 {
751 SWITCH_THRU_ALL_UIS ()
752 {
753 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
754
755 if (mi == NULL)
756 continue;
757
758 target_terminal::scoped_restore_terminal_state term_state;
759 target_terminal::ours_for_output ();
760
761 gdb_printf (mi->event_channel, "tsv-created,"
762 "name=\"%s\",initial=\"%s\"",
763 tsv->name.c_str (), plongest (tsv->initial_value));
764
765 gdb_flush (mi->event_channel);
766 }
767 }
768
769 /* Emit notification on deleting a trace state variable. */
770
771 static void
772 mi_tsv_deleted (const struct trace_state_variable *tsv)
773 {
774 SWITCH_THRU_ALL_UIS ()
775 {
776 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
777
778 if (mi == NULL)
779 continue;
780
781 target_terminal::scoped_restore_terminal_state term_state;
782 target_terminal::ours_for_output ();
783
784 if (tsv != NULL)
785 gdb_printf (mi->event_channel, "tsv-deleted,"
786 "name=\"%s\"", tsv->name.c_str ());
787 else
788 gdb_printf (mi->event_channel, "tsv-deleted");
789
790 gdb_flush (mi->event_channel);
791 }
792 }
793
794 /* Emit notification on modifying a trace state variable. */
795
796 static void
797 mi_tsv_modified (const struct trace_state_variable *tsv)
798 {
799 SWITCH_THRU_ALL_UIS ()
800 {
801 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
802 struct ui_out *mi_uiout;
803
804 if (mi == NULL)
805 continue;
806
807 mi_uiout = top_level_interpreter ()->interp_ui_out ();
808
809 target_terminal::scoped_restore_terminal_state term_state;
810 target_terminal::ours_for_output ();
811
812 gdb_printf (mi->event_channel,
813 "tsv-modified");
814
815 ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
816
817 mi_uiout->field_string ("name", tsv->name);
818 mi_uiout->field_string ("initial",
819 plongest (tsv->initial_value));
820 if (tsv->value_known)
821 mi_uiout->field_string ("current", plongest (tsv->value));
822
823 gdb_flush (mi->event_channel);
824 }
825 }
826
827 /* Print breakpoint BP on MI's event channel. */
828
829 static void
830 mi_print_breakpoint_for_event (struct mi_interp *mi, breakpoint *bp)
831 {
832 ui_out *mi_uiout = mi->interp_ui_out ();
833
834 /* We want the output from print_breakpoint to go to
835 mi->event_channel. One approach would be to just call
836 print_breakpoint, and then use mi_out_put to send the current
837 content of mi_uiout into mi->event_channel. However, that will
838 break if anything is output to mi_uiout prior to calling the
839 breakpoint_created notifications. So, we use
840 ui_out_redirect. */
841 ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
842
843 try
844 {
845 scoped_restore restore_uiout
846 = make_scoped_restore (&current_uiout, mi_uiout);
847
848 print_breakpoint (bp);
849 }
850 catch (const gdb_exception &ex)
851 {
852 exception_print (gdb_stderr, ex);
853 }
854 }
855
856 /* Emit notification about a created breakpoint. */
857
858 static void
859 mi_breakpoint_created (struct breakpoint *b)
860 {
861 if (mi_suppress_notification.breakpoint)
862 return;
863
864 if (b->number <= 0)
865 return;
866
867 SWITCH_THRU_ALL_UIS ()
868 {
869 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
870
871 if (mi == NULL)
872 continue;
873
874 target_terminal::scoped_restore_terminal_state term_state;
875 target_terminal::ours_for_output ();
876
877 gdb_printf (mi->event_channel,
878 "breakpoint-created");
879 mi_print_breakpoint_for_event (mi, b);
880
881 gdb_flush (mi->event_channel);
882 }
883 }
884
885 /* Emit notification about deleted breakpoint. */
886
887 static void
888 mi_breakpoint_deleted (struct breakpoint *b)
889 {
890 if (mi_suppress_notification.breakpoint)
891 return;
892
893 if (b->number <= 0)
894 return;
895
896 SWITCH_THRU_ALL_UIS ()
897 {
898 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
899
900 if (mi == NULL)
901 continue;
902
903 target_terminal::scoped_restore_terminal_state term_state;
904 target_terminal::ours_for_output ();
905
906 gdb_printf (mi->event_channel, "breakpoint-deleted,id=\"%d\"",
907 b->number);
908
909 gdb_flush (mi->event_channel);
910 }
911 }
912
913 /* Emit notification about modified breakpoint. */
914
915 static void
916 mi_breakpoint_modified (struct breakpoint *b)
917 {
918 if (mi_suppress_notification.breakpoint)
919 return;
920
921 if (b->number <= 0)
922 return;
923
924 SWITCH_THRU_ALL_UIS ()
925 {
926 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
927
928 if (mi == NULL)
929 continue;
930
931 target_terminal::scoped_restore_terminal_state term_state;
932 target_terminal::ours_for_output ();
933 gdb_printf (mi->event_channel,
934 "breakpoint-modified");
935 mi_print_breakpoint_for_event (mi, b);
936
937 gdb_flush (mi->event_channel);
938 }
939 }
940
941 static void
942 mi_output_running (struct thread_info *thread)
943 {
944 SWITCH_THRU_ALL_UIS ()
945 {
946 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
947
948 if (mi == NULL)
949 continue;
950
951 gdb_printf (mi->raw_stdout,
952 "*running,thread-id=\"%d\"\n",
953 thread->global_num);
954 }
955 }
956
957 /* Return true if there are multiple inferiors loaded. This is used
958 for backwards compatibility -- if there's only one inferior, output
959 "all", otherwise, output each resumed thread individually. */
960
961 static bool
962 multiple_inferiors_p ()
963 {
964 int count = 0;
965 for (inferior *inf ATTRIBUTE_UNUSED : all_non_exited_inferiors ())
966 {
967 count++;
968 if (count > 1)
969 return true;
970 }
971
972 return false;
973 }
974
975 static void
976 mi_on_resume_1 (struct mi_interp *mi,
977 process_stratum_target *targ, ptid_t ptid)
978 {
979 /* To cater for older frontends, emit ^running, but do it only once
980 per each command. We do it here, since at this point we know
981 that the target was successfully resumed, and in non-async mode,
982 we won't return back to MI interpreter code until the target
983 is done running, so delaying the output of "^running" until then
984 will make it impossible for frontend to know what's going on.
985
986 In future (MI3), we'll be outputting "^done" here. */
987 if (!running_result_record_printed && mi_proceeded)
988 {
989 gdb_printf (mi->raw_stdout, "%s^running\n",
990 current_token ? current_token : "");
991 }
992
993 /* Backwards compatibility. If doing a wildcard resume and there's
994 only one inferior, output "all", otherwise, output each resumed
995 thread individually. */
996 if ((ptid == minus_one_ptid || ptid.is_pid ())
997 && !multiple_inferiors_p ())
998 gdb_printf (mi->raw_stdout, "*running,thread-id=\"all\"\n");
999 else
1000 for (thread_info *tp : all_non_exited_threads (targ, ptid))
1001 mi_output_running (tp);
1002
1003 if (!running_result_record_printed && mi_proceeded)
1004 {
1005 running_result_record_printed = 1;
1006 /* This is what gdb used to do historically -- printing prompt
1007 even if it cannot actually accept any input. This will be
1008 surely removed for MI3, and may be removed even earlier. */
1009 if (current_ui->prompt_state == PROMPT_BLOCKED)
1010 gdb_puts ("(gdb) \n", mi->raw_stdout);
1011 }
1012 gdb_flush (mi->raw_stdout);
1013 }
1014
1015 static void
1016 mi_on_resume (ptid_t ptid)
1017 {
1018 struct thread_info *tp = NULL;
1019
1020 process_stratum_target *target = current_inferior ()->process_target ();
1021 if (ptid == minus_one_ptid || ptid.is_pid ())
1022 tp = inferior_thread ();
1023 else
1024 tp = find_thread_ptid (target, ptid);
1025
1026 /* Suppress output while calling an inferior function. */
1027 if (tp->control.in_infcall)
1028 return;
1029
1030 SWITCH_THRU_ALL_UIS ()
1031 {
1032 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1033
1034 if (mi == NULL)
1035 continue;
1036
1037 target_terminal::scoped_restore_terminal_state term_state;
1038 target_terminal::ours_for_output ();
1039
1040 mi_on_resume_1 (mi, target, ptid);
1041 }
1042 }
1043
1044 /* See mi-interp.h. */
1045
1046 void
1047 mi_output_solib_attribs (ui_out *uiout, struct so_list *solib)
1048 {
1049 struct gdbarch *gdbarch = target_gdbarch ();
1050
1051 uiout->field_string ("id", solib->so_original_name);
1052 uiout->field_string ("target-name", solib->so_original_name);
1053 uiout->field_string ("host-name", solib->so_name);
1054 uiout->field_signed ("symbols-loaded", solib->symbols_loaded);
1055 if (!gdbarch_has_global_solist (target_gdbarch ()))
1056 uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num);
1057
1058 ui_out_emit_list list_emitter (uiout, "ranges");
1059 ui_out_emit_tuple tuple_emitter (uiout, NULL);
1060 if (solib->addr_high != 0)
1061 {
1062 uiout->field_core_addr ("from", gdbarch, solib->addr_low);
1063 uiout->field_core_addr ("to", gdbarch, solib->addr_high);
1064 }
1065 }
1066
1067 static void
1068 mi_solib_loaded (struct so_list *solib)
1069 {
1070 SWITCH_THRU_ALL_UIS ()
1071 {
1072 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1073 struct ui_out *uiout;
1074
1075 if (mi == NULL)
1076 continue;
1077
1078 uiout = top_level_interpreter ()->interp_ui_out ();
1079
1080 target_terminal::scoped_restore_terminal_state term_state;
1081 target_terminal::ours_for_output ();
1082
1083 gdb_printf (mi->event_channel, "library-loaded");
1084
1085 ui_out_redirect_pop redir (uiout, mi->event_channel);
1086
1087 mi_output_solib_attribs (uiout, solib);
1088
1089 gdb_flush (mi->event_channel);
1090 }
1091 }
1092
1093 static void
1094 mi_solib_unloaded (struct so_list *solib)
1095 {
1096 SWITCH_THRU_ALL_UIS ()
1097 {
1098 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1099 struct ui_out *uiout;
1100
1101 if (mi == NULL)
1102 continue;
1103
1104 uiout = top_level_interpreter ()->interp_ui_out ();
1105
1106 target_terminal::scoped_restore_terminal_state term_state;
1107 target_terminal::ours_for_output ();
1108
1109 gdb_printf (mi->event_channel, "library-unloaded");
1110
1111 ui_out_redirect_pop redir (uiout, mi->event_channel);
1112
1113 uiout->field_string ("id", solib->so_original_name);
1114 uiout->field_string ("target-name", solib->so_original_name);
1115 uiout->field_string ("host-name", solib->so_name);
1116 if (!gdbarch_has_global_solist (target_gdbarch ()))
1117 {
1118 uiout->field_fmt ("thread-group", "i%d", current_inferior ()->num);
1119 }
1120
1121 gdb_flush (mi->event_channel);
1122 }
1123 }
1124
1125 /* Emit notification about the command parameter change. */
1126
1127 static void
1128 mi_command_param_changed (const char *param, const char *value)
1129 {
1130 if (mi_suppress_notification.cmd_param_changed)
1131 return;
1132
1133 SWITCH_THRU_ALL_UIS ()
1134 {
1135 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1136 struct ui_out *mi_uiout;
1137
1138 if (mi == NULL)
1139 continue;
1140
1141 mi_uiout = top_level_interpreter ()->interp_ui_out ();
1142
1143 target_terminal::scoped_restore_terminal_state term_state;
1144 target_terminal::ours_for_output ();
1145
1146 gdb_printf (mi->event_channel, "cmd-param-changed");
1147
1148 ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
1149
1150 mi_uiout->field_string ("param", param);
1151 mi_uiout->field_string ("value", value);
1152
1153 gdb_flush (mi->event_channel);
1154 }
1155 }
1156
1157 /* Emit notification about the target memory change. */
1158
1159 static void
1160 mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
1161 ssize_t len, const bfd_byte *myaddr)
1162 {
1163 if (mi_suppress_notification.memory)
1164 return;
1165
1166 SWITCH_THRU_ALL_UIS ()
1167 {
1168 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1169 struct ui_out *mi_uiout;
1170 struct obj_section *sec;
1171
1172 if (mi == NULL)
1173 continue;
1174
1175 mi_uiout = top_level_interpreter ()->interp_ui_out ();
1176
1177 target_terminal::scoped_restore_terminal_state term_state;
1178 target_terminal::ours_for_output ();
1179
1180 gdb_printf (mi->event_channel, "memory-changed");
1181
1182 ui_out_redirect_pop redir (mi_uiout, mi->event_channel);
1183
1184 mi_uiout->field_fmt ("thread-group", "i%d", inferior->num);
1185 mi_uiout->field_core_addr ("addr", target_gdbarch (), memaddr);
1186 mi_uiout->field_string ("len", hex_string (len));
1187
1188 /* Append 'type=code' into notification if MEMADDR falls in the range of
1189 sections contain code. */
1190 sec = find_pc_section (memaddr);
1191 if (sec != NULL && sec->objfile != NULL)
1192 {
1193 flagword flags = bfd_section_flags (sec->the_bfd_section);
1194
1195 if (flags & SEC_CODE)
1196 mi_uiout->field_string ("type", "code");
1197 }
1198
1199 gdb_flush (mi->event_channel);
1200 }
1201 }
1202
1203 /* Emit an event when the selection context (inferior, thread, frame)
1204 changed. */
1205
1206 static void
1207 mi_user_selected_context_changed (user_selected_what selection)
1208 {
1209 struct thread_info *tp;
1210
1211 /* Don't send an event if we're responding to an MI command. */
1212 if (mi_suppress_notification.user_selected_context)
1213 return;
1214
1215 if (inferior_ptid != null_ptid)
1216 tp = inferior_thread ();
1217 else
1218 tp = NULL;
1219
1220 SWITCH_THRU_ALL_UIS ()
1221 {
1222 struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
1223 struct ui_out *mi_uiout;
1224
1225 if (mi == NULL)
1226 continue;
1227
1228 mi_uiout = top_level_interpreter ()->interp_ui_out ();
1229
1230 ui_out_redirect_pop redirect_popper (mi_uiout, mi->event_channel);
1231
1232 target_terminal::scoped_restore_terminal_state term_state;
1233 target_terminal::ours_for_output ();
1234
1235 if (selection & USER_SELECTED_INFERIOR)
1236 print_selected_inferior (mi->cli_uiout);
1237
1238 if (tp != NULL
1239 && (selection & (USER_SELECTED_THREAD | USER_SELECTED_FRAME)))
1240 {
1241 print_selected_thread_frame (mi->cli_uiout, selection);
1242
1243 gdb_printf (mi->event_channel,
1244 "thread-selected,id=\"%d\"",
1245 tp->global_num);
1246
1247 if (tp->state != THREAD_RUNNING)
1248 {
1249 if (has_stack_frames ())
1250 print_stack_frame_to_uiout (mi_uiout, get_selected_frame (NULL),
1251 1, SRC_AND_LOC, 1);
1252 }
1253 }
1254
1255 gdb_flush (mi->event_channel);
1256 }
1257 }
1258
1259 ui_out *
1260 mi_interp::interp_ui_out ()
1261 {
1262 return this->mi_uiout;
1263 }
1264
1265 /* Do MI-specific logging actions; save raw_stdout, and change all
1266 the consoles to use the supplied ui-file(s). */
1267
1268 void
1269 mi_interp::set_logging (ui_file_up logfile, bool logging_redirect,
1270 bool debug_redirect)
1271 {
1272 struct mi_interp *mi = this;
1273
1274 if (logfile != NULL)
1275 {
1276 mi->saved_raw_stdout = mi->raw_stdout;
1277
1278 ui_file *logfile_p = logfile.get ();
1279 mi->logfile_holder = std::move (logfile);
1280
1281 /* If something is not being redirected, then a tee containing both the
1282 logfile and stdout. */
1283 ui_file *tee = nullptr;
1284 if (!logging_redirect || !debug_redirect)
1285 {
1286 tee = new tee_file (mi->raw_stdout, logfile_p);
1287 mi->stdout_holder.reset (tee);
1288 }
1289
1290 mi->raw_stdout = logging_redirect ? logfile_p : tee;
1291 }
1292 else
1293 {
1294 mi->logfile_holder.reset ();
1295 mi->stdout_holder.reset ();
1296 mi->raw_stdout = mi->saved_raw_stdout;
1297 mi->saved_raw_stdout = nullptr;
1298 }
1299
1300 mi->out->set_raw (mi->raw_stdout);
1301 mi->err->set_raw (mi->raw_stdout);
1302 mi->log->set_raw (mi->raw_stdout);
1303 mi->targ->set_raw (mi->raw_stdout);
1304 mi->event_channel->set_raw (mi->raw_stdout);
1305 }
1306
1307 /* Factory for MI interpreters. */
1308
1309 static struct interp *
1310 mi_interp_factory (const char *name)
1311 {
1312 return new mi_interp (name);
1313 }
1314
1315 void _initialize_mi_interp ();
1316 void
1317 _initialize_mi_interp ()
1318 {
1319 /* The various interpreter levels. */
1320 interp_factory_register (INTERP_MI2, mi_interp_factory);
1321 interp_factory_register (INTERP_MI3, mi_interp_factory);
1322 interp_factory_register (INTERP_MI4, mi_interp_factory);
1323 interp_factory_register (INTERP_MI, mi_interp_factory);
1324
1325 gdb::observers::signal_received.attach (mi_on_signal_received, "mi-interp");
1326 gdb::observers::end_stepping_range.attach (mi_on_end_stepping_range,
1327 "mi-interp");
1328 gdb::observers::signal_exited.attach (mi_on_signal_exited, "mi-interp");
1329 gdb::observers::exited.attach (mi_on_exited, "mi-interp");
1330 gdb::observers::no_history.attach (mi_on_no_history, "mi-interp");
1331 gdb::observers::new_thread.attach (mi_new_thread, "mi-interp");
1332 gdb::observers::thread_exit.attach (mi_thread_exit, "mi-interp");
1333 gdb::observers::inferior_added.attach (mi_inferior_added, "mi-interp");
1334 gdb::observers::inferior_appeared.attach (mi_inferior_appeared, "mi-interp");
1335 gdb::observers::inferior_exit.attach (mi_inferior_exit, "mi-interp");
1336 gdb::observers::inferior_removed.attach (mi_inferior_removed, "mi-interp");
1337 gdb::observers::record_changed.attach (mi_record_changed, "mi-interp");
1338 gdb::observers::normal_stop.attach (mi_on_normal_stop, "mi-interp");
1339 gdb::observers::target_resumed.attach (mi_on_resume, "mi-interp");
1340 gdb::observers::solib_loaded.attach (mi_solib_loaded, "mi-interp");
1341 gdb::observers::solib_unloaded.attach (mi_solib_unloaded, "mi-interp");
1342 gdb::observers::about_to_proceed.attach (mi_about_to_proceed, "mi-interp");
1343 gdb::observers::traceframe_changed.attach (mi_traceframe_changed,
1344 "mi-interp");
1345 gdb::observers::tsv_created.attach (mi_tsv_created, "mi-interp");
1346 gdb::observers::tsv_deleted.attach (mi_tsv_deleted, "mi-interp");
1347 gdb::observers::tsv_modified.attach (mi_tsv_modified, "mi-interp");
1348 gdb::observers::breakpoint_created.attach (mi_breakpoint_created,
1349 "mi-interp");
1350 gdb::observers::breakpoint_deleted.attach (mi_breakpoint_deleted,
1351 "mi-interp");
1352 gdb::observers::breakpoint_modified.attach (mi_breakpoint_modified,
1353 "mi-interp");
1354 gdb::observers::command_param_changed.attach (mi_command_param_changed,
1355 "mi-interp");
1356 gdb::observers::command_error.attach (mi_on_command_error, "mi-interp");
1357 gdb::observers::memory_changed.attach (mi_memory_changed, "mi-interp");
1358 gdb::observers::sync_execution_done.attach (mi_on_sync_execution_done,
1359 "mi-interp");
1360 gdb::observers::user_selected_context_changed.attach
1361 (mi_user_selected_context_changed, "mi-interp");
1362 }