aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog17
-rw-r--r--gcc/c-decl.c4
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/decl2.c4
-rw-r--r--gcc/langhooks.c8
-rw-r--r--gcc/lto/ChangeLog12
-rw-r--r--gcc/lto/lto.c36
-rw-r--r--gcc/timevar.c53
-rw-r--r--gcc/timevar.def8
-rw-r--r--gcc/toplev.c11
10 files changed, 136 insertions, 22 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 348185f..0055ebf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,20 @@
+2012-06-18 Lawrence Crowl <crowl@google.com>
+
+ * timevar.def (TV_PHASE_GENERATE): Rename to TV_PHASE_LATE_ASM.
+ (TV_PHASE_CGRAPH): Rename to TV_PHASE_OPT_GEN.
+ (TV_PHASE_STREAM_IN): New.
+ (TV_PHASE_STREAM_OUT): New.
+ * timevar.c (validate_phases): New.
+ (timevar_print): Call validate_phases.
+ * c-decl.c (c_write_global_declarations): Rename use of TV_PHASE_CGRAPH
+ to TV_PHASE_OPT_GEN.
+ * langhooks.c (write_global_declarations): Rename use of
+ TV_PHASE_CGRAPH to TV_PHASE_OPT_GEN. Use TV_PHASE_DBGINFO instead of
+ TV_PHASE_CHECK_DBGINFO.
+ * toplev.c (compile_file): Rename use of TV_PHASE_GENERATE to
+ TV_PHASE_LATE_ASM. Move start of TV_PHASE_LATE_ASM to after call to
+ lang_hooks.decls.final_write_globals.
+
2012-06-18 David Edelshn <dje.gcc@gmail.com>
* config/rs6000/aix52.h (TARGET_EXTRA_BUILTINS): Define as 0.
diff --git a/gcc/c-decl.c b/gcc/c-decl.c
index 86add14..9622b12 100644
--- a/gcc/c-decl.c
+++ b/gcc/c-decl.c
@@ -10101,13 +10101,13 @@ c_write_global_declarations (void)
c_write_global_declarations_1 (BLOCK_VARS (ext_block));
timevar_stop (TV_PHASE_DEFERRED);
- timevar_start (TV_PHASE_CGRAPH);
+ timevar_start (TV_PHASE_OPT_GEN);
/* We're done parsing; proceed to optimize and emit assembly.
FIXME: shouldn't be the front end's responsibility to call this. */
finalize_compilation_unit ();
- timevar_stop (TV_PHASE_CGRAPH);
+ timevar_stop (TV_PHASE_OPT_GEN);
timevar_start (TV_PHASE_DBGINFO);
/* After cgraph has had a chance to emit everything that's going to
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 590eadd..b450775 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2012-06-18 Lawrence Crowl <crowl@google.com>
+
+ * decl2.c (cp_write_global_declarations): Rename use of TV_PHASE_CGRAPH
+ to TV_PHASE_OPT_GEN.
+
2012-06-18 Steven Bosscher <steven@gcc.gnu.org>
* decl.c (finish_function): Remove code conditional on VMS_TARGET.
diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c
index 2e3c9a6..d8c7260 100644
--- a/gcc/cp/decl2.c
+++ b/gcc/cp/decl2.c
@@ -4019,11 +4019,11 @@ cp_write_global_declarations (void)
candidates = collect_candidates_for_java_method_aliases ();
timevar_stop (TV_PHASE_DEFERRED);
- timevar_start (TV_PHASE_CGRAPH);
+ timevar_start (TV_PHASE_OPT_GEN);
finalize_compilation_unit ();
- timevar_stop (TV_PHASE_CGRAPH);
+ timevar_stop (TV_PHASE_OPT_GEN);
timevar_start (TV_PHASE_CHECK_DBGINFO);
/* Now, issue warnings about static, but not defined, functions,
diff --git a/gcc/langhooks.c b/gcc/langhooks.c
index 46c19c3..a34733f 100644
--- a/gcc/langhooks.c
+++ b/gcc/langhooks.c
@@ -317,15 +317,15 @@ write_global_declarations (void)
check_global_declarations (vec, len);
timevar_stop (TV_PHASE_DEFERRED);
- timevar_start (TV_PHASE_CGRAPH);
+ timevar_start (TV_PHASE_OPT_GEN);
/* This lang hook is dual-purposed, and also finalizes the
compilation unit. */
finalize_compilation_unit ();
- timevar_stop (TV_PHASE_CGRAPH);
+ timevar_stop (TV_PHASE_OPT_GEN);
- timevar_start (TV_PHASE_CHECK_DBGINFO);
+ timevar_start (TV_PHASE_DBGINFO);
emit_debug_global_declarations (vec, len);
- timevar_stop (TV_PHASE_CHECK_DBGINFO);
+ timevar_stop (TV_PHASE_DBGINFO);
/* Clean up. */
free (vec);
diff --git a/gcc/lto/ChangeLog b/gcc/lto/ChangeLog
index 06774d8..3f025dc 100644
--- a/gcc/lto/ChangeLog
+++ b/gcc/lto/ChangeLog
@@ -1,3 +1,15 @@
+2012-06-18 Lawrence Crowl <crowl@google.com>
+
+ * lto.c (do_whole_program_analysis): Rename use of TV_PHASE_CGRAPH to
+ TV_PHASE_OPT_GEN. Use new timevar TV_PHASE_STREAM_OUT around the call
+ to lto_wpa_write_files.
+ (lto_main): Rename use of TV_PHASE_CGRAPH to TV_PHASE_OPT_GEN. Move
+ start of TV_PHASE_OPT_GEN to include call to materialize_cgraph. Use
+ TV_PHASE_SETUP for the call to lto_init. Use new timevar
+ TV_PHASE_STREAM_IN around the call to read_cgraph_and_symbols.
+ Turn TV_PHASE_PARSING off then back on again, because LTO is pretending
+ to be a front end, but is not one.
+
2012-05-18 Jan Hubicka <jh@suse.cz>
* lto.c (lto_materialize_constructors_and_inits): Remove.
diff --git a/gcc/lto/lto.c b/gcc/lto/lto.c
index b94c8a7..df5c3df 100644
--- a/gcc/lto/lto.c
+++ b/gcc/lto/lto.c
@@ -1935,7 +1935,8 @@ materialize_cgraph (void)
static void
do_whole_program_analysis (void)
{
- timevar_start (TV_PHASE_CGRAPH);
+ timevar_start (TV_PHASE_OPT_GEN);
+
/* Note that since we are in WPA mode, materialize_cgraph will not
actually read in all the function bodies. It only materializes
the decls and cgraph nodes so that analysis can be performed. */
@@ -1979,23 +1980,27 @@ do_whole_program_analysis (void)
else
lto_balanced_map ();
+ timevar_stop (TV_PHASE_OPT_GEN);
+ timevar_start (TV_PHASE_STREAM_OUT);
+
if (!quiet_flag)
{
fprintf (stderr, "\nStreaming out");
fflush (stderr);
}
lto_wpa_write_files ();
- ggc_collect ();
if (!quiet_flag)
fprintf (stderr, "\n");
+ timevar_stop (TV_PHASE_STREAM_OUT);
+
+ ggc_collect ();
if (post_ipa_mem_report)
{
fprintf (stderr, "Memory consumption after IPA\n");
dump_memory_report (false);
}
- timevar_stop (TV_PHASE_CGRAPH);
/* Show the LTO report before launching LTRANS. */
if (flag_lto_report)
print_lto_report ();
@@ -2075,13 +2080,28 @@ lto_init (void)
void
lto_main (void)
{
+ /* LTO is called as a front end, even though it is not a front end.
+ Because it is called as a front end, TV_PHASE_PARSING and
+ TV_PARSE_GLOBAL are active, and we need to turn them off while
+ doing LTO. Later we turn them back on so they are active up in
+ toplev.c. */
+ timevar_pop (TV_PARSE_GLOBAL);
+ timevar_stop (TV_PHASE_PARSING);
+
+ timevar_start (TV_PHASE_SETUP);
+
/* Initialize the LTO front end. */
lto_init ();
+ timevar_stop (TV_PHASE_SETUP);
+ timevar_start (TV_PHASE_STREAM_IN);
+
/* Read all the symbols and call graph from all the files in the
command line. */
read_cgraph_and_symbols (num_in_fnames, in_fnames);
+ timevar_stop (TV_PHASE_STREAM_IN);
+
if (!seen_error ())
{
/* If WPA is enabled analyze the whole call graph and create an
@@ -2091,13 +2111,15 @@ lto_main (void)
do_whole_program_analysis ();
else
{
+ timevar_start (TV_PHASE_OPT_GEN);
+
materialize_cgraph ();
/* Let the middle end know that we have read and merged all of
the input files. */
- timevar_start (TV_PHASE_CGRAPH);
compile ();
- timevar_stop (TV_PHASE_CGRAPH);
+
+ timevar_stop (TV_PHASE_OPT_GEN);
/* FIXME lto, if the processes spawned by WPA fail, we miss
the chance to print WPA's report, so WPA will call
@@ -2108,6 +2130,10 @@ lto_main (void)
print_lto_report ();
}
}
+
+ /* Here we make LTO pretend to be a parser. */
+ timevar_start (TV_PHASE_PARSING);
+ timevar_push (TV_PARSE_GLOBAL);
}
#include "gt-lto-lto.h"
diff --git a/gcc/timevar.c b/gcc/timevar.c
index 96eb92a..2d1fe72 100644
--- a/gcc/timevar.c
+++ b/gcc/timevar.c
@@ -421,6 +421,57 @@ timevar_cond_stop (timevar_id_t timevar, bool running)
}
+/* Validate that phase times are consistent. */
+
+static void
+validate_phases (FILE *fp)
+{
+ unsigned int /* timevar_id_t */ id;
+ struct timevar_time_def *total = &timevars[TV_TOTAL].elapsed;
+ double phase_user = 0.0;
+ double phase_sys = 0.0;
+ double phase_wall = 0.0;
+ unsigned phase_ggc_mem = 0;
+ static char phase_prefix[] = "phase ";
+ const double tolerance = 1.000001; /* One part in a million. */
+
+ for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id)
+ {
+ struct timevar_def *tv = &timevars[(timevar_id_t) id];
+
+ /* Don't evaluate timing variables that were never used. */
+ if (!tv->used)
+ continue;
+
+ if (strncmp (tv->name, phase_prefix, sizeof phase_prefix - 1) == 0)
+ {
+ phase_user += tv->elapsed.user;
+ phase_sys += tv->elapsed.sys;
+ phase_wall += tv->elapsed.wall;
+ phase_ggc_mem += tv->elapsed.ggc_mem;
+ }
+ }
+
+ if (phase_user > total->user * tolerance
+ || phase_sys > total->sys * tolerance
+ || phase_wall > total->wall * tolerance
+ || phase_ggc_mem > total->ggc_mem * tolerance)
+ {
+
+ fprintf (fp, "Timing error: total of phase timers exceeds total time.\n");
+ if (phase_user > total->user)
+ fprintf (fp, "user %24.18e > %24.18e\n", phase_user, total->user);
+ if (phase_sys > total->sys)
+ fprintf (fp, "sys %24.18e > %24.18e\n", phase_sys, total->sys);
+ if (phase_wall > total->wall)
+ fprintf (fp, "wall %24.18e > %24.18e\n", phase_wall, total->wall);
+ if (phase_ggc_mem > total->ggc_mem)
+ fprintf (fp, "ggc_mem %24u > %24u\n", phase_ggc_mem, total->ggc_mem);
+ gcc_unreachable ();
+ }
+}
+
+
/* 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. */
@@ -535,6 +586,8 @@ timevar_print (FILE *fp)
#endif /* defined (HAVE_USER_TIME) || defined (HAVE_SYS_TIME)
|| defined (HAVE_WALL_TIME) */
+
+ validate_phases (fp);
}
/* Prints a message to stderr stating that time elapsed in STR is
diff --git a/gcc/timevar.def b/gcc/timevar.def
index 1f5ea2a..57d9e3f 100644
--- a/gcc/timevar.def
+++ b/gcc/timevar.def
@@ -33,13 +33,17 @@
/* The total execution time. */
DEFTIMEVAR (TV_TOTAL , "total time")
+/* The compiler phases. These must be mutually exclusive.
+ Ideally, they would sum to near the total time. */
DEFTIMEVAR (TV_PHASE_SETUP , "phase setup")
DEFTIMEVAR (TV_PHASE_PARSING , "phase parsing")
DEFTIMEVAR (TV_PHASE_DEFERRED , "phase lang. deferred")
-DEFTIMEVAR (TV_PHASE_CGRAPH , "phase cgraph")
+DEFTIMEVAR (TV_PHASE_OPT_GEN , "phase opt and generate")
DEFTIMEVAR (TV_PHASE_DBGINFO , "phase debug info")
DEFTIMEVAR (TV_PHASE_CHECK_DBGINFO , "phase check & debug info")
-DEFTIMEVAR (TV_PHASE_GENERATE , "phase generate")
+DEFTIMEVAR (TV_PHASE_LATE_ASM , "phase last asm")
+DEFTIMEVAR (TV_PHASE_STREAM_IN , "phase stream in")
+DEFTIMEVAR (TV_PHASE_STREAM_OUT , "phase stream out")
DEFTIMEVAR (TV_PHASE_FINALIZE , "phase finalize")
/* Concurrent timers, indicated by "|". */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 3f5e61b..2eb75f1 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -558,18 +558,15 @@ compile_file (void)
if (flag_syntax_only || flag_wpa)
return;
- timevar_start (TV_PHASE_GENERATE);
-
ggc_protect_identifiers = false;
/* This must also call finalize_compilation_unit. */
lang_hooks.decls.final_write_globals ();
if (seen_error ())
- {
- timevar_stop (TV_PHASE_GENERATE);
- return;
- }
+ return;
+
+ timevar_start (TV_PHASE_LATE_ASM);
/* Compilation unit is finalized. When producing non-fat LTO object, we are
basically finished. */
@@ -670,7 +667,7 @@ compile_file (void)
assembly file after this point. */
targetm.asm_out.file_end ();
- timevar_stop (TV_PHASE_GENERATE);
+ timevar_stop (TV_PHASE_LATE_ASM);
}
/* Print version information to FILE.