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