Introduce gen-pass-instances.awk and pass-instances.def
authorDavid Malcolm <dmalcolm@redhat.com>
Wed, 31 Jul 2013 00:48:03 +0000 (00:48 +0000)
committerDavid Malcolm <dmalcolm@gcc.gnu.org>
Wed, 31 Jul 2013 00:48:03 +0000 (00:48 +0000)
Introduce a new gen-pass-instances.awk script, and use it at build time
to make a pass-instances.def from passes.def.

gcc/

* Makefile.in (pass-instances.def): New.
(passes.o): Replace dependency on passes.def with one on
pass-instances.def

* gen-pass-instances.awk: New.

* passes.c (pass_manager::pass_manager): Use pass-instances.def
rather than passes.def, updating local definition of NEXT_PASS
macro to add an extra NUM parameter (currently unused).

From-SVN: r201359

gcc/ChangeLog
gcc/Makefile.in
gcc/gen-pass-instances.awk [new file with mode: 0644]
gcc/passes.c

index 3c8c2e5..d8bc3c8 100644 (file)
@@ -1,3 +1,15 @@
+2013-07-31  David Malcolm  <dmalcolm@redhat.com>
+
+       * Makefile.in (pass-instances.def): New.
+       (passes.o): Replace dependency on passes.def with one on
+       pass-instances.def
+
+       * gen-pass-instances.awk: New.
+
+       * passes.c (pass_manager::pass_manager): Use pass-instances.def
+       rather than passes.def, updating local definition of NEXT_PASS
+       macro to add an extra NUM parameter (currently unused).
+
 2013-07-30  David Malcolm  <dmalcolm@redhat.com>
 
        * Makefile.in (PASS_MANAGER_H): New.
index 3f8bd70..40ad19d 100644 (file)
@@ -2737,6 +2737,10 @@ toplev.o : toplev.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
 
 hwint.o : hwint.c $(CONFIG_H) $(SYSTEM_H) $(DIAGNOSTIC_CORE_H)
 
+pass-instances.def: $(srcdir)/passes.def $(srcdir)/gen-pass-instances.awk
+       $(AWK) -f $(srcdir)/gen-pass-instances.awk \
+         $(srcdir)/passes.def > pass-instances.def
+
 passes.o : passes.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
    $(RTL_H) $(FUNCTION_H) $(FLAGS_H) $(INPUT_H) $(INSN_ATTR_H) output.h \
    $(DIAGNOSTIC_CORE_H) debug.h insn-config.h intl.h $(RECOG_H) toplev.h \
@@ -2747,7 +2751,7 @@ passes.o : passes.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(TREE_H) \
    hosthooks.h $(CGRAPH_H) $(COVERAGE_H) $(TREE_PASS_H) $(TREE_DUMP_H) \
    $(GGC_H) $(OPTS_H) $(TREE_FLOW_H) $(TREE_INLINE_H) \
    gt-passes.h $(DF_H) $(PREDICT_H) $(LTO_STREAMER_H) \
-   $(PLUGIN_H) $(IPA_UTILS_H) passes.def \
+   $(PLUGIN_H) $(IPA_UTILS_H) pass-instances.def \
    $(CONTEXT_H) $(PASS_MANAGER_H)
 
 plugin.o : plugin.c $(PLUGIN_H) $(CONFIG_H) $(SYSTEM_H) coretypes.h \
diff --git a/gcc/gen-pass-instances.awk b/gcc/gen-pass-instances.awk
new file mode 100644 (file)
index 0000000..41b5e75
--- /dev/null
@@ -0,0 +1,66 @@
+#  Copyright (C) 2013 Free Software Foundation, Inc.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 3, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# This Awk script takes passes.def and writes pass-instances.def,
+# counting the instances of each kind of pass, adding an instance number
+# to everywhere that NEXT_PASS is used.
+#
+# For example, the single-instanced pass:
+#     NEXT_PASS (pass_warn_unused_result);
+# becomes this in the output:
+#     NEXT_PASS (pass_warn_unused_result, 1);
+#
+# The various instances of
+#   NEXT_PASS (pass_copy_prop);
+# become:
+#   NEXT_PASS (pass_copy_prop, 1);
+# through:
+#   NEXT_PASS (pass_copy_prop, 8);
+# (currently there are 8 instances of that pass)
+
+# Usage: awk -f gen-pass-instances.awk passes.def
+
+BEGIN {
+       print "/* This file is auto-generated by gen-pass-instances.awk";
+       print "   from passes.def.  */";
+}
+
+function handle_line()
+{
+       line = $0;
+       where = match(line, /NEXT_PASS \((.+)\)/)
+       if (where != 0)
+       {
+               len_of_start = length("NEXT_PASS (")
+               len_of_end = length(")")
+               len_of_pass_name = RLENGTH - (len_of_start + len_of_end)
+               line_length = length(line)
+               pass_starts_at = where + len_of_start
+               pass_name = substr(line, pass_starts_at, len_of_pass_name)
+               if (pass_name in pass_counts)
+                       pass_counts[pass_name]++;
+               else
+                       pass_counts[pass_name] = 1;
+               printf "%s, %s%s\n",
+                       substr(line, 0, pass_starts_at + len_of_pass_name - 1),
+                       pass_counts[pass_name],
+                       substr(line, pass_starts_at + len_of_pass_name);
+       } else {
+               print line;
+       }
+}
+
+{ handle_line() }
index b8ab1e8..a43a588 100644 (file)
@@ -1315,12 +1315,12 @@ pass_manager::pass_manager (context *ctxt)
 #define POP_INSERT_PASSES() \
   }
 
-#define NEXT_PASS(PASS)  (p = next_pass_1 (p, &((PASS).pass)))
+#define NEXT_PASS(PASS, NUM)  (p = next_pass_1 (p, &((PASS).pass)))
 
 #define TERMINATE_PASS_LIST() \
   *p = NULL;
 
-#include "passes.def"
+#include "pass-instances.def"
 
 #undef INSERT_PASSES_AFTER
 #undef PUSH_INSERT_PASSES_WITHIN