2015-11-13 Tom de Vries <t...@codesourcery.com>
* gdbhooks.py (class PassNames): Handle extra arg NEXT_PASS argument.
* gen-pass-instances.awk (handle_line): Same.
* pass_manager.h (class pass_manager): Define and undefine
NEXT_PASS_WITH_ARG.
* passes.c (opt_pass::set_pass_param): New function.
(pass_manager::pass_manager): Define and undefine NEXT_PASS_WITH_ARG.
* passes.def: Add extra arg to NEXT_PASS (pass_vrp).
* tree-pass.h (gimple_opt::set_pass_param): Declare.
* tree-vrp.c (vrp_finalize, execute_vrp): Add and handle
warn_array_bounds_p parameter.
(pass_vrp::pass_vrp): Initialize warn_array_bounds_p.
(pass_vrp::set_pass_param): New function.
(pass_vrp::execute): Add warn_array_bounds_p arg to execute_vrp call.
(pass_vrp::warn_array_bounds_p): New private member.
---
gcc/gdbhooks.py | 2 +-
gcc/gen-pass-instances.awk | 28 +++++++++++++++++++++++-----
gcc/pass_manager.h | 2 ++
gcc/passes.c | 14 ++++++++++++++
gcc/passes.def | 4 ++--
gcc/tree-pass.h | 1 +
gcc/tree-vrp.c | 20 ++++++++++++++------
7 files changed, 57 insertions(+), 14 deletions(-)
diff --git a/gcc/gdbhooks.py b/gcc/gdbhooks.py
index 2b9a94c..f920392 100644
--- a/gcc/gdbhooks.py
+++ b/gcc/gdbhooks.py
@@ -537,7 +537,7 @@ class PassNames:
self.names = []
with open(os.path.join(srcdir, 'passes.def')) as f:
for line in f:
- m = re.match('\s*NEXT_PASS \((.+)\);', line)
+ m = re.match('\s*NEXT_PASS \(([^,]+).*\);', line)
if m:
self.names.append(m.group(1))
diff --git a/gcc/gen-pass-instances.awk b/gcc/gen-pass-instances.awk
index 9cff429..106a2f6 100644
--- a/gcc/gen-pass-instances.awk
+++ b/gcc/gen-pass-instances.awk
@@ -61,12 +61,14 @@ function handle_line()
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, ",");
- # Set pass_name argument
- pass_name = args_str;
+ # Set pass_name argument, an optional with_arg argument
+ pass_name = args[1];
+ with_arg = args[2];
- # Find call expression prefix (until and including called function)
- len_of_prefix = args_start_at - 1 - len_of_open;
+ # Find call expression prefix
+ len_of_prefix = call_starts_at - 1;
prefix = substr(line, 1, len_of_prefix);
# Find call expression postfix
@@ -82,7 +84,23 @@ function handle_line()
pass_num = pass_counts[pass_name];
# Print call expression with extra pass_num argument
- printf "%s(%s, %s)%s\n", prefix, pass_name, pass_num, postfix;
+ printf "%s", prefix;
+ if (with_arg)
+ {
+ printf "NEXT_PASS_WITH_ARG";
+ }
+ else
+ {
+ printf "NEXT_PASS";
+ }
+ printf " (";
+ printf "%s", pass_name;
+ printf ", %s", pass_num;
+ if (with_arg)
+ {
+ printf ", %s", with_arg;
+ }
+ printf ")%s\n", postfix;
}
{ handle_line() }
diff --git a/gcc/pass_manager.h b/gcc/pass_manager.h
index 7d539e4..a8199e2 100644
--- a/gcc/pass_manager.h
+++ b/gcc/pass_manager.h
@@ -120,6 +120,7 @@ private:
#define PUSH_INSERT_PASSES_WITHIN(PASS)
#define POP_INSERT_PASSES()
#define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM
+#define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM)
#define TERMINATE_PASS_LIST()
#include "pass-instances.def"
@@ -128,6 +129,7 @@ private:
#undef PUSH_INSERT_PASSES_WITHIN
#undef POP_INSERT_PASSES
#undef NEXT_PASS
+#undef NEXT_PASS_WITH_ARG
#undef TERMINATE_PASS_LIST
}; // class pass_manager
diff --git a/gcc/passes.c b/gcc/passes.c
index dd8d00a..e634c5c 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -81,6 +81,13 @@ opt_pass::clone ()
internal_error ("pass %s does not support cloning", name);
}
+void
+opt_pass::set_pass_param (unsigned int, bool)
+{
+ internal_error ("pass %s needs a set_pass_param implementation to handle the"
+ " extra argument in NEXT_PASS", name);
+}