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