]> git.saurik.com Git - bison.git/blobdiff - src/main.c
* src/Makefile.am (BUILT_SOURCES): Fix the trailing backslash.
[bison.git] / src / main.c
index d6a691af55dc036d4bdcd9f7c72851c38bb69719..4d7fd3319085bdf3c1d1f477393482c3d6511f22 100644 (file)
@@ -1,5 +1,7 @@
-/* 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,
+   2006
    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.  |
-`--------------------------*/
-
-#if HAVE_MALLOC_H & HAVE_SYS_TIMES_H
-# include <malloc.h>
-# include <sys/times.h>
-#endif
-
-static void
-stage (const char *title)
-{
-#if HAVE_MALLOC_H & HAVE_SYS_TIMES_H
-  if (trace_flag)
-    {
-      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);
 
-  if (trace_flag)
+  timevar_report = trace_flag & trace_time;
+  init_timevar ();
+  timevar_start (TV_TOTAL);
+
+  if (trace_flag & trace_bitsets)
     bitset_stats_enable ();
 
   muscle_init ();
 
     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.  */
 
   /* 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");
+  gram_scanner_free ();
   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
-
-  if (trace_flag)
+  uniqstrs_free ();
+  timevar_pop (TV_FREE);
+
+  if (trace_flag & trace_bitsets)
     bitset_stats_dump (stderr);
 
     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;
 }
 }