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