]> git.saurik.com Git - bison.git/blobdiff - src/main.c
Require default %destructor/%printer to be declared using
[bison.git] / src / main.c
index a4a9871fdbe6dc62695fbba89d22b56d06de39e4..69e72fec31865e402182009734ffa1ed5fe453d7 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 <malloc.h>
-#include <sys/times.h>
+#include "reader.h"
+#include "reduce.h"
+#include "scan-gram.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;
 
-static void
-stage (const char *title)
-{
-  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);
-}
+
 
 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
      lookahead is not enough to disambiguate the parsing.  In file
      conflicts.  Also resolve s/r conflicts based on precedence
      declarations.  */
   /* 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 ();
   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 ();
+  /* Lookahead 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;
 }
 }