]> git.saurik.com Git - bison.git/blobdiff - src/main.c
* bootstrap: Comment out the AM_CPPFLAGS line, since we don't use
[bison.git] / src / main.c
index b769f2c7fd39d080df2d135aed7e6180d502d1dd..8769fef8aa0ae2ab95b300a2da2d9aac8fffaca4 100644 (file)
@@ -1,5 +1,6 @@
-/* Top level entry point of bison,
-   Copyright 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002
+/* Top level entry point of Bison.
+
+   Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
    Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
    You should have received a copy of the GNU General Public License
    along with Bison; see the file COPYING.  If not, write to
 
    You should have received a copy of the GNU General Public License
    along with Bison; see the file COPYING.  If not, write to
-   the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
+   the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 
+#include <config.h>
 #include "system.h"
 #include "system.h"
-#include "bitset_stats.h"
-#include "bitset.h"
-#include "getargs.h"
-#include "symtab.h"
-#include "gram.h"
-#include "files.h"
+
+#include <bitset_stats.h>
+#include <bitset.h>
+#include <timevar.h>
+
+#include "LR0.h"
 #include "complain.h"
 #include "complain.h"
+#include "conflicts.h"
 #include "derives.h"
 #include "derives.h"
-#include "output.h"
-#include "reader.h"
+#include "files.h"
+#include "getargs.h"
+#include "gram.h"
 #include "lalr.h"
 #include "lalr.h"
-#include "reduce.h"
+#include "muscle_tab.h"
 #include "nullable.h"
 #include "nullable.h"
+#include "output.h"
 #include "print.h"
 #include "print.h"
-#include "LR0.h"
-#include "conflicts.h"
 #include "print_graph.h"
 #include "print_graph.h"
-#include "muscle_tab.h"
+#include "reader.h"
+#include "reduce.h"
+#include "symtab.h"
+#include "tables.h"
+#include "uniqstr.h"
 
 /* The name this program was run with, for messages.  */
 char *program_name;
 
 
 
 /* The name this program was run with, for messages.  */
 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[])
 {
   program_name = argv[0];
   setlocale (LC_ALL, "");
 
 int
 main (int argc, char *argv[])
 {
   program_name = argv[0];
   setlocale (LC_ALL, "");
-  bindtextdomain (PACKAGE, LOCALEDIR);
-  textdomain (PACKAGE);
+  (void) bindtextdomain (PACKAGE, LOCALEDIR);
+  (void) bindtextdomain ("bison-runtime", LOCALEDIR);
+  (void) textdomain (PACKAGE);
+
+  uniqstrs_new ();
 
   getargs (argc, argv);
 
 
   getargs (argc, argv);
 
+  timevar_report = trace_flag & trace_time;
+  init_timevar ();
+  timevar_start (TV_TOTAL);
+
   if (trace_flag & trace_bitsets)
     bitset_stats_enable ();
 
   muscle_init ();
 
   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.  */
   /* 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);
+  if (complaint_issued)
+    goto finish;
 
   /* Find useless nonterminals and productions and reduce the grammar. */
 
   /* Find useless nonterminals and productions and reduce the grammar. */
+  timevar_push (TV_REDUCE);
   reduce_grammar ();
   reduce_grammar ();
-
-  stage ("reduced grammar");
+  timevar_pop (TV_REDUCE);
 
   /* Record other info about the grammar.  In files derives and
      nullable.  */
 
   /* Record other info about the grammar.  In files derives and
      nullable.  */
-  set_derives ();
-  set_nullable ();
+  timevar_push (TV_SETS);
+  derives_compute ();
+  nullable_compute ();
+  timevar_pop (TV_SETS);
 
   /* Convert to nondeterministic finite state machine.  In file LR0.
      See state.h for more info.  */
 
   /* Convert to nondeterministic finite state machine.  In file LR0.
      See state.h for more info.  */
+  timevar_push (TV_LR0);
   generate_states ();
   generate_states ();
+  timevar_pop (TV_LR0);
 
 
-  stage ("generated states");
   /* make it deterministic.  In file lalr.  */
   /* make it deterministic.  In file lalr.  */
+  timevar_push (TV_LALR);
   lalr ();
   lalr ();
+  timevar_pop (TV_LALR);
 
 
-  stage ("lalred");
   /* Find and record any conflicts: places where one token of
   /* Find and record any conflicts: places where one token of
-     lookahead is not enough to disambiguate the parsing.  In file
+     look-ahead is not enough to disambiguate the parsing.  In file
      conflicts.  Also resolve s/r conflicts based on precedence
      declarations.  */
      conflicts.  Also resolve s/r conflicts based on precedence
      declarations.  */
+  timevar_push (TV_CONFLICTS);
   conflicts_solve ();
   conflicts_print ();
   conflicts_solve ();
   conflicts_print ();
+  timevar_pop (TV_CONFLICTS);
+
+  /* Compute the parser tables.  */
+  timevar_push (TV_ACTIONS);
+  tables_generate ();
+  timevar_pop (TV_ACTIONS);
+
+  grammar_rules_never_reduced_report
+    (_("rule never reduced because of conflicts"));
 
 
-  stage ("solved conflicts");
   /* Output file names. */
   compute_output_file_names ();
 
   /* Output the detailed report on the grammar.  */
   if (report_flag)
   /* 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);
+    }
+
+  /* Output the VCG graph.  */
+  if (graph_flag)
+    {
+      timevar_push (TV_GRAPH);
+      print_graph ();
+      timevar_pop (TV_GRAPH);
+    }
 
 
-  stage ("printed results");
   /* Stop if there were errors, to avoid trashing previous output
      files.  */
   /* Stop if there were errors, to avoid trashing previous output
      files.  */
-  if (complain_message_count)
-    exit (1);
+  if (complaint_issued)
+    goto finish;
 
 
-  /* Output the VCG graph.  */
-  if (graph_flag)
-    print_graph ();
+  /* Look-ahead tokens are no longer needed. */
+  timevar_push (TV_FREE);
+  lalr_free ();
+  timevar_pop (TV_FREE);
 
   /* Output the tables and the parser to ftable.  In file output.  */
 
   /* Output the tables and the parser to ftable.  In file output.  */
+  timevar_push (TV_PARSER);
   output ();
   output ();
-  stage ("made output");
+  timevar_pop (TV_PARSER);
 
 
+  timevar_push (TV_FREE);
+  nullable_free ();
+  derives_free ();
+  tables_free ();
   states_free ();
   states_free ();
-  stage ("freed states");
   reduce_free ();
   reduce_free ();
-  stage ("freed reduce");
   conflicts_free ();
   conflicts_free ();
-  stage ("freed conflicts");
-  free_nullable ();
-  stage ("freed nullable");
-  free_derives ();
-  stage ("freed derives");
   grammar_free ();
   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 ();
 
   /* 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 ();
   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
+  uniqstrs_free ();
+  timevar_pop (TV_FREE);
 
   if (trace_flag & trace_bitsets)
     bitset_stats_dump (stderr);
 
 
   if (trace_flag & trace_bitsets)
     bitset_stats_dump (stderr);
 
-  return complain_message_count ? EXIT_FAILURE : EXIT_SUCCESS;
+ finish:
+
+  /* Stop timing and print the times.  */
+  timevar_stop (TV_TOTAL);
+  timevar_print (stderr);
+
+  return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS;
 }
 }