diff options
author | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-04 05:53:38 +0000 |
---|---|---|
committer | aoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-06-04 05:53:38 +0000 |
commit | 4537c5d9c17d2786dc03d17c1082698c6ad8d95b (patch) | |
tree | af384b855eda7c598567b5b28fdc5fa93f2fe7b2 | |
parent | ee093c13ff4f658246f1d740c165c3209617ac63 (diff) | |
download | gcc-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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 20 | ||||
-rw-r--r-- | gcc/gcc.c | 57 |
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 = ×[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) |