diff options
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/Makefile.in | 6 | ||||
-rw-r--r-- | gcc/gen-pass-instances.awk | 66 | ||||
-rw-r--r-- | gcc/passes.c | 4 |
4 files changed, 85 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3c8c2e5e99a..d8bc3c88618 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 3f8bd70afca..40ad19da085 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 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() } diff --git a/gcc/passes.c b/gcc/passes.c index b8ab1e88b7a..a43a58809af 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 |