*** empty log message ***
[deliverable/binutils-gdb.git] / gdb / mi / mi-interp.c
CommitLineData
4a8f6654
AC
1/* MI Interpreter Definitions and Commands for GDB, the GNU debugger.
2
0b302171 3 Copyright (C) 2002-2005, 2007-2012 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"
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"
c1043fc2 28#include "exceptions.h"
4a8f6654
AC
29#include "mi-main.h"
30#include "mi-cmds.h"
31#include "mi-out.h"
32#include "mi-console.h"
66bb093b 33#include "mi-common.h"
683f2885
VP
34#include "observer.h"
35#include "gdbthread.h"
c86cf029 36#include "solist.h"
8d3788bd 37#include "gdb.h"
4a8f6654 38
2b03b41d
SS
39/* These are the interpreter setup, etc. functions for the MI
40 interpreter. */
41
4a8f6654 42static void mi_execute_command_wrapper (char *cmd);
e837f12a 43static void mi_execute_command_input_handler (char *cmd);
4a8f6654 44static void mi_command_loop (int mi_version);
4a8f6654
AC
45
46/* These are hooks that we put in place while doing interpreter_exec
2b03b41d
SS
47 so we can report interesting things that happened "behind the MI's
48 back" in this command. */
49
bee0189a 50static int mi_interp_query_hook (const char *ctlstr, va_list ap)
2b03b41d 51 ATTRIBUTE_PRINTF (1, 0);
4a8f6654 52
f786f615 53static void mi3_command_loop (void);
4a8f6654
AC
54static void mi2_command_loop (void);
55static void mi1_command_loop (void);
56
57static void mi_insert_notify_hooks (void);
58static void mi_remove_notify_hooks (void);
1d33d6ba 59static void mi_on_normal_stop (struct bpstats *bs, int print_frame);
4a8f6654 60
683f2885 61static void mi_new_thread (struct thread_info *t);
a07daef3 62static void mi_thread_exit (struct thread_info *t, int silent);
82a90ccf 63static void mi_record_changed (struct inferior*, int);
a79b8f6e
VP
64static void mi_inferior_added (struct inferior *inf);
65static void mi_inferior_appeared (struct inferior *inf);
66static void mi_inferior_exit (struct inferior *inf);
67static void mi_inferior_removed (struct inferior *inf);
e1ac3328 68static void mi_on_resume (ptid_t ptid);
c86cf029
VP
69static void mi_solib_loaded (struct so_list *solib);
70static void mi_solib_unloaded (struct so_list *solib);
f3b1572e 71static void mi_about_to_proceed (void);
201b4506 72static void mi_traceframe_changed (int tfnum, int tpnum);
bb25a15c
YQ
73static void mi_tsv_created (const char *name, LONGEST value);
74static void mi_tsv_deleted (const char *name);
8d3788bd
VP
75static void mi_breakpoint_created (struct breakpoint *b);
76static void mi_breakpoint_deleted (struct breakpoint *b);
77static void mi_breakpoint_modified (struct breakpoint *b);
5b9afe8a 78static void mi_command_param_changed (const char *param, const char *value);
683f2885 79
a79b8f6e
VP
80static int report_initial_inferior (struct inferior *inf, void *closure);
81
4a8f6654 82static void *
4801a9a3 83mi_interpreter_init (struct interp *interp, int top_level)
4a8f6654
AC
84{
85 struct mi_interp *mi = XMALLOC (struct mi_interp);
4801a9a3
PA
86 const char *name;
87 int mi_version;
4a8f6654 88
bf6309af
SS
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. */
4a8f6654 93
bf6309af 94 raw_stdout = gdb_stdout;
4a8f6654 95
2b03b41d
SS
96 /* Create MI console channels, each with a different prefix so they
97 can be distinguished. */
4a8f6654
AC
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
4801a9a3
PA
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
683f2885 120 if (top_level)
063bfe2e
VP
121 {
122 observer_attach_new_thread (mi_new_thread);
123 observer_attach_thread_exit (mi_thread_exit);
a79b8f6e 124 observer_attach_inferior_added (mi_inferior_added);
6c95b8df 125 observer_attach_inferior_appeared (mi_inferior_appeared);
4a92f99b 126 observer_attach_inferior_exit (mi_inferior_exit);
a79b8f6e 127 observer_attach_inferior_removed (mi_inferior_removed);
82a90ccf 128 observer_attach_record_changed (mi_record_changed);
f7f9a841 129 observer_attach_normal_stop (mi_on_normal_stop);
e1ac3328 130 observer_attach_target_resumed (mi_on_resume);
c86cf029
VP
131 observer_attach_solib_loaded (mi_solib_loaded);
132 observer_attach_solib_unloaded (mi_solib_unloaded);
f3b1572e 133 observer_attach_about_to_proceed (mi_about_to_proceed);
201b4506 134 observer_attach_traceframe_changed (mi_traceframe_changed);
bb25a15c
YQ
135 observer_attach_tsv_created (mi_tsv_created);
136 observer_attach_tsv_deleted (mi_tsv_deleted);
8d3788bd
VP
137 observer_attach_breakpoint_created (mi_breakpoint_created);
138 observer_attach_breakpoint_deleted (mi_breakpoint_deleted);
139 observer_attach_breakpoint_modified (mi_breakpoint_modified);
5b9afe8a 140 observer_attach_command_param_changed (mi_command_param_changed);
a79b8f6e 141
2b03b41d
SS
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. */
a79b8f6e 146 iterate_over_inferiors (report_initial_inferior, mi);
063bfe2e 147 }
683f2885 148
4a8f6654
AC
149 return mi;
150}
151
152static int
153mi_interpreter_resume (void *data)
154{
155 struct mi_interp *mi = data;
4a8f6654 156
2b03b41d
SS
157 /* As per hack note in mi_interpreter_init, swap in the output
158 channels... */
4a8f6654
AC
159 gdb_setup_readline ();
160
362646f5
AC
161 /* These overwrite some of the initialization done in
162 _intialize_event_loop. */
163 call_readline = gdb_readline2;
e837f12a 164 input_handler = mi_execute_command_input_handler;
362646f5
AC
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;
4a8f6654
AC
174
175 gdb_stdout = mi->out;
2b03b41d 176 /* Route error and log output through the MI. */
4a8f6654
AC
177 gdb_stderr = mi->err;
178 gdb_stdlog = mi->log;
2b03b41d 179 /* Route target output through the MI. */
4a8f6654 180 gdb_stdtarg = mi->targ;
2b03b41d 181 /* Route target error through the MI as well. */
1f20321b 182 gdb_stdtargerr = mi->targ;
4a8f6654
AC
183
184 /* Replace all the hooks that we know about. There really needs to
185 be a better way of doing this... */
186 clear_interpreter_hooks ();
187
9a4105ab 188 deprecated_show_load_progress = mi_load_progress;
4a8f6654 189
2b03b41d 190 /* If we're _the_ interpreter, take control. */
4a8f6654 191 if (current_interp_named_p (INTERP_MI1))
9a4105ab 192 deprecated_command_loop_hook = mi1_command_loop;
f786f615 193 else if (current_interp_named_p (INTERP_MI2))
9a4105ab 194 deprecated_command_loop_hook = mi2_command_loop;
f786f615 195 else if (current_interp_named_p (INTERP_MI3))
9a4105ab 196 deprecated_command_loop_hook = mi3_command_loop;
4a8f6654 197 else
9a4105ab 198 deprecated_command_loop_hook = mi2_command_loop;
4a8f6654
AC
199
200 return 1;
201}
202
203static int
204mi_interpreter_suspend (void *data)
205{
206 gdb_disable_readline ();
207 return 1;
208}
209
71fff37b 210static struct gdb_exception
4a8f6654
AC
211mi_interpreter_exec (void *data, const char *command)
212{
213 char *tmp = alloca (strlen (command) + 1);
102040f0 214
4a8f6654
AC
215 strcpy (tmp, command);
216 mi_execute_command_wrapper (tmp);
c1043fc2 217 return exception_none;
4a8f6654
AC
218}
219
2b03b41d
SS
220/* Never display the default GDB prompt in MI case. */
221
4a8f6654
AC
222static int
223mi_interpreter_prompt_p (void *data)
224{
225 return 0;
226}
227
ce8f13f8 228void
4a8f6654
AC
229mi_cmd_interpreter_exec (char *command, char **argv, int argc)
230{
231 struct interp *interp_to_use;
4a8f6654 232 int i;
a13e061a
PA
233 char *mi_error_message = NULL;
234 struct cleanup *old_chain;
4a8f6654
AC
235
236 if (argc < 2)
1b05df00 237 error (_("-interpreter-exec: "
9b20d036 238 "Usage: -interpreter-exec interp command"));
4a8f6654
AC
239
240 interp_to_use = interp_lookup (argv[0]);
241 if (interp_to_use == NULL)
1b05df00 242 error (_("-interpreter-exec: could not find interpreter \"%s\""),
9a2b4c1b 243 argv[0]);
4a8f6654
AC
244
245 if (!interp_exec_p (interp_to_use))
1b05df00 246 error (_("-interpreter-exec: interpreter \"%s\" "
9b20d036 247 "does not support command execution"),
a13e061a 248 argv[0]);
4a8f6654 249
2b03b41d
SS
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. */
4a8f6654
AC
255 mi_insert_notify_hooks ();
256
2b03b41d 257 /* Now run the code. */
4a8f6654 258
a13e061a 259 old_chain = make_cleanup (null_cleanup, 0);
4a8f6654
AC
260 for (i = 1; i < argc; i++)
261 {
32c1e744 262 struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
102040f0 263
32c1e744
VP
264 if (e.reason < 0)
265 {
266 mi_error_message = xstrdup (e.message);
a13e061a 267 make_cleanup (xfree, mi_error_message);
32c1e744
VP
268 break;
269 }
4a8f6654
AC
270 }
271
272 mi_remove_notify_hooks ();
273
a13e061a
PA
274 if (mi_error_message != NULL)
275 error ("%s", mi_error_message);
276 do_cleanups (old_chain);
4a8f6654
AC
277}
278
2b03b41d
SS
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. */
4a8f6654
AC
285
286static void
287mi_insert_notify_hooks (void)
288{
9a4105ab 289 deprecated_query_hook = mi_interp_query_hook;
4a8f6654
AC
290}
291
292static void
11308a41 293mi_remove_notify_hooks (void)
4a8f6654 294{
9a4105ab 295 deprecated_query_hook = NULL;
4a8f6654
AC
296}
297
298static int
299mi_interp_query_hook (const char *ctlstr, va_list ap)
300{
301 return 1;
302}
303
4a8f6654
AC
304static void
305mi_execute_command_wrapper (char *cmd)
306{
307 mi_execute_command (cmd, stdin == instream);
308}
309
e837f12a
JK
310/* mi_execute_command_wrapper wrapper suitable for INPUT_HANDLER. */
311
312static void
313mi_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
4a8f6654
AC
321static void
322mi1_command_loop (void)
323{
324 mi_command_loop (1);
325}
326
327static void
328mi2_command_loop (void)
329{
330 mi_command_loop (2);
331}
332
f786f615
AC
333static void
334mi3_command_loop (void)
335{
336 mi_command_loop (3);
337}
338
4a8f6654
AC
339static void
340mi_command_loop (int mi_version)
341{
4a8f6654 342 /* Turn off 8 bit strings in quoted output. Any character with the
2b03b41d 343 high bit set is printed using C's octal format. */
4a8f6654 344 sevenbit_strings = 1;
2b03b41d
SS
345
346 /* Tell the world that we're alive. */
4a8f6654
AC
347 fputs_unfiltered ("(gdb) \n", raw_stdout);
348 gdb_flush (raw_stdout);
2b03b41d 349
362646f5 350 start_event_loop ();
4a8f6654
AC
351}
352
683f2885
VP
353static void
354mi_new_thread (struct thread_info *t)
355{
356 struct mi_interp *mi = top_level_interpreter_data ();
a79b8f6e
VP
357 struct inferior *inf = find_inferior_pid (ptid_get_pid (t->ptid));
358
359 gdb_assert (inf);
683f2885 360
3d043ef6 361 fprintf_unfiltered (mi->event_channel,
a79b8f6e
VP
362 "thread-created,id=\"%d\",group-id=\"i%d\"",
363 t->num, inf->num);
683f2885
VP
364 gdb_flush (mi->event_channel);
365}
366
063bfe2e 367static void
a07daef3 368mi_thread_exit (struct thread_info *t, int silent)
063bfe2e 369{
a07daef3 370 struct mi_interp *mi;
a79b8f6e 371 struct inferior *inf;
a07daef3
PA
372
373 if (silent)
374 return;
375
a79b8f6e
VP
376 inf = find_inferior_pid (ptid_get_pid (t->ptid));
377
a07daef3 378 mi = top_level_interpreter_data ();
063bfe2e 379 target_terminal_ours ();
3d043ef6 380 fprintf_unfiltered (mi->event_channel,
a79b8f6e
VP
381 "thread-exited,id=\"%d\",group-id=\"i%d\"",
382 t->num, inf->num);
063bfe2e
VP
383 gdb_flush (mi->event_channel);
384}
385
82a90ccf
YQ
386/* Emit notification on changing the state of record. */
387
388static void
389mi_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
a79b8f6e
VP
399static void
400mi_inferior_added (struct inferior *inf)
401{
402 struct mi_interp *mi = top_level_interpreter_data ();
102040f0 403
a79b8f6e
VP
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
411static void
412mi_inferior_appeared (struct inferior *inf)
4a92f99b
VP
413{
414 struct mi_interp *mi = top_level_interpreter_data ();
102040f0 415
4a92f99b 416 target_terminal_ours ();
a79b8f6e
VP
417 fprintf_unfiltered (mi->event_channel,
418 "thread-group-started,id=\"i%d\",pid=\"%d\"",
419 inf->num, inf->pid);
4a92f99b
VP
420 gdb_flush (mi->event_channel);
421}
422
423static void
a79b8f6e 424mi_inferior_exit (struct inferior *inf)
4a92f99b
VP
425{
426 struct mi_interp *mi = top_level_interpreter_data ();
102040f0 427
4a92f99b 428 target_terminal_ours ();
8cf64490
TT
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
4a92f99b
VP
437 gdb_flush (mi->event_channel);
438}
439
a79b8f6e
VP
440static void
441mi_inferior_removed (struct inferior *inf)
442{
443 struct mi_interp *mi = top_level_interpreter_data ();
102040f0 444
a79b8f6e
VP
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
f7f9a841 452static void
1d33d6ba 453mi_on_normal_stop (struct bpstats *bs, int print_frame)
f7f9a841
VP
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. */
1d33d6ba 458 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
f7f9a841 459
1d33d6ba
VP
460 if (print_frame)
461 {
dc146f7c 462 int core;
102040f0 463
79a45e25 464 if (current_uiout != mi_uiout)
1d33d6ba 465 {
2b03b41d
SS
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. */
79a45e25 471 struct ui_out *saved_uiout = current_uiout;
36dfb11c
TT
472 struct target_waitstatus last;
473 ptid_t last_ptid;
102040f0 474
79a45e25 475 current_uiout = mi_uiout;
36dfb11c
TT
476
477 get_last_target_status (&last_ptid, &last);
478 bpstat_print (bs, last.kind);
479
1d33d6ba 480 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
79a45e25 481 current_uiout = saved_uiout;
1d33d6ba
VP
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");
102040f0 490
1d33d6ba 491 ui_out_field_int (mi_uiout, NULL,
102040f0 492 pid_to_thread_id (inferior_ptid));
1d33d6ba
VP
493 do_cleanups (back_to);
494 }
495 else
496 ui_out_field_string (mi_uiout, "stopped-threads", "all");
dc146f7c
VP
497
498 core = target_core_of_thread (inferior_ptid);
499 if (core != -1)
500 ui_out_field_int (mi_uiout, "core", core);
1d33d6ba
VP
501 }
502
f7f9a841 503 fputs_unfiltered ("*stopped", raw_stdout);
1d33d6ba
VP
504 mi_out_put (mi_uiout, raw_stdout);
505 mi_out_rewind (mi_uiout);
4333ada3 506 mi_print_timing_maybe ();
f7f9a841
VP
507 fputs_unfiltered ("\n", raw_stdout);
508 gdb_flush (raw_stdout);
509}
510
f3b1572e
PA
511static void
512mi_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 ();
102040f0 519
16c381f0 520 if (tp->control.in_infcall)
f3b1572e
PA
521 return;
522 }
523
524 mi_proceeded = 1;
525}
526
5b9afe8a
YQ
527/* When the element is non-zero, no MI notifications will be emitted in
528 response to the corresponding observers. */
2b03b41d 529
5b9afe8a
YQ
530struct mi_suppress_notification mi_suppress_notification =
531 {
532 0,
533 0,
201b4506 534 0,
5b9afe8a 535 };
8d3788bd 536
201b4506
YQ
537/* Emit notification on changing a traceframe. */
538
539static void
540mi_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
bb25a15c
YQ
559/* Emit notification on creating a trace state variable. */
560
561static void
562mi_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
577static void
578mi_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
8d3788bd 593/* Emit notification about a created breakpoint. */
2b03b41d 594
8d3788bd
VP
595static void
596mi_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 ());
bfd189b1 600 volatile struct gdb_exception e;
8d3788bd 601
5b9afe8a 602 if (mi_suppress_notification.breakpoint)
8d3788bd
VP
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
2b03b41d
SS
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. */
8d3788bd
VP
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. */
2b03b41d 627
8d3788bd
VP
628static void
629mi_breakpoint_deleted (struct breakpoint *b)
630{
631 struct mi_interp *mi = top_level_interpreter_data ();
632
5b9afe8a 633 if (mi_suppress_notification.breakpoint)
8d3788bd
VP
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. */
2b03b41d 648
8d3788bd
VP
649static void
650mi_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 ());
bfd189b1 654 volatile struct gdb_exception e;
8d3788bd 655
5b9afe8a 656 if (mi_suppress_notification.breakpoint)
8d3788bd
VP
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
2b03b41d
SS
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. */
8d3788bd
VP
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
d90e17a7
PA
680static int
681mi_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
693static int
694mi_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
e1ac3328
VP
705static void
706mi_on_resume (ptid_t ptid)
707{
c5a4d20b
PA
708 struct thread_info *tp = NULL;
709
9944e9c2 710 if (ptid_equal (ptid, minus_one_ptid) || ptid_is_pid (ptid))
c5a4d20b
PA
711 tp = inferior_thread ();
712 else
e09875d4 713 tp = find_thread_ptid (ptid);
c5a4d20b
PA
714
715 /* Suppress output while calling an inferior function. */
16c381f0 716 if (tp->control.in_infcall)
c5a4d20b
PA
717 return;
718
a2840c35
VP
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. */
f3b1572e 727 if (!running_result_record_printed && mi_proceeded)
a2840c35 728 {
c271b6e2
VP
729 fprintf_unfiltered (raw_stdout, "%s^running\n",
730 current_token ? current_token : "");
a2840c35
VP
731 }
732
e1ac3328
VP
733 if (PIDGET (ptid) == -1)
734 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"all\"\n");
d90e17a7 735 else if (ptid_is_pid (ptid))
bb599c81 736 {
ab730e72 737 int count = 0;
d90e17a7
PA
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);
bb599c81 748 }
e1ac3328
VP
749 else
750 {
e09875d4 751 struct thread_info *ti = find_thread_ptid (ptid);
102040f0 752
e1ac3328
VP
753 gdb_assert (ti);
754 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"%d\"\n", ti->num);
755 }
a2840c35 756
f3b1572e 757 if (!running_result_record_printed && mi_proceeded)
a2840c35
VP
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 }
c1828f25 768 gdb_flush (raw_stdout);
e1ac3328
VP
769}
770
c86cf029
VP
771static void
772mi_solib_loaded (struct so_list *solib)
773{
774 struct mi_interp *mi = top_level_interpreter_data ();
102040f0 775
c86cf029 776 target_terminal_ours ();
a79b8f6e
VP
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
c86cf029
VP
792 gdb_flush (mi->event_channel);
793}
794
795static void
796mi_solib_unloaded (struct so_list *solib)
797{
798 struct mi_interp *mi = top_level_interpreter_data ();
102040f0 799
c86cf029 800 target_terminal_ours ();
a79b8f6e
VP
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
c86cf029
VP
814 gdb_flush (mi->event_channel);
815}
816
5b9afe8a
YQ
817/* Emit notification about the command parameter change. */
818
819static void
820mi_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
a79b8f6e
VP
843static int
844report_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;
102040f0 851
a79b8f6e
VP
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}
c86cf029 859
4801a9a3
PA
860static struct ui_out *
861mi_ui_out (struct interp *interp)
862{
863 struct mi_interp *mi = interp_data (interp);
864
865 return mi->uiout;
866}
867
37ce89eb
SS
868/* Save the original value of raw_stdout here when logging, so we can
869 restore correctly when done. */
870
871static 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
876static int
877mi_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
b9362cc7
AC
916extern initialize_file_ftype _initialize_mi_interp; /* -Wmissing-prototypes */
917
4a8f6654
AC
918void
919_initialize_mi_interp (void)
920{
921 static const struct interp_procs procs =
2b03b41d
SS
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 */
37ce89eb
SS
928 mi_ui_out, /* ui_out_proc */
929 mi_set_logging /* set_logging_proc */
2b03b41d 930 };
4a8f6654 931
2fcf52f0 932 /* The various interpreter levels. */
4801a9a3
PA
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));
4a8f6654 937}
This page took 0.911389 seconds and 4 git commands to generate.