diff options
author | Josh Stone <jistone@redhat.com> | 2010-03-09 15:32:58 -0800 |
---|---|---|
committer | Josh Stone <jistone@redhat.com> | 2010-03-09 15:32:58 -0800 |
commit | c0f562688ae877000f46058f748a8b986679863e (patch) | |
tree | fc543785fd32f7071ba0b7e0952e3cad9736804c /elaborate.cxx | |
parent | 985adad37f66be2b1796641360296b7632c7f290 (diff) | |
download | systemtap-steved-c0f562688ae877000f46058f748a8b986679863e.tar.gz systemtap-steved-c0f562688ae877000f46058f748a8b986679863e.tar.xz systemtap-steved-c0f562688ae877000f46058f748a8b986679863e.zip |
PR11360: Make @defined and -L play nice
The constant-folding is now enabled for s.listing_mode_vars, despite all
other optimizations being disabled. This is needed so we can prune any
invalid branches that are gated by @defined.
* elaborate.cxx (semantic_pass): Leave the optimization decision to the
optimization passes themselves.
(semantic_pass_optimize1): Predicate most optimizations, but enable the
constant-folding for listing_mode_vars too.
(semantic_pass_optimize2): Predicate all (1) optimizations.
* testsuite/semok/defined_list_vars.stp: New test.
Diffstat (limited to 'elaborate.cxx')
-rw-r--r-- | elaborate.cxx | 26 |
1 files changed, 17 insertions, 9 deletions
diff --git a/elaborate.cxx b/elaborate.cxx index 59110c75..07a2ed61 100644 --- a/elaborate.cxx +++ b/elaborate.cxx @@ -1494,10 +1494,10 @@ semantic_pass (systemtap_session& s) if (rc == 0) rc = semantic_pass_symbols (s); if (rc == 0) rc = semantic_pass_conditions (s); - if (rc == 0 && ! s.unoptimized) rc = semantic_pass_optimize1 (s); + if (rc == 0) rc = semantic_pass_optimize1 (s); if (rc == 0) rc = semantic_pass_types (s); if (rc == 0) add_global_var_display (s); - if (rc == 0 && ! s.unoptimized) rc = semantic_pass_optimize2 (s); + if (rc == 0) rc = semantic_pass_optimize2 (s); if (rc == 0) rc = semantic_pass_vars (s); if (rc == 0) rc = semantic_pass_stats (s); @@ -3663,12 +3663,19 @@ semantic_pass_optimize1 (systemtap_session& s) relaxed_p = true; // until proven otherwise - semantic_pass_opt1 (s, relaxed_p); - semantic_pass_opt2 (s, relaxed_p, iterations); // produce some warnings only on iteration=0 - semantic_pass_opt3 (s, relaxed_p); - semantic_pass_opt4 (s, relaxed_p); - semantic_pass_opt5 (s, relaxed_p); - semantic_pass_const_fold (s, relaxed_p); + if (!s.unoptimized) + { + semantic_pass_opt1 (s, relaxed_p); + semantic_pass_opt2 (s, relaxed_p, iterations); // produce some warnings only on iteration=0 + semantic_pass_opt3 (s, relaxed_p); + semantic_pass_opt4 (s, relaxed_p); + semantic_pass_opt5 (s, relaxed_p); + } + + // For listing mode, we need const-folding regardless of optimization so + // that @defined expressions can be properly resolved. PR11360 + if (!s.unoptimized || s.listing_mode_vars) + semantic_pass_const_fold (s, relaxed_p); iterations ++; } @@ -3692,7 +3699,8 @@ semantic_pass_optimize2 (systemtap_session& s) if (pending_interrupts) break; relaxed_p = true; // until proven otherwise - semantic_pass_opt6 (s, relaxed_p); + if (!s.unoptimized) + semantic_pass_opt6 (s, relaxed_p); } return rc; |