public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
From: David Malcolm <dmalcolm@redhat.com>
To: gcc-patches@gcc.gnu.org
Cc: David Malcolm <dmalcolm@redhat.com>
Subject: [PATCH 02/11] Generate pass-instances.def
Date: Fri, 26 Jul 2013 15:46:00 -0000	[thread overview]
Message-ID: <1374851081-32153-3-git-send-email-dmalcolm@redhat.com> (raw)
In-Reply-To: <1374851081-32153-1-git-send-email-dmalcolm@redhat.com>

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

  parent reply	other threads:[~2013-07-26 15:33 UTC|newest]

Thread overview: 74+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-07-26 15:05 [PATCH 00/11] Rewrite of pass management David Malcolm
2013-07-26 15:05 ` [PATCH 01/11] Introduce beginnings of a pipeline class David Malcolm
2013-07-29 20:00   ` Jeff Law
2013-07-30 19:02     ` [Committed] Introduce beginnings of gcc::pass_manager class (was Re: [PATCH 01/11] Introduce beginnings of a pipeline class.) David Malcolm
2013-07-26 15:05 ` [PATCH 04/11] Automated conversion of passes to C++ classes David Malcolm
2013-07-26 15:05 ` [PATCH 10/11] Make gcc::context be GC-managed David Malcolm
2013-08-01 21:28   ` Richard Henderson
2013-08-02 18:31     ` David Malcolm
2013-08-03  0:43       ` Updated patch 10 (was Re: [PATCH 10/11] Make gcc::context be GC-managed) David Malcolm
2013-08-03 18:19         ` Richard Henderson
2013-08-20  0:55           ` David Malcolm
2013-07-26 15:05 ` [PATCH 08/11] Example of converting global state to per-pass state David Malcolm
2013-08-01 20:58   ` Richard Henderson
2013-08-13  0:46     ` David Malcolm
2013-07-26 15:05 ` [PATCH 05/11] Add -fno-rtti when building plugins David Malcolm
2013-07-29 20:24   ` Jeff Law
2013-07-26 15:05 ` [PATCH 06/11] Rewrite how instances of passes are cloned David Malcolm
2013-08-01 17:55   ` David Malcolm
2013-08-01 18:11     ` David Malcolm
2013-08-01 20:56     ` Richard Henderson
2013-07-26 15:05 ` [PATCH 07/11] Introduce virtual functions in testsuite/gcc.dg/plugin/one_time_plugin.c David Malcolm
2013-08-01 20:48   ` Richard Henderson
2013-08-13  0:42     ` David Malcolm
2013-07-26 15:05 ` [PATCH 03/11] Handwritten part of conversion of passes to C++ classes David Malcolm
2013-07-28  9:12   ` Basile Starynkevitch
2013-07-29 15:43     ` David Malcolm
2013-07-29 22:39   ` Jeff Law
2013-08-01 17:13     ` [PATCH 3.1/11] Explicitly initialize the macro-generated pass fields (was Re: [PATCH 03/11] Handwritten part of conversion of passes to C++ classes) David Malcolm
2013-08-03  0:39       ` David Malcolm
2013-08-03 17:59         ` Richard Henderson
2013-08-05 21:03     ` Passes are now C++ classes " David Malcolm
2013-08-06 15:16       ` Steve Ellcey
2013-08-06 17:55         ` [Patch] Unbreak build on mips (was Re: Passes are now C++ classes (was Re: [PATCH 03/11] Handwritten part of conversion of passes to C++ classes)) David Malcolm
2013-08-06 18:12           ` Richard Sandiford
2013-08-06 18:52             ` David Malcolm
2013-08-07 13:10         ` Passes are now C++ classes (was Re: [PATCH 03/11] Handwritten part of conversion of passes to C++ classes) Eric Botcazou
2013-08-06 19:12       ` Basile Starynkevitch
2024-06-28 13:06   ` Handle 'NUM' in 'PUSH_INSERT_PASSES_WITHIN' (was: " Thomas Schwinge
2013-07-26 15:05 ` [PATCH 11/11] Make opt_pass and gcc::pipeline be GC-managed David Malcolm
2013-07-27 18:45   ` Bernhard Reutner-Fischer
2013-08-01 21:45   ` Richard Henderson
2013-08-02 19:08     ` David Malcolm
2013-08-02 20:01       ` Richard Henderson
2013-08-02 21:53         ` David Malcolm
2013-08-03  0:21           ` Richard Henderson
2013-08-27 10:07             ` Richard Biener
2013-08-03  0:48         ` Updated patch (was Re: [PATCH 11/11] Make opt_pass and gcc::pipeline be GC-managed) David Malcolm
2013-08-03 18:39           ` Richard Henderson
2013-08-05 15:18             ` David Malcolm
2013-08-05 16:59               ` Richard Henderson
2013-08-05 17:28                 ` David Malcolm
2013-08-16 15:33                 ` v3 of " David Malcolm
2013-08-19 17:57                   ` Richard Henderson
2013-08-20  0:59                     ` David Malcolm
2013-07-26 15:29 ` [PATCH 09/11] Support "gcc" namespace in gengtype David Malcolm
2013-08-01 21:01   ` Richard Henderson
2013-08-16 19:53     ` David Malcolm
2013-07-26 15:33 ` [PATCH 02/11] Generate pass-instances.def David Malcolm
2013-07-26 15:46 ` David Malcolm [this message]
2013-07-29 20:03   ` Jeff Law
2013-07-31  3:24     ` David Malcolm
2013-07-31  8:53       ` Build broken (was: [PATCH 02/11] Generate pass-instances.def) Jan-Benedict Glaw
2013-07-31  9:37         ` Jan-Benedict Glaw
2013-07-31 10:06         ` Jan-Benedict Glaw
2013-07-31 15:58           ` David Malcolm
2013-07-31 16:18             ` Jan-Benedict Glaw
2013-07-31 16:26               ` David Malcolm
2013-07-31 16:50                 ` Jan-Benedict Glaw
2024-06-28 12:13   ` Rewrite usage comment at the top of 'gcc/passes.def' " Thomas Schwinge
2024-06-28 12:57     ` Richard Biener
2013-07-29 11:10 ` [PATCH 00/11] Rewrite of pass management Richard Earnshaw
2013-07-29 15:32   ` David Malcolm
2013-07-29 16:33     ` Mike Stump
2013-07-29 16:37     ` Diego Novillo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1374851081-32153-3-git-send-email-dmalcolm@redhat.com \
    --to=dmalcolm@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).