aboutsummaryrefslogtreecommitdiff
path: root/gcc/passes.c
diff options
context:
space:
mode:
authorDuncan Sands <baldrick@free.fr>2010-02-22 15:18:10 +0100
committerDuncan Sands <baldrick@gcc.gnu.org>2010-02-22 14:18:10 +0000
commit669887fc19f995611f6dd7ed923aa6bd2726bbc1 (patch)
tree069106f741da0cb8952d28b2c2cd0ec8010b6fd1 /gcc/passes.c
parent9efc83f4ba0dc4c9148256f477f203eab10134db (diff)
downloadgcc-669887fc19f995611f6dd7ed923aa6bd2726bbc1.zip
gcc-669887fc19f995611f6dd7ed923aa6bd2726bbc1.tar.gz
gcc-669887fc19f995611f6dd7ed923aa6bd2726bbc1.tar.bz2
If a pass occurs in several pass lists...
If a pass occurs in several pass lists, like pass_cleanup_eh which occurs in both all_small_ipa_passes and all_passes, make sure all instances of it are considered for replacement/insertion when ref_pass_instance_number is zero, not just the instance in the first pass list. From-SVN: r156961
Diffstat (limited to 'gcc/passes.c')
-rw-r--r--gcc/passes.c76
1 files changed, 41 insertions, 35 deletions
diff --git a/gcc/passes.c b/gcc/passes.c
index a04a5ef..9d0c55a 100644
--- a/gcc/passes.c
+++ b/gcc/passes.c
@@ -632,6 +632,8 @@ position_pass (struct register_pass_info *new_pass_info,
void
register_pass (struct register_pass_info *pass_info)
{
+ bool all_instances, success;
+
/* The checks below could fail in buggy plugins. Existing GCC
passes should never fail these checks, so we mention plugin in
the messages. */
@@ -647,46 +649,50 @@ register_pass (struct register_pass_info *pass_info)
pass_info->pass->name);
/* Try to insert the new pass to the pass lists. We need to check
- all three lists as the reference pass could be in one (or all) of
+ all five lists as the reference pass could be in one (or all) of
them. */
- if (!position_pass (pass_info, &all_lowering_passes)
- && !position_pass (pass_info, &all_small_ipa_passes)
- && !position_pass (pass_info, &all_regular_ipa_passes)
- && !position_pass (pass_info, &all_lto_gen_passes)
- && !position_pass (pass_info, &all_passes))
+ all_instances = pass_info->ref_pass_instance_number == 0;
+ success = position_pass (pass_info, &all_lowering_passes);
+ if (!success || all_instances)
+ success |= position_pass (pass_info, &all_small_ipa_passes);
+ if (!success || all_instances)
+ success |= position_pass (pass_info, &all_regular_ipa_passes);
+ if (!success || all_instances)
+ success |= position_pass (pass_info, &all_lto_gen_passes);
+ if (!success || all_instances)
+ success |= position_pass (pass_info, &all_passes);
+ if (!success)
fatal_error
("pass %qs not found but is referenced by new pass %qs",
pass_info->reference_pass_name, pass_info->pass->name);
- else
+
+ /* OK, we have successfully inserted the new pass. We need to register
+ the dump files for the newly added pass and its duplicates (if any).
+ Because the registration of plugin/backend passes happens after the
+ command-line options are parsed, the options that specify single
+ pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
+ passes. Therefore we currently can only enable dumping of
+ new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
+ are specified. While doing so, we also delete the pass_list_node
+ objects created during pass positioning. */
+ while (added_pass_nodes)
{
- /* OK, we have successfully inserted the new pass. We need to register
- the dump files for the newly added pass and its duplicates (if any).
- Because the registration of plugin/backend passes happens after the
- command-line options are parsed, the options that specify single
- pass dumping (e.g. -fdump-tree-PASSNAME) cannot be used for new
- passes. Therefore we currently can only enable dumping of
- new passes when the 'dump-all' flags (e.g. -fdump-tree-all)
- are specified. While doing so, we also delete the pass_list_node
- objects created during pass positioning. */
- while (added_pass_nodes)
- {
- struct pass_list_node *next_node = added_pass_nodes->next;
- enum tree_dump_index tdi;
- register_one_dump_file (added_pass_nodes->pass);
- if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS
- || added_pass_nodes->pass->type == IPA_PASS)
- tdi = TDI_ipa_all;
- else if (added_pass_nodes->pass->type == GIMPLE_PASS)
- tdi = TDI_tree_all;
- else
- tdi = TDI_rtl_all;
- /* Check if dump-all flag is specified. */
- if (get_dump_file_info (tdi)->state)
- get_dump_file_info (added_pass_nodes->pass->static_pass_number)
- ->state = get_dump_file_info (tdi)->state;
- XDELETE (added_pass_nodes);
- added_pass_nodes = next_node;
- }
+ struct pass_list_node *next_node = added_pass_nodes->next;
+ enum tree_dump_index tdi;
+ register_one_dump_file (added_pass_nodes->pass);
+ if (added_pass_nodes->pass->type == SIMPLE_IPA_PASS
+ || added_pass_nodes->pass->type == IPA_PASS)
+ tdi = TDI_ipa_all;
+ else if (added_pass_nodes->pass->type == GIMPLE_PASS)
+ tdi = TDI_tree_all;
+ else
+ tdi = TDI_rtl_all;
+ /* Check if dump-all flag is specified. */
+ if (get_dump_file_info (tdi)->state)
+ get_dump_file_info (added_pass_nodes->pass->static_pass_number)
+ ->state = get_dump_file_info (tdi)->state;
+ XDELETE (added_pass_nodes);
+ added_pass_nodes = next_node;
}
}