* elf32-mips.c, elf64-mips.c, elfn32-mips.c
[deliverable/binutils-gdb.git] / gdb / mi / mi-main.c
CommitLineData
fb40c209 1/* MI Command Set.
cd0bfa36 2
1caae165 3 Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005 Free Software
0fd88904 4 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{
548 int regnum;
549 int i;
550 int numregs;
24e8cecf
EZ
551 LONGEST value;
552 char format;
553
554 /* Note that the test for a valid register must include checking the
555 REGISTER_NAME because NUM_REGS may be allocated for the union of
556 the register sets within a family of related processors. In this
557 case, some entries of REGISTER_NAME will change depending upon
558 the particular processor being debugged. */
559
28b41c52 560 numregs = NUM_REGS + NUM_PSEUDO_REGS;
24e8cecf
EZ
561
562 if (argc == 0)
563 {
c6902d46 564 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: Usage: -data-write-register-values <format> [<regnum1> <value1>...<regnumN> <valueN>]");
24e8cecf
EZ
565 return MI_CMD_ERROR;
566 }
567
568 format = (int) argv[0][0];
569
570 if (!target_has_registers)
571 {
c6902d46 572 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: No registers.");
24e8cecf
EZ
573 return MI_CMD_ERROR;
574 }
575
576 if (!(argc - 1))
577 {
c6902d46 578 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: No regs and values specified.");
24e8cecf
EZ
579 return MI_CMD_ERROR;
580 }
581
582 if ((argc - 1) % 2)
583 {
c6902d46 584 mi_error_message = xstrprintf ("mi_cmd_data_write_register_values: Regs and vals are not in pairs.");
24e8cecf
EZ
585 return MI_CMD_ERROR;
586 }
587
588 for (i = 1; i < argc; i = i + 2)
589 {
590 regnum = atoi (argv[i]);
591
592 if (regnum >= 0
593 && regnum < numregs
594 && REGISTER_NAME (regnum) != NULL
595 && *REGISTER_NAME (regnum) != '\000')
596 {
d8bf3afa
KB
597 void *buffer;
598 struct cleanup *old_chain;
599
24e8cecf
EZ
600 /* Get the value as a number */
601 value = parse_and_eval_address (argv[i + 1]);
602 /* Get the value into an array */
b1e29e33 603 buffer = xmalloc (DEPRECATED_REGISTER_SIZE);
d8bf3afa 604 old_chain = make_cleanup (xfree, buffer);
b1e29e33 605 store_signed_integer (buffer, DEPRECATED_REGISTER_SIZE, value);
24e8cecf 606 /* Write it down */
3acba339 607 deprecated_write_register_bytes (DEPRECATED_REGISTER_BYTE (regnum), buffer, register_size (current_gdbarch, regnum));
d8bf3afa
KB
608 /* Free the buffer. */
609 do_cleanups (old_chain);
24e8cecf
EZ
610 }
611 else
612 {
c6902d46 613 mi_error_message = xstrprintf ("bad register number");
24e8cecf
EZ
614 return MI_CMD_ERROR;
615 }
616 }
617 return MI_CMD_DONE;
618}
619
fb40c209
AC
620#if 0
621/*This is commented out because we decided it was not useful. I leave
622 it, just in case. ezannoni:1999-12-08 */
623
624/* Assign a value to a variable. The expression argument must be in
625 the form A=2 or "A = 2" (I.e. if there are spaces it needs to be
626 quoted. */
627enum mi_cmd_result
628mi_cmd_data_assign (char *command, char **argv, int argc)
629{
630 struct expression *expr;
631 struct cleanup *old_chain;
632
633 if (argc != 1)
634 {
c6902d46 635 mi_error_message = xstrprintf ("mi_cmd_data_assign: Usage: -data-assign expression");
fb40c209
AC
636 return MI_CMD_ERROR;
637 }
638
639 /* NOTE what follows is a clone of set_command(). FIXME: ezannoni
640 01-12-1999: Need to decide what to do with this for libgdb purposes. */
641
642 expr = parse_expression (argv[0]);
47cf603e 643 old_chain = make_cleanup (free_current_contents, &expr);
fb40c209
AC
644 evaluate_expression (expr);
645 do_cleanups (old_chain);
646 return MI_CMD_DONE;
647}
648#endif
649
650/* Evaluate the value of the argument. The argument is an
651 expression. If the expression contains spaces it needs to be
652 included in double quotes. */
653enum mi_cmd_result
654mi_cmd_data_evaluate_expression (char *command, char **argv, int argc)
655{
656 struct expression *expr;
657 struct cleanup *old_chain = NULL;
96052a95 658 struct value *val;
fb40c209
AC
659 struct ui_stream *stb = NULL;
660
661 stb = ui_out_stream_new (uiout);
662
663 if (argc != 1)
664 {
c6902d46 665 mi_error_message = xstrprintf ("mi_cmd_data_evaluate_expression: Usage: -data-evaluate-expression expression");
fb40c209
AC
666 return MI_CMD_ERROR;
667 }
668
669 expr = parse_expression (argv[0]);
670
47cf603e 671 old_chain = make_cleanup (free_current_contents, &expr);
fb40c209
AC
672
673 val = evaluate_expression (expr);
674
675 /* Print the result of the expression evaluation. */
0fd88904 676 val_print (value_type (val), value_contents (val),
13c3b5f5 677 value_embedded_offset (val), VALUE_ADDRESS (val),
fb40c209
AC
678 stb->stream, 0, 0, 0, 0);
679
680 ui_out_field_stream (uiout, "value", stb);
681 ui_out_stream_delete (stb);
682
683 do_cleanups (old_chain);
684
685 return MI_CMD_DONE;
686}
687
688enum mi_cmd_result
689mi_cmd_target_download (char *args, int from_tty)
690{
691 char *run;
692 struct cleanup *old_cleanups = NULL;
693
c6902d46 694 run = xstrprintf ("load %s", args);
b8c9b27d 695 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
696 execute_command (run, from_tty);
697
698 do_cleanups (old_cleanups);
699 return MI_CMD_DONE;
700}
701
702/* Connect to the remote target. */
703enum mi_cmd_result
704mi_cmd_target_select (char *args, int from_tty)
705{
706 char *run;
707 struct cleanup *old_cleanups = NULL;
708
c6902d46 709 run = xstrprintf ("target %s", args);
b8c9b27d 710 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
711
712 /* target-select is always synchronous. once the call has returned
713 we know that we are connected. */
714 /* NOTE: At present all targets that are connected are also
715 (implicitly) talking to a halted target. In the future this may
716 change. */
717 execute_command (run, from_tty);
718
719 do_cleanups (old_cleanups);
720
721 /* Issue the completion message here. */
722 if (last_async_command)
723 fputs_unfiltered (last_async_command, raw_stdout);
724 fputs_unfiltered ("^connected", raw_stdout);
725 mi_out_put (uiout, raw_stdout);
726 mi_out_rewind (uiout);
727 fputs_unfiltered ("\n", raw_stdout);
728 do_exec_cleanups (ALL_CLEANUPS);
729 return MI_CMD_QUIET;
730}
731
732/* DATA-MEMORY-READ:
733
734 ADDR: start address of data to be dumped.
735 WORD-FORMAT: a char indicating format for the ``word''. See
736 the ``x'' command.
737 WORD-SIZE: size of each ``word''; 1,2,4, or 8 bytes
738 NR_ROW: Number of rows.
739 NR_COL: The number of colums (words per row).
740 ASCHAR: (OPTIONAL) Append an ascii character dump to each row. Use
741 ASCHAR for unprintable characters.
742
743 Reads SIZE*NR_ROW*NR_COL bytes starting at ADDR from memory and
744 displayes them. Returns:
745
746 {addr="...",rowN={wordN="..." ,... [,ascii="..."]}, ...}
747
748 Returns:
749 The number of bytes read is SIZE*ROW*COL. */
750
751enum mi_cmd_result
752mi_cmd_data_read_memory (char *command, char **argv, int argc)
753{
754 struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
755 CORE_ADDR addr;
756 long total_bytes;
757 long nr_cols;
758 long nr_rows;
759 char word_format;
760 struct type *word_type;
761 long word_size;
762 char word_asize;
763 char aschar;
508416a1 764 gdb_byte *mbuf;
fb40c209
AC
765 int nr_bytes;
766 long offset = 0;
767 int optind = 0;
768 char *optarg;
769 enum opt
770 {
771 OFFSET_OPT
772 };
773 static struct mi_opt opts[] =
774 {
775 {"o", OFFSET_OPT, 1},
776 0
777 };
778
779 while (1)
780 {
781 int opt = mi_getopt ("mi_cmd_data_read_memory", argc, argv, opts,
782 &optind, &optarg);
783 if (opt < 0)
784 break;
785 switch ((enum opt) opt)
786 {
787 case OFFSET_OPT:
788 offset = atol (optarg);
789 break;
790 }
791 }
792 argv += optind;
793 argc -= optind;
794
795 if (argc < 5 || argc > 6)
796 {
c6902d46 797 mi_error_message = xstrprintf ("mi_cmd_data_read_memory: Usage: ADDR WORD-FORMAT WORD-SIZE NR-ROWS NR-COLS [ASCHAR].");
fb40c209
AC
798 return MI_CMD_ERROR;
799 }
800
801 /* Extract all the arguments. */
802
803 /* Start address of the memory dump. */
804 addr = parse_and_eval_address (argv[0]) + offset;
805 /* The format character to use when displaying a memory word. See
806 the ``x'' command. */
807 word_format = argv[1][0];
808 /* The size of the memory word. */
809 word_size = atol (argv[2]);
810 switch (word_size)
811 {
812 case 1:
813 word_type = builtin_type_int8;
814 word_asize = 'b';
815 break;
816 case 2:
817 word_type = builtin_type_int16;
818 word_asize = 'h';
819 break;
820 case 4:
821 word_type = builtin_type_int32;
822 word_asize = 'w';
823 break;
824 case 8:
825 word_type = builtin_type_int64;
826 word_asize = 'g';
827 break;
828 default:
829 word_type = builtin_type_int8;
830 word_asize = 'b';
831 }
832 /* The number of rows */
833 nr_rows = atol (argv[3]);
834 if (nr_rows <= 0)
835 {
c6902d46 836 mi_error_message = xstrprintf ("mi_cmd_data_read_memory: invalid number of rows.");
fb40c209
AC
837 return MI_CMD_ERROR;
838 }
839 /* number of bytes per row. */
840 nr_cols = atol (argv[4]);
841 if (nr_cols <= 0)
842 {
c6902d46 843 mi_error_message = xstrprintf ("mi_cmd_data_read_memory: invalid number of columns.");
de169ec9 844 return MI_CMD_ERROR;
fb40c209
AC
845 }
846 /* The un-printable character when printing ascii. */
847 if (argc == 6)
848 aschar = *argv[5];
849 else
850 aschar = 0;
851
852 /* create a buffer and read it in. */
853 total_bytes = word_size * nr_rows * nr_cols;
2e94c453 854 mbuf = xcalloc (total_bytes, 1);
b8c9b27d 855 make_cleanup (xfree, mbuf);
fb40c209
AC
856 nr_bytes = 0;
857 while (nr_bytes < total_bytes)
858 {
859 int error;
860 long num = target_read_memory_partial (addr + nr_bytes, mbuf + nr_bytes,
861 total_bytes - nr_bytes,
862 &error);
863 if (num <= 0)
864 break;
865 nr_bytes += num;
866 }
867
868 /* output the header information. */
869 ui_out_field_core_addr (uiout, "addr", addr);
870 ui_out_field_int (uiout, "nr-bytes", nr_bytes);
871 ui_out_field_int (uiout, "total-bytes", total_bytes);
872 ui_out_field_core_addr (uiout, "next-row", addr + word_size * nr_cols);
873 ui_out_field_core_addr (uiout, "prev-row", addr - word_size * nr_cols);
874 ui_out_field_core_addr (uiout, "next-page", addr + total_bytes);
875 ui_out_field_core_addr (uiout, "prev-page", addr - total_bytes);
876
877 /* Build the result as a two dimentional table. */
878 {
879 struct ui_stream *stream = ui_out_stream_new (uiout);
6ad4a2cf 880 struct cleanup *cleanup_list_memory;
fb40c209
AC
881 int row;
882 int row_byte;
6ad4a2cf 883 cleanup_list_memory = make_cleanup_ui_out_list_begin_end (uiout, "memory");
fb40c209
AC
884 for (row = 0, row_byte = 0;
885 row < nr_rows;
886 row++, row_byte += nr_cols * word_size)
887 {
888 int col;
889 int col_byte;
6ad4a2cf
JJ
890 struct cleanup *cleanup_tuple;
891 struct cleanup *cleanup_list_data;
892 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
893 ui_out_field_core_addr (uiout, "addr", addr + row_byte);
894 /* ui_out_field_core_addr_symbolic (uiout, "saddr", addr + row_byte); */
6ad4a2cf 895 cleanup_list_data = make_cleanup_ui_out_list_begin_end (uiout, "data");
fb40c209
AC
896 for (col = 0, col_byte = row_byte;
897 col < nr_cols;
898 col++, col_byte += word_size)
899 {
900 if (col_byte + word_size > nr_bytes)
901 {
902 ui_out_field_string (uiout, NULL, "N/A");
903 }
904 else
905 {
906 ui_file_rewind (stream->stream);
907 print_scalar_formatted (mbuf + col_byte, word_type, word_format,
908 word_asize, stream->stream);
909 ui_out_field_stream (uiout, NULL, stream);
910 }
911 }
6ad4a2cf 912 do_cleanups (cleanup_list_data);
fb40c209
AC
913 if (aschar)
914 {
915 int byte;
916 ui_file_rewind (stream->stream);
917 for (byte = row_byte; byte < row_byte + word_size * nr_cols; byte++)
918 {
919 if (byte >= nr_bytes)
920 {
921 fputc_unfiltered ('X', stream->stream);
922 }
923 else if (mbuf[byte] < 32 || mbuf[byte] > 126)
924 {
925 fputc_unfiltered (aschar, stream->stream);
926 }
927 else
928 fputc_unfiltered (mbuf[byte], stream->stream);
929 }
930 ui_out_field_stream (uiout, "ascii", stream);
931 }
6ad4a2cf 932 do_cleanups (cleanup_tuple);
fb40c209
AC
933 }
934 ui_out_stream_delete (stream);
6ad4a2cf 935 do_cleanups (cleanup_list_memory);
fb40c209
AC
936 }
937 do_cleanups (cleanups);
938 return MI_CMD_DONE;
939}
940
941/* DATA-MEMORY-WRITE:
942
943 COLUMN_OFFSET: optional argument. Must be preceeded by '-o'. The
944 offset from the beginning of the memory grid row where the cell to
945 be written is.
946 ADDR: start address of the row in the memory grid where the memory
947 cell is, if OFFSET_COLUMN is specified. Otherwise, the address of
948 the location to write to.
949 FORMAT: a char indicating format for the ``word''. See
950 the ``x'' command.
951 WORD_SIZE: size of each ``word''; 1,2,4, or 8 bytes
952 VALUE: value to be written into the memory address.
953
954 Writes VALUE into ADDR + (COLUMN_OFFSET * WORD_SIZE).
955
956 Prints nothing. */
957enum mi_cmd_result
958mi_cmd_data_write_memory (char *command, char **argv, int argc)
959{
960 CORE_ADDR addr;
961 char word_format;
962 long word_size;
963 /* FIXME: ezannoni 2000-02-17 LONGEST could possibly not be big
964 enough when using a compiler other than GCC. */
965 LONGEST value;
d8bf3afa
KB
966 void *buffer;
967 struct cleanup *old_chain;
fb40c209
AC
968 long offset = 0;
969 int optind = 0;
970 char *optarg;
971 enum opt
972 {
973 OFFSET_OPT
974 };
975 static struct mi_opt opts[] =
976 {
977 {"o", OFFSET_OPT, 1},
978 0
979 };
980
981 while (1)
982 {
983 int opt = mi_getopt ("mi_cmd_data_write_memory", argc, argv, opts,
984 &optind, &optarg);
985 if (opt < 0)
986 break;
987 switch ((enum opt) opt)
988 {
989 case OFFSET_OPT:
990 offset = atol (optarg);
991 break;
992 }
993 }
994 argv += optind;
995 argc -= optind;
996
997 if (argc != 4)
998 {
c6902d46 999 mi_error_message = xstrprintf ("mi_cmd_data_write_memory: Usage: [-o COLUMN_OFFSET] ADDR FORMAT WORD-SIZE VALUE.");
fb40c209
AC
1000 return MI_CMD_ERROR;
1001 }
1002
1003 /* Extract all the arguments. */
1004 /* Start address of the memory dump. */
1005 addr = parse_and_eval_address (argv[0]);
1006 /* The format character to use when displaying a memory word. See
1007 the ``x'' command. */
1008 word_format = argv[1][0];
1009 /* The size of the memory word. */
1010 word_size = atol (argv[2]);
1011
1012 /* Calculate the real address of the write destination. */
1013 addr += (offset * word_size);
1014
1015 /* Get the value as a number */
1016 value = parse_and_eval_address (argv[3]);
1017 /* Get the value into an array */
d8bf3afa
KB
1018 buffer = xmalloc (word_size);
1019 old_chain = make_cleanup (xfree, buffer);
fb40c209
AC
1020 store_signed_integer (buffer, word_size, value);
1021 /* Write it down to memory */
1022 write_memory (addr, buffer, word_size);
d8bf3afa
KB
1023 /* Free the buffer. */
1024 do_cleanups (old_chain);
fb40c209
AC
1025
1026 return MI_CMD_DONE;
1027}
1028
8d34ea23
KS
1029/* Execute a command within a safe environment.
1030 Return <0 for error; >=0 for ok.
1031
1032 args->action will tell mi_execute_command what action
1033 to perfrom after the given command has executed (display/supress
1034 prompt, display error). */
fb40c209 1035
f30f06b8 1036static void
8d34ea23 1037captured_mi_execute_command (struct ui_out *uiout, void *data)
fb40c209 1038{
8d34ea23
KS
1039 struct captured_mi_execute_command_args *args =
1040 (struct captured_mi_execute_command_args *) data;
1041 struct mi_parse *context = args->command;
fb40c209
AC
1042
1043 switch (context->op)
1044 {
1045
1046 case MI_COMMAND:
1047 /* A MI command was read from the input stream */
1048 if (mi_debug_p)
1049 /* FIXME: gdb_???? */
1050 fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1051 context->token, context->command, context->args);
1052 /* FIXME: cagney/1999-09-25: Rather than this convoluted
1053 condition expression, each function should return an
1054 indication of what action is required and then switch on
1055 that. */
8d34ea23
KS
1056 args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;
1057 args->rc = mi_cmd_execute (context);
1058
fb40c209
AC
1059 if (!target_can_async_p () || !target_executing)
1060 {
4389a95a
AC
1061 /* print the result if there were no errors
1062
1063 Remember that on the way out of executing a command, you have
1064 to directly use the mi_interp's uiout, since the command could
1065 have reset the interpreter, in which case the current uiout
1066 will most likely crash in the mi_out_* routines. */
8d34ea23 1067 if (args->rc == MI_CMD_DONE)
fb40c209
AC
1068 {
1069 fputs_unfiltered (context->token, raw_stdout);
1070 fputs_unfiltered ("^done", raw_stdout);
1071 mi_out_put (uiout, raw_stdout);
1072 mi_out_rewind (uiout);
1073 fputs_unfiltered ("\n", raw_stdout);
1074 }
8d34ea23 1075 else if (args->rc == MI_CMD_ERROR)
fb40c209
AC
1076 {
1077 if (mi_error_message)
1078 {
1079 fputs_unfiltered (context->token, raw_stdout);
1080 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1081 fputstr_unfiltered (mi_error_message, '"', raw_stdout);
b8c9b27d 1082 xfree (mi_error_message);
fb40c209
AC
1083 fputs_unfiltered ("\"\n", raw_stdout);
1084 }
1085 mi_out_rewind (uiout);
1086 }
fb40c209
AC
1087 else
1088 mi_out_rewind (uiout);
1089 }
1090 else if (sync_execution)
8d34ea23
KS
1091 {
1092 /* Don't print the prompt. We are executing the target in
1093 synchronous mode. */
1094 args->action = EXECUTE_COMMAND_SUPRESS_PROMPT;
f30f06b8 1095 return;
8d34ea23 1096 }
fb40c209
AC
1097 break;
1098
1099 case CLI_COMMAND:
78f5381d
AC
1100 {
1101 char *argv[2];
1102 /* A CLI command was read from the input stream. */
1103 /* This "feature" will be removed as soon as we have a
1104 complete set of mi commands. */
1105 /* Echo the command on the console. */
1106 fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1107 /* Call the "console" interpreter. */
1108 argv[0] = "console";
1109 argv[1] = context->command;
eec01795 1110 args->rc = mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
78f5381d 1111
eec01795 1112 /* If we changed interpreters, DON'T print out anything. */
78f5381d
AC
1113 if (current_interp_named_p (INTERP_MI)
1114 || current_interp_named_p (INTERP_MI1)
1115 || current_interp_named_p (INTERP_MI2)
1116 || current_interp_named_p (INTERP_MI3))
1117 {
eec01795
DJ
1118 if (args->rc == MI_CMD_DONE)
1119 {
1120 fputs_unfiltered (context->token, raw_stdout);
1121 fputs_unfiltered ("^done", raw_stdout);
1122 mi_out_put (uiout, raw_stdout);
1123 mi_out_rewind (uiout);
1124 fputs_unfiltered ("\n", raw_stdout);
1125 args->action = EXECUTE_COMMAND_DISPLAY_PROMPT;
1126 }
1127 else if (args->rc == MI_CMD_ERROR)
1128 {
1129 if (mi_error_message)
1130 {
1131 fputs_unfiltered (context->token, raw_stdout);
1132 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1133 fputstr_unfiltered (mi_error_message, '"', raw_stdout);
1134 xfree (mi_error_message);
1135 fputs_unfiltered ("\"\n", raw_stdout);
1136 }
1137 mi_out_rewind (uiout);
1138 }
1139 else
1140 mi_out_rewind (uiout);
78f5381d
AC
1141 }
1142 break;
1143 }
fb40c209
AC
1144
1145 }
8d34ea23 1146
f30f06b8 1147 return;
fb40c209
AC
1148}
1149
1150
1151void
1152mi_execute_command (char *cmd, int from_tty)
1153{
1154 struct mi_parse *command;
8d34ea23
KS
1155 struct captured_mi_execute_command_args args;
1156 struct ui_out *saved_uiout = uiout;
fb40c209
AC
1157
1158 /* This is to handle EOF (^D). We just quit gdb. */
1159 /* FIXME: we should call some API function here. */
1160 if (cmd == 0)
1161 quit_force (NULL, from_tty);
1162
1163 command = mi_parse (cmd);
1164
1165 if (command != NULL)
1166 {
71fff37b 1167 struct gdb_exception result;
8d34ea23 1168 /* FIXME: cagney/1999-11-04: Can this use of catch_exceptions either
fb40c209 1169 be pushed even further down or even eliminated? */
8d34ea23 1170 args.command = command;
f30f06b8
AC
1171 result = catch_exception (uiout, captured_mi_execute_command, &args,
1172 RETURN_MASK_ALL);
9cbc821d 1173 exception_print (gdb_stderr, result);
8d34ea23
KS
1174
1175 if (args.action == EXECUTE_COMMAND_SUPRESS_PROMPT)
fb40c209
AC
1176 {
1177 /* The command is executing synchronously. Bail out early
1178 suppressing the finished prompt. */
1179 mi_parse_free (command);
1180 return;
1181 }
ce43223b 1182 if (result.reason < 0)
fb40c209 1183 {
fb40c209 1184 /* The command execution failed and error() was called
589e074d 1185 somewhere. */
fb40c209
AC
1186 fputs_unfiltered (command->token, raw_stdout);
1187 fputs_unfiltered ("^error,msg=\"", raw_stdout);
b315da38 1188 fputstr_unfiltered (result.message, '"', raw_stdout);
fb40c209 1189 fputs_unfiltered ("\"\n", raw_stdout);
589e074d 1190 mi_out_rewind (uiout);
fb40c209
AC
1191 }
1192 mi_parse_free (command);
1193 }
1194
fb40c209 1195 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1196 gdb_flush (raw_stdout);
fb40c209
AC
1197 /* print any buffered hook code */
1198 /* ..... */
1199}
1200
1201static enum mi_cmd_result
1202mi_cmd_execute (struct mi_parse *parse)
1203{
1204 if (parse->cmd->argv_func != NULL
1205 || parse->cmd->args_func != NULL)
1206 {
1207 /* FIXME: We need to save the token because the command executed
1208 may be asynchronous and need to print the token again.
1209 In the future we can pass the token down to the func
1210 and get rid of the last_async_command */
1211 /* The problem here is to keep the token around when we launch
1212 the target, and we want to interrupt it later on. The
1213 interrupt command will have its own token, but when the
1214 target stops, we must display the token corresponding to the
1215 last execution command given. So we have another string where
1216 we copy the token (previous_async_command), if this was
1217 indeed the token of an execution command, and when we stop we
1218 print that one. This is possible because the interrupt
1219 command, when over, will copy that token back into the
1220 default token string (last_async_command). */
1221
1222 if (target_executing)
1223 {
1224 if (!previous_async_command)
1225 previous_async_command = xstrdup (last_async_command);
1226 if (strcmp (parse->command, "exec-interrupt"))
1227 {
1228 fputs_unfiltered (parse->token, raw_stdout);
1229 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1230 fputs_unfiltered ("Cannot execute command ", raw_stdout);
1231 fputstr_unfiltered (parse->command, '"', raw_stdout);
1232 fputs_unfiltered (" while target running", raw_stdout);
1233 fputs_unfiltered ("\"\n", raw_stdout);
1234 return MI_CMD_ERROR;
1235 }
1236 }
1237 last_async_command = xstrdup (parse->token);
e2f9c474 1238 make_exec_cleanup (free_current_contents, &last_async_command);
fb40c209
AC
1239 /* FIXME: DELETE THIS! */
1240 if (parse->cmd->args_func != NULL)
1241 return parse->cmd->args_func (parse->args, 0 /*from_tty */ );
1242 return parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
1243 }
b2af646b 1244 else if (parse->cmd->cli.cmd != 0)
fb40c209
AC
1245 {
1246 /* FIXME: DELETE THIS. */
1247 /* The operation is still implemented by a cli command */
1248 /* Must be a synchronous one */
b2af646b
AC
1249 mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
1250 parse->args);
fb40c209
AC
1251 return MI_CMD_DONE;
1252 }
1253 else
1254 {
1255 /* FIXME: DELETE THIS. */
1256 fputs_unfiltered (parse->token, raw_stdout);
1257 fputs_unfiltered ("^error,msg=\"", raw_stdout);
1258 fputs_unfiltered ("Undefined mi command: ", raw_stdout);
1259 fputstr_unfiltered (parse->command, '"', raw_stdout);
1260 fputs_unfiltered (" (missing implementation)", raw_stdout);
1261 fputs_unfiltered ("\"\n", raw_stdout);
1262 return MI_CMD_ERROR;
1263 }
1264}
1265
fb40c209
AC
1266/* FIXME: This is just a hack so we can get some extra commands going.
1267 We don't want to channel things through the CLI, but call libgdb directly */
1268/* Use only for synchronous commands */
1269
1270void
b2af646b 1271mi_execute_cli_command (const char *cmd, int args_p, const char *args)
fb40c209 1272{
b2af646b 1273 if (cmd != 0)
fb40c209
AC
1274 {
1275 struct cleanup *old_cleanups;
1276 char *run;
b2af646b 1277 if (args_p)
c6902d46 1278 run = xstrprintf ("%s %s", cmd, args);
b2af646b
AC
1279 else
1280 run = xstrdup (cmd);
fb40c209
AC
1281 if (mi_debug_p)
1282 /* FIXME: gdb_???? */
1283 fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
b2af646b 1284 cmd, run);
b8c9b27d 1285 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
1286 execute_command ( /*ui */ run, 0 /*from_tty */ );
1287 do_cleanups (old_cleanups);
1288 return;
1289 }
1290}
1291
1292enum mi_cmd_result
1293mi_execute_async_cli_command (char *mi, char *args, int from_tty)
1294{
1295 struct cleanup *old_cleanups;
1296 char *run;
1297 char *async_args;
1298
1299 if (target_can_async_p ())
1300 {
1301 async_args = (char *) xmalloc (strlen (args) + 2);
1302 make_exec_cleanup (free, async_args);
1303 strcpy (async_args, args);
1304 strcat (async_args, "&");
c6902d46 1305 run = xstrprintf ("%s %s", mi, async_args);
fb40c209
AC
1306 make_exec_cleanup (free, run);
1307 add_continuation (mi_exec_async_cli_cmd_continuation, NULL);
6311b07d 1308 old_cleanups = NULL;
fb40c209
AC
1309 }
1310 else
1311 {
c6902d46 1312 run = xstrprintf ("%s %s", mi, args);
b8c9b27d 1313 old_cleanups = make_cleanup (xfree, run);
fb40c209
AC
1314 }
1315
1316 if (!target_can_async_p ())
1317 {
1318 /* NOTE: For synchronous targets asynchronous behavour is faked by
1319 printing out the GDB prompt before we even try to execute the
1320 command. */
1321 if (last_async_command)
1322 fputs_unfiltered (last_async_command, raw_stdout);
1323 fputs_unfiltered ("^running\n", raw_stdout);
1324 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1325 gdb_flush (raw_stdout);
fb40c209
AC
1326 }
1327 else
1328 {
1329 /* FIXME: cagney/1999-11-29: Printing this message before
1330 calling execute_command is wrong. It should only be printed
1331 once gdb has confirmed that it really has managed to send a
1332 run command to the target. */
1333 if (last_async_command)
1334 fputs_unfiltered (last_async_command, raw_stdout);
1335 fputs_unfiltered ("^running\n", raw_stdout);
1336 }
1337
1338 execute_command ( /*ui */ run, 0 /*from_tty */ );
1339
1340 if (!target_can_async_p ())
1341 {
1342 /* Do this before doing any printing. It would appear that some
1343 print code leaves garbage around in the buffer. */
1344 do_cleanups (old_cleanups);
1345 /* If the target was doing the operation synchronously we fake
1346 the stopped message. */
1347 if (last_async_command)
1348 fputs_unfiltered (last_async_command, raw_stdout);
1349 fputs_unfiltered ("*stopped", raw_stdout);
1350 mi_out_put (uiout, raw_stdout);
1351 mi_out_rewind (uiout);
1352 fputs_unfiltered ("\n", raw_stdout);
1353 return MI_CMD_QUIET;
1354 }
1355 return MI_CMD_DONE;
1356}
1357
1358void
1359mi_exec_async_cli_cmd_continuation (struct continuation_arg *arg)
1360{
1361 if (last_async_command)
1362 fputs_unfiltered (last_async_command, raw_stdout);
1363 fputs_unfiltered ("*stopped", raw_stdout);
1364 mi_out_put (uiout, raw_stdout);
1365 fputs_unfiltered ("\n", raw_stdout);
1366 fputs_unfiltered ("(gdb) \n", raw_stdout);
a433f9e4 1367 gdb_flush (raw_stdout);
fb40c209
AC
1368 do_exec_cleanups (ALL_CLEANUPS);
1369}
1370
4389a95a 1371void
fb40c209
AC
1372mi_load_progress (const char *section_name,
1373 unsigned long sent_so_far,
1374 unsigned long total_section,
1375 unsigned long total_sent,
1376 unsigned long grand_total)
1377{
1378 struct timeval time_now, delta, update_threshold;
1379 static struct timeval last_update;
1380 static char *previous_sect_name = NULL;
1381 int new_section;
0be75e02 1382 struct ui_out *saved_uiout;
fb40c209 1383
0be75e02
AS
1384 /* This function is called through deprecated_show_load_progress
1385 which means uiout may not be correct. Fix it for the duration
1386 of this function. */
1387 saved_uiout = uiout;
1388
1389 if (current_interp_named_p (INTERP_MI))
1390 uiout = mi_out_new (2);
1391 else if (current_interp_named_p (INTERP_MI1))
1392 uiout = mi_out_new (1);
1393 else
fb40c209
AC
1394 return;
1395
1396 update_threshold.tv_sec = 0;
1397 update_threshold.tv_usec = 500000;
1398 gettimeofday (&time_now, NULL);
1399
1400 delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
1401 delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
1402
1403 if (delta.tv_usec < 0)
1404 {
1405 delta.tv_sec -= 1;
1406 delta.tv_usec += 1000000;
1407 }
1408
1409 new_section = (previous_sect_name ?
1410 strcmp (previous_sect_name, section_name) : 1);
1411 if (new_section)
1412 {
6ad4a2cf 1413 struct cleanup *cleanup_tuple;
b8c9b27d 1414 xfree (previous_sect_name);
fb40c209
AC
1415 previous_sect_name = xstrdup (section_name);
1416
1417 if (last_async_command)
1418 fputs_unfiltered (last_async_command, raw_stdout);
1419 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 1420 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
1421 ui_out_field_string (uiout, "section", section_name);
1422 ui_out_field_int (uiout, "section-size", total_section);
1423 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 1424 do_cleanups (cleanup_tuple);
fb40c209
AC
1425 mi_out_put (uiout, raw_stdout);
1426 fputs_unfiltered ("\n", raw_stdout);
1427 gdb_flush (raw_stdout);
1428 }
1429
1430 if (delta.tv_sec >= update_threshold.tv_sec &&
1431 delta.tv_usec >= update_threshold.tv_usec)
1432 {
6ad4a2cf 1433 struct cleanup *cleanup_tuple;
fb40c209
AC
1434 last_update.tv_sec = time_now.tv_sec;
1435 last_update.tv_usec = time_now.tv_usec;
1436 if (last_async_command)
1437 fputs_unfiltered (last_async_command, raw_stdout);
1438 fputs_unfiltered ("+download", raw_stdout);
6ad4a2cf 1439 cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
fb40c209
AC
1440 ui_out_field_string (uiout, "section", section_name);
1441 ui_out_field_int (uiout, "section-sent", sent_so_far);
1442 ui_out_field_int (uiout, "section-size", total_section);
1443 ui_out_field_int (uiout, "total-sent", total_sent);
1444 ui_out_field_int (uiout, "total-size", grand_total);
6ad4a2cf 1445 do_cleanups (cleanup_tuple);
fb40c209
AC
1446 mi_out_put (uiout, raw_stdout);
1447 fputs_unfiltered ("\n", raw_stdout);
1448 gdb_flush (raw_stdout);
1449 }
0be75e02
AS
1450
1451 xfree (uiout);
1452 uiout = saved_uiout;
fb40c209
AC
1453}
1454
4389a95a
AC
1455void
1456mi_setup_architecture_data (void)
fb40c209 1457{
00a9a2c6
EZ
1458 old_regs = xmalloc ((NUM_REGS + NUM_PSEUDO_REGS) * MAX_REGISTER_SIZE + 1);
1459 memset (old_regs, 0, (NUM_REGS + NUM_PSEUDO_REGS) * MAX_REGISTER_SIZE + 1);
fb40c209
AC
1460}
1461
fb40c209 1462void
fba45db2 1463_initialize_mi_main (void)
fb40c209 1464{
046a4708
AC
1465 DEPRECATED_REGISTER_GDBARCH_SWAP (old_regs);
1466 deprecated_register_gdbarch_swap (NULL, 0, mi_setup_architecture_data);
fb40c209 1467}
This page took 0.594491 seconds and 4 git commands to generate.