aboutsummaryrefslogtreecommitdiff
path: root/gcc/passes.c
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2017-01-06 14:15:20 +0000
committerDavid Malcolm <dmalcolm@gcc.gnu.org>2017-01-06 14:15:20 +0000
commitbad86e8d42c6572dbcf89814597551823aca2e8d (patch)
tree82963fd6d4852b957b28e06ecf430bb561544a6e /gcc/passes.c
parent5406184ce77c6362c5cd513b1c4f1c05b5046a6d (diff)
downloadgcc-bad86e8d42c6572dbcf89814597551823aca2e8d.zip
gcc-bad86e8d42c6572dbcf89814597551823aca2e8d.tar.gz
gcc-bad86e8d42c6572dbcf89814597551823aca2e8d.tar.bz2
passes.c: split out pass-skipping logic into subroutines
gcc/ChangeLog: * passes.c (execute_one_pass): Split out pass-skipping logic into... (determine_pass_name_match): ...this new function and... (should_skip_pass_p): ...this new function. From-SVN: r244160
Diffstat (limited to 'gcc/passes.c')
-rw-r--r--gcc/passes.c97
1 files changed, 63 insertions, 34 deletions
diff --git a/gcc/passes.c b/gcc/passes.c
index 32d964b..31262ed 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -2273,6 +2273,67 @@ override_gate_status (opt_pass *pass, tree func, bool gate_status)
return gate_status;
}
+/* Determine if PASS_NAME matches CRITERION.
+ Not a pure predicate, since it can update CRITERION, to support
+ matching the Nth invocation of a pass.
+ Subroutine of should_skip_pass_p. */
+
+static bool
+determine_pass_name_match (const char *pass_name, char *criterion)
+{
+ size_t namelen = strlen (pass_name);
+ if (! strncmp (pass_name, criterion, namelen))
+ {
+ /* The following supports starting with the Nth invocation
+ of a pass (where N does not necessarily is equal to the
+ dump file suffix). */
+ if (criterion[namelen] == '\0'
+ || (criterion[namelen] == '1'
+ && criterion[namelen + 1] == '\0'))
+ return true;
+ else
+ {
+ if (criterion[namelen + 1] == '\0')
+ --criterion[namelen];
+ return false;
+ }
+ }
+ else
+ return false;
+}
+
+/* For skipping passes until "startwith" pass.
+ Return true iff PASS should be skipped.
+ Clear cfun->pass_startwith when encountering the "startwith" pass,
+ so that all subsequent passes are run. */
+
+static bool
+should_skip_pass_p (opt_pass *pass)
+{
+ if (!cfun)
+ return false;
+ if (!cfun->pass_startwith)
+ return false;
+
+ /* We can't skip the lowering phase yet -- ideally we'd
+ drive that phase fully via properties. */
+ if (!(cfun->curr_properties & PROP_ssa))
+ return false;
+
+ if (determine_pass_name_match (pass->name, cfun->pass_startwith))
+ {
+ cfun->pass_startwith = NULL;
+ return false;
+ }
+
+ /* And also run any property provider. */
+ if (pass->properties_provided != 0)
+ return false;
+
+ /* If we get here, then we have a "startwith" that we haven't seen yet;
+ skip the pass. */
+ return true;
+}
/* Execute PASS. */
@@ -2313,40 +2374,8 @@ execute_one_pass (opt_pass *pass)
return false;
}
- /* For skipping passes until startwith pass */
- if (cfun
- && cfun->pass_startwith
- /* But we can't skip the lowering phase yet -- ideally we'd
- drive that phase fully via properties. */
- && (cfun->curr_properties & PROP_ssa))
- {
- size_t namelen = strlen (pass->name);
- /* We have to at least start when we leave SSA. */
- if (pass->properties_destroyed & PROP_ssa)
- cfun->pass_startwith = NULL;
- else if (! strncmp (pass->name, cfun->pass_startwith, namelen))
- {
- /* The following supports starting with the Nth invocation
- of a pass (where N does not necessarily is equal to the
- dump file suffix). */
- if (cfun->pass_startwith[namelen] == '\0'
- || (cfun->pass_startwith[namelen] == '1'
- && cfun->pass_startwith[namelen + 1] == '\0'))
- cfun->pass_startwith = NULL;
- else
- {
- if (cfun->pass_startwith[namelen + 1] != '\0')
- return true;
- --cfun->pass_startwith[namelen];
- return true;
- }
- }
- /* And also run any property provider. */
- else if (pass->properties_provided != 0)
- ;
- else
- return true;
- }
+ if (should_skip_pass_p (pass))
+ return true;
/* Pass execution event trigger: useful to identify passes being
executed. */