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