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