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