2008-05-03 Mike Frysinger <vapier@gentoo.org>
[deliverable/binutils-gdb.git] / gdb / mi / mi-interp.c
CommitLineData
4a8f6654
AC
1/* MI Interpreter Definitions and Commands for GDB, the GNU debugger.
2
9b254dd1
DJ
3 Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008
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"
683f2885
VP
34#include "observer.h"
35#include "gdbthread.h"
4a8f6654
AC
36
37struct mi_interp
38{
39 /* MI's output channels */
40 struct ui_file *out;
41 struct ui_file *err;
42 struct ui_file *log;
43 struct ui_file *targ;
44 struct ui_file *event_channel;
45
46 /* This is the interpreter for the mi... */
47 struct interp *mi2_interp;
48 struct interp *mi1_interp;
49 struct interp *mi_interp;
50};
51
52/* These are the interpreter setup, etc. functions for the MI interpreter */
53static void mi_execute_command_wrapper (char *cmd);
54static void mi_command_loop (int mi_version);
4a8f6654
AC
55
56/* These are hooks that we put in place while doing interpreter_exec
57 so we can report interesting things that happened "behind the mi's
58 back" in this command */
bee0189a
DJ
59static int mi_interp_query_hook (const char *ctlstr, va_list ap)
60 ATTR_FORMAT (printf, 1, 0);
4a8f6654 61
f786f615 62static void mi3_command_loop (void);
4a8f6654
AC
63static void mi2_command_loop (void);
64static void mi1_command_loop (void);
65
66static void mi_insert_notify_hooks (void);
67static void mi_remove_notify_hooks (void);
68
683f2885
VP
69static void mi_new_thread (struct thread_info *t);
70
4a8f6654 71static void *
683f2885 72mi_interpreter_init (int top_level)
4a8f6654
AC
73{
74 struct mi_interp *mi = XMALLOC (struct mi_interp);
75
4a8f6654
AC
76 /* HACK: We need to force stdout/stderr to point at the console. This avoids
77 any potential side effects caused by legacy code that is still
78 using the TUI / fputs_unfiltered_hook. So we set up output channels for
79 this now, and swap them in when we are run. */
80
81 raw_stdout = stdio_fileopen (stdout);
82
83 /* Create MI channels */
84 mi->out = mi_console_file_new (raw_stdout, "~", '"');
85 mi->err = mi_console_file_new (raw_stdout, "&", '"');
86 mi->log = mi->err;
87 mi->targ = mi_console_file_new (raw_stdout, "@", '"');
88 mi->event_channel = mi_console_file_new (raw_stdout, "=", 0);
89
683f2885
VP
90 if (top_level)
91 observer_attach_new_thread (mi_new_thread);
92
4a8f6654
AC
93 return mi;
94}
95
96static int
97mi_interpreter_resume (void *data)
98{
99 struct mi_interp *mi = data;
100 /* As per hack note in mi_interpreter_init, swap in the output channels... */
101
102 gdb_setup_readline ();
103
362646f5
AC
104 /* These overwrite some of the initialization done in
105 _intialize_event_loop. */
106 call_readline = gdb_readline2;
107 input_handler = mi_execute_command_wrapper;
108 add_file_handler (input_fd, stdin_event_handler, 0);
109 async_command_editing_p = 0;
110 /* FIXME: This is a total hack for now. PB's use of the MI
111 implicitly relies on a bug in the async support which allows
112 asynchronous commands to leak through the commmand loop. The bug
113 involves (but is not limited to) the fact that sync_execution was
114 erroneously initialized to 0. Duplicate by initializing it thus
115 here... */
116 sync_execution = 0;
4a8f6654
AC
117
118 gdb_stdout = mi->out;
119 /* Route error and log output through the MI */
120 gdb_stderr = mi->err;
121 gdb_stdlog = mi->log;
122 /* Route target output through the MI. */
123 gdb_stdtarg = mi->targ;
1f20321b
FR
124 /* Route target error through the MI as well. */
125 gdb_stdtargerr = mi->targ;
4a8f6654
AC
126
127 /* Replace all the hooks that we know about. There really needs to
128 be a better way of doing this... */
129 clear_interpreter_hooks ();
130
9a4105ab 131 deprecated_show_load_progress = mi_load_progress;
4a8f6654
AC
132
133 /* If we're _the_ interpreter, take control. */
134 if (current_interp_named_p (INTERP_MI1))
9a4105ab 135 deprecated_command_loop_hook = mi1_command_loop;
f786f615 136 else if (current_interp_named_p (INTERP_MI2))
9a4105ab 137 deprecated_command_loop_hook = mi2_command_loop;
f786f615 138 else if (current_interp_named_p (INTERP_MI3))
9a4105ab 139 deprecated_command_loop_hook = mi3_command_loop;
4a8f6654 140 else
9a4105ab 141 deprecated_command_loop_hook = mi2_command_loop;
4a8f6654
AC
142
143 return 1;
144}
145
146static int
147mi_interpreter_suspend (void *data)
148{
149 gdb_disable_readline ();
150 return 1;
151}
152
71fff37b 153static struct gdb_exception
4a8f6654
AC
154mi_interpreter_exec (void *data, const char *command)
155{
71fff37b 156 static struct gdb_exception ok;
4a8f6654
AC
157 char *tmp = alloca (strlen (command) + 1);
158 strcpy (tmp, command);
159 mi_execute_command_wrapper (tmp);
c1043fc2 160 return exception_none;
4a8f6654
AC
161}
162
163/* Never display the default gdb prompt in mi case. */
164static int
165mi_interpreter_prompt_p (void *data)
166{
167 return 0;
168}
169
170static void
f107f563 171mi_interpreter_exec_continuation (struct continuation_arg *arg, int error_p)
4a8f6654
AC
172{
173 bpstat_do_actions (&stop_bpstat);
f107f563
VP
174 /* It's not clear what to do in the case of errror -- should we assume that
175 the target is stopped, or that it still runs? */
4a8f6654
AC
176 if (!target_executing)
177 {
178 fputs_unfiltered ("*stopped", raw_stdout);
179 mi_out_put (uiout, raw_stdout);
180 fputs_unfiltered ("\n", raw_stdout);
181 fputs_unfiltered ("(gdb) \n", raw_stdout);
182 gdb_flush (raw_stdout);
4a8f6654
AC
183 }
184 else if (target_can_async_p ())
185 {
186 add_continuation (mi_interpreter_exec_continuation, NULL);
187 }
188}
189
190enum mi_cmd_result
191mi_cmd_interpreter_exec (char *command, char **argv, int argc)
192{
193 struct interp *interp_to_use;
4a8f6654
AC
194 int i;
195 struct interp_procs *procs;
a13e061a
PA
196 char *mi_error_message = NULL;
197 struct cleanup *old_chain;
4a8f6654
AC
198
199 if (argc < 2)
a13e061a 200 error ("mi_cmd_interpreter_exec: Usage: -interpreter-exec interp command");
4a8f6654
AC
201
202 interp_to_use = interp_lookup (argv[0]);
203 if (interp_to_use == NULL)
a13e061a 204 error ("mi_cmd_interpreter_exec: could not find interpreter \"%s\"", argv[0]);
4a8f6654
AC
205
206 if (!interp_exec_p (interp_to_use))
a13e061a
PA
207 error ("mi_cmd_interpreter_exec: interpreter \"%s\" does not support command execution",
208 argv[0]);
4a8f6654
AC
209
210 /* Insert the MI out hooks, making sure to also call the interpreter's hooks
211 if it has any. */
212 /* KRS: We shouldn't need this... Events should be installed and they should
213 just ALWAYS fire something out down the MI channel... */
214 mi_insert_notify_hooks ();
215
216 /* Now run the code... */
217
a13e061a 218 old_chain = make_cleanup (null_cleanup, 0);
4a8f6654
AC
219 for (i = 1; i < argc; i++)
220 {
32c1e744
VP
221 struct gdb_exception e = interp_exec (interp_to_use, argv[i]);
222 if (e.reason < 0)
223 {
224 mi_error_message = xstrdup (e.message);
a13e061a 225 make_cleanup (xfree, mi_error_message);
32c1e744
VP
226 break;
227 }
4a8f6654
AC
228 }
229
230 mi_remove_notify_hooks ();
231
232 /* Okay, now let's see if the command set the inferior going...
233 Tricky point - have to do this AFTER resetting the interpreter, since
234 changing the interpreter will clear out all the continuations for
235 that interpreter... */
236
237 if (target_can_async_p () && target_executing)
238 {
239 fputs_unfiltered ("^running\n", raw_stdout);
240 add_continuation (mi_interpreter_exec_continuation, NULL);
241 }
242
a13e061a
PA
243 if (mi_error_message != NULL)
244 error ("%s", mi_error_message);
245 do_cleanups (old_chain);
246 return MI_CMD_DONE;
4a8f6654
AC
247}
248
249/*
250 * mi_insert_notify_hooks - This inserts a number of hooks that are meant to produce
251 * async-notify ("=") MI messages while running commands in another interpreter
252 * using mi_interpreter_exec. The canonical use for this is to allow access to
253 * the gdb CLI interpreter from within the MI, while still producing MI style output
254 * when actions in the CLI command change gdb's state.
255*/
256
257static void
258mi_insert_notify_hooks (void)
259{
9a4105ab 260 deprecated_query_hook = mi_interp_query_hook;
4a8f6654
AC
261}
262
263static void
11308a41 264mi_remove_notify_hooks (void)
4a8f6654 265{
9a4105ab 266 deprecated_query_hook = NULL;
4a8f6654
AC
267}
268
269static int
270mi_interp_query_hook (const char *ctlstr, va_list ap)
271{
272 return 1;
273}
274
4a8f6654
AC
275static void
276mi_execute_command_wrapper (char *cmd)
277{
278 mi_execute_command (cmd, stdin == instream);
279}
280
281static void
282mi1_command_loop (void)
283{
284 mi_command_loop (1);
285}
286
287static void
288mi2_command_loop (void)
289{
290 mi_command_loop (2);
291}
292
f786f615
AC
293static void
294mi3_command_loop (void)
295{
296 mi_command_loop (3);
297}
298
4a8f6654
AC
299static void
300mi_command_loop (int mi_version)
301{
4a8f6654
AC
302 /* Turn off 8 bit strings in quoted output. Any character with the
303 high bit set is printed using C's octal format. */
304 sevenbit_strings = 1;
305 /* Tell the world that we're alive */
306 fputs_unfiltered ("(gdb) \n", raw_stdout);
307 gdb_flush (raw_stdout);
362646f5 308 start_event_loop ();
4a8f6654
AC
309}
310
683f2885
VP
311static void
312mi_new_thread (struct thread_info *t)
313{
314 struct mi_interp *mi = top_level_interpreter_data ();
315
c6446539 316 fprintf_unfiltered (mi->event_channel, "thread-created,id=\"%d\"", t->num);
683f2885
VP
317 gdb_flush (mi->event_channel);
318}
319
b9362cc7
AC
320extern initialize_file_ftype _initialize_mi_interp; /* -Wmissing-prototypes */
321
4a8f6654
AC
322void
323_initialize_mi_interp (void)
324{
325 static const struct interp_procs procs =
326 {
327 mi_interpreter_init, /* init_proc */
328 mi_interpreter_resume, /* resume_proc */
329 mi_interpreter_suspend, /* suspend_proc */
330 mi_interpreter_exec, /* exec_proc */
331 mi_interpreter_prompt_p /* prompt_proc_p */
332 };
333
2fcf52f0 334 /* The various interpreter levels. */
4a8f6654 335 interp_add (interp_new (INTERP_MI1, NULL, mi_out_new (1), &procs));
2fcf52f0
AC
336 interp_add (interp_new (INTERP_MI2, NULL, mi_out_new (2), &procs));
337 interp_add (interp_new (INTERP_MI3, NULL, mi_out_new (3), &procs));
4a8f6654 338
2fcf52f0
AC
339 /* "mi" selects the most recent released version. "mi2" was
340 released as part of GDB 6.0. */
341 interp_add (interp_new (INTERP_MI, NULL, mi_out_new (2), &procs));
4a8f6654 342}
This page took 0.454905 seconds and 4 git commands to generate.