2009-05-27 Tom Tromey <tromey@redhat.com>
[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] + 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] + 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       do_cleanups (cleanup);
1117       return;
1118     }
1119
1120   error ("-list-features should be passed no arguments");
1121 }
1122
1123 void
1124 mi_cmd_list_target_features (char *command, char **argv, int argc)
1125 {
1126   if (argc == 0)
1127     {
1128       struct cleanup *cleanup = NULL;
1129       cleanup = make_cleanup_ui_out_list_begin_end (uiout, "features");      
1130
1131       if (target_can_async_p ())
1132         ui_out_field_string (uiout, NULL, "async");
1133       
1134       do_cleanups (cleanup);
1135       return;
1136     }
1137
1138   error ("-list-target-features should be passed no arguments");
1139 }
1140
1141 /* Execute a command within a safe environment.
1142    Return <0 for error; >=0 for ok.
1143
1144    args->action will tell mi_execute_command what action
1145    to perfrom after the given command has executed (display/suppress
1146    prompt, display error). */
1147
1148 static void
1149 captured_mi_execute_command (struct ui_out *uiout, void *data)
1150 {
1151   struct cleanup *cleanup;
1152   struct mi_parse *context = (struct mi_parse *) data;
1153
1154   if (do_timings)
1155     current_command_ts = context->cmd_start;
1156
1157   current_token = xstrdup (context->token);
1158   cleanup = make_cleanup (free_current_contents, &current_token);
1159
1160   running_result_record_printed = 0;
1161   mi_proceeded = 0;
1162   switch (context->op)
1163     {
1164     case MI_COMMAND:
1165       /* A MI command was read from the input stream.  */
1166       if (mi_debug_p)
1167         /* FIXME: gdb_???? */
1168         fprintf_unfiltered (raw_stdout, " token=`%s' command=`%s' args=`%s'\n",
1169                             context->token, context->command, context->args);
1170
1171
1172       mi_cmd_execute (context);
1173
1174       /* Print the result if there were no errors.
1175
1176          Remember that on the way out of executing a command, you have
1177          to directly use the mi_interp's uiout, since the command could 
1178          have reset the interpreter, in which case the current uiout 
1179          will most likely crash in the mi_out_* routines.  */
1180       if (!running_result_record_printed)
1181         {
1182           fputs_unfiltered (context->token, raw_stdout);
1183           /* There's no particularly good reason why target-connect results
1184              in not ^done.  Should kill ^connected for MI3.  */
1185           fputs_unfiltered (strcmp (context->command, "target-select") == 0
1186                             ? "^connected" : "^done", raw_stdout);
1187           mi_out_put (uiout, raw_stdout);
1188           mi_out_rewind (uiout);
1189           mi_print_timing_maybe ();
1190           fputs_unfiltered ("\n", raw_stdout);
1191         }
1192       else
1193             /* The command does not want anything to be printed.  In that
1194                case, the command probably should not have written anything
1195                to uiout, but in case it has written something, discard it.  */
1196         mi_out_rewind (uiout);
1197       break;
1198
1199     case CLI_COMMAND:
1200       {
1201         char *argv[2];
1202         /* A CLI command was read from the input stream.  */
1203         /* This "feature" will be removed as soon as we have a
1204            complete set of mi commands.  */
1205         /* Echo the command on the console.  */
1206         fprintf_unfiltered (gdb_stdlog, "%s\n", context->command);
1207         /* Call the "console" interpreter.  */
1208         argv[0] = "console";
1209         argv[1] = context->command;
1210         mi_cmd_interpreter_exec ("-interpreter-exec", argv, 2);
1211
1212         /* If we changed interpreters, DON'T print out anything.  */
1213         if (current_interp_named_p (INTERP_MI)
1214             || current_interp_named_p (INTERP_MI1)
1215             || current_interp_named_p (INTERP_MI2)
1216             || current_interp_named_p (INTERP_MI3))
1217           {
1218             if (!running_result_record_printed)
1219               {
1220                 fputs_unfiltered (context->token, raw_stdout);
1221                 fputs_unfiltered ("^done", raw_stdout);
1222                 mi_out_put (uiout, raw_stdout);
1223                 mi_out_rewind (uiout);
1224                 mi_print_timing_maybe ();
1225                 fputs_unfiltered ("\n", raw_stdout);            
1226               }
1227             else
1228               mi_out_rewind (uiout);
1229           }
1230         break;
1231       }
1232
1233     }
1234
1235   do_cleanups (cleanup);
1236
1237   return;
1238 }
1239
1240
1241 void
1242 mi_execute_command (char *cmd, int from_tty)
1243 {
1244   struct mi_parse *command;
1245   struct ui_out *saved_uiout = uiout;
1246
1247   /* This is to handle EOF (^D). We just quit gdb.  */
1248   /* FIXME: we should call some API function here.  */
1249   if (cmd == 0)
1250     quit_force (NULL, from_tty);
1251
1252   command = mi_parse (cmd);
1253
1254   if (command != NULL)
1255     {
1256       struct gdb_exception result;
1257       ptid_t previous_ptid = inferior_ptid;
1258
1259       if (do_timings)
1260         {
1261           command->cmd_start = (struct mi_timestamp *)
1262             xmalloc (sizeof (struct mi_timestamp));
1263           timestamp (command->cmd_start);
1264         }
1265
1266       result = catch_exception (uiout, captured_mi_execute_command, command,
1267                                 RETURN_MASK_ALL);
1268       if (result.reason < 0)
1269         {
1270           /* The command execution failed and error() was called
1271              somewhere.  */
1272           fputs_unfiltered (command->token, raw_stdout);
1273           fputs_unfiltered ("^error,msg=\"", raw_stdout);
1274           if (result.message == NULL)
1275             fputs_unfiltered ("unknown error", raw_stdout);
1276           else
1277             fputstr_unfiltered (result.message, '"', raw_stdout);
1278           fputs_unfiltered ("\"\n", raw_stdout);
1279           mi_out_rewind (uiout);
1280         }
1281
1282       if (/* The notifications are only output when the top-level
1283              interpreter (specified on the command line) is MI.  */      
1284           ui_out_is_mi_like_p (interp_ui_out (top_level_interpreter ()))
1285           /* Don't try report anything if there are no threads -- 
1286              the program is dead.  */
1287           && thread_count () != 0
1288           /* -thread-select explicitly changes thread. If frontend uses that
1289              internally, we don't want to emit =thread-selected, since
1290              =thread-selected is supposed to indicate user's intentions.  */
1291           && strcmp (command->command, "thread-select") != 0)
1292         {
1293           struct mi_interp *mi = top_level_interpreter_data ();
1294           int report_change = 0;
1295
1296           if (command->thread == -1)
1297             {
1298               report_change = (!ptid_equal (previous_ptid, null_ptid)
1299                                && !ptid_equal (inferior_ptid, previous_ptid)
1300                                && !ptid_equal (inferior_ptid, null_ptid));
1301             }
1302           else if (!ptid_equal (inferior_ptid, null_ptid))
1303             {
1304               struct thread_info *ti = inferior_thread ();
1305               report_change = (ti->num != command->thread);
1306             }
1307
1308           if (report_change)
1309             {     
1310               struct thread_info *ti = inferior_thread ();
1311               target_terminal_ours ();
1312               fprintf_unfiltered (mi->event_channel, 
1313                                   "thread-selected,id=\"%d\"",
1314                                   ti->num);
1315               gdb_flush (mi->event_channel);
1316             }
1317         }
1318
1319       mi_parse_free (command);
1320     }
1321
1322   fputs_unfiltered ("(gdb) \n", raw_stdout);
1323   gdb_flush (raw_stdout);
1324   /* Print any buffered hook code.  */
1325   /* ..... */
1326 }
1327
1328 static void
1329 mi_cmd_execute (struct mi_parse *parse)
1330 {
1331   struct cleanup *cleanup;
1332   int i;
1333
1334   free_all_values ();
1335   cleanup = make_cleanup (null_cleanup, NULL);
1336
1337   if (parse->frame != -1 && parse->thread == -1)
1338     error (_("Cannot specify --frame without --thread"));
1339
1340   if (parse->thread != -1)
1341     {
1342       struct thread_info *tp = find_thread_id (parse->thread);
1343       if (!tp)
1344         error (_("Invalid thread id: %d"), parse->thread);
1345
1346       if (is_exited (tp->ptid))
1347         error (_("Thread id: %d has terminated"), parse->thread);
1348
1349       switch_to_thread (tp->ptid);
1350     }
1351
1352   if (parse->frame != -1)
1353     {
1354       struct frame_info *fid;
1355       int frame = parse->frame;
1356       fid = find_relative_frame (get_current_frame (), &frame);
1357       if (frame == 0)
1358         /* find_relative_frame was successful */
1359         select_frame (fid);
1360       else
1361         error (_("Invalid frame id: %d"), frame);
1362     }
1363
1364   if (parse->cmd->argv_func != NULL)
1365     parse->cmd->argv_func (parse->command, parse->argv, parse->argc);
1366   else if (parse->cmd->cli.cmd != 0)
1367     {
1368       /* FIXME: DELETE THIS. */
1369       /* The operation is still implemented by a cli command.  */
1370       /* Must be a synchronous one.  */
1371       mi_execute_cli_command (parse->cmd->cli.cmd, parse->cmd->cli.args_p,
1372                               parse->args);
1373     }
1374   else
1375     {
1376       /* FIXME: DELETE THIS.  */
1377       struct ui_file *stb;
1378
1379       stb = mem_fileopen ();
1380
1381       fputs_unfiltered ("Undefined mi command: ", stb);
1382       fputstr_unfiltered (parse->command, '"', stb);
1383       fputs_unfiltered (" (missing implementation)", stb);
1384
1385       make_cleanup_ui_file_delete (stb);
1386       error_stream (stb);
1387     }
1388   do_cleanups (cleanup);
1389 }
1390
1391 /* FIXME: This is just a hack so we can get some extra commands going.
1392    We don't want to channel things through the CLI, but call libgdb directly.
1393    Use only for synchronous commands.  */
1394
1395 void
1396 mi_execute_cli_command (const char *cmd, int args_p, const char *args)
1397 {
1398   if (cmd != 0)
1399     {
1400       struct cleanup *old_cleanups;
1401       char *run;
1402       if (args_p)
1403         run = xstrprintf ("%s %s", cmd, args);
1404       else
1405         run = xstrdup (cmd);
1406       if (mi_debug_p)
1407         /* FIXME: gdb_???? */
1408         fprintf_unfiltered (gdb_stdout, "cli=%s run=%s\n",
1409                             cmd, run);
1410       old_cleanups = make_cleanup (xfree, run);
1411       execute_command ( /*ui */ run, 0 /*from_tty */ );
1412       do_cleanups (old_cleanups);
1413       return;
1414     }
1415 }
1416
1417 void
1418 mi_execute_async_cli_command (char *cli_command, char **argv, int argc)
1419 {
1420   struct cleanup *old_cleanups;
1421   char *run;
1422
1423   if (target_can_async_p ())
1424     run = xstrprintf ("%s %s&", cli_command, argc ? *argv : "");
1425   else
1426     run = xstrprintf ("%s %s", cli_command, argc ? *argv : "");
1427   old_cleanups = make_cleanup (xfree, run);  
1428
1429   execute_command ( /*ui */ run, 0 /*from_tty */ );
1430
1431   if (target_can_async_p ())
1432     {
1433       /* If we're not executing, an exception should have been throw.  */
1434       gdb_assert (is_running (inferior_ptid));
1435       do_cleanups (old_cleanups);
1436     }
1437   else
1438     {
1439       /* Do this before doing any printing.  It would appear that some
1440          print code leaves garbage around in the buffer.  */
1441       do_cleanups (old_cleanups);
1442     }
1443 }
1444
1445 void
1446 mi_load_progress (const char *section_name,
1447                   unsigned long sent_so_far,
1448                   unsigned long total_section,
1449                   unsigned long total_sent,
1450                   unsigned long grand_total)
1451 {
1452   struct timeval time_now, delta, update_threshold;
1453   static struct timeval last_update;
1454   static char *previous_sect_name = NULL;
1455   int new_section;
1456   struct ui_out *saved_uiout;
1457
1458   /* This function is called through deprecated_show_load_progress
1459      which means uiout may not be correct.  Fix it for the duration
1460      of this function.  */
1461   saved_uiout = uiout;
1462
1463   if (current_interp_named_p (INTERP_MI)
1464       || current_interp_named_p (INTERP_MI2))
1465     uiout = mi_out_new (2);
1466   else if (current_interp_named_p (INTERP_MI1))
1467     uiout = mi_out_new (1);
1468   else if (current_interp_named_p (INTERP_MI3))
1469     uiout = mi_out_new (3);
1470   else
1471     return;
1472
1473   update_threshold.tv_sec = 0;
1474   update_threshold.tv_usec = 500000;
1475   gettimeofday (&time_now, NULL);
1476
1477   delta.tv_usec = time_now.tv_usec - last_update.tv_usec;
1478   delta.tv_sec = time_now.tv_sec - last_update.tv_sec;
1479
1480   if (delta.tv_usec < 0)
1481     {
1482       delta.tv_sec -= 1;
1483       delta.tv_usec += 1000000L;
1484     }
1485
1486   new_section = (previous_sect_name ?
1487                  strcmp (previous_sect_name, section_name) : 1);
1488   if (new_section)
1489     {
1490       struct cleanup *cleanup_tuple;
1491       xfree (previous_sect_name);
1492       previous_sect_name = xstrdup (section_name);
1493
1494       if (current_token)
1495         fputs_unfiltered (current_token, raw_stdout);
1496       fputs_unfiltered ("+download", raw_stdout);
1497       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1498       ui_out_field_string (uiout, "section", section_name);
1499       ui_out_field_int (uiout, "section-size", total_section);
1500       ui_out_field_int (uiout, "total-size", grand_total);
1501       do_cleanups (cleanup_tuple);
1502       mi_out_put (uiout, raw_stdout);
1503       fputs_unfiltered ("\n", raw_stdout);
1504       gdb_flush (raw_stdout);
1505     }
1506
1507   if (delta.tv_sec >= update_threshold.tv_sec &&
1508       delta.tv_usec >= update_threshold.tv_usec)
1509     {
1510       struct cleanup *cleanup_tuple;
1511       last_update.tv_sec = time_now.tv_sec;
1512       last_update.tv_usec = time_now.tv_usec;
1513       if (current_token)
1514         fputs_unfiltered (current_token, raw_stdout);
1515       fputs_unfiltered ("+download", raw_stdout);
1516       cleanup_tuple = make_cleanup_ui_out_tuple_begin_end (uiout, NULL);
1517       ui_out_field_string (uiout, "section", section_name);
1518       ui_out_field_int (uiout, "section-sent", sent_so_far);
1519       ui_out_field_int (uiout, "section-size", total_section);
1520       ui_out_field_int (uiout, "total-sent", total_sent);
1521       ui_out_field_int (uiout, "total-size", grand_total);
1522       do_cleanups (cleanup_tuple);
1523       mi_out_put (uiout, raw_stdout);
1524       fputs_unfiltered ("\n", raw_stdout);
1525       gdb_flush (raw_stdout);
1526     }
1527
1528   xfree (uiout);
1529   uiout = saved_uiout;
1530 }
1531
1532 static void 
1533 timestamp (struct mi_timestamp *tv)
1534   {
1535     long usec;
1536     gettimeofday (&tv->wallclock, NULL);
1537 #ifdef HAVE_GETRUSAGE
1538     getrusage (RUSAGE_SELF, &rusage);
1539     tv->utime.tv_sec = rusage.ru_utime.tv_sec;
1540     tv->utime.tv_usec = rusage.ru_utime.tv_usec;
1541     tv->stime.tv_sec = rusage.ru_stime.tv_sec;
1542     tv->stime.tv_usec = rusage.ru_stime.tv_usec;
1543 #else
1544     usec = get_run_time ();
1545     tv->utime.tv_sec = usec/1000000L;
1546     tv->utime.tv_usec = usec - 1000000L*tv->utime.tv_sec;
1547     tv->stime.tv_sec = 0;
1548     tv->stime.tv_usec = 0;
1549 #endif
1550   }
1551
1552 static void 
1553 print_diff_now (struct mi_timestamp *start)
1554   {
1555     struct mi_timestamp now;
1556     timestamp (&now);
1557     print_diff (start, &now);
1558   }
1559
1560 void
1561 mi_print_timing_maybe (void)
1562 {
1563   /* If the command is -enable-timing then do_timings may be
1564      true whilst current_command_ts is not initialized.  */
1565   if (do_timings && current_command_ts)
1566     print_diff_now (current_command_ts);
1567 }
1568
1569 static long 
1570 timeval_diff (struct timeval start, struct timeval end)
1571   {
1572     return ((end.tv_sec - start.tv_sec) * 1000000L)
1573       + (end.tv_usec - start.tv_usec);
1574   }
1575
1576 static void 
1577 print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
1578   {
1579     fprintf_unfiltered
1580       (raw_stdout,
1581        ",time={wallclock=\"%0.5f\",user=\"%0.5f\",system=\"%0.5f\"}", 
1582        timeval_diff (start->wallclock, end->wallclock) / 1000000.0, 
1583        timeval_diff (start->utime, end->utime) / 1000000.0, 
1584        timeval_diff (start->stime, end->stime) / 1000000.0);
1585   }