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