]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mi/mi-main.c
Copyright updates for 2007.
[thirdparty/binutils-gdb.git] / gdb / mi / mi-main.c
CommitLineData
fb40c209 1/* MI Command Set.
cd0bfa36 2
6aba47ca
DJ
3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2007
4 Free Software Foundation, Inc.
cd0bfa36 5
ab91fdd5 6 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
1caae165
EZ
22 Foundation, Inc., 51 Franklin Street, Fifth Floor,
23 Boston, MA 02110-1301, USA. */
fb40c209
AC
24
25/* Work in progress */
26
27#include "defs.h"
28#include "target.h"
29#include "inferior.h"
30#include "gdb_string.h"
60250e8b 31#include "exceptions.h"
fb40c209
AC
32#include "top.h"
33#include "gdbthread.h"
34#include "mi-cmds.h"
35#include "mi-parse.h"
36#include "mi-getopt.h"
37#include "mi-console.h"
38#include "ui-out.h"
39#include "mi-out.h"
4389a95a 40#include "interps.h"
fb40c209
AC
41#include "event-loop.h"
42#include "event-top.h"
43#include "gdbcore.h" /* for write_memory() */
73937e03 44#include "value.h" /* for deprecated_write_register_bytes() */
4e052eda 45#include "regcache.h"
5b7f31a4 46#include "gdb.h"
36dc181b 47#include "frame.h"
b9362cc7 48#include "mi-main.h"
36dc181b 49
fb40c209
AC
50#include <ctype.h>
51#include <sys/time.h>
52
fb40c209
AC
53enum
54 {
55 FROM_TTY = 0
56 };
57
8d34ea23
KS
58/* Enumerations of the actions that may result from calling
59 captured_mi_execute_command */
60
61enum captured_mi_execute_command_actions
62 {
63 EXECUTE_COMMAND_DISPLAY_PROMPT,
ce43223b 64 EXECUTE_COMMAND_SUPRESS_PROMPT
8d34ea23
KS
65 };
66
67/* This structure is used to pass information from captured_mi_execute_command
68 to mi_execute_command. */
69struct captured_mi_execute_command_args
70{
71 /* This return result of the MI command (output) */
72 enum mi_cmd_result rc;
73
74 /* What action to perform when the call is finished (output) */
75 enum captured_mi_execute_command_actions action;
76
77 /* The command context to be executed (input) */
78 struct mi_parse *command;
79};
fb40c209
AC
80
81int mi_debug_p;
82struct ui_file *raw_stdout;
83
84/* The token of the last asynchronous command */
85static char *last_async_command;
86static char *previous_async_command;
4389a95a 87char *mi_error_message;
fb40c209
AC
88static char *old_regs;
89
90extern void _initialize_mi_main (void);
fb40c209
AC
91static enum mi_cmd_result mi_cmd_execute (struct mi_parse *parse);
92
b2af646b
AC
93static void mi_execute_cli_command (const char *cmd, int args_p,
94 const char *args);
fb40c209 95static enum mi_cmd_result mi_execute_async_cli_command (char *mi, char *args, int from_tty);
fb40c209 96
4389a95a 97static void mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg);
fb40c209
AC
98
99static int register_changed_p (int regnum);
100static int get_register (int regnum, int format);
4389a95a 101
fb40c209
AC
102/* Command implementations. FIXME: Is this libgdb? No. This is the MI
103 layer that calls libgdb. Any operation used in the below should be
104 formalized. */
105
106enum mi_cmd_result
107mi_cmd_gdb_exit (char *command, char **argv, int argc)
108{
109 /* We have to print everything right here because we never return */
110 if (last_async_command)
111 fputs_unfiltered (last_async_command, raw_stdout);
112 fputs_unfiltered ("^exit\n", raw_stdout);
113 mi_out_put (uiout, raw_stdout);
114 /* FIXME: The function called is not yet a formal libgdb function */
115 quit_force (NULL, FROM_TTY);
116 return MI_CMD_DONE;
117}
118
119enum mi_cmd_result
120mi_cmd_exec_run (char *args, int from_tty)
121{
122 /* FIXME: Should call a libgdb function, not a cli wrapper */
123 return mi_execute_async_cli_command ("run", args, from_tty);
124}
125
126enum mi_cmd_result
127mi_cmd_exec_next (char *args, int from_tty)
128{
129 /* FIXME: Should call a libgdb function, not a cli wrapper */
130 return mi_execute_async_cli_command ("next", args, from_tty);
131}
132
133enum mi_cmd_result
134mi_cmd_exec_next_instruction (char *args, int from_tty)
135{
136 /* FIXME: Should call a libgdb function, not a cli wrapper */
137 return mi_execute_async_cli_command ("nexti", args, from_tty);
138}
139
140enum mi_cmd_result
141mi_cmd_exec_step (char *args, int from_tty)
142{
143 /* FIXME: Should call a libgdb function, not a cli wrapper */
144 return mi_execute_async_cli_command ("step", args, from_tty);
145}
146
147enum mi_cmd_result
148mi_cmd_exec_step_instruction (char *args, int from_tty)
149{
150 /* FIXME: Should call a libgdb function, not a cli wrapper */
151 return mi_execute_async_cli_command ("stepi", args, from_tty);
152}
153
154enum mi_cmd_result
155mi_cmd_exec_finish (char *args, int from_tty)
156{
157 /* FIXME: Should call a libgdb function, not a cli wrapper */
158 return mi_execute_async_cli_command ("finish", args, from_tty);
159}
160
161enum mi_cmd_result
162mi_cmd_exec_until (char *args, int from_tty)
163{
164 /* FIXME: Should call a libgdb function, not a cli wrapper */
165 return mi_execute_async_cli_command ("until", args, from_tty);
166}
167
168enum mi_cmd_result
169mi_cmd_exec_return (char *args, int from_tty)
170{
fb40c209
AC
171 /* This command doesn't really execute the target, it just pops the
172 specified number of frames. */
173 if (*args)
174 /* Call return_command with from_tty argument equal to 0 so as to
175 avoid being queried. */
36dc181b 176 return_command (args, 0);
fb40c209
AC
177 else
178 /* Call return_command with from_tty argument equal to 0 so as to
179 avoid being queried. */
36dc181b 180 return_command (NULL, 0);
fb40c209
AC
181
182 /* Because we have called return_command with from_tty = 0, we need
183 to print the frame here. */
b04f3ab4 184 print_stack_frame (get_selected_frame (NULL), 1, LOC_AND_ADDRESS);
fb40c209
AC
185
186 return MI_CMD_DONE;
187}
188
189enum mi_cmd_result
190mi_cmd_exec_continue (char *args, int from_tty)
191{
192 /* FIXME: Should call a libgdb function, not a cli wrapper */
193 return mi_execute_async_cli_command ("continue", args, from_tty);
194}
195
196/* Interrupt the execution of the target. Note how we must play around
197 with the token varialbes, in order to display the current token in
198 the result of the interrupt command, and the previous execution
199 token when the target finally stops. See comments in
200 mi_cmd_execute. */
201enum mi_cmd_result
202mi_cmd_exec_interrupt (char *args, int from_tty)
203{
fb40c209
AC
204 if (!target_executing)
205 {
c6902d46 206 mi_error_message = xstrprintf ("mi_cmd_exec_interrupt: Inferior not executing.");
fb40c209
AC
207 return MI_CMD_ERROR;
208 }
36dc181b 209 interrupt_target_command (args, from_tty);
fb40c209
AC
210 if (last_async_command)
211 fputs_unfiltered (last_async_command, raw_stdout);
212 fputs_unfiltered ("^done", raw_stdout);
b8c9b27d 213 xfree (last_async_command);
fb40c209
AC
214 if (previous_async_command)
215 last_async_command = xstrdup (previous_async_command);
b8c9b27d 216 xfree (previous_async_command);
fb40c209
AC
217 previous_async_command = NULL;
218 mi_out_put (uiout, raw_stdout);
219 mi_out_rewind (uiout);
220 fputs_unfiltered ("\n", raw_stdout);
fb40c209
AC
221 return MI_CMD_QUIET;
222}
223
224enum mi_cmd_result
225mi_cmd_thread_select (char *command, char **argv, int argc)
226{
227 enum gdb_rc rc;
228
229 if (argc != 1)
230 {
c6902d46 231 mi_error_message = xstrprintf ("mi_cmd_thread_select: USAGE: threadnum.");
fb40c209
AC
232 return MI_CMD_ERROR;
233 }
234 else
ce43223b 235 rc = gdb_thread_select (uiout, argv[0], &mi_error_message);
fb40c209 236
99615eb8
KS
237 /* RC is enum gdb_rc if it is successful (>=0)
238 enum return_reason if not (<0). */
239 if ((int) rc < 0 && (enum return_reason) rc == RETURN_ERROR)
ce43223b 240 return MI_CMD_ERROR;
99615eb8
KS
241 else if ((int) rc >= 0 && rc == GDB_RC_FAIL)
242 return MI_CMD_ERROR;
fb40c209
AC
243 else
244 return MI_CMD_DONE;
245}
246
247enum mi_cmd_result
248mi_cmd_thread_list_ids (char *command, char **argv, int argc)
249{
250 enum gdb_rc rc = MI_CMD_DONE;
251
252 if (argc != 0)
253 {
c6902d46 254 mi_error_message = xstrprintf ("mi_cmd_thread_list_ids: No arguments required.");
fb40c209
AC
255 return MI_CMD_ERROR;
256 }
257 else
ce43223b 258 rc = gdb_list_thread_ids (uiout, &mi_error_message);
fb40c209
AC
259
260 if (rc == GDB_RC_FAIL)
ce43223b 261 return MI_CMD_ERROR;
fb40c209
AC
262 else
263 return MI_CMD_DONE;
264}
265
266enum mi_cmd_result
267mi_cmd_data_list_register_names (char *command, char **argv, int argc)
268{
269 int regnum, numregs;
270 int i;
4060713b 271 struct cleanup *cleanup;
fb40c209
AC
272
273 /* Note that the test for a valid register must include checking the
274 REGISTER_NAME because NUM_REGS may be allocated for the union of
275 the register sets within a family of related processors. In this
276 case, some entries of REGISTER_NAME will change depending upon
277 the particular processor being debugged. */
278
173d6894 279 numregs = NUM_REGS + NUM_PSEUDO_REGS;
fb40c209 280
4060713b 281 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-names");
fb40c209
AC
282
283 if (argc == 0) /* No args, just do all the regs */
284 {
285 for (regnum = 0;
286 regnum < numregs;
287 regnum++)
288 {
289 if (REGISTER_NAME (regnum) == NULL
290 || *(REGISTER_NAME (regnum)) == '\0')
173d6894
AC
291 ui_out_field_string (uiout, NULL, "");
292 else
293 ui_out_field_string (uiout, NULL, REGISTER_NAME (regnum));
fb40c209
AC
294 }
295 }
296
297 /* Else, list of register #s, just do listed regs */
298 for (i = 0; i < argc; i++)
299 {
300 regnum = atoi (argv[i]);
173d6894 301 if (regnum < 0 || regnum >= numregs)
fb40c209 302 {
4060713b 303 do_cleanups (cleanup);
c6902d46 304 mi_error_message = xstrprintf ("bad register number");
fb40c209
AC
305 return MI_CMD_ERROR;
306 }
173d6894
AC
307 if (REGISTER_NAME (regnum) == NULL
308 || *(REGISTER_NAME (regnum)) == '\0')
309 ui_out_field_string (uiout, NULL, "");
310 else
311 ui_out_field_string (uiout, NULL, REGISTER_NAME (regnum));
fb40c209 312 }
4060713b 313 do_cleanups (cleanup);
fb40c209
AC
314 return MI_CMD_DONE;
315}
316
317enum mi_cmd_result
318mi_cmd_data_list_changed_registers (char *command, char **argv, int argc)
319{
320 int regnum, numregs, changed;
321 int i;
4060713b 322 struct cleanup *cleanup;
fb40c209
AC
323
324 /* Note that the test for a valid register must include checking the
325 REGISTER_NAME because NUM_REGS may be allocated for the union of
326 the register sets within a family of related processors. In this
327 case, some entries of REGISTER_NAME will change depending upon
328 the particular processor being debugged. */
329
28b41c52 330 numregs = NUM_REGS + NUM_PSEUDO_REGS;
fb40c209 331
4060713b 332 cleanup = make_cleanup_ui_out_list_begin_end (uiout, "changed-registers");
fb40c209
AC
333
334 if (argc == 0) /* No args, just do all the regs */
335 {
336 for (regnum = 0;
337 regnum < numregs;
338 regnum++)
339 {
340 if (REGISTER_NAME (regnum) == NULL
341 || *(REGISTER_NAME (regnum)) == '\0')
342 continue;
343 changed = register_changed_p (regnum);
344 if (changed < 0)
345 {
4060713b 346 do_cleanups (cleanup);
c6902d46 347 mi_error_message = xstrprintf ("mi_cmd_data_list_changed_registers: Unable to read register contents.");
fb40c209
AC
348 return MI_CMD_ERROR;
349 }
350 else if (changed)
351 ui_out_field_int (uiout, NULL, regnum);
352 }
353 }
354
355 /* Else, list of register #s, just do listed regs */
356 for (i = 0; i < argc; i++)
357 {
358 regnum = atoi (argv[i]);
359
360 if (regnum >= 0
361 && regnum < numregs
362 && REGISTER_NAME (regnum) != NULL
363 && *REGISTER_NAME (regnum) != '\000')
364 {
365 changed = register_changed_p (regnum);
366 if (changed < 0)
367 {
4060713b 368 do_cleanups (cleanup);
c6902d46 369 mi_error_message = xstrprintf ("mi_cmd_data_list_register_change: Unable to read register contents.");
fb40c209
AC
370 return MI_CMD_ERROR;
371 }
372 else if (changed)
373 ui_out_field_int (uiout, NULL, regnum);
374 }
375 else
376 {
4060713b 377 do_cleanups (cleanup);
c6902d46 378 mi_error_message = xstrprintf ("bad register number");
fb40c209
AC
379 return MI_CMD_ERROR;
380 }
381 }
4060713b 382 do_cleanups (cleanup);
fb40c209
AC
383 return MI_CMD_DONE;
384}
385
386static int
387register_changed_p (int regnum)
388{
10c42a71 389 gdb_byte raw_buffer[MAX_REGISTER_SIZE];
fb40c209 390
589e074d 391 if (! frame_register_read (get_selected_frame (NULL), regnum, raw_buffer))
fb40c209
AC
392 return -1;
393
62700349 394 if (memcmp (&old_regs[DEPRECATED_REGISTER_BYTE (regnum)], raw_buffer,
3acba339 395 register_size (current_gdbarch, regnum)) == 0)
fb40c209
AC
396 return 0;
397
398 /* Found a changed register. Return 1. */
399
62700349 400 memcpy (&old_regs[DEPRECATED_REGISTER_BYTE (regnum)], raw_buffer,
3acba339 401 register_size (current_gdbarch, regnum));
fb40c209
AC
402
403 return 1;
404}
405
406/* Return a list of register number and value pairs. The valid
407 arguments expected are: a letter indicating the format in which to
408 display the registers contents. This can be one of: x (hexadecimal), d
409 (decimal), N (natural), t (binary), o (octal), r (raw). After the
410 format argumetn there can be a sequence of numbers, indicating which
411 registers to fetch the content of. If the format is the only argument,
412 a list of all the registers with their values is returned. */
413enum mi_cmd_result
414mi_cmd_data_list_register_values (char *command, char **argv, int argc)
415{
416 int regnum, numregs, format, result;
417 int i;
4060713b 418 struct cleanup *list_cleanup, *tuple_cleanup;
fb40c209
AC
419
420 /* Note that the test for a valid register must include checking the
421 REGISTER_NAME because NUM_REGS may be allocated for the union of
422 the register sets within a family of related processors. In this
423 case, some entries of REGISTER_NAME will change depending upon
424 the particular processor being debugged. */
425
28b41c52 426 numregs = NUM_REGS + NUM_PSEUDO_REGS;
fb40c209
AC
427
428 if (argc == 0)
429 {
c6902d46 430 mi_error_message = xstrprintf ("mi_cmd_data_list_register_values: Usage: -data-list-register-values <format> [<regnum1>...<regnumN>]");
fb40c209
AC
431 return MI_CMD_ERROR;
432 }
433
434 format = (int) argv[0][0];
435
4060713b 436 list_cleanup = make_cleanup_ui_out_list_begin_end (uiout, "register-values");
fb40c209
AC
437
438 if (argc == 1) /* No args, beside the format: do all the regs */
439 {
440 for (regnum = 0;
441 regnum < numregs;
442 regnum++)
443 {
444 if (REGISTER_NAME (regnum) == NULL
445 || *(REGISTER_NAME (regnum)) == '\0')
446 continue;
4060713b 447 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
448 ui_out_field_int (uiout, "number", regnum);
449 result = get_register (regnum, format);
450 if (result == -1)
4060713b
KS
451 {
452 do_cleanups (list_cleanup);
453 return MI_CMD_ERROR;
454 }
455 do_cleanups (tuple_cleanup);
fb40c209
AC
456 }
457 }
458
459 /* Else, list of register #s, just do listed regs */
460 for (i = 1; i < argc; i++)
461 {
462 regnum = atoi (argv[i]);
463
464 if (regnum >= 0
465 && regnum < numregs
466 && REGISTER_NAME (regnum) != NULL
467 && *REGISTER_NAME (regnum) != '\000')
468 {
4060713b 469 tuple_cleanup = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
470 ui_out_field_int (uiout, "number", regnum);
471 result = get_register (regnum, format);
472 if (result == -1)
4060713b
KS
473 {
474 do_cleanups (list_cleanup);
475 return MI_CMD_ERROR;
476 }
477 do_cleanups (tuple_cleanup);
fb40c209
AC
478 }
479 else
480 {
4060713b 481 do_cleanups (list_cleanup);
c6902d46 482 mi_error_message = xstrprintf ("bad register number");
fb40c209
AC
483 return MI_CMD_ERROR;
484 }
485 }
4060713b 486 do_cleanups (list_cleanup);
fb40c209
AC
487 return MI_CMD_DONE;
488}
489
490/* Output one register's contents in the desired format. */
491static int
492get_register (int regnum, int format)
493{
10c42a71 494 gdb_byte buffer[MAX_REGISTER_SIZE];
fb40c209 495 int optim;
ac2adee5
AC
496 int realnum;
497 CORE_ADDR addr;
498 enum lval_type lval;
fb40c209
AC
499 static struct ui_stream *stb = NULL;
500
501 stb = ui_out_stream_new (uiout);
502
503 if (format == 'N')
504 format = 0;
505
589e074d 506 frame_register (get_selected_frame (NULL), regnum, &optim, &lval, &addr,
9730f241 507 &realnum, buffer);
ac2adee5 508
fb40c209
AC
509 if (optim)
510 {
c6902d46 511 mi_error_message = xstrprintf ("Optimized out");
fb40c209
AC
512 return -1;
513 }
514
fb40c209
AC
515 if (format == 'r')
516 {
517 int j;
518 char *ptr, buf[1024];
519
520 strcpy (buf, "0x");
521 ptr = buf + 2;
3acba339 522 for (j = 0; j < register_size (current_gdbarch, regnum); j++)
fb40c209 523 {
d5b5ac79 524 int idx = TARGET_BYTE_ORDER == BFD_ENDIAN_BIG ? j
3acba339 525 : register_size (current_gdbarch, regnum) - 1 - j;
9730f241 526 sprintf (ptr, "%02x", (unsigned char) buffer[idx]);
fb40c209
AC
527 ptr += 2;
528 }
529 ui_out_field_string (uiout, "value", buf);
530 /*fputs_filtered (buf, gdb_stdout); */
531 }
532 else
533 {
9730f241 534 val_print (register_type (current_gdbarch, regnum), buffer, 0, 0,
fb40c209
AC
535 stb->stream, format, 1, 0, Val_pretty_default);
536 ui_out_field_stream (uiout, "value", stb);
537 ui_out_stream_delete (stb);
538 }
539 return 1;
540}
541
24e8cecf
EZ
542/* Write given values into registers. The registers and values are
543 given as pairs. The corresponding MI command is
544 -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]*/
545enum mi_cmd_result
546mi_cmd_data_write_register_values (char *command, char **argv, int argc)
547{
9f3a1602 548 int numregs, i;
24e8cecf
EZ
549 char format;
550
551 /* Note that the test for a valid register must include checking the
552 REGISTER_NAME because NUM_REGS may be allocated for the union of
553 the register sets within a family of related processors. In this
554 case, some entries of REGISTER_NAME will change depending upon
555 the particular processor being debugged. */
556
28b41c52 557 numregs = NUM_REGS + NUM_PSEUDO_REGS;
24e8cecf
EZ
558
559 if (argc == 0)
560 {
c6902d46 561 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: Usage: -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
24e8cecf
EZ
562 return MI_CMD_ERROR;
563 }
564
565 format = (int) argv[0][0];
566
567 if (!target_has_registers)
568 {
c6902d46 569 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: No registers.");
24e8cecf
EZ
570 return MI_CMD_ERROR;
571 }
572
573 if (!(argc - 1))
574 {
c6902d46 575 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: No regs and values specified.");
24e8cecf
EZ
576 return MI_CMD_ERROR;
577 }
578
579 if ((argc - 1) % 2)
580 {
c6902d46 581 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: Regs and vals are not in pairs.");
24e8cecf
EZ
582 return MI_CMD_ERROR;
583 }
584
585 for (i = 1; i < argc; i = i + 2)
586 {
9f3a1602 587 int regnum = atoi (argv[i]);
24e8cecf 588
9f3a1602
MK
589 if (regnum >= 0 && regnum < numregs
590 && REGISTER_NAME (regnum) && *REGISTER_NAME (regnum))
24e8cecf 591 {
9f3a1602 592 LONGEST value;
d8bf3afa 593
9f3a1602 594 /* Get the value as a number. */
24e8cecf 595 value = parse_and_eval_address (argv[i + 1]);
9f3a1602 596
24e8cecf 597 /* Write it down */
9f3a1602 598 regcache_cooked_write_signed (current_regcache, regnum, value);
24e8cecf
EZ
599 }
600 else
601 {
c6902d46 602 mi_error_message = xstrprintf ("bad register number");
24e8cecf
EZ
603 return MI_CMD_ERROR;
604 }
605 }
606 return MI_CMD_DONE;
607}
608
fb40c209
AC
609#if 0
610/*This is commented out because we decided it was not useful. I leave
611 it, just in case. ezannoni:1999-12-08 */
612
613/* Assign a value to a variable. The expression argument must be in
614 the form A=2 or "A = 2" (I.e. if there are spaces it needs to be
615 quoted. */
616enum mi_cmd_result
617mi_cmd_data_assign (char *command, char **argv, int argc)
618{
619 struct expression *expr;
620 struct cleanup *old_chain;
621
622 if (argc != 1)
623 {
c6902d46 624 mi_error_message = xstrprintf ("mi_cmd_data_assign: Usage: -data-assign expression");
fb40c209
AC
625 return MI_CMD_ERROR;
626 }
627
628 /* NOTE what follows is a clone of set_command(). FIXME: ezannoni
629 01-12-1999: Need to decide what to do with this for libgdb purposes. */
630
631 expr = parse_expression (argv[0]);
47cf603e 632 old_chain = make_cleanup (free_current_contents, &expr);
fb40c209
AC
633 evaluate_expression (expr);
634 do_cleanups (old_chain);
635 return MI_CMD_DONE;
636}
637#endif
638
639/* Evaluate the value of the argument. The argument is an
640 expression. If the expression contains spaces it needs to be
641 included in double quotes. */
642enum mi_cmd_result
643mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
644{
645 struct expression *expr;
646 struct cleanup *old_chain = NULL;
96052a95 647 struct value *val;
fb40c209
AC
648 struct ui_stream *stb = NULL;
649
650 stb = ui_out_stream_new (uiout);
651
652 if (argc != 1)
653 {
c6902d46 654 mi_error_message = xstrprintf ("mi_cmd_data_evaluate_expression: Usage: -data-evaluate-expression expression");
fb40c209
AC
655 return MI_CMD_ERROR;
656 }
657
658 expr = parse_expression (argv[0]);
659
47cf603e 660 old_chain = make_cleanup (free_current_contents, &expr);
fb40c209
AC
661
662 val = evaluate_expression (expr);
663
664 /* Print the result of the expression evaluation. */
0fd88904 665 val_print (value_type (val), value_contents (val),
13c3b5f5 666 value_embedded_offset (val), VALUE_ADDRESS (val),
fb40c209
AC
667 stb->stream, 0, 0, 0, 0);
668
669 ui_out_field_stream (uiout, "value", stb);
670 ui_out_stream_delete (stb);
671
672 do_cleanups (old_chain);
673
674 return MI_CMD_DONE;
675}
676
677enum mi_cmd_result
678mi_cmd_target_download (char *args, int from_tty)
679{
680 char *run;
681 struct cleanup *old_cleanups = NULL;
682
c6902d46 683 run = xstrprintf ("load %s", args);
b8c9b27d 684 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
685 execute_command (run, from_tty);
686
687 do_cleanups (old_cleanups);
688 return MI_CMD_DONE;
689}
690
691/* Connect to the remote target. */
692enum mi_cmd_result
693mi_cmd_target_select (char *args, int from_tty)
694{
695 char *run;
696 struct cleanup *old_cleanups = NULL;
697
c6902d46 698 run = xstrprintf ("target %s", args);
b8c9b27d 699 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
700
701 /* target-select is always synchronous. once the call has returned
702 we know that we are connected. */
703 /* NOTE: At present all targets that are connected are also
704 (implicitly) talking to a halted target. In the future this may
705 change. */
706 execute_command (run, from_tty);
707
708 do_cleanups (old_cleanups);
709
710 /* Issue the completion message here. */
711 if (last_async_command)
712 fputs_unfiltered (last_async_command, raw_stdout);
713 fputs_unfiltered ("^connected", raw_stdout);
714 mi_out_put (uiout, raw_stdout);
715 mi_out_rewind (uiout);
716 fputs_unfiltered ("\n", raw_stdout);
717 do_exec_cleanups (ALL_CLEANUPS);
718 return MI_CMD_QUIET;
719}
720
721/* DATA-MEMORY-READ:
722
723 ADDR: start address of data to be dumped.
724 WORD-FORMAT: a char indicating format for the ``word''. See
725 the ``x'' command.
726 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes
727 NR_ROW: Number of rows.
728 NR_COL: The number of colums (words per row).
729 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use
730 ASCHAR for unprintable characters.
731
732 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
733 displayes them. Returns:
734
735 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
736
737 Returns:
738 The number of bytes read is SIZE*ROW*COL. */
739
740enum mi_cmd_result
741mi_cmd_data_read_memory (char *command, char **argv, int argc)
742{
743 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
744 CORE_ADDR addr;
745 long total_bytes;
746 long nr_cols;
747 long nr_rows;
748 char word_format;
749 struct type *word_type;
750 long word_size;
751 char word_asize;
752 char aschar;
508416a1 753 gdb_byte *mbuf;
fb40c209
AC
754 int nr_bytes;
755 long offset = 0;
756 int optind = 0;
757 char *optarg;
758 enum opt
759 {
760 OFFSET_OPT
761 };
762 static struct mi_opt opts[] =
763 {
764 {"o", OFFSET_OPT, 1},
d5d6fca5 765 { 0, 0, 0 }
fb40c209
AC
766 };
767
768 while (1)
769 {
770 int opt = mi_getopt ("mi_cmd_data_read_memory", argc, argv, opts,
771 &optind, &optarg);
772 if (opt < 0)
773 break;
774 switch ((enum opt) opt)
775 {
776 case OFFSET_OPT:
777 offset = atol (optarg);
778 break;
779 }
780 }
781 argv += optind;
782 argc -= optind;
783
784 if (argc < 5 || argc > 6)
785 {
c6902d46 786 mi_error_message = xstrprintf ("mi_cmd_data_read_memory: Usage: ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].");
fb40c209
AC
787 return MI_CMD_ERROR;
788 }
789
790 /* Extract all the arguments. */
791
792 /* Start address of the memory dump. */
793 addr = parse_and_eval_address (argv[0]) + offset;
794 /* The format character to use when displaying a memory word. See
795 the ``x'' command. */
796 word_format = argv[1][0];
797 /* The size of the memory word. */
798 word_size = atol (argv[2]);
799 switch (word_size)
800 {
801 case 1:
802 word_type = builtin_type_int8;
803 word_asize = 'b';
804 break;
805 case 2:
806 word_type = builtin_type_int16;
807 word_asize = 'h';
808 break;
809 case 4:
810 word_type = builtin_type_int32;
811 word_asize = 'w';
812 break;
813 case 8:
814 word_type = builtin_type_int64;
815 word_asize = 'g';
816 break;
817 default:
818 word_type = builtin_type_int8;
819 word_asize = 'b';
820 }
821 /* The number of rows */
822 nr_rows = atol (argv[3]);
823 if (nr_rows <= 0)
824 {
c6902d46 825 mi_error_message = xstrprintf ("mi_cmd_data_read_memory: invalid number of rows.");
fb40c209
AC
826 return MI_CMD_ERROR;
827 }
828 /* number of bytes per row. */
829 nr_cols = atol (argv[4]);
830 if (nr_cols <= 0)
831 {
c6902d46 832 mi_error_message = xstrprintf ("mi_cmd_data_read_memory: invalid number of columns.");
de169ec9 833 return MI_CMD_ERROR;
fb40c209
AC
834 }
835 /* The un-printable character when printing ascii. */
836 if (argc == 6)
837 aschar = *argv[5];
838 else
839 aschar = 0;
840
841 /* create a buffer and read it in. */
842 total_bytes = word_size * nr_rows * nr_cols;
2e94c453 843 mbuf = xcalloc (total_bytes, 1);
b8c9b27d 844 make_cleanup (xfree, mbuf);
cf7a04e8
DJ
845
846 nr_bytes = target_read (&current_target, TARGET_OBJECT_MEMORY, NULL,
847 mbuf, addr, total_bytes);
848 if (nr_bytes <= 0)
fb40c209 849 {
cf7a04e8
DJ
850 do_cleanups (cleanups);
851 mi_error_message = xstrdup ("Unable to read memory.");
852 return MI_CMD_ERROR;
fb40c209
AC
853 }
854
855 /* output the header information. */
856 ui_out_field_core_addr (uiout, "addr", addr);
857 ui_out_field_int (uiout, "nr-bytes", nr_bytes);
858 ui_out_field_int (uiout, "total-bytes", total_bytes);
859 ui_out_field_core_addr (uiout, "next-row", addr + word_size * nr_cols);
860 ui_out_field_core_addr (uiout, "prev-row", addr - word_size * nr_cols);
861 ui_out_field_core_addr (uiout, "next-page", addr + total_bytes);
862 ui_out_field_core_addr (uiout, "prev-page", addr - total_bytes);
863
864 /* Build the result as a two dimentional table. */
865 {
866 struct ui_stream *stream = ui_out_stream_new (uiout);
6ad4a2cf 867 struct cleanup *cleanup_list_memory;
fb40c209
AC
868 int row;
869 int row_byte;
6ad4a2cf 870 cleanup_list_memory = make_cleanup_ui_out_list_begin_end (uiout, "memory");
fb40c209
AC
871 for (row = 0, row_byte = 0;
872 row < nr_rows;
873 row++, row_byte += nr_cols * word_size)
874 {
875 int col;
876 int col_byte;
6ad4a2cf
JJ
877 struct cleanup *cleanup_tuple;
878 struct cleanup *cleanup_list_data;
879 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
880 ui_out_field_core_addr (uiout, "addr", addr + row_byte);
881 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr + row_byte); */
6ad4a2cf 882 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
fb40c209
AC
883 for (col = 0, col_byte = row_byte;
884 col < nr_cols;
885 col++, col_byte += word_size)
886 {
887 if (col_byte + word_size > nr_bytes)
888 {
889 ui_out_field_string (uiout, NULL, "N/A");
890 }
891 else
892 {
893 ui_file_rewind (stream->stream);
894 print_scalar_formatted (mbuf + col_byte, word_type, word_format,
895 word_asize, stream->stream);
896 ui_out_field_stream (uiout, NULL, stream);
897 }
898 }
6ad4a2cf 899 do_cleanups (cleanup_list_data);
fb40c209
AC
900 if (aschar)
901 {
902 int byte;
903 ui_file_rewind (stream->stream);
904 for (byte = row_byte; byte < row_byte + word_size * nr_cols; byte++)
905 {
906 if (byte >= nr_bytes)
907 {
908 fputc_unfiltered ('X', stream->stream);
909 }
910 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
911 {
912 fputc_unfiltered (aschar, stream->stream);
913 }
914 else
915 fputc_unfiltered (mbuf[byte], stream->stream);
916 }
917 ui_out_field_stream (uiout, "ascii", stream);
918 }
6ad4a2cf 919 do_cleanups (cleanup_tuple);
fb40c209
AC
920 }
921 ui_out_stream_delete (stream);
6ad4a2cf 922 do_cleanups (cleanup_list_memory);
fb40c209
AC
923 }
924 do_cleanups (cleanups);
925 return MI_CMD_DONE;
926}
927
928/* DATA-MEMORY-WRITE:
929
930 COLUMN_OFFSET: optional argument. Must be preceeded by '-o'. The
931 offset from the beginning of the memory grid row where the cell to
932 be written is.
933 ADDR: start address of the row in the memory grid where the memory
934 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
935 the location to write to.
936 FORMAT: a char indicating format for the ``word''. See
937 the ``x'' command.
938 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
939 VALUE: value to be written into the memory address.
940
941 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
942
943 Prints nothing. */
944enum mi_cmd_result
945mi_cmd_data_write_memory (char *command, char **argv, int argc)
946{
947 CORE_ADDR addr;
948 char word_format;
949 long word_size;
950 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
951 enough when using a compiler other than GCC. */
952 LONGEST value;
d8bf3afa
KB
953 void *buffer;
954 struct cleanup *old_chain;
fb40c209
AC
955 long offset = 0;
956 int optind = 0;
957 char *optarg;
958 enum opt
959 {
960 OFFSET_OPT
961 };
962 static struct mi_opt opts[] =
963 {
964 {"o", OFFSET_OPT, 1},
d5d6fca5 965 { 0, 0, 0 }
fb40c209
AC
966 };
967
968 while (1)
969 {
970 int opt = mi_getopt ("mi_cmd_data_write_memory", argc, argv, opts,
971 &optind, &optarg);
972 if (opt < 0)
973 break;
974 switch ((enum opt) opt)
975 {
976 case OFFSET_OPT:
977 offset = atol (optarg);
978 break;
979 }
980 }
981 argv += optind;
982 argc -= optind;
983
984 if (argc != 4)
985 {
c6902d46 986 mi_error_message = xstrprintf ("mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
fb40c209
AC
987 return MI_CMD_ERROR;
988 }
989
990 /* Extract all the arguments. */
991 /* Start address of the memory dump. */
992 addr = parse_and_eval_address (argv[0]);
993 /* The format character to use when displaying a memory word. See
994 the ``x'' command. */
995 word_format = argv[1][0];
996 /* The size of the memory word. */
997 word_size = atol (argv[2]);
998
999 /* Calculate the real address of the write destination. */
1000 addr += (offset * word_size);
1001
1002 /* Get the value as a number */
1003 value = parse_and_eval_address (argv[3]);
1004 /* Get the value into an array */
d8bf3afa
KB
1005 buffer = xmalloc (word_size);
1006 old_chain = make_cleanup (xfree, buffer);
fb40c209
AC
1007 store_signed_integer (buffer, word_size, value);
1008 /* Write it down to memory */
1009 write_memory (addr, buffer, word_size);
d8bf3afa
KB
1010 /* Free the buffer. */
1011 do_cleanups (old_chain);
fb40c209
AC
1012
1013 return MI_CMD_DONE;
1014}
1015
8d34ea23
KS
1016/* Execute a command within a safe environment.
1017 Return <0 for error; >=0 for ok.
1018
1019 args->action will tell mi_execute_command what action
1020 to perfrom after the given command has executed (display/supress
1021 prompt, display error). */
fb40c209 1022
f30f06b8 1023static void
8d34ea23 1024captured_mi_execute_command (struct ui_out *uiout, void *data)
fb40c209 1025{
8d34ea23
KS
1026 struct captured_mi_execute_command_args *args =
1027 (struct captured_mi_execute_command_args *) data;
1028 struct mi_parse *context = args->command;
fb40c209
AC
1029
1030 switch (context->op)
1031 {
1032
1033 case MI_COMMAND:
1034 /* A MI command was read from the input stream */
1035 if (mi_debug_p)
1036 /* FIXME: gdb_???? */
1037 fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1038 context->token, context->command, context->args);
1039 /* FIXME: cagney/1999-09-25: Rather than this convoluted
1040 condition expression, each function should return an
1041 indication of what action is required and then switch on
1042 that. */
8d34ea23
KS
1043 args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;
1044 args->rc = mi_cmd_execute (context);
1045
fb40c209
AC
1046 if (!target_can_async_p () || !target_executing)
1047 {
4389a95a
AC
1048 /* print the result if there were no errors
1049
1050 Remember that on the way out of executing a command, you have
1051 to directly use the mi_interp's uiout, since the command could
1052 have reset the interpreter, in which case the current uiout
1053 will most likely crash in the mi_out_* routines. */
8d34ea23 1054 if (args->rc == MI_CMD_DONE)
fb40c209
AC
1055 {
1056 fputs_unfiltered (context->token, raw_stdout);
1057 fputs_unfiltered ("^done", raw_stdout);
1058 mi_out_put (uiout, raw_stdout);
1059 mi_out_rewind (uiout);
1060 fputs_unfiltered ("\n", raw_stdout);
1061 }
8d34ea23 1062 else if (args->rc == MI_CMD_ERROR)
fb40c209
AC
1063 {
1064 if (mi_error_message)
1065 {
1066 fputs_unfiltered (context->token, raw_stdout);
1067 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1068 fputstr_unfiltered (mi_error_message, '"', raw_stdout);
b8c9b27d 1069 xfree (mi_error_message);
fb40c209
AC
1070 fputs_unfiltered ("\"\n", raw_stdout);
1071 }
1072 mi_out_rewind (uiout);
1073 }
fb40c209
AC
1074 else
1075 mi_out_rewind (uiout);
1076 }
1077 else if (sync_execution)
8d34ea23
KS
1078 {
1079 /* Don't print the prompt. We are executing the target in
1080 synchronous mode. */
1081 args->action = EXECUTE_COMMAND_SUPRESS_PROMPT;
f30f06b8 1082 return;
8d34ea23 1083 }
fb40c209
AC
1084 break;
1085
1086 case CLI_COMMAND:
78f5381d
AC
1087 {
1088 char *argv[2];
1089 /* A CLI command was read from the input stream. */
1090 /* This "feature" will be removed as soon as we have a
1091 complete set of mi commands. */
1092 /* Echo the command on the console. */
1093 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1094 /* Call the "console" interpreter. */
1095 argv[0] = "console";
1096 argv[1] = context->command;
eec01795 1097 args->rc = mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
78f5381d 1098
eec01795 1099 /* If we changed interpreters, DON'T print out anything. */
78f5381d
AC
1100 if (current_interp_named_p (INTERP_MI)
1101 || current_interp_named_p (INTERP_MI1)
1102 || current_interp_named_p (INTERP_MI2)
1103 || current_interp_named_p (INTERP_MI3))
1104 {
eec01795
DJ
1105 if (args->rc == MI_CMD_DONE)
1106 {
1107 fputs_unfiltered (context->token, raw_stdout);
1108 fputs_unfiltered ("^done", raw_stdout);
1109 mi_out_put (uiout, raw_stdout);
1110 mi_out_rewind (uiout);
1111 fputs_unfiltered ("\n", raw_stdout);
1112 args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;
1113 }
1114 else if (args->rc == MI_CMD_ERROR)
1115 {
1116 if (mi_error_message)
1117 {
1118 fputs_unfiltered (context->token, raw_stdout);
1119 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1120 fputstr_unfiltered (mi_error_message, '"', raw_stdout);
1121 xfree (mi_error_message);
1122 fputs_unfiltered ("\"\n", raw_stdout);
1123 }
1124 mi_out_rewind (uiout);
1125 }
1126 else
1127 mi_out_rewind (uiout);
78f5381d
AC
1128 }
1129 break;
1130 }
fb40c209
AC
1131
1132 }
8d34ea23 1133
f30f06b8 1134 return;
fb40c209
AC
1135}
1136
1137
1138void
1139mi_execute_command (char *cmd, int from_tty)
1140{
1141 struct mi_parse *command;
8d34ea23
KS
1142 struct captured_mi_execute_command_args args;
1143 struct ui_out *saved_uiout = uiout;
fb40c209
AC
1144
1145 /* This is to handle EOF (^D). We just quit gdb. */
1146 /* FIXME: we should call some API function here. */
1147 if (cmd == 0)
1148 quit_force (NULL, from_tty);
1149
1150 command = mi_parse (cmd);
1151
1152 if (command != NULL)
1153 {
71fff37b 1154 struct gdb_exception result;
8d34ea23 1155 /* FIXME: cagney/1999-11-04: Can this use of catch_exceptions either
fb40c209 1156 be pushed even further down or even eliminated? */
8d34ea23 1157 args.command = command;
f30f06b8
AC
1158 result = catch_exception (uiout, captured_mi_execute_command, &args,
1159 RETURN_MASK_ALL);
9cbc821d 1160 exception_print (gdb_stderr, result);
8d34ea23
KS
1161
1162 if (args.action == EXECUTE_COMMAND_SUPRESS_PROMPT)
fb40c209
AC
1163 {
1164 /* The command is executing synchronously. Bail out early
1165 suppressing the finished prompt. */
1166 mi_parse_free (command);
1167 return;
1168 }
ce43223b 1169 if (result.reason < 0)
fb40c209 1170 {
fb40c209 1171 /* The command execution failed and error() was called
589e074d 1172 somewhere. */
fb40c209
AC
1173 fputs_unfiltered (command->token, raw_stdout);
1174 fputs_unfiltered ("^error,msg=\"", raw_stdout);
63f06803
DJ
1175 if (result.message == NULL)
1176 fputs_unfiltered ("unknown error", raw_stdout);
1177 else
1178 fputstr_unfiltered (result.message, '"', raw_stdout);
fb40c209 1179 fputs_unfiltered ("\"\n", raw_stdout);
589e074d 1180 mi_out_rewind (uiout);
fb40c209
AC
1181 }
1182 mi_parse_free (command);
1183 }
1184
fb40c209 1185 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1186 gdb_flush (raw_stdout);
fb40c209
AC
1187 /* print any buffered hook code */
1188 /* ..... */
1189}
1190
1191static enum mi_cmd_result
1192mi_cmd_execute (struct mi_parse *parse)
1193{
1194 if (parse->cmd->argv_func != NULL
1195 || parse->cmd->args_func != NULL)
1196 {
1197 /* FIXME: We need to save the token because the command executed
1198 may be asynchronous and need to print the token again.
1199 In the future we can pass the token down to the func
1200 and get rid of the last_async_command */
1201 /* The problem here is to keep the token around when we launch
1202 the target, and we want to interrupt it later on. The
1203 interrupt command will have its own token, but when the
1204 target stops, we must display the token corresponding to the
1205 last execution command given. So we have another string where
1206 we copy the token (previous_async_command), if this was
1207 indeed the token of an execution command, and when we stop we
1208 print that one. This is possible because the interrupt
1209 command, when over, will copy that token back into the
1210 default token string (last_async_command). */
1211
1212 if (target_executing)
1213 {
1214 if (!previous_async_command)
1215 previous_async_command = xstrdup (last_async_command);
1216 if (strcmp (parse->command, "exec-interrupt"))
1217 {
1218 fputs_unfiltered (parse->token, raw_stdout);
1219 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1220 fputs_unfiltered ("Cannot execute command ", raw_stdout);
1221 fputstr_unfiltered (parse->command, '"', raw_stdout);
1222 fputs_unfiltered (" while target running", raw_stdout);
1223 fputs_unfiltered ("\"\n", raw_stdout);
1224 return MI_CMD_ERROR;
1225 }
1226 }
1227 last_async_command = xstrdup (parse->token);
e2f9c474 1228 make_exec_cleanup (free_current_contents, &last_async_command);
fb40c209
AC
1229 /* FIXME: DELETE THIS! */
1230 if (parse->cmd->args_func != NULL)
1231 return parse->cmd->args_func (parse->args, 0 /*from_tty */ );
1232 return parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
1233 }
b2af646b 1234 else if (parse->cmd->cli.cmd != 0)
fb40c209
AC
1235 {
1236 /* FIXME: DELETE THIS. */
1237 /* The operation is still implemented by a cli command */
1238 /* Must be a synchronous one */
b2af646b
AC
1239 mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
1240 parse->args);
fb40c209
AC
1241 return MI_CMD_DONE;
1242 }
1243 else
1244 {
1245 /* FIXME: DELETE THIS. */
1246 fputs_unfiltered (parse->token, raw_stdout);
1247 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1248 fputs_unfiltered ("Undefined mi command: ", raw_stdout);
1249 fputstr_unfiltered (parse->command, '"', raw_stdout);
1250 fputs_unfiltered (" (missing implementation)", raw_stdout);
1251 fputs_unfiltered ("\"\n", raw_stdout);
1252 return MI_CMD_ERROR;
1253 }
1254}
1255
fb40c209
AC
1256/* FIXME: This is just a hack so we can get some extra commands going.
1257 We don't want to channel things through the CLI, but call libgdb directly */
1258/* Use only for synchronous commands */
1259
1260void
b2af646b 1261mi_execute_cli_command (const char *cmd, int args_p, const char *args)
fb40c209 1262{
b2af646b 1263 if (cmd != 0)
fb40c209
AC
1264 {
1265 struct cleanup *old_cleanups;
1266 char *run;
b2af646b 1267 if (args_p)
c6902d46 1268 run = xstrprintf ("%s %s", cmd, args);
b2af646b
AC
1269 else
1270 run = xstrdup (cmd);
fb40c209
AC
1271 if (mi_debug_p)
1272 /* FIXME: gdb_???? */
1273 fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
b2af646b 1274 cmd, run);
b8c9b27d 1275 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
1276 execute_command ( /*ui */ run, 0 /*from_tty */ );
1277 do_cleanups (old_cleanups);
1278 return;
1279 }
1280}
1281
1282enum mi_cmd_result
1283mi_execute_async_cli_command (char *mi, char *args, int from_tty)
1284{
1285 struct cleanup *old_cleanups;
1286 char *run;
1287 char *async_args;
1288
1289 if (target_can_async_p ())
1290 {
1291 async_args = (char *) xmalloc (strlen (args) + 2);
1292 make_exec_cleanup (free, async_args);
1293 strcpy (async_args, args);
1294 strcat (async_args, "&");
c6902d46 1295 run = xstrprintf ("%s %s", mi, async_args);
fb40c209
AC
1296 make_exec_cleanup (free, run);
1297 add_continuation (mi_exec_async_cli_cmd_continuation, NULL);
6311b07d 1298 old_cleanups = NULL;
fb40c209
AC
1299 }
1300 else
1301 {
c6902d46 1302 run = xstrprintf ("%s %s", mi, args);
b8c9b27d 1303 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
1304 }
1305
1306 if (!target_can_async_p ())
1307 {
1308 /* NOTE: For synchronous targets asynchronous behavour is faked by
1309 printing out the GDB prompt before we even try to execute the
1310 command. */
1311 if (last_async_command)
1312 fputs_unfiltered (last_async_command, raw_stdout);
1313 fputs_unfiltered ("^running\n", raw_stdout);
1314 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1315 gdb_flush (raw_stdout);
fb40c209
AC
1316 }
1317 else
1318 {
1319 /* FIXME: cagney/1999-11-29: Printing this message before
1320 calling execute_command is wrong. It should only be printed
1321 once gdb has confirmed that it really has managed to send a
1322 run command to the target. */
1323 if (last_async_command)
1324 fputs_unfiltered (last_async_command, raw_stdout);
1325 fputs_unfiltered ("^running\n", raw_stdout);
1326 }
1327
1328 execute_command ( /*ui */ run, 0 /*from_tty */ );
1329
1330 if (!target_can_async_p ())
1331 {
1332 /* Do this before doing any printing. It would appear that some
1333 print code leaves garbage around in the buffer. */
1334 do_cleanups (old_cleanups);
1335 /* If the target was doing the operation synchronously we fake
1336 the stopped message. */
1337 if (last_async_command)
1338 fputs_unfiltered (last_async_command, raw_stdout);
1339 fputs_unfiltered ("*stopped", raw_stdout);
1340 mi_out_put (uiout, raw_stdout);
1341 mi_out_rewind (uiout);
1342 fputs_unfiltered ("\n", raw_stdout);
1343 return MI_CMD_QUIET;
1344 }
1345 return MI_CMD_DONE;
1346}
1347
1348void
1349mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg)
1350{
1351 if (last_async_command)
1352 fputs_unfiltered (last_async_command, raw_stdout);
1353 fputs_unfiltered ("*stopped", raw_stdout);
1354 mi_out_put (uiout, raw_stdout);
1355 fputs_unfiltered ("\n", raw_stdout);
1356 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1357 gdb_flush (raw_stdout);
fb40c209
AC
1358 do_exec_cleanups (ALL_CLEANUPS);
1359}
1360
4389a95a 1361void
fb40c209
AC
1362mi_load_progress (const char *section_name,
1363 unsigned long sent_so_far,
1364 unsigned long total_section,
1365 unsigned long total_sent,
1366 unsigned long grand_total)
1367{
1368 struct timeval time_now, delta, update_threshold;
1369 static struct timeval last_update;
1370 static char *previous_sect_name = NULL;
1371 int new_section;
0be75e02 1372 struct ui_out *saved_uiout;
fb40c209 1373
0be75e02
AS
1374 /* This function is called through deprecated_show_load_progress
1375 which means uiout may not be correct. Fix it for the duration
1376 of this function. */
1377 saved_uiout = uiout;
1378
1379 if (current_interp_named_p (INTERP_MI))
1380 uiout = mi_out_new (2);
1381 else if (current_interp_named_p (INTERP_MI1))
1382 uiout = mi_out_new (1);
1383 else
fb40c209
AC
1384 return;
1385
1386 update_threshold.tv_sec = 0;
1387 update_threshold.tv_usec = 500000;
1388 gettimeofday (&time_now, NULL);
1389
1390 delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
1391 delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
1392
1393 if (delta.tv_usec < 0)
1394 {
1395 delta.tv_sec -= 1;
1396 delta.tv_usec += 1000000;
1397 }
1398
1399 new_section = (previous_sect_name ?
1400 strcmp (previous_sect_name, section_name) : 1);
1401 if (new_section)
1402 {
6ad4a2cf 1403 struct cleanup *cleanup_tuple;
b8c9b27d 1404 xfree (previous_sect_name);
fb40c209
AC
1405 previous_sect_name = xstrdup (section_name);
1406
1407 if (last_async_command)
1408 fputs_unfiltered (last_async_command, raw_stdout);
1409 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 1410 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
1411 ui_out_field_string (uiout, "section", section_name);
1412 ui_out_field_int (uiout, "section-size", total_section);
1413 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 1414 do_cleanups (cleanup_tuple);
fb40c209
AC
1415 mi_out_put (uiout, raw_stdout);
1416 fputs_unfiltered ("\n", raw_stdout);
1417 gdb_flush (raw_stdout);
1418 }
1419
1420 if (delta.tv_sec >= update_threshold.tv_sec &&
1421 delta.tv_usec >= update_threshold.tv_usec)
1422 {
6ad4a2cf 1423 struct cleanup *cleanup_tuple;
fb40c209
AC
1424 last_update.tv_sec = time_now.tv_sec;
1425 last_update.tv_usec = time_now.tv_usec;
1426 if (last_async_command)
1427 fputs_unfiltered (last_async_command, raw_stdout);
1428 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 1429 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
1430 ui_out_field_string (uiout, "section", section_name);
1431 ui_out_field_int (uiout, "section-sent", sent_so_far);
1432 ui_out_field_int (uiout, "section-size", total_section);
1433 ui_out_field_int (uiout, "total-sent", total_sent);
1434 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 1435 do_cleanups (cleanup_tuple);
fb40c209
AC
1436 mi_out_put (uiout, raw_stdout);
1437 fputs_unfiltered ("\n", raw_stdout);
1438 gdb_flush (raw_stdout);
1439 }
0be75e02
AS
1440
1441 xfree (uiout);
1442 uiout = saved_uiout;
fb40c209
AC
1443}
1444
4389a95a
AC
1445void
1446mi_setup_architecture_data (void)
fb40c209 1447{
00a9a2c6
EZ
1448 old_regs = xmalloc ((NUM_REGS + NUM_PSEUDO_REGS) * MAX_REGISTER_SIZE + 1);
1449 memset (old_regs, 0, (NUM_REGS + NUM_PSEUDO_REGS) * MAX_REGISTER_SIZE + 1);
fb40c209
AC
1450}
1451
fb40c209 1452void
fba45db2 1453_initialize_mi_main (void)
fb40c209 1454{
046a4708
AC
1455 DEPRECATED_REGISTER_GDBARCH_SWAP (old_regs);
1456 deprecated_register_gdbarch_swap (NULL, 0, mi_setup_architecture_data);
fb40c209 1457}