This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[trunk<-vta] Re: [vta,vta4.3,trunk?] introduce -time=file flag


On Sep 11, 2008, Alexandre Oliva <aoliva@redhat.com> wrote:

> -time currently dumps to stderr, which makes it less than useful when
> logging a -j build, especially when you want to measure say the vta
> compilation overhead without giving up -j.

> This patch introduces -time=file, so that the compiler driver appends
> the compile time and the command line to file.

Ok for trunk?

for  gcc/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	* gcc.c (report_times_to_file): New.
	(execute): Implement it.
	(process_command): Support -time=.
	* doc/invoke.texi: Document it.
	
Index: gcc/gcc.c
===================================================================
--- gcc/gcc.c.orig	2009-05-28 04:46:23.000000000 -0300
+++ gcc/gcc.c	2009-05-28 04:47:54.000000000 -0300
@@ -198,6 +198,10 @@ static int print_subprocess_help;
 
 static int report_times;
 
+/* Whether we should report subprocess execution times to a file.  */
+
+FILE *report_times_to_file = NULL;
+
 /* Nonzero means place this string before uses of /, so that include
    and library files can be found in an alternate location.  */
 
@@ -3026,7 +3030,8 @@ execute (void)
 
   /* Run each piped subprocess.  */
 
-  pex = pex_init (PEX_USE_PIPES | (report_times ? PEX_RECORD_TIMES : 0),
+  pex = pex_init (PEX_USE_PIPES | ((report_times || report_times_to_file)
+				   ? PEX_RECORD_TIMES : 0),
 		  programname, temp_filename);
   if (pex == NULL)
     pfatal_with_name (_("pex_init failed"));
@@ -3070,7 +3075,7 @@ execute (void)
     if (!pex_get_status (pex, n_commands, statuses))
       pfatal_with_name (_("failed to get exit status"));
 
-    if (report_times)
+    if (report_times || report_times_to_file)
       {
 	times = (struct pex_time *) alloca (n_commands * sizeof (struct pex_time));
 	if (!pex_get_times (pex, n_commands, times))
@@ -3115,7 +3120,7 @@ See %s for instructions.",
 	    ret_code = -1;
 	  }
 
-	if (report_times)
+	if (report_times || report_times_to_file)
 	  {
 	    struct pex_time *pt = &times[i];
 	    double ut, st;
@@ -3126,7 +3131,43 @@ See %s for instructions.",
 		  + (double) pt->system_microseconds / 1.0e6);
 
 	    if (ut + st != 0)
-	      notice ("# %s %.2f %.2f\n", commands[i].prog, ut, st);
+	      {
+		if (report_times)
+		  notice ("# %s %.2f %.2f\n", commands[i].prog, ut, st);
+
+		if (report_times_to_file)
+		  {
+		    int c = 0;
+		    const char *const *j;
+
+		    fprintf (report_times_to_file, "%g %g", ut, st);
+
+		    for (j = &commands[i].prog; *j; j = &commands[i].argv[++c])
+		      {
+			const char *p;
+			for (p = *j; *p; ++p)
+			  if (*p == '"' || *p == '\\' || *p == '$'
+			      || ISSPACE (*p))
+			    break;
+
+			if (*p)
+			  {
+			    fprintf (report_times_to_file, " \"");
+			    for (p = *j; *p; ++p)
+			      {
+				if (*p == '"' || *p == '\\' || *p == '$')
+				  fputc ('\\', report_times_to_file);
+				fputc (*p, report_times_to_file);
+			      }
+			    fputc ('"', report_times_to_file);
+			  }
+			else
+			  fprintf (report_times_to_file, " %s", *j);
+		      }
+
+		    fputc ('\n', report_times_to_file);
+		  }
+	      }
 	  }
       }
 
@@ -3923,6 +3964,12 @@ process_command (int argc, const char **
 	}
       else if (strcmp (argv[i], "-time") == 0)
 	report_times = 1;
+      else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
+	{
+	  if (report_times_to_file)
+	    fclose (report_times_to_file);
+	  report_times_to_file = fopen (argv[i] + sizeof ("-time=") - 1, "a");
+	}
       else if (strcmp (argv[i], "-pipe") == 0)
 	{
 	  /* -pipe has to go into the switches array as well as
@@ -4358,6 +4405,8 @@ process_command (int argc, const char **
 	;
       else if (strcmp (argv[i], "-time") == 0)
 	;
+      else if (strncmp (argv[i], "-time=", sizeof ("-time=") - 1) == 0)
+	;
       else if (strcmp (argv[i], "-###") == 0)
 	;
       else if (argv[i][0] == '-' && argv[i][1] != 0)
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi.orig	2009-05-28 04:45:58.000000000 -0300
+++ gcc/doc/invoke.texi	2009-05-28 04:48:14.000000000 -0300
@@ -320,7 +320,7 @@ Objective-C and Objective-C++ Dialects}.
 -print-multi-directory  -print-multi-lib @gol
 -print-prog-name=@var{program}  -print-search-dirs  -Q @gol
 -print-sysroot -print-sysroot-headers-suffix @gol
--save-temps -save-temps=cwd -save-temps=obj -time}
+-save-temps -save-temps=cwd -save-temps=obj -time@r{[}=@var{file}@r{]}}
 
 @item Optimization Options
 @xref{Optimize Options,,Options that Control Optimization}.
@@ -5327,11 +5327,13 @@ would create @file{foo.i}, @file{foo.s},
 @file{dir/xbar.s}, @file{dir2/yfoobar.i}, @file{dir2/yfoobar.s}, and
 @file{dir2/yfoobar.o}.
 
-@item -time
+@item -time@r{[}=@var{file}@r{]}
 @opindex time
 Report the CPU time taken by each subprocess in the compilation
 sequence.  For C source files, this is the compiler proper and assembler
-(plus the linker if linking is done).  The output looks like this:
+(plus the linker if linking is done).
+
+Without the specification of an output file, the output looks like this:
 
 @smallexample
 # cc1 0.12 0.01
@@ -5343,6 +5345,18 @@ executing the program itself.  The secon
 time spent executing operating system routines on behalf of the program.
 Both numbers are in seconds.
 
+With the specification of an output file, the output is appended to the
+named file, and it looks like this:
+
+@smallexample
+0.12 0.01 cc1 @var{options}
+0.00 0.01 as @var{options}
+@end smallexample
+
+The ``user time'' and the ``system time'' are moved before the program
+name, and the options passed to the program are displayed, so that one
+can later tell what file was being compiled, and with which options.
+
 @item -fvar-tracking
 @opindex fvar-tracking
 Run variable tracking pass.  It computes where variables are stored at each
-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]