OSDN Git Service

2010-04-06 Kai Tietz <kai.tietz@onevision.com>
[pf3gnuchains/gcc-fork.git] / gcc / timevar.c
index 65323eb..df671e4 100644 (file)
@@ -1,12 +1,12 @@
 /* Timing variables for measuring compiler performance.
 /* Timing variables for measuring compiler performance.
-   Copyright (C) 2000, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
    Contributed by Alex Samuel <samuel@codesourcery.com>
 
 This file is part of GCC.
 
 GCC 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
    Contributed by Alex Samuel <samuel@codesourcery.com>
 
 This file is part of GCC.
 
 GCC 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 2, or (at your option) any later
+Software Foundation; either version 3, or (at your option) any later
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 version.
 
 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
@@ -15,9 +15,8 @@ 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
 for more details.
 
 You should have received a copy of the GNU General Public License
-along with GCC; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA
-02111-1307, USA.  */
+along with GCC; see the file COPYING3.  If not see
+<http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
 #include "system.h"
 
 #include "config.h"
 #include "system.h"
@@ -27,11 +26,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif
 #ifdef HAVE_SYS_RESOURCE_H
 #include <sys/resource.h>
 #endif
-#include "coretypes.h"
-#include "tm.h"
-#include "intl.h"
-#include "rtl.h"
-#include "toplev.h"
+#include "timevar.h"
 
 #ifndef HAVE_CLOCK_T
 typedef int clock_t;
 
 #ifndef HAVE_CLOCK_T
 typedef int clock_t;
@@ -110,10 +105,19 @@ static double clocks_to_msec;
 #define CLOCKS_TO_MSEC (1 / (double)CLOCKS_PER_SEC)
 #endif
 
 #define CLOCKS_TO_MSEC (1 / (double)CLOCKS_PER_SEC)
 #endif
 
-#include "flags.h"
-#include "timevar.h"
+/* True if timevars should be used.  In GCC, this happens with
+   the -ftime-report flag.  */
+
+bool timevar_enable;
+
+/* Total amount of memory allocated by garbage collector.  */
 
 
-static bool timevar_enable;
+size_t timevar_ggc_mem_total;
+
+/* The amount of memory that will cause us to report the timevar even
+   if the time spent is not significant.  */
+
+#define GGC_MEM_BOUND (1 << 20)
 
 /* See timevar.h for an explanation of timing variables.  */
 
 
 /* See timevar.h for an explanation of timing variables.  */
 
@@ -183,6 +187,7 @@ get_time (struct timevar_time_def *now)
   now->user = 0;
   now->sys  = 0;
   now->wall = 0;
   now->user = 0;
   now->sys  = 0;
   now->wall = 0;
+  now->ggc_mem = timevar_ggc_mem_total;
 
   if (!timevar_enable)
     return;
 
   if (!timevar_enable)
     return;
@@ -216,6 +221,7 @@ timevar_accumulate (struct timevar_time_def *timer,
   timer->user += stop_time->user - start_time->user;
   timer->sys += stop_time->sys - start_time->sys;
   timer->wall += stop_time->wall - start_time->wall;
   timer->user += stop_time->user - start_time->user;
   timer->sys += stop_time->sys - start_time->sys;
   timer->wall += stop_time->wall - start_time->wall;
+  timer->ggc_mem += stop_time->ggc_mem - start_time->ggc_mem;
 }
 
 /* Initialize timing variables.  */
 }
 
 /* Initialize timing variables.  */
@@ -250,15 +256,12 @@ timevar_init (void)
    TIMEVAR cannot be running as a standalone timer.  */
 
 void
    TIMEVAR cannot be running as a standalone timer.  */
 
 void
-timevar_push (timevar_id_t timevar)
+timevar_push_1 (timevar_id_t timevar)
 {
   struct timevar_def *tv = &timevars[timevar];
   struct timevar_stack_def *context;
   struct timevar_time_def now;
 
 {
   struct timevar_def *tv = &timevars[timevar];
   struct timevar_stack_def *context;
   struct timevar_time_def now;
 
-  if (!timevar_enable)
-    return;
-
   /* Mark this timing variable as used.  */
   tv->used = 1;
 
   /* Mark this timing variable as used.  */
   tv->used = 1;
 
@@ -285,7 +288,7 @@ timevar_push (timevar_id_t timevar)
       unused_stack_instances = unused_stack_instances->next;
     }
   else
       unused_stack_instances = unused_stack_instances->next;
     }
   else
-    context = xmalloc (sizeof (struct timevar_stack_def));
+    context = XNEW (struct timevar_stack_def);
 
   /* Fill it in and put it on the stack.  */
   context->timevar = tv;
 
   /* Fill it in and put it on the stack.  */
   context->timevar = tv;
@@ -300,16 +303,13 @@ timevar_push (timevar_id_t timevar)
    timing variable.  */
 
 void
    timing variable.  */
 
 void
-timevar_pop (timevar_id_t timevar)
+timevar_pop_1 (timevar_id_t timevar)
 {
   struct timevar_time_def now;
   struct timevar_stack_def *popped = stack;
 
 {
   struct timevar_time_def now;
   struct timevar_stack_def *popped = stack;
 
-  if (!timevar_enable)
-    return;
-
   gcc_assert (&timevars[timevar] == stack->timevar);
   gcc_assert (&timevars[timevar] == stack->timevar);
-  
+
   /* What time is it?  */
   get_time (&now);
 
   /* What time is it?  */
   get_time (&now);
 
@@ -371,31 +371,6 @@ timevar_stop (timevar_id_t timevar)
   timevar_accumulate (&tv->elapsed, &tv->start_time, &now);
 }
 
   timevar_accumulate (&tv->elapsed, &tv->start_time, &now);
 }
 
-/* Fill the elapsed time for TIMEVAR into ELAPSED.  Returns
-   update-to-date information even if TIMEVAR is currently running.  */
-
-void
-timevar_get (timevar_id_t timevar, struct timevar_time_def *elapsed)
-{
-  struct timevar_def *tv = &timevars[timevar];
-  struct timevar_time_def now;
-
-  *elapsed = tv->elapsed;
-
-  /* Is TIMEVAR currently running as a standalone timer?  */
-  if (tv->standalone)
-    {
-      get_time (&now);
-      timevar_accumulate (elapsed, &tv->start_time, &now);
-    }
-  /* Or is TIMEVAR at the top of the timer stack?  */
-  else if (stack->timevar == tv)
-    {
-      get_time (&now);
-      timevar_accumulate (elapsed, &start_time, &now);
-    }
-}
-
 /* Summarize timing variables to FP.  The timing variable TV_TOTAL has
    a special meaning -- it's considered to be the total elapsed time,
    for normalizing the others, and is displayed last.  */
 /* Summarize timing variables to FP.  The timing variable TV_TOTAL has
    a special meaning -- it's considered to be the total elapsed time,
    for normalizing the others, and is displayed last.  */
@@ -429,7 +404,7 @@ timevar_print (FILE *fp)
      TIMEVAR.  */
   start_time = now;
 
      TIMEVAR.  */
   start_time = now;
 
-  fputs (_("\nExecution times (seconds)\n"), fp);
+  fputs ("\nExecution times (seconds)\n", fp);
   for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id)
     {
       struct timevar_def *tv = &timevars[(timevar_id_t) id];
   for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id)
     {
       struct timevar_def *tv = &timevars[(timevar_id_t) id];
@@ -448,7 +423,8 @@ timevar_print (FILE *fp)
          zeroes.  */
       if (tv->elapsed.user < tiny
          && tv->elapsed.sys < tiny
          zeroes.  */
       if (tv->elapsed.user < tiny
          && tv->elapsed.sys < tiny
-         && tv->elapsed.wall < tiny)
+         && tv->elapsed.wall < tiny
+         && tv->elapsed.ggc_mem < GGC_MEM_BOUND)
        continue;
 
       /* The timing variable name.  */
        continue;
 
       /* The timing variable name.  */
@@ -475,11 +451,18 @@ timevar_print (FILE *fp)
               (total->wall == 0 ? 0 : tv->elapsed.wall / total->wall) * 100);
 #endif /* HAVE_WALL_TIME */
 
               (total->wall == 0 ? 0 : tv->elapsed.wall / total->wall) * 100);
 #endif /* HAVE_WALL_TIME */
 
+      /* Print the amount of ggc memory allocated.  */
+      fprintf (fp, "%8u kB (%2.0f%%) ggc",
+              (unsigned) (tv->elapsed.ggc_mem >> 10),
+              (total->ggc_mem == 0
+               ? 0
+               : (float) tv->elapsed.ggc_mem / total->ggc_mem) * 100);
+
       putc ('\n', fp);
     }
 
   /* Print total time.  */
       putc ('\n', fp);
     }
 
   /* Print total time.  */
-  fputs (_(" TOTAL                 :"), fp);
+  fputs (" TOTAL                 :", fp);
 #ifdef HAVE_USER_TIME
   fprintf (fp, "%7.2f          ", total->user);
 #endif
 #ifdef HAVE_USER_TIME
   fprintf (fp, "%7.2f          ", total->user);
 #endif
@@ -487,12 +470,17 @@ timevar_print (FILE *fp)
   fprintf (fp, "%7.2f          ", total->sys);
 #endif
 #ifdef HAVE_WALL_TIME
   fprintf (fp, "%7.2f          ", total->sys);
 #endif
 #ifdef HAVE_WALL_TIME
-  fprintf (fp, "%7.2f\n", total->wall);
+  fprintf (fp, "%7.2f           ", total->wall);
 #endif
 #endif
+  fprintf (fp, "%8u kB\n", (unsigned) (total->ggc_mem >> 10));
 
 #ifdef ENABLE_CHECKING
   fprintf (fp, "Extra diagnostic checks enabled; compiler may run slowly.\n");
 
 #ifdef ENABLE_CHECKING
   fprintf (fp, "Extra diagnostic checks enabled; compiler may run slowly.\n");
-  fprintf (fp, "Configure with --disable-checking to disable checks.\n");
+  fprintf (fp, "Configure with --enable-checking=release to disable checks.\n");
+#endif
+#ifndef ENABLE_ASSERT_CHECKING
+  fprintf (fp, "Internal checks disabled; compiler is not suited for release.\n");
+  fprintf (fp, "Configure with --enable-checking=release to enable checks.\n");
 #endif
 
 #endif /* defined (HAVE_USER_TIME) || defined (HAVE_SYS_TIME)
 #endif
 
 #endif /* defined (HAVE_USER_TIME) || defined (HAVE_SYS_TIME)
@@ -507,7 +495,7 @@ print_time (const char *str, long total)
 {
   long all_time = get_run_time ();
   fprintf (stderr,
 {
   long all_time = get_run_time ();
   fprintf (stderr,
-          _("time in %s: %ld.%06ld (%ld%%)\n"),
+          "time in %s: %ld.%06ld (%ld%%)\n",
           str, total / 1000000, total % 1000000,
           all_time == 0 ? 0
           : (long) (((100.0 * (double) total) / (double) all_time) + .5));
           str, total / 1000000, total % 1000000,
           all_time == 0 ? 0
           : (long) (((100.0 * (double) total) / (double) all_time) + .5));