diff options
author | Jakub Jelinek <jakub@redhat.com> | 2016-10-08 14:04:37 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2016-10-08 14:04:37 +0200 |
commit | 478167be6297adb9774abfea589b6b1d0a7f227e (patch) | |
tree | c64fb4d05bc6d2df0c0fe2e1a7a2146b140e04c9 /gcc/gen-pass-instances.awk | |
parent | ee19ef45ba9dc5a783303e353d538e83dabe3377 (diff) |
gen-pass-instances.awk: Rewritten.
* gen-pass-instances.awk: Rewritten.
* Makefile.in (pass-instances.def): Depend on $(PASSES_EXTRA), pass
$(PASSES_EXTRA) after passes.def to the script.
* config/i386/t-i386 (PASSES_EXTRA): Add i386-passes.def.
* config/i386/i386-passes.def: New file.
* config/i386/i386-protos.h (make_pass_insert_vzeroupper,
make_pass_stv): Declare.
* config/i386/i386.c (pass_stv::pass_stv): Initialize timode_p to
false.
(pass_stv::gate): Depending on timode_p member require TARGET_64BIT
or !TARGET_64BIT.
(pass_stv::clone, pass_stv::set_pass_param): New methods.
(pass_stv::timode_p): New non-static data member.
(ix86_option_override): Don't register passes here.
From-SVN: r240887
Diffstat (limited to 'gcc/gen-pass-instances.awk')
-rw-r--r-- | gcc/gen-pass-instances.awk | 232 |
1 files changed, 177 insertions, 55 deletions
diff --git a/gcc/gen-pass-instances.awk b/gcc/gen-pass-instances.awk index bc82ee94873..6f7794eb402 100644 --- a/gcc/gen-pass-instances.awk +++ b/gcc/gen-pass-instances.awk @@ -17,6 +17,8 @@ # 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. +# Also handle INSERT_PASS_AFTER, INSERT_PASS_BEFORE and REPLACE_PASS +# directives. # # For example, the single-instanced pass: # NEXT_PASS (pass_warn_unused_result); @@ -30,81 +32,201 @@ # through: # NEXT_PASS (pass_copy_prop, 8); # (currently there are 8 instances of that pass) +# +# INSERT_PASS_AFTER (pass_copy_prop, 1, pass_stv); +# will insert +# NEXT_PASS (pass_stv, 1); +# immediately after the NEXT_PASS (pass_copy_prop, 1) line, +# similarly INSERT_PASS_BEFORE inserts immediately before that line. +# REPLACE_PASS (pass_copy_prop, 1, pass_stv, true); +# will replace NEXT_PASS (pass_copy_prop, 1) line with +# NEXT_PASS (pass_stv, 1, true); +# line and renumber all higher pass_copy_prop instances if any. # 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. */"; + print "/* This file is auto-generated by gen-pass-instances.awk"; + print " from passes.def. */"; + lineno = 1; } -function handle_line() +function parse_line(line, fnname, len_of_call, len_of_start, + len_of_open, len_of_close, + len_of_args, args_start_at, + args_str, len_of_prefix, + call_starts_at, + postfix_starts_at) { - line = $0; - - # Find call expression. - call_starts_at = match(line, /NEXT_PASS \(.+\)/); - if (call_starts_at == 0) - { - print line; - return; - } + # Find call expression. + call_starts_at = match(line, fnname " \\(.+\\)"); + if (call_starts_at == 0) + return 0; + + # Length of the call expression. + len_of_call = RLENGTH; + + len_of_start = length(fnname " ("); + len_of_open = length("("); + len_of_close = length(")"); + + # Find arguments + len_of_args = len_of_call - (len_of_start + len_of_close); + args_start_at = call_starts_at + len_of_start; + args_str = substr(line, args_start_at, len_of_args); + split(args_str, args, ","); + + # Find call expression prefix + len_of_prefix = call_starts_at - 1; + prefix = substr(line, 1, len_of_prefix); + + # Find call expression postfix + postfix_starts_at = call_starts_at + len_of_call; + postfix = substr(line, postfix_starts_at); + return 1; +} - # Length of the call expression. - len_of_call = RLENGTH; +function adjust_linenos(above, increment, p, i) +{ + for (p in pass_lines) + if (pass_lines[p] >= above) + pass_lines[p] += pass_lines[p]; + if (increment > 0) + for (i = lineno - 1; i >= above; i--) + lines[i + increment] = lines[i]; + else + for (i = above; i < lineno; i++) + lines[i + increment] = lines[i]; + lineno += increment; +} - len_of_start = length("NEXT_PASS ("); - len_of_open = length("("); - len_of_close = length(")"); +function insert_remove_pass(line, fnname) +{ + parse_line($0, fnname); + pass_name = args[1]; + if (pass_name == "PASS") + return 1; + pass_num = args[2] + 0; + new_line = prefix "NEXT_PASS (" args[3]; + if (args[4]) + new_line = new_line ", " args[4]; + new_line = new_line ")" postfix; + if (!pass_lines[pass_name, pass_num]) + { + print "ERROR: Can't locate instance of the pass mentioned in " fnname; + return 1; + } + return 0; +} - # Find arguments - len_of_args = len_of_call - (len_of_start + len_of_close); - args_start_at = call_starts_at + len_of_start; - args_str = substr(line, args_start_at, len_of_args); - split(args_str, args, ","); +function insert_pass(line, fnname, after, num) +{ + if (insert_remove_pass(line, fnname)) + return; + num = pass_lines[pass_name, pass_num]; + adjust_linenos(num + after, 1); + pass_name = args[3]; + # Set pass_counts + if (args[3] in pass_counts) + pass_counts[pass_name]++; + else + pass_counts[pass_name] = 1; + + pass_lines[pass_name, pass_counts[pass_name]] = num + after; + lines[num + after] = new_line; +} - # Set pass_name argument, an optional with_arg argument - pass_name = args[1]; - with_arg = args[2]; +function replace_pass(line, fnname, num, i) +{ + if (insert_remove_pass(line, "REPLACE_PASS")) + return; + num = pass_lines[pass_name, pass_num]; + for (i = pass_counts[pass_name]; i > pass_num; i--) + pass_lines[pass_name, i - 1] = pass_lines[pass_name, i]; + delete pass_lines[pass_name, pass_counts[pass_name]]; + if (pass_counts[pass_name] == 1) + delete pass_counts[pass_name]; + else + pass_counts[pass_name]--; + + pass_name = args[3]; + # Set pass_counts + if (args[3] in pass_counts) + pass_counts[pass_name]++; + else + pass_counts[pass_name] = 1; + + pass_lines[pass_name, pass_counts[pass_name]] = num; + lines[num] = new_line; +} - # Find call expression prefix - len_of_prefix = call_starts_at - 1; - prefix = substr(line, 1, len_of_prefix); +/INSERT_PASS_AFTER \(.+\)/ { + insert_pass($0, "INSERT_PASS_AFTER", 1); + next; +} - # Find call expression postfix - postfix_starts_at = call_starts_at + len_of_call; - postfix = substr(line, postfix_starts_at); +/INSERT_PASS_BEFORE \(.+\)/ { + insert_pass($0, "INSERT_PASS_BEFORE", 0); + next; +} - # Set pass_counts - if (pass_name in pass_counts) - pass_counts[pass_name]++; - else - pass_counts[pass_name] = 1; +/REPLACE_PASS \(.+\)/ { + replace_pass($0, "REPLACE_PASS"); + next; +} - pass_num = pass_counts[pass_name]; +{ + ret = parse_line($0, "NEXT_PASS"); + if (ret) + { + pass_name = args[1]; + + # Set pass_counts + if (pass_name in pass_counts) + pass_counts[pass_name]++; + else + pass_counts[pass_name] = 1; + + pass_lines[pass_name, pass_counts[pass_name]] = lineno; + } + lines[lineno++] = $0; +} - # Print call expression with extra pass_num argument - printf "%s", prefix; - if (with_arg) +END { + delete pass_counts; + for (i = 1; i < lineno; i++) + { + ret = parse_line(lines[i], "NEXT_PASS"); + if (ret) { - printf "NEXT_PASS_WITH_ARG"; + # Set pass_name argument, an optional with_arg argument + pass_name = args[1]; + with_arg = args[2]; + + # Set pass_counts + if (pass_name in pass_counts) + pass_counts[pass_name]++; + else + pass_counts[pass_name] = 1; + + pass_num = pass_counts[pass_name]; + + # Print call expression with extra pass_num argument + printf "%s", prefix; + if (with_arg) + printf "NEXT_PASS_WITH_ARG"; + else + printf "NEXT_PASS"; + printf " (%s, %s", pass_name, pass_num; + if (with_arg) + printf ", %s", with_arg; + printf ")%s\n", postfix; } - else - { - printf "NEXT_PASS"; - } - printf " ("; - printf "%s", pass_name; - printf ", %s", pass_num; - if (with_arg) - { - printf ", %s", with_arg; - } - printf ")%s\n", postfix; + else + print lines[i]; + } } -{ handle_line() } - # Local Variables: # mode:awk # c-basic-offset:8 |