summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2009-06-04 05:53:38 +0000
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>2009-06-04 05:53:38 +0000
commit4537c5d9c17d2786dc03d17c1082698c6ad8d95b (patch)
treeaf384b855eda7c598567b5b28fdc5fa93f2fe7b2
parentee093c13ff4f658246f1d740c165c3209617ac63 (diff)
downloadgcc-4537c5d9c17d2786dc03d17c1082698c6ad8d95b.tar.gz
* gcc.c (report_times_to_file): New.
(execute): Implement it. (process_command): Support -time=. * doc/invoke.texi: Document it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@148162 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/doc/invoke.texi20
-rw-r--r--gcc/gcc.c57
3 files changed, 77 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2190c0fb982..3730967f161 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
2009-06-04 Alexandre Oliva <aoliva@redhat.com>
+ * gcc.c (report_times_to_file): New.
+ (execute): Implement it.
+ (process_command): Support -time=.
+ * doc/invoke.texi: Document it.
+
+2009-06-04 Alexandre Oliva <aoliva@redhat.com>
+
* tree-ssa-live.c (remove_unused_scope_block_p): Keep variables
that have value exprs.
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index eded92e47f8..9771effc9e5 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -318,7 +318,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}.
@@ -5287,11 +5287,13 @@ would create @file{foo.i}, @file{foo.s}, @file{dir/xbar.i},
@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
@@ -5303,6 +5305,18 @@ executing the program itself. The second number is ``system time'',
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
diff --git a/gcc/gcc.c b/gcc/gcc.c
index f0d986c259a..7d211ca2dd5 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -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. */
@@ -3017,7 +3021,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"));
@@ -3061,7 +3066,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))
@@ -3106,7 +3111,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;
@@ -3117,7 +3122,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);
+ }
+ }
}
}
@@ -3876,6 +3917,12 @@ process_command (int argc, const char **argv)
}
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
@@ -4288,6 +4335,8 @@ process_command (int argc, const char **argv)
;
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)