New commands "mt set per-command {space,time,symtab} {on,off}".
authorDoug Evans <dje@google.com>
Thu, 21 Mar 2013 17:37:30 +0000 (17:37 +0000)
committerDoug Evans <dje@google.com>
Thu, 21 Mar 2013 17:37:30 +0000 (17:37 +0000)
* NEWS: Add entry.
* event-top.c: #include "maint.h".
* main.c: #include "maint.h".
* maint.c: #include <sys/time.h>, <time.h>, block.h, top.h,
timeval-utils.h, maint.h, cli/cli-setshow.h.
(per_command_time, per_command_space): New static globals.
(per_command_symtab): New static global.
(per_command_setlist, per_command_showlist): New static globals.
(struct cmd_stats): Move here from utils.c.
(set_per_command_time): Renamed from set_display_time in utils.c
and moved here.  All callers updated.
(set_per_command_space): Renamed from set_display_space in utils.c
and moved here.  All callers updated.
(count_symtabs_and_blocks): New function.
(report_command_stats): Moved here from utils.c.  Add support for
printing symtab stats.  Only print data if enabled before command
executed.
(make_command_stats_cleanup): Ditto.
(sert_per_command_cmd, show_per_command_cmd): New functions.
(_initialize_maint_cmds): Add new commands
mt set per-command {space,time,symtab} {on,off}.
* maint.h: New file.
* top.c: #include "maint.h".
* utils.c (reset_prompt_for_continue_wait_time): New function.
(get_prompt_for_continue_wait_time): New function.
* utils.h (reset_prompt_for_continue_wait_time): Declare
(get_prompt_for_continue_wait_time): Declare.
(make_command_stats_cleanup): Moved to maint.h.
(set_display_time, set_display_space): Moved to maint.h and renamed
to set_per_command_time, set_per_command_space.
* cli/cli-setshow.c (parse_cli_boolean_value): Renamed from
parse_binary_operation and made non-static.  Don't call error,
just return an error marker.  All callers updated.
* cli/cli-setshow.h (parse_cli_boolean_value): Declare.

doc/
* gdb.texinfo (Maintenance Commands): Add docs for
"mt set per-command {space,time,symtab} {on,off}".

testsuite/
* gdb.base/maint.exp: Update tests for per-command stats.

15 files changed:
gdb/ChangeLog
gdb/NEWS
gdb/cli/cli-setshow.c
gdb/cli/cli-setshow.h
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/event-top.c
gdb/main.c
gdb/maint.c
gdb/maint.h [new file with mode: 0644]
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.base/maint.exp
gdb/top.c
gdb/utils.c
gdb/utils.h

index ee3f8c4d99eb368cf153752e00bd672bbe7c4d4f..779e306338f8451b48c2a8c1c2c5215516eff934 100644 (file)
@@ -1,3 +1,41 @@
+2013-03-21  Doug Evans  <dje@google.com>
+
+       New commands "mt set per-command {space,time,symtab} {on,off}".
+       * NEWS: Add entry.
+       * event-top.c: #include "maint.h".
+       * main.c: #include "maint.h".
+       * maint.c: #include <sys/time.h>, <time.h>, block.h, top.h,
+       timeval-utils.h, maint.h, cli/cli-setshow.h.
+       (per_command_time, per_command_space): New static globals.
+       (per_command_symtab): New static global.
+       (per_command_setlist, per_command_showlist): New static globals.
+       (struct cmd_stats): Move here from utils.c.
+       (set_per_command_time): Renamed from set_display_time in utils.c
+       and moved here.  All callers updated.
+       (set_per_command_space): Renamed from set_display_space in utils.c
+       and moved here.  All callers updated.
+       (count_symtabs_and_blocks): New function.
+       (report_command_stats): Moved here from utils.c.  Add support for
+       printing symtab stats.  Only print data if enabled before command
+       executed.
+       (make_command_stats_cleanup): Ditto.
+       (sert_per_command_cmd, show_per_command_cmd): New functions.
+       (_initialize_maint_cmds): Add new commands
+       mt set per-command {space,time,symtab} {on,off}.
+       * maint.h: New file.
+       * top.c: #include "maint.h".
+       * utils.c (reset_prompt_for_continue_wait_time): New function.
+       (get_prompt_for_continue_wait_time): New function.
+       * utils.h (reset_prompt_for_continue_wait_time): Declare
+       (get_prompt_for_continue_wait_time): Declare.
+       (make_command_stats_cleanup): Moved to maint.h.
+       (set_display_time, set_display_space): Moved to maint.h and renamed
+       to set_per_command_time, set_per_command_space.
+       * cli/cli-setshow.c (parse_cli_boolean_value): Renamed from
+       parse_binary_operation and made non-static.  Don't call error,
+       just return an error marker.  All callers updated.
+       * cli/cli-setshow.h (parse_cli_boolean_value): Declare.
+
 2013-03-21  Tom Tromey  <tromey@redhat.com>
 
        * symfile.c (alloc_section_addr_info): Update header.  Don't set
index b759adf53507b2d75f0a4fc15f1771ae0f9ea9b9..77a27f78dca00d3e83c6181bd0eb9eba78d97ba2 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -3,6 +3,13 @@
 
 *** Changes since GDB 7.6
 
+* New commands:
+maint set|show per-command
+maint set|show per-command space
+maint set|show per-command time
+maint set|show per-command symtab
+  Enable display of per-command gdb resource usage.
+
 * The command 'tsave' can now support new option '-ctf' to save trace
   buffer in Common Trace Format.
 
index 3a0e978cadfbb32e704140b93ed41d1f6717c179..95ebbe7b65d860108703285ea957a9207cdf6844 100644 (file)
 #include "cli/cli-cmds.h"
 #include "cli/cli-setshow.h"
 
-/* Prototypes for local functions.  */
-
-static int parse_binary_operation (char *);
-
 /* Return true if the change of command parameter should be notified.  */
 
 static int
@@ -76,8 +72,10 @@ parse_auto_binary_operation (const char *arg)
   return AUTO_BOOLEAN_AUTO; /* Pacify GCC.  */
 }
 
-static int
-parse_binary_operation (char *arg)
+/* See cli-setshow.h.  */
+
+int
+parse_cli_boolean_value (char *arg)
 {
   int length;
 
@@ -100,10 +98,7 @@ parse_binary_operation (char *arg)
           || strncmp (arg, "disable", length) == 0)
     return 0;
   else
-    {
-      error (_("\"on\" or \"off\" expected."));
-      return 0;
-    }
+    return -1;
 }
 \f
 void
@@ -248,8 +243,10 @@ do_set_command (char *arg, int from_tty, struct cmd_list_element *c)
       break;
     case var_boolean:
       {
-       int val = parse_binary_operation (arg);
+       int val = parse_cli_boolean_value (arg);
 
+       if (val < 0)
+         error (_("\"on\" or \"off\" expected."));
        if (val != *(int *) c->var)
          {
            *(int *) c->var = val;
index 079b9dae7ed8b87457e3f16230dd7d9be645a1e3..152080bee57d2d72b243a59a1f900024bf1ba5f2 100644 (file)
 
 struct cmd_list_element;
 
-/* Exported to cli/cli-cmds.c and gdb/top.c */
+/* Parse ARG, an option to a boolean variable.
+   Returns 1 for true, 0 for false, and -1 if invalid.  */
+extern int parse_cli_boolean_value (char *arg);
 
 extern void do_set_command (char *arg, int from_tty,
                            struct cmd_list_element *c);
 extern void do_show_command (char *arg, int from_tty,
                             struct cmd_list_element *c);
 
-/* Exported to cli/cli-cmds.c and gdb/top.c, language.c and valprint.c */
-
 extern void cmd_show_list (struct cmd_list_element *list, int from_tty,
                           char *prefix);
 
index 4830331a56ab0d27784b1e3eef7e00bf9e919f8b..ca4b4543de510f8f7ada28538e41572dfb6d2a66 100644 (file)
@@ -1,3 +1,8 @@
+2013-03-21  Doug Evans  <dje@google.com>
+
+       * gdb.texinfo (Maintenance Commands): Add docs for
+       "mt set per-command {space,time,symtab} {on,off}".
+
 2013-03-14  Hui Zhu  <hui@codesourcery.com>
            Yao Qi  <yao@codesourcery.com>
 
index 4ac28bb8bb878ef4ac93cdb0a82d83b9b8560f04..e5e97a92672fd1c45c775d47a808a40a1e4bec29 100644 (file)
@@ -35721,24 +35721,33 @@ Control whether to show all non zero areas within a 1k block starting
 at thread local base, when using the @samp{info w32 thread-information-block}
 command.
 
-@kindex maint space
-@cindex memory used by commands
-@item maint space
-Control whether to display memory usage for each command.  If set to a
-nonzero value, @value{GDBN} will display how much memory each command
-took, following the command's own output.  This can also be requested
-by invoking @value{GDBN} with the @option{--statistics} command-line
-switch (@pxref{Mode Options}).
+@kindex maint set per-command
+@kindex maint show per-command
+@item maint set per-command
+@itemx maint show per-command
+@cindex resources used by commands
 
-@kindex maint time
-@cindex time of command execution
-@item maint time
-Control whether to display the execution time of @value{GDBN} for each command.
-If set to a nonzero value, @value{GDBN} will display how much time it
+@value{GDBN} can display the resources used by each command.
+This is useful in debugging performance problems.
+
+@table @code
+@item maint set per-command space [on|off]
+@itemx maint show per-command space
+Enable or disable the printing of the memory used by GDB for each command.
+If enabled, @value{GDBN} will display how much memory each command
+took, following the command's own output.
+This can also be requested by invoking @value{GDBN} with the
+@option{--statistics} command-line switch (@pxref{Mode Options}).
+
+@item maint set per-command time [on|off]
+@itemx maint show per-command time
+Enable or disable the printing of the execution time of @value{GDBN}
+for each command.
+If enabled, @value{GDBN} will display how much time it
 took to execute each command, following the command's own output.
 Both CPU time and wallclock time are printed.
 Printing both is useful when trying to determine whether the cost is
-CPU or, e.g., disk/network, latency.
+CPU or, e.g., disk/network latency.
 Note that the CPU time printed is for @value{GDBN} only, it does not include
 the execution time of the inferior because there's no mechanism currently
 to compute how much time was spent by @value{GDBN} and how much time was
@@ -35746,6 +35755,31 @@ spent by the program been debugged.
 This can also be requested by invoking @value{GDBN} with the
 @option{--statistics} command-line switch (@pxref{Mode Options}).
 
+@item maint set per-command symtab [on|off]
+@itemx maint show per-command symtab
+Enable or disable the printing of basic symbol table statistics
+for each command.
+If enabled, @value{GDBN} will display the following information:
+
+@table @bullet
+@item number of symbol tables
+@itemx number of primary symbol tables
+@itemx number of blocks in the blockvector
+@end table
+@end table
+
+@kindex maint space
+@cindex memory used by commands
+@item maint space @var{value}
+An alias for @code{maint set per-command space}.
+A non-zero value enables it, zero disables it.
+
+@kindex maint time
+@cindex time of command execution
+@item maint time @var{value}
+An alias for @code{maint set per-command time}.
+A non-zero value enables it, zero disables it.
+
 @kindex maint translate-address
 @item maint translate-address @r{[}@var{section}@r{]} @var{addr}
 Find the symbol stored at the location specified by the address
index bd92ef1cd284d6fa198d4835c167483d4ca14c6b..10f14993b554541430869509d1d2b37ed467710a 100644 (file)
@@ -36,6 +36,7 @@
 #include "continuations.h"
 #include "gdbcmd.h"            /* for dont_repeat() */
 #include "annotate.h"
+#include "maint.h"
 
 /* readline include files.  */
 #include "readline/readline.h"
index 06f3febd2903151af6f77fd3515fc1a140dcb705..08a27697745eef72dcf0660b0d6b95d5dec29673 100644 (file)
@@ -42,6 +42,7 @@
 #include "python/python.h"
 #include "objfiles.h"
 #include "auto-load.h"
+#include "maint.h"
 
 /* The selected interpreter.  This will be used as a set command
    variable, so it should always be malloc'ed - since
@@ -538,8 +539,8 @@ captured_main (void *data)
            break;
          case OPT_STATISTICS:
            /* Enable the display of both time and space usage.  */
-           set_display_time (1);
-           set_display_space (1);
+           set_per_command_time (1);
+           set_per_command_space (1);
            break;
          case OPT_TUI:
            /* --tui is equivalent to -i=tui.  */
index b835db6a5482fb874ee89fdfbf401a3542697e6e..db3e63dfcf813b5f8d8fbdaeb73d59059205462d 100644 (file)
 #include "arch-utils.h"
 #include <ctype.h>
 #include <signal.h>
+#include <sys/time.h>
+#include <time.h>
 #include "command.h"
 #include "gdbcmd.h"
 #include "symtab.h"
+#include "block.h"
 #include "gdbtypes.h"
 #include "demangle.h"
 #include "gdbcore.h"
 #include "objfiles.h"
 #include "value.h"
 #include "gdb_assert.h"
+#include "top.h"
+#include "timeval-utils.h"
+#include "maint.h"
 
 #include "cli/cli-decode.h"
 #include "cli/cli-utils.h"
+#include "cli/cli-setshow.h"
 
 extern void _initialize_maint_cmds (void);
 
@@ -164,7 +171,7 @@ maintenance_time_display (char *args, int from_tty)
   if (args == NULL || *args == '\0')
     printf_unfiltered (_("\"maintenance time\" takes a numeric argument.\n"));
   else
-    set_display_time (strtol (args, NULL, 10));
+    set_per_command_time (strtol (args, NULL, 10));
 }
 
 static void
@@ -173,7 +180,7 @@ maintenance_space_display (char *args, int from_tty)
   if (args == NULL || *args == '\0')
     printf_unfiltered ("\"maintenance space\" takes a numeric argument.\n");
   else
-    set_display_space (strtol (args, NULL, 10));
+    set_per_command_space (strtol (args, NULL, 10));
 }
 
 /* The "maintenance info" command is defined as a prefix, with
@@ -725,7 +732,243 @@ maintenance_set_profile_cmd (char *args, int from_tty,
   error (_("Profiling support is not available on this system."));
 }
 #endif
+\f
+/* If nonzero, display time usage both at startup and for each command.  */
 
+static int per_command_time;
+
+/* If nonzero, display space usage both at startup and for each command.  */
+
+static int per_command_space;
+
+/* If nonzero, display basic symtab stats for each command.  */
+
+static int per_command_symtab;
+
+/* mt per-command commands.  */
+
+static struct cmd_list_element *per_command_setlist;
+static struct cmd_list_element *per_command_showlist;
+
+/* Records a run time and space usage to be used as a base for
+   reporting elapsed time or change in space.  */
+
+struct cmd_stats 
+{
+  /* Zero if the saved time is from the beginning of GDB execution.
+     One if from the beginning of an individual command execution.  */
+  int msg_type;
+  /* Track whether the stat was enabled at the start of the command
+     so that we can avoid printing anything if it gets turned on by
+     the current command.  */
+  int time_enabled : 1;
+  int space_enabled : 1;
+  int symtab_enabled : 1;
+  long start_cpu_time;
+  struct timeval start_wall_time;
+  long start_space;
+  /* Total number of symtabs (over all objfiles).  */
+  int start_nr_symtabs;
+  /* Of those, a count of just the primary ones.  */
+  int start_nr_primary_symtabs;
+  /* Total number of blocks.  */
+  int start_nr_blocks;
+};
+
+/* Set whether to display time statistics to NEW_VALUE
+   (non-zero means true).  */
+
+void
+set_per_command_time (int new_value)
+{
+  per_command_time = new_value;
+}
+
+/* Set whether to display space statistics to NEW_VALUE
+   (non-zero means true).  */
+
+void
+set_per_command_space (int new_value)
+{
+  per_command_space = new_value;
+}
+
+/* Count the number of symtabs and blocks.  */
+
+static void
+count_symtabs_and_blocks (int *nr_symtabs_ptr, int *nr_primary_symtabs_ptr,
+                         int *nr_blocks_ptr)
+{
+  struct objfile *o;
+  struct symtab *s;
+  int nr_symtabs = 0;
+  int nr_primary_symtabs = 0;
+  int nr_blocks = 0;
+
+  ALL_SYMTABS (o, s)
+    {
+      ++nr_symtabs;
+      if (s->primary)
+       {
+         ++nr_primary_symtabs;
+         nr_blocks += BLOCKVECTOR_NBLOCKS (BLOCKVECTOR (s));
+       }
+    }
+
+  *nr_symtabs_ptr = nr_symtabs;
+  *nr_primary_symtabs_ptr = nr_primary_symtabs;
+  *nr_blocks_ptr = nr_blocks;
+}
+
+/* As indicated by display_time and display_space, report GDB's elapsed time
+   and space usage from the base time and space provided in ARG, which
+   must be a pointer to a struct cmd_stat.  This function is intended
+   to be called as a cleanup.  */
+
+static void
+report_command_stats (void *arg)
+{
+  struct cmd_stats *start_stats = (struct cmd_stats *) arg;
+  int msg_type = start_stats->msg_type;
+
+  if (start_stats->time_enabled)
+    {
+      long cmd_time = get_run_time () - start_stats->start_cpu_time;
+      struct timeval now_wall_time, delta_wall_time, wait_time;
+
+      gettimeofday (&now_wall_time, NULL);
+      timeval_sub (&delta_wall_time,
+                  &now_wall_time, &start_stats->start_wall_time);
+
+      /* Subtract time spend in prompt_for_continue from walltime.  */
+      wait_time = get_prompt_for_continue_wait_time ();
+      timeval_sub (&delta_wall_time, &delta_wall_time, &wait_time);
+
+      printf_unfiltered (msg_type == 0
+                        ? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n")
+                        : _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"),
+                        cmd_time / 1000000, cmd_time % 1000000,
+                        (long) delta_wall_time.tv_sec,
+                        (long) delta_wall_time.tv_usec);
+    }
+
+  if (start_stats->space_enabled)
+    {
+#ifdef HAVE_SBRK
+      char *lim = (char *) sbrk (0);
+
+      long space_now = lim - lim_at_start;
+      long space_diff = space_now - start_stats->start_space;
+
+      printf_unfiltered (msg_type == 0
+                        ? _("Space used: %ld (%s%ld during startup)\n")
+                        : _("Space used: %ld (%s%ld for this command)\n"),
+                        space_now,
+                        (space_diff >= 0 ? "+" : ""),
+                        space_diff);
+#endif
+    }
+
+  if (start_stats->symtab_enabled)
+    {
+      int nr_symtabs, nr_primary_symtabs, nr_blocks;
+
+      count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks);
+      printf_unfiltered (_("#symtabs: %d (+%d),"
+                          " #primary symtabs: %d (+%d),"
+                          " #blocks: %d (+%d)\n"),
+                        nr_symtabs,
+                        nr_symtabs - start_stats->start_nr_symtabs,
+                        nr_primary_symtabs,
+                        nr_primary_symtabs - start_stats->start_nr_primary_symtabs,
+                        nr_blocks,
+                        nr_blocks - start_stats->start_nr_blocks);
+    }
+}
+
+/* Create a cleanup that reports time and space used since its creation.
+   MSG_TYPE is zero for gdb startup, otherwise it is one(1) to report
+   data for individual commands.  */
+
+struct cleanup *
+make_command_stats_cleanup (int msg_type)
+{
+  struct cmd_stats *new_stat;
+
+  /* Early exit if we're not reporting any stats.  */
+  if (!per_command_time
+      && !per_command_space
+      && !per_command_symtab)
+    return make_cleanup (null_cleanup, 0);
+
+  new_stat = XZALLOC (struct cmd_stats);
+
+  new_stat->msg_type = msg_type;
+
+  if (per_command_space)
+    {
+#ifdef HAVE_SBRK
+      char *lim = (char *) sbrk (0);
+      new_stat->start_space = lim - lim_at_start;
+      new_stat->space_enabled = 1;
+#endif
+    }
+
+  if (per_command_time)
+    {
+      new_stat->start_cpu_time = get_run_time ();
+      gettimeofday (&new_stat->start_wall_time, NULL);
+      new_stat->time_enabled = 1;
+    }
+
+  if (per_command_symtab)
+    {
+      int nr_symtabs, nr_primary_symtabs, nr_blocks;
+
+      count_symtabs_and_blocks (&nr_symtabs, &nr_primary_symtabs, &nr_blocks);
+      new_stat->start_nr_symtabs = nr_symtabs;
+      new_stat->start_nr_primary_symtabs = nr_primary_symtabs;
+      new_stat->start_nr_blocks = nr_blocks;
+      new_stat->symtab_enabled = 1;
+    }
+
+  /* Initalize timer to keep track of how long we waited for the user.  */
+  reset_prompt_for_continue_wait_time ();
+
+  return make_cleanup_dtor (report_command_stats, new_stat, xfree);
+}
+
+/* Handle unknown "mt set per-command" arguments.
+   In this case have "mt set per-command on|off" affect every setting.  */
+
+static void
+set_per_command_cmd (char *args, int from_tty)
+{
+  struct cmd_list_element *list;
+  size_t length;
+  int val;
+
+  val = parse_cli_boolean_value (args);
+  if (val < 0)
+    error (_("Bad value for 'mt set per-command no'."));
+
+  for (list = per_command_setlist; list != NULL; list = list->next)
+    if (list->var_type == var_boolean)
+      {
+       gdb_assert (list->type == set_cmd);
+       do_set_command (args, from_tty, list);
+      }
+}
+
+/* Command "show per-command" displays summary of all the current
+   "show per-command " settings.  */
+
+static void
+show_per_command_cmd (char *args, int from_tty)
+{
+  cmd_show_list (per_command_showlist, from_tty, "");
+}
+\f
 void
 _initialize_maint_cmds (void)
 {
@@ -802,12 +1045,56 @@ Call internal GDB demangler routine to demangle a C++ link name\n\
 and prints the result."),
           &maintenancelist);
 
+  add_prefix_cmd ("per-command", class_maintenance, set_per_command_cmd, _("\
+Per-command statistics settings."),
+                   &per_command_setlist, "set per-command ",
+                   1/*allow-unknown*/, &maintenance_set_cmdlist);
+
+  add_prefix_cmd ("per-command", class_maintenance, show_per_command_cmd, _("\
+Show per-command statistics settings."),
+                   &per_command_showlist, "show per-command ",
+                   0/*allow-unknown*/, &maintenance_show_cmdlist);
+
+  add_setshow_boolean_cmd ("time", class_maintenance,
+                          &per_command_time, _("\
+Set whether to display per-command execution time."), _("\
+Show whether to display per-command execution time."),
+                          _("\
+If enabled, the execution time for each command will be\n\
+displayed following the command's output."),
+                          NULL, NULL,
+                          &per_command_setlist, &per_command_showlist);
+
+  add_setshow_boolean_cmd ("space", class_maintenance,
+                          &per_command_space, _("\
+Set whether to display per-command space usage."), _("\
+Show whether to display per-command space usage."),
+                          _("\
+If enabled, the space usage for each command will be\n\
+displayed following the command's output."),
+                          NULL, NULL,
+                          &per_command_setlist, &per_command_showlist);
+
+  add_setshow_boolean_cmd ("symtab", class_maintenance,
+                          &per_command_symtab, _("\
+Set whether to display per-command symtab statistics."), _("\
+Show whether to display per-command symtab statistics."),
+                          _("\
+If enabled, the basic symtab statistics for each command will be\n\
+displayed following the command's output."),
+                          NULL, NULL,
+                          &per_command_setlist, &per_command_showlist);
+
+  /* This is equivalent to "mt set per-command time on".
+     Kept because some people are used to typing "mt time 1".  */
   add_cmd ("time", class_maintenance, maintenance_time_display, _("\
 Set the display of time usage.\n\
 If nonzero, will cause the execution time for each command to be\n\
 displayed, following the command's output."),
           &maintenancelist);
 
+  /* This is equivalent to "mt set per-command space on".
+     Kept because some people are used to typing "mt space 1".  */
   add_cmd ("space", class_maintenance, maintenance_space_display, _("\
 Set the display of space usage.\n\
 If nonzero, will cause the execution space for each command to be\n\
diff --git a/gdb/maint.h b/gdb/maint.h
new file mode 100644 (file)
index 0000000..51d53b0
--- /dev/null
@@ -0,0 +1,31 @@
+/* Support for GDB maintenance commands.
+   Copyright (C) 2013 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef MAINT_H
+#define MAINT_H
+
+extern void set_per_command_time (int);
+
+extern void set_per_command_space (int);
+
+/* Note: There's no set_per_command_symtab on purpose.
+   Symtab stats aren't yet as useful for --statistics output.  */
+
+extern struct cleanup *make_command_stats_cleanup (int);
+
+#endif /* MAINT_H */
index afbb5eb25f0f8064db84bfe3b97cbd6bfc80298a..690126c66d313b3979936883d755cdc50dc89dc9 100644 (file)
@@ -1,3 +1,7 @@
+2013-03-21  Doug Evans  <dje@google.com>
+
+       * gdb.base/maint.exp: Update tests for per-command stats.
+
 2013-03-21  Tom Tromey  <tromey@redhat.com>
 
        * gdb.cp/cpexprs.exp: Add test for FILENAME:: case.
index e3b6e3cd1f12f297403496a5b8328c9f3b130090..a867c50f93c192dc82299148bf333c25bcbf6243 100644 (file)
 
 
 #maintenance check-symtabs -- Check consistency of psymtabs and symtabs
-#maintenance space -- Set the display of space usage
 #maintenance set -- Set GDB internal variables used by the GDB maintainer
 #maintenance show -- Show GDB internal variables used by the GDB maintainer
-#maintenance time -- Set the display of time usage
 #maintenance demangle -- Demangle a C++ mangled name
 #maintenance dump-me -- Get fatal error; make debugger dump its core
 #maintenance print -- Maintenance command for printing GDB internal state
@@ -126,22 +124,10 @@ gdb_expect  {
     timeout         { fail "(timeout) maint check-symtabs" }
 }
 
-gdb_test "maint space" \
-    "\"maintenance space\" takes a numeric argument\\."
+gdb_test_no_output "maint set per-command on"
 
-gdb_test "maint space 1" \
-    "Space used: $decimal \\(\\+$decimal for this command\\)"
-
-gdb_test "maint time" \
-    "\"maintenance time\" takes a numeric argument\\..*Space used: $decimal \\(\\+$decimal for this command\\)" 
-
-gdb_test "maint time 1" \
-    "Command execution time: $decimal.*Space used: $decimal \\(\\+$decimal for this command\\)"
-
-gdb_test "maint time 0" \
-    "Space used: $decimal \\(\\+$decimal for this command\\)"
-
-gdb_test_no_output "maint space 0"
+gdb_test "maint set per-command off" \
+    "Command execution time: \[0-9.\]+ \\(cpu\\), \[0-9.\]+ \\(wall\\)\[\r\n\]+Space used: $decimal \\(\\+$decimal for this command\\)\[\r\n\]+#symtabs: $decimal \\(\\+$decimal\\), #primary symtabs: $decimal \\(\\+$decimal\\), #blocks: $decimal \\(\\+$decimal\\)"
 
 gdb_test "maint demangle" \
     "\"maintenance demangle\" takes an argument to demangle\\."
index e06c5ee7760fcebe101495a7b0680b2e7a979be9..7905b518501ce9bac9ee60a2b04bcf2bfbd418f2 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -47,6 +47,7 @@
 #include "python/python.h"
 #include "interps.h"
 #include "observer.h"
+#include "maint.h"
 
 /* readline include files.  */
 #include "readline/readline.h"
index 4c2f08c91b84082f410d39c56113f2125ea60131..a28c782ef9415069d8c025b71920f836dae89784 100644 (file)
@@ -544,117 +544,6 @@ free_current_contents (void *ptr)
       *location = NULL;
     }
 }
-
-/* If nonzero, display time usage both at startup and for each command.  */
-
-static int display_time;
-
-/* If nonzero, display space usage both at startup and for each command.  */
-
-static int display_space;
-
-/* Records a run time and space usage to be used as a base for
-   reporting elapsed time or change in space.  In addition,
-   the msg_type field indicates whether the saved time is from the
-   beginning of GDB execution (0) or the beginning of an individual 
-   command execution (1).  */
-struct cmd_stats 
-{
-  int msg_type;
-  long start_cpu_time;
-  struct timeval start_wall_time;
-  long start_space;
-};
-
-/* Set whether to display time statistics to NEW_VALUE (non-zero 
-   means true).  */
-void
-set_display_time (int new_value)
-{
-  display_time = new_value;
-}
-
-/* Set whether to display space statistics to NEW_VALUE (non-zero
-   means true).  */
-void
-set_display_space (int new_value)
-{
-  display_space = new_value;
-}
-
-/* As indicated by display_time and display_space, report GDB's elapsed time
-   and space usage from the base time and space provided in ARG, which
-   must be a pointer to a struct cmd_stat.  This function is intended
-   to be called as a cleanup.  */
-static void
-report_command_stats (void *arg)
-{
-  struct cmd_stats *start_stats = (struct cmd_stats *) arg;
-  int msg_type = start_stats->msg_type;
-
-  if (display_time)
-    {
-      long cmd_time = get_run_time () - start_stats->start_cpu_time;
-      struct timeval now_wall_time, delta_wall_time;
-
-      gettimeofday (&now_wall_time, NULL);
-      timeval_sub (&delta_wall_time,
-                  &now_wall_time, &start_stats->start_wall_time);
-
-      /* Subtract time spend in prompt_for_continue from walltime.  */
-      timeval_sub (&delta_wall_time,
-                   &delta_wall_time, &prompt_for_continue_wait_time);
-
-      printf_unfiltered (msg_type == 0
-                        ? _("Startup time: %ld.%06ld (cpu), %ld.%06ld (wall)\n")
-                        : _("Command execution time: %ld.%06ld (cpu), %ld.%06ld (wall)\n"),
-                        cmd_time / 1000000, cmd_time % 1000000,
-                        (long) delta_wall_time.tv_sec,
-                        (long) delta_wall_time.tv_usec);
-    }
-
-  if (display_space)
-    {
-#ifdef HAVE_SBRK
-      char *lim = (char *) sbrk (0);
-
-      long space_now = lim - lim_at_start;
-      long space_diff = space_now - start_stats->start_space;
-
-      printf_unfiltered (msg_type == 0
-                        ? _("Space used: %ld (%s%ld during startup)\n")
-                        : _("Space used: %ld (%s%ld for this command)\n"),
-                        space_now,
-                        (space_diff >= 0 ? "+" : ""),
-                        space_diff);
-#endif
-    }
-}
-
-/* Create a cleanup that reports time and space used since its
-   creation.  Precise messages depend on MSG_TYPE:
-      0:  Initial time/space
-      1:  Individual command time/space.  */
-struct cleanup *
-make_command_stats_cleanup (int msg_type)
-{
-  static const struct timeval zero_timeval = { 0 };
-  struct cmd_stats *new_stat = XMALLOC (struct cmd_stats);
-  
-#ifdef HAVE_SBRK
-  char *lim = (char *) sbrk (0);
-  new_stat->start_space = lim - lim_at_start;
-#endif
-
-  new_stat->msg_type = msg_type;
-  new_stat->start_cpu_time = get_run_time ();
-  gettimeofday (&new_stat->start_wall_time, NULL);
-
-  /* Initalize timer to keep track of how long we waited for the user.  */
-  prompt_for_continue_wait_time = zero_timeval;
-
-  return make_cleanup_dtor (report_command_stats, new_stat, xfree);
-}
 \f
 
 
@@ -1924,6 +1813,24 @@ prompt_for_continue (void)
   dont_repeat ();              /* Forget prev cmd -- CR won't repeat it.  */
 }
 
+/* Initalize timer to keep track of how long we waited for the user.  */
+
+void
+reset_prompt_for_continue_wait_time (void)
+{
+  static const struct timeval zero_timeval = { 0 };
+
+  prompt_for_continue_wait_time = zero_timeval;
+}
+
+/* Fetch the cumulative time spent in prompt_for_continue.  */
+
+struct timeval
+get_prompt_for_continue_wait_time (void)
+{
+  return prompt_for_continue_wait_time;
+}
+
 /* Reinitialize filter; ie. tell it to reset to original values.  */
 
 void
index 52bcaff6c4b68861eb50d8e4c7172f4beb44a631..9015c86b906b1e0b3ed634006d0f7e2ea0269f26 100644 (file)
@@ -53,6 +53,11 @@ extern char *safe_strerror (int);
    bfd_check_format_matches, and will be freed.  */
 
 extern const char *gdb_bfd_errmsg (bfd_error_type error_tag, char **matching);
+
+/* Reset the prompt_for_continue clock.  */
+void reset_prompt_for_continue_wait_time (void);
+/* Return the time spent in prompt_for_continue.  */
+struct timeval get_prompt_for_continue_wait_time (void);
 \f
 /* Parsing utilites.  */
 
@@ -110,8 +115,6 @@ extern struct cleanup *make_cleanup_htab_delete (htab_t htab);
 
 extern void free_current_contents (void *);
 
-extern struct cleanup *make_command_stats_cleanup (int);
-
 extern void init_page_info (void);
 
 extern struct cleanup *make_cleanup_restore_page_info (void);
@@ -136,10 +139,6 @@ char *ldirname (const char *filename);
 
 struct ui_file;
 
-extern void set_display_time (int);
-
-extern void set_display_space (int);
-
 extern int query (const char *, ...) ATTRIBUTE_PRINTF (1, 2);
 extern int nquery (const char *, ...) ATTRIBUTE_PRINTF (1, 2);
 extern int yquery (const char *, ...) ATTRIBUTE_PRINTF (1, 2);