This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH 02/11] Generate 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.

An example of the result can be seen at:

  http://dmalcolm.fedorapeople.org/gcc/2013-07-25/pass-instances.def

The generated pass-instances.def contains similar content to passes.def,
but the pass instances within it are explicitly numbered, so that e.g.
the third instance of:

  NEXT_PASS (pass_copy_prop)

becomes:

  NEXT_PASS (pass_copy_prop, 3)

This is needed by a subsequent patch so that we can create fields within
the pipeline class for each pass instance, where we need unique field
names to avoid a syntax error.  For example, all 8 instances of
pass_copy_prop will need different names. e.g.

   opt_pass *pass_copy_prop_1;
   ...
   opt_pass *pass_copy_prop_8;

I have successfully tested the script with gawk, with gawk using the
"-c" compatibility option to turn off gawk extensions, and with busybox
awk (versions tested were gawk-4.0.1 and busybox-1.19.4).

This patch replaces a previous attempt at this:
  http://gcc.gnu.org/ml/gcc-patches/2013-07/msg00686.html
which converted multi-instance passes to using a new NEXT_PASS_NUM
macro, requiring the instance numbering within passes.def to be
maintained by hand.

In the new approach, the instance numbers are generated automatically,
and are visible at build time, giving the uniqueness needed by later
patches, whilst avoiding manual maintenance work, and also making it
easy to see the instance numbering (by inspecting the generated
pass-instances.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 (pipeline::pipeline): Use pass-instances.def rather
	than passes.def, updating local definition of NEXT_PASS macro
	to add an extra NUM parameter (currently unused).
---
 gcc/Makefile.in            |  6 ++++-
 gcc/gen-pass-instances.awk | 66 ++++++++++++++++++++++++++++++++++++++++++++++
 gcc/passes.c               |  4 +--
 3 files changed, 73 insertions(+), 3 deletions(-)
 create mode 100644 gcc/gen-pass-instances.awk

diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index 0b28c2d..6d1f32c 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) $(PIPELINE_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 e625bf2..1bca68e 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -1315,12 +1315,12 @@ pipeline::pipeline (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
-- 
1.7.11.7


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]