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