https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68874
Bug ID: 68874 Summary: Allow pass groups to be cloned Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: enhancement Priority: P3 Component: other Assignee: unassigned at gcc dot gnu.org Reporter: vries at gcc dot gnu.org Target Milestone: --- A pass group in passes.def is declared like this: ... NEXT_PASS (pass_build_ssa_passes); PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_init_datastructures); NEXT_PASS (pass_build_ssa); NEXT_PASS (pass_ubsan); NEXT_PASS (pass_early_warn_uninitialized); NEXT_PASS (pass_nothrow); POP_INSERT_PASSES () ... Sometimes it's needed to split a pass group in two. This could be done by cloning the pass group: ... NEXT_PASS (pass_build_ssa_passes); PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_init_datastructures); NEXT_PASS (pass_build_ssa); POP_INSERT_PASSES () ... NEXT_PASS (pass_build_ssa_passes); PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) NEXT_PASS (pass_ubsan); NEXT_PASS (pass_early_warn_uninitialized); NEXT_PASS (pass_nothrow); POP_INSERT_PASSES () ... But atm, this is not supported, because PUSH_INSERT_PASSES_WITHIN hardcodes that the pass instance is instance 1: ... #define PUSH_INSERT_PASSES_WITHIN(PASS) \ { \ opt_pass **p = &(PASS ## _1)->sub; ... So we have to revert to copy-pasting the pass group, appending 2 everywhere and then using: ... NEXT_PASS (pass_build_ssa_passes); PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes) NEXT_PASS (pass_fixup_cfg); NEXT_PASS (pass_init_datastructures); NEXT_PASS (pass_build_ssa); POP_INSERT_PASSES () ... NEXT_PASS (pass_build_ssa_passes2); PUSH_INSERT_PASSES_WITHIN (pass_build_ssa_passes2) NEXT_PASS (pass_ubsan); NEXT_PASS (pass_early_warn_uninitialized); NEXT_PASS (pass_nothrow); POP_INSERT_PASSES () ...