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