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