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