Do target_terminal_ours in query & friends instead of in all callers
[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);
82a90ccf 68static void mi_record_changed (struct inferior*, int);
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
4a8f6654 91static void *
4801a9a3 92mi_interpreter_init (struct interp *interp, int top_level)
4a8f6654 93{
70ba0933 94 struct mi_interp *mi = XNEW (struct mi_interp);
4801a9a3
PA
95 const char *name;
96 int mi_version;
4a8f6654 97
bf6309af
SS
98 /* Assign the output channel created at startup to its own global,
99 so that we can create a console channel that encapsulates and
100 prefixes all gdb_output-type bits coming from the rest of the
101 debugger. */
4a8f6654 102
bf6309af 103 raw_stdout = gdb_stdout;
4a8f6654 104
2b03b41d
SS
105 /* Create MI console channels, each with a different prefix so they
106 can be distinguished. */
4a8f6654
AC
107 mi->out = mi_console_file_new (raw_stdout, "~", '"');
108 mi->err = mi_console_file_new (raw_stdout, "&", '"');
109 mi->log = mi->err;
110 mi->targ = mi_console_file_new (raw_stdout, "@", '"');
111 mi->event_channel = mi_console_file_new (raw_stdout, "=", 0);
112
4801a9a3
PA
113 name = interp_name (interp);
114 /* INTERP_MI selects the most recent released version. "mi2" was
115 released as part of GDB 6.0. */
116 if (strcmp (name, INTERP_MI) == 0)
117 mi_version = 2;
118 else if (strcmp (name, INTERP_MI1) == 0)
119 mi_version = 1;
120 else if (strcmp (name, INTERP_MI2) == 0)
121 mi_version = 2;
122 else if (strcmp (name, INTERP_MI3) == 0)
123 mi_version = 3;
124 else
125 gdb_assert_not_reached ("unhandled MI version");
126
fd664c91
PA
127 mi->mi_uiout = mi_out_new (mi_version);
128 mi->cli_uiout = cli_out_new (mi->out);
129
130 /* There are installed even if MI is not the top level interpreter.
131 The callbacks themselves decide whether to be skipped. */
132 observer_attach_signal_received (mi_on_signal_received);
133 observer_attach_end_stepping_range (mi_on_end_stepping_range);
134 observer_attach_signal_exited (mi_on_signal_exited);
135 observer_attach_exited (mi_on_exited);
136 observer_attach_no_history (mi_on_no_history);
4801a9a3 137
683f2885 138 if (top_level)
063bfe2e
VP
139 {
140 observer_attach_new_thread (mi_new_thread);
141 observer_attach_thread_exit (mi_thread_exit);
a79b8f6e 142 observer_attach_inferior_added (mi_inferior_added);
6c95b8df 143 observer_attach_inferior_appeared (mi_inferior_appeared);
4a92f99b 144 observer_attach_inferior_exit (mi_inferior_exit);
a79b8f6e 145 observer_attach_inferior_removed (mi_inferior_removed);
82a90ccf 146 observer_attach_record_changed (mi_record_changed);
f7f9a841 147 observer_attach_normal_stop (mi_on_normal_stop);
e1ac3328 148 observer_attach_target_resumed (mi_on_resume);
c86cf029
VP
149 observer_attach_solib_loaded (mi_solib_loaded);
150 observer_attach_solib_unloaded (mi_solib_unloaded);
f3b1572e 151 observer_attach_about_to_proceed (mi_about_to_proceed);
201b4506 152 observer_attach_traceframe_changed (mi_traceframe_changed);
bb25a15c
YQ
153 observer_attach_tsv_created (mi_tsv_created);
154 observer_attach_tsv_deleted (mi_tsv_deleted);
134a2066 155 observer_attach_tsv_modified (mi_tsv_modified);
8d3788bd
VP
156 observer_attach_breakpoint_created (mi_breakpoint_created);
157 observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
158 observer_attach_breakpoint_modified (mi_breakpoint_modified);
5b9afe8a 159 observer_attach_command_param_changed (mi_command_param_changed);
8de0566d 160 observer_attach_memory_changed (mi_memory_changed);
329ea579 161 observer_attach_sync_execution_done (mi_on_sync_execution_done);
a79b8f6e 162
2b03b41d
SS
163 /* The initial inferior is created before this function is
164 called, so we need to report it explicitly. Use iteration in
165 case future version of GDB creates more than one inferior
166 up-front. */
a79b8f6e 167 iterate_over_inferiors (report_initial_inferior, mi);
063bfe2e 168 }
683f2885 169
4a8f6654
AC
170 return mi;
171}
172
173static int
174mi_interpreter_resume (void *data)
175{
19ba03f4 176 struct mi_interp *mi = (struct mi_interp *) data;
4a8f6654 177
2b03b41d
SS
178 /* As per hack note in mi_interpreter_init, swap in the output
179 channels... */
4a8f6654
AC
180 gdb_setup_readline ();
181
362646f5
AC
182 /* These overwrite some of the initialization done in
183 _intialize_event_loop. */
c70061cf 184 call_readline = gdb_readline_no_editing_callback;
e837f12a 185 input_handler = mi_execute_command_input_handler;
362646f5
AC
186 async_command_editing_p = 0;
187 /* FIXME: This is a total hack for now. PB's use of the MI
188 implicitly relies on a bug in the async support which allows
189 asynchronous commands to leak through the commmand loop. The bug
190 involves (but is not limited to) the fact that sync_execution was
191 erroneously initialized to 0. Duplicate by initializing it thus
192 here... */
193 sync_execution = 0;
4a8f6654
AC
194
195 gdb_stdout = mi->out;
2b03b41d 196 /* Route error and log output through the MI. */
4a8f6654
AC
197 gdb_stderr = mi->err;
198 gdb_stdlog = mi->log;
2b03b41d 199 /* Route target output through the MI. */
4a8f6654 200 gdb_stdtarg = mi->targ;
2b03b41d 201 /* Route target error through the MI as well. */
1f20321b 202 gdb_stdtargerr = mi->targ;
4a8f6654
AC
203
204 /* Replace all the hooks that we know about. There really needs to
205 be a better way of doing this... */
206 clear_interpreter_hooks ();
207
9a4105ab 208 deprecated_show_load_progress = mi_load_progress;
4a8f6654 209
4a8f6654
AC
210 return 1;
211}
212
213static int
214mi_interpreter_suspend (void *data)
215{
216 gdb_disable_readline ();
217 return 1;
218}
219
71fff37b 220static struct gdb_exception
4a8f6654
AC
221mi_interpreter_exec (void *data, const char *command)
222{
ee047554 223 mi_execute_command_wrapper (command);
c1043fc2 224 return exception_none;
4a8f6654
AC
225}
226
ce8f13f8 227void
4a8f6654
AC
228mi_cmd_interpreter_exec (char *command, char **argv, int argc)
229{
230 struct interp *interp_to_use;
4a8f6654 231 int i;
a13e061a
PA
232 char *mi_error_message = NULL;
233 struct cleanup *old_chain;
4a8f6654
AC
234
235 if (argc < 2)
1b05df00 236 error (_("-interpreter-exec: "
9b20d036 237 "Usage: -interpreter-exec interp command"));
4a8f6654
AC
238
239 interp_to_use = interp_lookup (argv[0]);
240 if (interp_to_use == NULL)
1b05df00 241 error (_("-interpreter-exec: could not find interpreter \"%s\""),
9a2b4c1b 242 argv[0]);
4a8f6654 243
17b2616c
PA
244 /* Note that unlike the CLI version of this command, we don't
245 actually set INTERP_TO_USE as the current interpreter, as we
246 still want gdb_stdout, etc. to point at MI streams. */
247
2b03b41d
SS
248 /* Insert the MI out hooks, making sure to also call the
249 interpreter's hooks if it has any. */
250 /* KRS: We shouldn't need this... Events should be installed and
251 they should just ALWAYS fire something out down the MI
252 channel. */
4a8f6654
AC
253 mi_insert_notify_hooks ();
254
2b03b41d 255 /* Now run the code. */
4a8f6654 256
a13e061a 257 old_chain = make_cleanup (null_cleanup, 0);
4a8f6654
AC
258 for (i = 1; i < argc; i++)
259 {
32c1e744 260 struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
102040f0 261
32c1e744
VP
262 if (e.reason < 0)
263 {
264 mi_error_message = xstrdup (e.message);
a13e061a 265 make_cleanup (xfree, mi_error_message);
32c1e744
VP
266 break;
267 }
4a8f6654
AC
268 }
269
270 mi_remove_notify_hooks ();
271
a13e061a
PA
272 if (mi_error_message != NULL)
273 error ("%s", mi_error_message);
274 do_cleanups (old_chain);
4a8f6654
AC
275}
276
2b03b41d
SS
277/* This inserts a number of hooks that are meant to produce
278 async-notify ("=") MI messages while running commands in another
279 interpreter using mi_interpreter_exec. The canonical use for this
280 is to allow access to the gdb CLI interpreter from within the MI,
281 while still producing MI style output when actions in the CLI
282 command change GDB's state. */
4a8f6654
AC
283
284static void
285mi_insert_notify_hooks (void)
286{
9a4105ab 287 deprecated_query_hook = mi_interp_query_hook;
4a8f6654
AC
288}
289
290static void
11308a41 291mi_remove_notify_hooks (void)
4a8f6654 292{
9a4105ab 293 deprecated_query_hook = NULL;
4a8f6654
AC
294}
295
296static int
297mi_interp_query_hook (const char *ctlstr, va_list ap)
298{
299 return 1;
300}
301
4a8f6654 302static void
ee047554 303mi_execute_command_wrapper (const char *cmd)
4a8f6654
AC
304{
305 mi_execute_command (cmd, stdin == instream);
306}
307
329ea579
PA
308/* Observer for the synchronous_command_done notification. */
309
310static void
311mi_on_sync_execution_done (void)
312{
0b333c5e
PA
313 /* If MI is sync, then output the MI prompt now, indicating we're
314 ready for further input. */
329ea579
PA
315 if (!mi_async_p ())
316 {
317 fputs_unfiltered ("(gdb) \n", raw_stdout);
318 gdb_flush (raw_stdout);
319 }
320}
321
e837f12a
JK
322/* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER. */
323
324static void
325mi_execute_command_input_handler (char *cmd)
326{
327 mi_execute_command_wrapper (cmd);
328
0b333c5e
PA
329 /* Print a prompt, indicating we're ready for further input, unless
330 we just started a synchronous command. In that case, we're about
331 to go back to the event loop and will output the prompt in the
332 'synchronous_command_done' observer when the target next
333 stops. */
334 if (!sync_execution)
329ea579
PA
335 {
336 fputs_unfiltered ("(gdb) \n", raw_stdout);
337 gdb_flush (raw_stdout);
338 }
e837f12a
JK
339}
340
4a8f6654 341static void
1af12a7d 342mi_command_loop (void *data)
4a8f6654 343{
4a8f6654 344 /* Turn off 8 bit strings in quoted output. Any character with the
2b03b41d 345 high bit set is printed using C's octal format. */
4a8f6654 346 sevenbit_strings = 1;
2b03b41d
SS
347
348 /* Tell the world that we're alive. */
4a8f6654
AC
349 fputs_unfiltered ("(gdb) \n", raw_stdout);
350 gdb_flush (raw_stdout);
2b03b41d 351
362646f5 352 start_event_loop ();
4a8f6654
AC
353}
354
683f2885
VP
355static void
356mi_new_thread (struct thread_info *t)
357{
19ba03f4 358 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
c9657e70 359 struct inferior *inf = find_inferior_ptid (t->ptid);
a79b8f6e
VP
360
361 gdb_assert (inf);
683f2885 362
3d043ef6 363 fprintf_unfiltered (mi->event_channel,
a79b8f6e 364 "thread-created,id=\"%d\",group-id=\"i%d\"",
5d5658a1 365 t->global_num, inf->num);
683f2885
VP
366 gdb_flush (mi->event_channel);
367}
368
063bfe2e 369static void
a07daef3 370mi_thread_exit (struct thread_info *t, int silent)
063bfe2e 371{
a07daef3 372 struct mi_interp *mi;
a79b8f6e 373 struct inferior *inf;
1abf3a14 374 struct cleanup *old_chain;
a07daef3
PA
375
376 if (silent)
377 return;
378
c9657e70 379 inf = find_inferior_ptid (t->ptid);
a79b8f6e 380
19ba03f4 381 mi = (struct mi_interp *) top_level_interpreter_data ();
1abf3a14 382 old_chain = make_cleanup_restore_target_terminal ();
063bfe2e 383 target_terminal_ours ();
3d043ef6 384 fprintf_unfiltered (mi->event_channel,
a79b8f6e 385 "thread-exited,id=\"%d\",group-id=\"i%d\"",
5d5658a1 386 t->global_num, inf->num);
063bfe2e 387 gdb_flush (mi->event_channel);
1abf3a14
SM
388
389 do_cleanups (old_chain);
063bfe2e
VP
390}
391
82a90ccf
YQ
392/* Emit notification on changing the state of record. */
393
394static void
395mi_record_changed (struct inferior *inferior, int started)
396{
19ba03f4 397 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
82a90ccf
YQ
398
399 fprintf_unfiltered (mi->event_channel, "record-%s,thread-group=\"i%d\"",
400 started ? "started" : "stopped", inferior->num);
401
402 gdb_flush (mi->event_channel);
403}
404
a79b8f6e
VP
405static void
406mi_inferior_added (struct inferior *inf)
407{
19ba03f4 408 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
102040f0 409
a79b8f6e
VP
410 target_terminal_ours ();
411 fprintf_unfiltered (mi->event_channel,
412 "thread-group-added,id=\"i%d\"",
413 inf->num);
414 gdb_flush (mi->event_channel);
415}
416
417static void
418mi_inferior_appeared (struct inferior *inf)
4a92f99b 419{
19ba03f4 420 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
102040f0 421
4a92f99b 422 target_terminal_ours ();
a79b8f6e
VP
423 fprintf_unfiltered (mi->event_channel,
424 "thread-group-started,id=\"i%d\",pid=\"%d\"",
425 inf->num, inf->pid);
4a92f99b
VP
426 gdb_flush (mi->event_channel);
427}
428
429static void
a79b8f6e 430mi_inferior_exit (struct inferior *inf)
4a92f99b 431{
19ba03f4 432 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
102040f0 433
4a92f99b 434 target_terminal_ours ();
8cf64490
TT
435 if (inf->has_exit_code)
436 fprintf_unfiltered (mi->event_channel,
437 "thread-group-exited,id=\"i%d\",exit-code=\"%s\"",
438 inf->num, int_string (inf->exit_code, 8, 0, 0, 1));
439 else
440 fprintf_unfiltered (mi->event_channel,
441 "thread-group-exited,id=\"i%d\"", inf->num);
442
4a92f99b
VP
443 gdb_flush (mi->event_channel);
444}
445
a79b8f6e
VP
446static void
447mi_inferior_removed (struct inferior *inf)
448{
19ba03f4 449 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
102040f0 450
a79b8f6e
VP
451 target_terminal_ours ();
452 fprintf_unfiltered (mi->event_channel,
453 "thread-group-removed,id=\"i%d\"",
454 inf->num);
455 gdb_flush (mi->event_channel);
456}
457
fd664c91
PA
458/* Return the MI interpreter, if it is active -- either because it's
459 the top-level interpreter or the interpreter executing the current
460 command. Returns NULL if the MI interpreter is not being used. */
461
462static struct interp *
463find_mi_interpreter (void)
464{
465 struct interp *interp;
466
467 interp = top_level_interpreter ();
468 if (ui_out_is_mi_like_p (interp_ui_out (interp)))
469 return interp;
470
471 interp = command_interp ();
472 if (ui_out_is_mi_like_p (interp_ui_out (interp)))
473 return interp;
474
475 return NULL;
476}
477
478/* Return the MI_INTERP structure of the active MI interpreter.
479 Returns NULL if MI is not active. */
480
481static struct mi_interp *
482mi_interp_data (void)
483{
484 struct interp *interp = find_mi_interpreter ();
485
486 if (interp != NULL)
19ba03f4 487 return (struct mi_interp *) interp_data (interp);
fd664c91
PA
488 return NULL;
489}
490
491/* Observers for several run control events that print why the
492 inferior has stopped to both the the MI event channel and to the MI
493 console. If the MI interpreter is not active, print nothing. */
494
495/* Observer for the signal_received notification. */
496
497static void
498mi_on_signal_received (enum gdb_signal siggnal)
499{
500 struct mi_interp *mi = mi_interp_data ();
501
502 if (mi == NULL)
503 return;
504
505 print_signal_received_reason (mi->mi_uiout, siggnal);
506 print_signal_received_reason (mi->cli_uiout, siggnal);
507}
508
509/* Observer for the end_stepping_range notification. */
510
511static void
512mi_on_end_stepping_range (void)
513{
514 struct mi_interp *mi = mi_interp_data ();
515
516 if (mi == NULL)
517 return;
518
519 print_end_stepping_range_reason (mi->mi_uiout);
520 print_end_stepping_range_reason (mi->cli_uiout);
521}
522
523/* Observer for the signal_exited notification. */
17b2616c
PA
524
525static void
fd664c91 526mi_on_signal_exited (enum gdb_signal siggnal)
17b2616c 527{
fd664c91 528 struct mi_interp *mi = mi_interp_data ();
17b2616c 529
fd664c91
PA
530 if (mi == NULL)
531 return;
532
533 print_signal_exited_reason (mi->mi_uiout, siggnal);
534 print_signal_exited_reason (mi->cli_uiout, siggnal);
535}
536
537/* Observer for the exited notification. */
538
539static void
540mi_on_exited (int exitstatus)
541{
542 struct mi_interp *mi = mi_interp_data ();
543
544 if (mi == NULL)
545 return;
546
547 print_exited_reason (mi->mi_uiout, exitstatus);
548 print_exited_reason (mi->cli_uiout, exitstatus);
549}
550
551/* Observer for the no_history notification. */
552
553static void
554mi_on_no_history (void)
555{
556 struct mi_interp *mi = mi_interp_data ();
557
558 if (mi == NULL)
559 return;
560
561 print_no_history_reason (mi->mi_uiout);
562 print_no_history_reason (mi->cli_uiout);
17b2616c
PA
563}
564
f7f9a841 565static void
1d33d6ba 566mi_on_normal_stop (struct bpstats *bs, int print_frame)
f7f9a841
VP
567{
568 /* Since this can be called when CLI command is executing,
569 using cli interpreter, be sure to use MI uiout for output,
570 not the current one. */
1d33d6ba 571 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
f7f9a841 572
1d33d6ba
VP
573 if (print_frame)
574 {
243a9253 575 struct thread_info *tp;
dc146f7c 576 int core;
102040f0 577
243a9253 578 tp = inferior_thread ();
36dfb11c 579
243a9253
PA
580 if (tp->thread_fsm != NULL
581 && thread_fsm_finished_p (tp->thread_fsm))
582 {
583 enum async_reply_reason reason;
36dfb11c 584
243a9253
PA
585 reason = thread_fsm_async_reply_reason (tp->thread_fsm);
586 ui_out_field_string (mi_uiout, "reason",
587 async_reason_lookup (reason));
1d33d6ba 588 }
243a9253
PA
589 print_stop_event (mi_uiout);
590
591 /* Breakpoint hits should always be mirrored to the console.
592 Deciding what to mirror to the console wrt to breakpoints and
593 random stops gets messy real fast. E.g., say "s" trips on a
594 breakpoint. We'd clearly want to mirror the event to the
595 console in this case. But what about more complicated cases
596 like "s&; thread n; s&", and one of those steps spawning a
597 new thread, and that thread hitting a breakpoint? It's
598 impossible in general to track whether the thread had any
599 relation to the commands that had been executed. So we just
600 simplify and always mirror breakpoints and random events to
601 the console.
602
603 OTOH, we should print the source line to the console when
604 stepping or other similar commands, iff the step was started
605 by a console command, but not if it was started with
606 -exec-step or similar. */
607 if ((bpstat_what (tp->control.stop_bpstat).main_action
608 == BPSTAT_WHAT_STOP_NOISY)
609 || !(tp->thread_fsm != NULL
610 && thread_fsm_finished_p (tp->thread_fsm))
611 || (tp->control.command_interp != NULL
612 && tp->control.command_interp != top_level_interpreter ()))
17b2616c 613 {
19ba03f4
SM
614 struct mi_interp *mi
615 = (struct mi_interp *) top_level_interpreter_data ();
243a9253
PA
616
617 print_stop_event (mi->cli_uiout);
17b2616c 618 }
1d33d6ba 619
5d5658a1
PA
620 tp = inferior_thread ();
621 ui_out_field_int (mi_uiout, "thread-id", tp->global_num);
1d33d6ba
VP
622 if (non_stop)
623 {
624 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end
625 (mi_uiout, "stopped-threads");
102040f0 626
5d5658a1 627 ui_out_field_int (mi_uiout, NULL, tp->global_num);
1d33d6ba
VP
628 do_cleanups (back_to);
629 }
630 else
631 ui_out_field_string (mi_uiout, "stopped-threads", "all");
dc146f7c
VP
632
633 core = target_core_of_thread (inferior_ptid);
634 if (core != -1)
635 ui_out_field_int (mi_uiout, "core", core);
1d33d6ba
VP
636 }
637
f7f9a841 638 fputs_unfiltered ("*stopped", raw_stdout);
1d33d6ba
VP
639 mi_out_put (mi_uiout, raw_stdout);
640 mi_out_rewind (mi_uiout);
4333ada3 641 mi_print_timing_maybe ();
f7f9a841
VP
642 fputs_unfiltered ("\n", raw_stdout);
643 gdb_flush (raw_stdout);
644}
645
f3b1572e
PA
646static void
647mi_about_to_proceed (void)
648{
649 /* Suppress output while calling an inferior function. */
650
651 if (!ptid_equal (inferior_ptid, null_ptid))
652 {
653 struct thread_info *tp = inferior_thread ();
102040f0 654
16c381f0 655 if (tp->control.in_infcall)
f3b1572e
PA
656 return;
657 }
658
659 mi_proceeded = 1;
660}
661
5b9afe8a
YQ
662/* When the element is non-zero, no MI notifications will be emitted in
663 response to the corresponding observers. */
2b03b41d 664
5b9afe8a
YQ
665struct mi_suppress_notification mi_suppress_notification =
666 {
667 0,
668 0,
201b4506 669 0,
5b9afe8a 670 };
8d3788bd 671
201b4506
YQ
672/* Emit notification on changing a traceframe. */
673
674static void
675mi_traceframe_changed (int tfnum, int tpnum)
676{
19ba03f4 677 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
201b4506
YQ
678
679 if (mi_suppress_notification.traceframe)
680 return;
681
682 target_terminal_ours ();
683
684 if (tfnum >= 0)
685 fprintf_unfiltered (mi->event_channel, "traceframe-changed,"
686 "num=\"%d\",tracepoint=\"%d\"\n",
687 tfnum, tpnum);
688 else
689 fprintf_unfiltered (mi->event_channel, "traceframe-changed,end");
690
691 gdb_flush (mi->event_channel);
692}
693
bb25a15c
YQ
694/* Emit notification on creating a trace state variable. */
695
696static void
134a2066 697mi_tsv_created (const struct trace_state_variable *tsv)
bb25a15c 698{
19ba03f4 699 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
bb25a15c
YQ
700
701 target_terminal_ours ();
702
703 fprintf_unfiltered (mi->event_channel, "tsv-created,"
134a2066
YQ
704 "name=\"%s\",initial=\"%s\"\n",
705 tsv->name, plongest (tsv->initial_value));
bb25a15c
YQ
706
707 gdb_flush (mi->event_channel);
708}
709
710/* Emit notification on deleting a trace state variable. */
711
712static void
134a2066 713mi_tsv_deleted (const struct trace_state_variable *tsv)
bb25a15c 714{
19ba03f4 715 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
bb25a15c
YQ
716
717 target_terminal_ours ();
718
134a2066 719 if (tsv != NULL)
bb25a15c 720 fprintf_unfiltered (mi->event_channel, "tsv-deleted,"
134a2066 721 "name=\"%s\"\n", tsv->name);
bb25a15c
YQ
722 else
723 fprintf_unfiltered (mi->event_channel, "tsv-deleted\n");
724
725 gdb_flush (mi->event_channel);
726}
727
134a2066
YQ
728/* Emit notification on modifying a trace state variable. */
729
730static void
731mi_tsv_modified (const struct trace_state_variable *tsv)
732{
19ba03f4 733 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
134a2066
YQ
734 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
735
736 target_terminal_ours ();
737
738 fprintf_unfiltered (mi->event_channel,
739 "tsv-modified");
740
741 ui_out_redirect (mi_uiout, mi->event_channel);
742
743 ui_out_field_string (mi_uiout, "name", tsv->name);
744 ui_out_field_string (mi_uiout, "initial",
745 plongest (tsv->initial_value));
746 if (tsv->value_known)
747 ui_out_field_string (mi_uiout, "current", plongest (tsv->value));
748
749 ui_out_redirect (mi_uiout, NULL);
750
751 gdb_flush (mi->event_channel);
752}
753
8d3788bd 754/* Emit notification about a created breakpoint. */
2b03b41d 755
8d3788bd
VP
756static void
757mi_breakpoint_created (struct breakpoint *b)
758{
19ba03f4 759 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
8d3788bd 760 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
8d3788bd 761
5b9afe8a 762 if (mi_suppress_notification.breakpoint)
8d3788bd
VP
763 return;
764
765 if (b->number <= 0)
766 return;
767
768 target_terminal_ours ();
769 fprintf_unfiltered (mi->event_channel,
770 "breakpoint-created");
771 /* We want the output from gdb_breakpoint_query to go to
2b03b41d
SS
772 mi->event_channel. One approach would be to just call
773 gdb_breakpoint_query, and then use mi_out_put to send the current
774 content of mi_outout into mi->event_channel. However, that will
775 break if anything is output to mi_uiout prior to calling the
776 breakpoint_created notifications. So, we use
777 ui_out_redirect. */
8d3788bd 778 ui_out_redirect (mi_uiout, mi->event_channel);
492d29ea
PA
779 TRY
780 {
781 gdb_breakpoint_query (mi_uiout, b->number, NULL);
782 }
783 CATCH (e, RETURN_MASK_ERROR)
784 {
785 }
786 END_CATCH
787
8d3788bd
VP
788 ui_out_redirect (mi_uiout, NULL);
789
790 gdb_flush (mi->event_channel);
791}
792
793/* Emit notification about deleted breakpoint. */
2b03b41d 794
8d3788bd
VP
795static void
796mi_breakpoint_deleted (struct breakpoint *b)
797{
19ba03f4 798 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
8d3788bd 799
5b9afe8a 800 if (mi_suppress_notification.breakpoint)
8d3788bd
VP
801 return;
802
803 if (b->number <= 0)
804 return;
805
806 target_terminal_ours ();
807
808 fprintf_unfiltered (mi->event_channel, "breakpoint-deleted,id=\"%d\"",
809 b->number);
810
811 gdb_flush (mi->event_channel);
812}
813
814/* Emit notification about modified breakpoint. */
2b03b41d 815
8d3788bd
VP
816static void
817mi_breakpoint_modified (struct breakpoint *b)
818{
19ba03f4 819 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
8d3788bd 820 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
8d3788bd 821
5b9afe8a 822 if (mi_suppress_notification.breakpoint)
8d3788bd
VP
823 return;
824
825 if (b->number <= 0)
826 return;
827
828 target_terminal_ours ();
829 fprintf_unfiltered (mi->event_channel,
830 "breakpoint-modified");
831 /* We want the output from gdb_breakpoint_query to go to
2b03b41d
SS
832 mi->event_channel. One approach would be to just call
833 gdb_breakpoint_query, and then use mi_out_put to send the current
834 content of mi_outout into mi->event_channel. However, that will
835 break if anything is output to mi_uiout prior to calling the
836 breakpoint_created notifications. So, we use
837 ui_out_redirect. */
8d3788bd 838 ui_out_redirect (mi_uiout, mi->event_channel);
492d29ea
PA
839 TRY
840 {
841 gdb_breakpoint_query (mi_uiout, b->number, NULL);
842 }
843 CATCH (e, RETURN_MASK_ERROR)
844 {
845 }
846 END_CATCH
847
8d3788bd
VP
848 ui_out_redirect (mi_uiout, NULL);
849
850 gdb_flush (mi->event_channel);
851}
852
d90e17a7
PA
853static int
854mi_output_running_pid (struct thread_info *info, void *arg)
855{
19ba03f4 856 ptid_t *ptid = (ptid_t *) arg;
d90e17a7
PA
857
858 if (ptid_get_pid (*ptid) == ptid_get_pid (info->ptid))
859 fprintf_unfiltered (raw_stdout,
860 "*running,thread-id=\"%d\"\n",
5d5658a1 861 info->global_num);
d90e17a7
PA
862
863 return 0;
864}
865
866static int
867mi_inferior_count (struct inferior *inf, void *arg)
868{
869 if (inf->pid != 0)
870 {
19ba03f4 871 int *count_p = (int *) arg;
d90e17a7
PA
872 (*count_p)++;
873 }
874
875 return 0;
876}
877
e1ac3328
VP
878static void
879mi_on_resume (ptid_t ptid)
880{
c5a4d20b
PA
881 struct thread_info *tp = NULL;
882
9944e9c2 883 if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
c5a4d20b
PA
884 tp = inferior_thread ();
885 else
e09875d4 886 tp = find_thread_ptid (ptid);
c5a4d20b
PA
887
888 /* Suppress output while calling an inferior function. */
16c381f0 889 if (tp->control.in_infcall)
c5a4d20b
PA
890 return;
891
a2840c35
VP
892 /* To cater for older frontends, emit ^running, but do it only once
893 per each command. We do it here, since at this point we know
894 that the target was successfully resumed, and in non-async mode,
895 we won't return back to MI interpreter code until the target
896 is done running, so delaying the output of "^running" until then
897 will make it impossible for frontend to know what's going on.
898
899 In future (MI3), we'll be outputting "^done" here. */
f3b1572e 900 if (!running_result_record_printed && mi_proceeded)
a2840c35 901 {
c271b6e2
VP
902 fprintf_unfiltered (raw_stdout, "%s^running\n",
903 current_token ? current_token : "");
a2840c35
VP
904 }
905
dfd4cc63 906 if (ptid_get_pid (ptid) == -1)
e1ac3328 907 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"all\"\n");
d90e17a7 908 else if (ptid_is_pid (ptid))
bb599c81 909 {
ab730e72 910 int count = 0;
d90e17a7
PA
911
912 /* Backwards compatibility. If there's only one inferior,
913 output "all", otherwise, output each resumed thread
914 individually. */
915 iterate_over_inferiors (mi_inferior_count, &count);
916
917 if (count == 1)
918 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"all\"\n");
919 else
920 iterate_over_threads (mi_output_running_pid, &ptid);
bb599c81 921 }
e1ac3328
VP
922 else
923 {
e09875d4 924 struct thread_info *ti = find_thread_ptid (ptid);
102040f0 925
e1ac3328 926 gdb_assert (ti);
5d5658a1
PA
927 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"%d\"\n",
928 ti->global_num);
e1ac3328 929 }
a2840c35 930
f3b1572e 931 if (!running_result_record_printed && mi_proceeded)
a2840c35
VP
932 {
933 running_result_record_printed = 1;
934 /* This is what gdb used to do historically -- printing prompt even if
935 it cannot actually accept any input. This will be surely removed
329ea579
PA
936 for MI3, and may be removed even earlier. SYNC_EXECUTION is
937 checked here because we only need to emit a prompt if a
938 synchronous command was issued when the target is async. */
939 if (!target_is_async_p () || sync_execution)
a2840c35
VP
940 fputs_unfiltered ("(gdb) \n", raw_stdout);
941 }
c1828f25 942 gdb_flush (raw_stdout);
e1ac3328
VP
943}
944
c86cf029
VP
945static void
946mi_solib_loaded (struct so_list *solib)
947{
19ba03f4 948 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
6ef284bd 949 struct ui_out *uiout = interp_ui_out (top_level_interpreter ());
102040f0 950
c86cf029 951 target_terminal_ours ();
6ef284bd
SM
952
953 fprintf_unfiltered (mi->event_channel, "library-loaded");
954
955 ui_out_redirect (uiout, mi->event_channel);
956
957 ui_out_field_string (uiout, "id", solib->so_original_name);
958 ui_out_field_string (uiout, "target-name", solib->so_original_name);
959 ui_out_field_string (uiout, "host-name", solib->so_name);
960 ui_out_field_int (uiout, "symbols-loaded", solib->symbols_loaded);
961 if (!gdbarch_has_global_solist (target_gdbarch ()))
962 {
963 ui_out_field_fmt (uiout, "thread-group", "i%d", current_inferior ()->num);
964 }
965
966 ui_out_redirect (uiout, NULL);
a79b8f6e 967
c86cf029
VP
968 gdb_flush (mi->event_channel);
969}
970
971static void
972mi_solib_unloaded (struct so_list *solib)
973{
19ba03f4 974 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
6ef284bd 975 struct ui_out *uiout = interp_ui_out (top_level_interpreter ());
102040f0 976
c86cf029 977 target_terminal_ours ();
6ef284bd
SM
978
979 fprintf_unfiltered (mi->event_channel, "library-unloaded");
980
981 ui_out_redirect (uiout, mi->event_channel);
982
983 ui_out_field_string (uiout, "id", solib->so_original_name);
984 ui_out_field_string (uiout, "target-name", solib->so_original_name);
985 ui_out_field_string (uiout, "host-name", solib->so_name);
986 if (!gdbarch_has_global_solist (target_gdbarch ()))
987 {
988 ui_out_field_fmt (uiout, "thread-group", "i%d", current_inferior ()->num);
989 }
990
991 ui_out_redirect (uiout, NULL);
a79b8f6e 992
c86cf029
VP
993 gdb_flush (mi->event_channel);
994}
995
5b9afe8a
YQ
996/* Emit notification about the command parameter change. */
997
998static void
999mi_command_param_changed (const char *param, const char *value)
1000{
19ba03f4 1001 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
5b9afe8a
YQ
1002 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
1003
1004 if (mi_suppress_notification.cmd_param_changed)
1005 return;
1006
1007 target_terminal_ours ();
1008
1009 fprintf_unfiltered (mi->event_channel,
1010 "cmd-param-changed");
1011
1012 ui_out_redirect (mi_uiout, mi->event_channel);
1013
1014 ui_out_field_string (mi_uiout, "param", param);
1015 ui_out_field_string (mi_uiout, "value", value);
1016
1017 ui_out_redirect (mi_uiout, NULL);
1018
1019 gdb_flush (mi->event_channel);
1020}
1021
8de0566d
YQ
1022/* Emit notification about the target memory change. */
1023
1024static void
1025mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
1026 ssize_t len, const bfd_byte *myaddr)
1027{
19ba03f4 1028 struct mi_interp *mi = (struct mi_interp *) top_level_interpreter_data ();
8de0566d
YQ
1029 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
1030 struct obj_section *sec;
1031
1032 if (mi_suppress_notification.memory)
1033 return;
1034
1035 target_terminal_ours ();
1036
1037 fprintf_unfiltered (mi->event_channel,
1038 "memory-changed");
1039
1040 ui_out_redirect (mi_uiout, mi->event_channel);
1041
1042 ui_out_field_fmt (mi_uiout, "thread-group", "i%d", inferior->num);
f5656ead 1043 ui_out_field_core_addr (mi_uiout, "addr", target_gdbarch (), memaddr);
deba7593 1044 ui_out_field_fmt (mi_uiout, "len", "%s", hex_string (len));
8de0566d
YQ
1045
1046 /* Append 'type=code' into notification if MEMADDR falls in the range of
1047 sections contain code. */
1048 sec = find_pc_section (memaddr);
1049 if (sec != NULL && sec->objfile != NULL)
1050 {
1051 flagword flags = bfd_get_section_flags (sec->objfile->obfd,
1052 sec->the_bfd_section);
1053
1054 if (flags & SEC_CODE)
1055 ui_out_field_string (mi_uiout, "type", "code");
1056 }
1057
1058 ui_out_redirect (mi_uiout, NULL);
1059
1060 gdb_flush (mi->event_channel);
1061}
1062
a79b8f6e
VP
1063static int
1064report_initial_inferior (struct inferior *inf, void *closure)
1065{
1066 /* This function is called from mi_intepreter_init, and since
1067 mi_inferior_added assumes that inferior is fully initialized
1068 and top_level_interpreter_data is set, we cannot call
1069 it here. */
19ba03f4 1070 struct mi_interp *mi = (struct mi_interp *) closure;
102040f0 1071
a79b8f6e
VP
1072 target_terminal_ours ();
1073 fprintf_unfiltered (mi->event_channel,
1074 "thread-group-added,id=\"i%d\"",
1075 inf->num);
1076 gdb_flush (mi->event_channel);
1077 return 0;
1078}
c86cf029 1079
4801a9a3
PA
1080static struct ui_out *
1081mi_ui_out (struct interp *interp)
1082{
19ba03f4 1083 struct mi_interp *mi = (struct mi_interp *) interp_data (interp);
4801a9a3 1084
fd664c91 1085 return mi->mi_uiout;
4801a9a3
PA
1086}
1087
37ce89eb
SS
1088/* Save the original value of raw_stdout here when logging, so we can
1089 restore correctly when done. */
1090
1091static struct ui_file *saved_raw_stdout;
1092
1093/* Do MI-specific logging actions; save raw_stdout, and change all
1094 the consoles to use the supplied ui-file(s). */
1095
1096static int
1097mi_set_logging (struct interp *interp, int start_log,
1098 struct ui_file *out, struct ui_file *logfile)
1099{
19ba03f4 1100 struct mi_interp *mi = (struct mi_interp *) interp_data (interp);
37ce89eb
SS
1101
1102 if (!mi)
1103 return 0;
1104
1105 if (start_log)
1106 {
1107 /* The tee created already is based on gdb_stdout, which for MI
1108 is a console and so we end up in an infinite loop of console
1109 writing to ui_file writing to console etc. So discard the
1110 existing tee (it hasn't been used yet, and MI won't ever use
1111 it), and create one based on raw_stdout instead. */
1112 if (logfile)
1113 {
1114 ui_file_delete (out);
1115 out = tee_file_new (raw_stdout, 0, logfile, 0);
1116 }
1117
1118 saved_raw_stdout = raw_stdout;
1119 raw_stdout = out;
1120 }
1121 else
1122 {
1123 raw_stdout = saved_raw_stdout;
1124 saved_raw_stdout = NULL;
1125 }
1126
1127 mi_console_set_raw (mi->out, raw_stdout);
1128 mi_console_set_raw (mi->err, raw_stdout);
1129 mi_console_set_raw (mi->log, raw_stdout);
1130 mi_console_set_raw (mi->targ, raw_stdout);
1131 mi_console_set_raw (mi->event_channel, raw_stdout);
1132
1133 return 1;
1134}
1135
b9362cc7
AC
1136extern initialize_file_ftype _initialize_mi_interp; /* -Wmissing-prototypes */
1137
4a8f6654
AC
1138void
1139_initialize_mi_interp (void)
1140{
1141 static const struct interp_procs procs =
2b03b41d
SS
1142 {
1143 mi_interpreter_init, /* init_proc */
1144 mi_interpreter_resume, /* resume_proc */
1145 mi_interpreter_suspend, /* suspend_proc */
1146 mi_interpreter_exec, /* exec_proc */
37ce89eb 1147 mi_ui_out, /* ui_out_proc */
1af12a7d
AB
1148 mi_set_logging, /* set_logging_proc */
1149 mi_command_loop /* command_loop_proc */
2b03b41d 1150 };
4a8f6654 1151
2fcf52f0 1152 /* The various interpreter levels. */
4801a9a3
PA
1153 interp_add (interp_new (INTERP_MI1, &procs));
1154 interp_add (interp_new (INTERP_MI2, &procs));
1155 interp_add (interp_new (INTERP_MI3, &procs));
1156 interp_add (interp_new (INTERP_MI, &procs));
4a8f6654 1157}
This page took 1.357653 seconds and 4 git commands to generate.