Steal GCC's --time-report support.

* lib/timevar.c, lib/timevar.h, lib/timevar.def: New,
stolen/adjusted from GCC.
* m4/stage.m4: Remove time related checks.
* m4/timevar.m4: New.
* configure.in: Adjust.
* src/system.h: Adjust to using timevar.h.
* src/getargs.h, src/getargs.c: Support trace_time for
--trace=time.
* src/main.c (stage): Remove.
(main): Replace `stage' invocations with timevar calls.
* src/output.c: Insert pertinent timevar calls.
This commit is contained in:
Akim Demaille
2002-07-31 19:52:13 +00:00
parent 273a74fa89
commit 1509d42fcb
14 changed files with 821 additions and 56 deletions

View File

@@ -55,8 +55,9 @@ static const char * const trace_args[] =
"automaton - contruction of the automaton",
"bitsets - use of bitsets",
"grammar - reading, reducing of the grammar",
"resource - time and memory (where available)",
"resource - memory consumption (where available)",
"sets - grammar sets: firsts, nullable etc.",
"time - time consumption",
"tools - m4 invocation and preserve the temporary file",
"all - all of the above",
0
@@ -70,6 +71,7 @@ static const int trace_types[] =
trace_grammar,
trace_resource,
trace_sets,
trace_time,
trace_tools,
trace_all
};

View File

@@ -45,6 +45,7 @@ enum trace_e
trace_tools = 1 << 3,
trace_automaton = 1 << 4,
trace_grammar = 1 << 5,
trace_time = 1 << 6,
trace_all = ~0
};
extern int trace_flag;

View File

@@ -44,27 +44,6 @@
char *program_name;
/*--------------------------.
| Tracking space and time. |
`--------------------------*/
static void
stage (const char *title)
{
#if HAVE_MALLINFO && HAVE_STRUCT_MALLINFO & HAVE_TIMES & HAVE_STRUCT_TMS
if (trace_flag & trace_resource)
{
struct mallinfo minfo = mallinfo ();
struct tms tinfo;
times (&tinfo);
fprintf (stderr, "STAGE: %30s: %9d (%9d): %ldu %lds\n",
title,
minfo.uordblks, minfo.arena,
tinfo.tms_utime, tinfo.tms_stime);
}
#endif
}
int
main (int argc, char *argv[])
@@ -76,58 +55,69 @@ main (int argc, char *argv[])
getargs (argc, argv);
time_report = trace_flag & trace_time;
init_timevar ();
timevar_start (TV_TOTAL);
if (trace_flag & trace_bitsets)
bitset_stats_enable ();
muscle_init ();
stage ("initialized muscles");
/* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE
and FATTRS. In file reader.c. The other parts are recorded in
the grammar; see gram.h. */
reader ();
stage ("reader");
timevar_push (TV_READER);
reader ();
timevar_pop (TV_READER);
if (complain_message_count)
exit (1);
/* Find useless nonterminals and productions and reduce the grammar. */
timevar_push (TV_REDUCE);
reduce_grammar ();
stage ("reduced grammar");
timevar_pop (TV_REDUCE);
/* Record other info about the grammar. In files derives and
nullable. */
timevar_push (TV_SETS);
set_derives ();
set_nullable ();
timevar_pop (TV_SETS);
/* Convert to nondeterministic finite state machine. In file LR0.
See state.h for more info. */
timevar_push (TV_LR0);
generate_states ();
timevar_pop (TV_LR0);
stage ("generated states");
/* make it deterministic. In file lalr. */
timevar_push (TV_LALR);
lalr ();
timevar_pop (TV_LALR);
stage ("lalred");
/* Find and record any conflicts: places where one token of
lookahead is not enough to disambiguate the parsing. In file
conflicts. Also resolve s/r conflicts based on precedence
declarations. */
timevar_push (TV_CONFLICTS);
conflicts_solve ();
conflicts_print ();
timevar_pop (TV_CONFLICTS);
stage ("solved conflicts");
/* Output file names. */
compute_output_file_names ();
/* Output the detailed report on the grammar. */
if (report_flag)
print_results ();
{
timevar_push (TV_REPORT);
print_results ();
timevar_pop (TV_REPORT);
}
stage ("printed results");
/* Stop if there were errors, to avoid trashing previous output
files. */
if (complain_message_count)
@@ -135,39 +125,42 @@ main (int argc, char *argv[])
/* Output the VCG graph. */
if (graph_flag)
print_graph ();
{
timevar_push (TV_GRAPH);
print_graph ();
timevar_pop (TV_GRAPH);
}
/* Output the tables and the parser to ftable. In file output. */
timevar_push (TV_PARSER);
output ();
stage ("made output");
timevar_pop (TV_PARSER);
timevar_push (TV_FREE);
states_free ();
stage ("freed states");
reduce_free ();
stage ("freed reduce");
conflicts_free ();
stage ("freed conflicts");
free_nullable ();
stage ("freed nullable");
free_derives ();
stage ("freed derives");
grammar_free ();
stage ("freed grammar");
/* The scanner memory cannot be released right after parsing, as it
contains things such as user actions, prologue, epilogue etc. */
scanner_free ();
stage ("freed scanner");
muscle_free ();
stage ("freed muscles");
/* If using alloca.c, flush the alloca'ed memory for the benefit of
people running Bison as a library in IDEs. */
#if C_ALLOCA
alloca (0);
#endif
timevar_pop (TV_FREE);
if (trace_flag & trace_bitsets)
bitset_stats_dump (stderr);
/* Stop timing and print the times. */
timevar_stop (TV_TOTAL);
timevar_print (stderr);
return complain_message_count ? EXIT_FAILURE : EXIT_SUCCESS;
}

View File

@@ -1289,6 +1289,7 @@ output_check (void)
XFREE (check);
}
/*-----------------------------------------------------------------.
| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable |
| and yycheck. |
@@ -1378,7 +1379,9 @@ output_skeleton (void)
fputs ("m4_divert_push(0)dnl\n", out);
xfclose (out);
timevar_push (TV_M4);
m4_invoke (tempfile);
timevar_pop (TV_M4);
/* If `debugging', keep this file alive. */
if (!(trace_flag & trace_tools))
@@ -1451,7 +1454,9 @@ output (void)
prepare_tokens ();
prepare_rules ();
prepare_states ();
timevar_push (TV_ACTIONS);
prepare_actions ();
timevar_pop (TV_ACTIONS);
prepare ();

View File

@@ -110,10 +110,12 @@ char *xstrndup PARAMS ((const char *s, size_t n));
#endif
/* Find `times' where available. */
#if HAVE_SYS_TIMES_H
# include <sys/times.h>
#endif
/*----------------.
| Using timevar. |
`----------------*/
#include "timevar.h"
extern int time_report;
/*---------------------.