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