aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2013-07-31 00:48:03 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2013-07-31 00:48:03 +0000
commita167b052dfe9a8509bb23c374ffaeee953df0917 (patch)
treefd69d628e5fda1a2454b09e4278c6a6dcf98db83
parentabf1719efeb6782e8a596ecbc36557890c688582 (diff)
downloadgcc-a167b052dfe9a8509bb23c374ffaeee953df0917.zip
gcc-a167b052dfe9a8509bb23c374ffaeee953df0917.tar.gz
gcc-a167b052dfe9a8509bb23c374ffaeee953df0917.tar.bz2
Introduce gen-pass-instances.awk and pass-instances.def
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
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/Makefile.in6
-rw-r--r--gcc/gen-pass-instances.awk66
-rw-r--r--gcc/passes.c4
4 files changed, 85 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3c8c2e5..d8bc3c8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 3f8bd70..40ad19d 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -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
index 0000000..41b5e75
--- /dev/null
+++ b/gcc/gen-pass-instances.awk
@@ -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() }
diff --git a/gcc/passes.c b/gcc/passes.c
index b8ab1e8..a43a588 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -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