*** 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
0fb0cc75 3 Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008, 2009
9b254dd1 4 Free Software Foundation, Inc.
4a8f6654
AC
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
4a8f6654
AC
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
4a8f6654
AC
20
21#include "defs.h"
22#include "gdb_string.h"
23#include "interps.h"
24#include "event-top.h"
25#include "event-loop.h"
26#include "inferior.h"
27#include "ui-out.h"
28#include "top.h"
c1043fc2 29#include "exceptions.h"
4a8f6654
AC
30#include "mi-main.h"
31#include "mi-cmds.h"
32#include "mi-out.h"
33#include "mi-console.h"
66bb093b 34#include "mi-common.h"
683f2885
VP
35#include "observer.h"
36#include "gdbthread.h"
4a8f6654 37
4a8f6654
AC
38/* These are the interpreter setup, etc. functions for the MI interpreter */
39static void mi_execute_command_wrapper (char *cmd);
40static void mi_command_loop (int mi_version);
4a8f6654
AC
41
42/* These are hooks that we put in place while doing interpreter_exec
43 so we can report interesting things that happened "behind the mi's
44 back" in this command */
bee0189a
DJ
45static int mi_interp_query_hook (const char *ctlstr, va_list ap)
46 ATTR_FORMAT (printf, 1, 0);
4a8f6654 47
f786f615 48static void mi3_command_loop (void);
4a8f6654
AC
49static void mi2_command_loop (void);
50static void mi1_command_loop (void);
51
52static void mi_insert_notify_hooks (void);
53static void mi_remove_notify_hooks (void);
1d33d6ba 54static void mi_on_normal_stop (struct bpstats *bs, int print_frame);
4a8f6654 55
683f2885 56static void mi_new_thread (struct thread_info *t);
063bfe2e 57static void mi_thread_exit (struct thread_info *t);
4a92f99b
VP
58static void mi_new_inferior (int pid);
59static void mi_inferior_exit (int pid);
e1ac3328 60static void mi_on_resume (ptid_t ptid);
683f2885 61
4a8f6654 62static void *
683f2885 63mi_interpreter_init (int top_level)
4a8f6654
AC
64{
65 struct mi_interp *mi = XMALLOC (struct mi_interp);
66
4a8f6654
AC
67 /* HACK: We need to force stdout/stderr to point at the console. This avoids
68 any potential side effects caused by legacy code that is still
69 using the TUI / fputs_unfiltered_hook. So we set up output channels for
70 this now, and swap them in when we are run. */
71
72 raw_stdout = stdio_fileopen (stdout);
73
74 /* Create MI channels */
75 mi->out = mi_console_file_new (raw_stdout, "~", '"');
76 mi->err = mi_console_file_new (raw_stdout, "&", '"');
77 mi->log = mi->err;
78 mi->targ = mi_console_file_new (raw_stdout, "@", '"');
79 mi->event_channel = mi_console_file_new (raw_stdout, "=", 0);
80
683f2885 81 if (top_level)
063bfe2e
VP
82 {
83 observer_attach_new_thread (mi_new_thread);
84 observer_attach_thread_exit (mi_thread_exit);
4a92f99b
VP
85 observer_attach_new_inferior (mi_new_inferior);
86 observer_attach_inferior_exit (mi_inferior_exit);
f7f9a841 87 observer_attach_normal_stop (mi_on_normal_stop);
e1ac3328 88 observer_attach_target_resumed (mi_on_resume);
063bfe2e 89 }
683f2885 90
4a8f6654
AC
91 return mi;
92}
93
94static int
95mi_interpreter_resume (void *data)
96{
97 struct mi_interp *mi = data;
98 /* As per hack note in mi_interpreter_init, swap in the output channels... */
99
100 gdb_setup_readline ();
101
362646f5
AC
102 /* These overwrite some of the initialization done in
103 _intialize_event_loop. */
104 call_readline = gdb_readline2;
105 input_handler = mi_execute_command_wrapper;
106 add_file_handler (input_fd, stdin_event_handler, 0);
107 async_command_editing_p = 0;
108 /* FIXME: This is a total hack for now. PB's use of the MI
109 implicitly relies on a bug in the async support which allows
110 asynchronous commands to leak through the commmand loop. The bug
111 involves (but is not limited to) the fact that sync_execution was
112 erroneously initialized to 0. Duplicate by initializing it thus
113 here... */
114 sync_execution = 0;
4a8f6654
AC
115
116 gdb_stdout = mi->out;
117 /* Route error and log output through the MI */
118 gdb_stderr = mi->err;
119 gdb_stdlog = mi->log;
120 /* Route target output through the MI. */
121 gdb_stdtarg = mi->targ;
1f20321b
FR
122 /* Route target error through the MI as well. */
123 gdb_stdtargerr = mi->targ;
4a8f6654
AC
124
125 /* Replace all the hooks that we know about. There really needs to
126 be a better way of doing this... */
127 clear_interpreter_hooks ();
128
9a4105ab 129 deprecated_show_load_progress = mi_load_progress;
4a8f6654
AC
130
131 /* If we're _the_ interpreter, take control. */
132 if (current_interp_named_p (INTERP_MI1))
9a4105ab 133 deprecated_command_loop_hook = mi1_command_loop;
f786f615 134 else if (current_interp_named_p (INTERP_MI2))
9a4105ab 135 deprecated_command_loop_hook = mi2_command_loop;
f786f615 136 else if (current_interp_named_p (INTERP_MI3))
9a4105ab 137 deprecated_command_loop_hook = mi3_command_loop;
4a8f6654 138 else
9a4105ab 139 deprecated_command_loop_hook = mi2_command_loop;
4a8f6654
AC
140
141 return 1;
142}
143
144static int
145mi_interpreter_suspend (void *data)
146{
147 gdb_disable_readline ();
148 return 1;
149}
150
71fff37b 151static struct gdb_exception
4a8f6654
AC
152mi_interpreter_exec (void *data, const char *command)
153{
71fff37b 154 static struct gdb_exception ok;
4a8f6654
AC
155 char *tmp = alloca (strlen (command) + 1);
156 strcpy (tmp, command);
157 mi_execute_command_wrapper (tmp);
c1043fc2 158 return exception_none;
4a8f6654
AC
159}
160
161/* Never display the default gdb prompt in mi case. */
162static int
163mi_interpreter_prompt_p (void *data)
164{
165 return 0;
166}
167
ce8f13f8 168void
4a8f6654
AC
169mi_cmd_interpreter_exec (char *command, char **argv, int argc)
170{
171 struct interp *interp_to_use;
4a8f6654
AC
172 int i;
173 struct interp_procs *procs;
a13e061a
PA
174 char *mi_error_message = NULL;
175 struct cleanup *old_chain;
4a8f6654
AC
176
177 if (argc < 2)
a13e061a 178 error ("mi_cmd_interpreter_exec: Usage: -interpreter-exec interp command");
4a8f6654
AC
179
180 interp_to_use = interp_lookup (argv[0]);
181 if (interp_to_use == NULL)
a13e061a 182 error ("mi_cmd_interpreter_exec: could not find interpreter \"%s\"", argv[0]);
4a8f6654
AC
183
184 if (!interp_exec_p (interp_to_use))
a13e061a
PA
185 error ("mi_cmd_interpreter_exec: interpreter \"%s\" does not support command execution",
186 argv[0]);
4a8f6654
AC
187
188 /* Insert the MI out hooks, making sure to also call the interpreter's hooks
189 if it has any. */
190 /* KRS: We shouldn't need this... Events should be installed and they should
191 just ALWAYS fire something out down the MI channel... */
192 mi_insert_notify_hooks ();
193
194 /* Now run the code... */
195
a13e061a 196 old_chain = make_cleanup (null_cleanup, 0);
4a8f6654
AC
197 for (i = 1; i < argc; i++)
198 {
32c1e744
VP
199 struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
200 if (e.reason < 0)
201 {
202 mi_error_message = xstrdup (e.message);
a13e061a 203 make_cleanup (xfree, mi_error_message);
32c1e744
VP
204 break;
205 }
4a8f6654
AC
206 }
207
208 mi_remove_notify_hooks ();
209
a13e061a
PA
210 if (mi_error_message != NULL)
211 error ("%s", mi_error_message);
212 do_cleanups (old_chain);
4a8f6654
AC
213}
214
215/*
216 * mi_insert_notify_hooks - This inserts a number of hooks that are meant to produce
217 * async-notify ("=") MI messages while running commands in another interpreter
218 * using mi_interpreter_exec. The canonical use for this is to allow access to
219 * the gdb CLI interpreter from within the MI, while still producing MI style output
220 * when actions in the CLI command change gdb's state.
221*/
222
223static void
224mi_insert_notify_hooks (void)
225{
9a4105ab 226 deprecated_query_hook = mi_interp_query_hook;
4a8f6654
AC
227}
228
229static void
11308a41 230mi_remove_notify_hooks (void)
4a8f6654 231{
9a4105ab 232 deprecated_query_hook = NULL;
4a8f6654
AC
233}
234
235static int
236mi_interp_query_hook (const char *ctlstr, va_list ap)
237{
238 return 1;
239}
240
4a8f6654
AC
241static void
242mi_execute_command_wrapper (char *cmd)
243{
244 mi_execute_command (cmd, stdin == instream);
245}
246
247static void
248mi1_command_loop (void)
249{
250 mi_command_loop (1);
251}
252
253static void
254mi2_command_loop (void)
255{
256 mi_command_loop (2);
257}
258
f786f615
AC
259static void
260mi3_command_loop (void)
261{
262 mi_command_loop (3);
263}
264
4a8f6654
AC
265static void
266mi_command_loop (int mi_version)
267{
4a8f6654
AC
268 /* Turn off 8 bit strings in quoted output. Any character with the
269 high bit set is printed using C's octal format. */
270 sevenbit_strings = 1;
271 /* Tell the world that we're alive */
272 fputs_unfiltered ("(gdb) \n", raw_stdout);
273 gdb_flush (raw_stdout);
362646f5 274 start_event_loop ();
4a8f6654
AC
275}
276
683f2885
VP
277static void
278mi_new_thread (struct thread_info *t)
279{
280 struct mi_interp *mi = top_level_interpreter_data ();
281
3d043ef6
VP
282 fprintf_unfiltered (mi->event_channel,
283 "thread-created,id=\"%d\",group-id=\"%d\"",
284 t->num, t->ptid.pid);
683f2885
VP
285 gdb_flush (mi->event_channel);
286}
287
063bfe2e
VP
288static void
289mi_thread_exit (struct thread_info *t)
290{
291 struct mi_interp *mi = top_level_interpreter_data ();
063bfe2e 292 target_terminal_ours ();
3d043ef6
VP
293 fprintf_unfiltered (mi->event_channel,
294 "thread-exited,id=\"%d\",group-id=\"%d\"",
295 t->num,t->ptid.pid);
063bfe2e
VP
296 gdb_flush (mi->event_channel);
297}
298
4a92f99b
VP
299static void
300mi_new_inferior (int pid)
301{
302 struct mi_interp *mi = top_level_interpreter_data ();
303 target_terminal_ours ();
304 fprintf_unfiltered (mi->event_channel, "thread-group-created,id=\"%d\"",
305 pid);
306 gdb_flush (mi->event_channel);
307}
308
309static void
310mi_inferior_exit (int pid)
311{
312 struct mi_interp *mi = top_level_interpreter_data ();
313 target_terminal_ours ();
314 fprintf_unfiltered (mi->event_channel, "thread-group-exited,id=\"%d\"",
315 pid);
316 gdb_flush (mi->event_channel);
317}
318
f7f9a841 319static void
1d33d6ba 320mi_on_normal_stop (struct bpstats *bs, int print_frame)
f7f9a841
VP
321{
322 /* Since this can be called when CLI command is executing,
323 using cli interpreter, be sure to use MI uiout for output,
324 not the current one. */
1d33d6ba 325 struct ui_out *mi_uiout = interp_ui_out (top_level_interpreter ());
f7f9a841
VP
326 struct mi_interp *mi = top_level_interpreter_data ();
327
1d33d6ba
VP
328 if (print_frame)
329 {
330 if (uiout != mi_uiout)
331 {
332 /* The normal_stop function has printed frame information into
333 CLI uiout, or some other non-MI uiout. There's no way we
334 can extract proper fields from random uiout object, so we print
335 the frame again. In practice, this can only happen when running
336 a CLI command in MI. */
337 struct ui_out *saved_uiout = uiout;
338 uiout = mi_uiout;
339 print_stack_frame (get_selected_frame (NULL), 0, SRC_AND_LOC);
340 uiout = saved_uiout;
341 }
342
343 ui_out_field_int (mi_uiout, "thread-id",
344 pid_to_thread_id (inferior_ptid));
345 if (non_stop)
346 {
347 struct cleanup *back_to = make_cleanup_ui_out_list_begin_end
348 (mi_uiout, "stopped-threads");
349 ui_out_field_int (mi_uiout, NULL,
350 pid_to_thread_id (inferior_ptid));
351 do_cleanups (back_to);
352 }
353 else
354 ui_out_field_string (mi_uiout, "stopped-threads", "all");
355 }
356
f7f9a841 357 fputs_unfiltered ("*stopped", raw_stdout);
1d33d6ba
VP
358 mi_out_put (mi_uiout, raw_stdout);
359 mi_out_rewind (mi_uiout);
f7f9a841
VP
360 fputs_unfiltered ("\n", raw_stdout);
361 gdb_flush (raw_stdout);
362}
363
e1ac3328
VP
364static void
365mi_on_resume (ptid_t ptid)
366{
a2840c35
VP
367 /* To cater for older frontends, emit ^running, but do it only once
368 per each command. We do it here, since at this point we know
369 that the target was successfully resumed, and in non-async mode,
370 we won't return back to MI interpreter code until the target
371 is done running, so delaying the output of "^running" until then
372 will make it impossible for frontend to know what's going on.
373
374 In future (MI3), we'll be outputting "^done" here. */
375 if (!running_result_record_printed)
376 {
377 if (current_token)
378 fputs_unfiltered (current_token, raw_stdout);
379 fputs_unfiltered ("^running\n", raw_stdout);
380 }
381
e1ac3328
VP
382 if (PIDGET (ptid) == -1)
383 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"all\"\n");
bb599c81
VP
384 else if (thread_count () == 0)
385 {
386 /* This is a target where for single-threaded programs the thread
387 table has zero threads. Don't print any thread-id field. */
388 fprintf_unfiltered (raw_stdout, "*running\n");
389 }
e1ac3328
VP
390 else
391 {
392 struct thread_info *ti = find_thread_pid (ptid);
393 gdb_assert (ti);
394 fprintf_unfiltered (raw_stdout, "*running,thread-id=\"%d\"\n", ti->num);
395 }
a2840c35
VP
396
397 if (!running_result_record_printed)
398 {
399 running_result_record_printed = 1;
400 /* This is what gdb used to do historically -- printing prompt even if
401 it cannot actually accept any input. This will be surely removed
402 for MI3, and may be removed even earler. */
403 /* FIXME: review the use of target_is_async_p here -- is that
404 what we want? */
405 if (!target_is_async_p ())
406 fputs_unfiltered ("(gdb) \n", raw_stdout);
407 }
c1828f25 408 gdb_flush (raw_stdout);
e1ac3328
VP
409}
410
b9362cc7
AC
411extern initialize_file_ftype _initialize_mi_interp; /* -Wmissing-prototypes */
412
4a8f6654
AC
413void
414_initialize_mi_interp (void)
415{
416 static const struct interp_procs procs =
417 {
418 mi_interpreter_init, /* init_proc */
419 mi_interpreter_resume, /* resume_proc */
420 mi_interpreter_suspend, /* suspend_proc */
421 mi_interpreter_exec, /* exec_proc */
422 mi_interpreter_prompt_p /* prompt_proc_p */
423 };
424
2fcf52f0 425 /* The various interpreter levels. */
4a8f6654 426 interp_add (interp_new (INTERP_MI1, NULL, mi_out_new (1), &procs));
2fcf52f0
AC
427 interp_add (interp_new (INTERP_MI2, NULL, mi_out_new (2), &procs));
428 interp_add (interp_new (INTERP_MI3, NULL, mi_out_new (3), &procs));
4a8f6654 429
2fcf52f0
AC
430 /* "mi" selects the most recent released version. "mi2" was
431 released as part of GDB 6.0. */
432 interp_add (interp_new (INTERP_MI, NULL, mi_out_new (2), &procs));
4a8f6654 433}
This page took 0.501018 seconds and 4 git commands to generate.