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
This commit is contained in:
David Malcolm 2013-07-31 00:48:03 +00:00 committed by David Malcolm
parent abf1719efe
commit a167b052df
4 changed files with 85 additions and 3 deletions

View 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.

View 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 \

View File

@ -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() }

View 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