summaryrefslogtreecommitdiff
path: root/gcc/gen-pass-instances.awk
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/gen-pass-instances.awk')
-rw-r--r--gcc/gen-pass-instances.awk66
1 files changed, 66 insertions, 0 deletions
diff --git a/gcc/gen-pass-instances.awk b/gcc/gen-pass-instances.awk
new file mode 100644
index 00000000000..41b5e75f781
--- /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() }