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