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