110d565efSmrg /* pass_manager.h - The pipeline of optimization passes 2*ec02198aSmrg Copyright (C) 2013-2020 Free Software Foundation, Inc. 310d565efSmrg 410d565efSmrg This file is part of GCC. 510d565efSmrg 610d565efSmrg GCC is free software; you can redistribute it and/or modify it under 710d565efSmrg the terms of the GNU General Public License as published by the Free 810d565efSmrg Software Foundation; either version 3, or (at your option) any later 910d565efSmrg version. 1010d565efSmrg 1110d565efSmrg GCC is distributed in the hope that it will be useful, but WITHOUT ANY 1210d565efSmrg WARRANTY; without even the implied warranty of MERCHANTABILITY or 1310d565efSmrg FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1410d565efSmrg for more details. 1510d565efSmrg 1610d565efSmrg You should have received a copy of the GNU General Public License 1710d565efSmrg along with GCC; see the file COPYING3. If not see 1810d565efSmrg <http://www.gnu.org/licenses/>. */ 1910d565efSmrg 2010d565efSmrg #ifndef GCC_PASS_MANAGER_H 2110d565efSmrg #define GCC_PASS_MANAGER_H 2210d565efSmrg 2310d565efSmrg class opt_pass; 2410d565efSmrg struct register_pass_info; 2510d565efSmrg 2610d565efSmrg /* Define a list of pass lists so that both passes.c and plugins can easily 2710d565efSmrg find all the pass lists. */ 2810d565efSmrg #define GCC_PASS_LISTS \ 2910d565efSmrg DEF_PASS_LIST (all_lowering_passes) \ 3010d565efSmrg DEF_PASS_LIST (all_small_ipa_passes) \ 3110d565efSmrg DEF_PASS_LIST (all_regular_ipa_passes) \ 3210d565efSmrg DEF_PASS_LIST (all_late_ipa_passes) \ 3310d565efSmrg DEF_PASS_LIST (all_passes) 3410d565efSmrg 3510d565efSmrg #define DEF_PASS_LIST(LIST) PASS_LIST_NO_##LIST, 3610d565efSmrg enum pass_list 3710d565efSmrg { 3810d565efSmrg GCC_PASS_LISTS 3910d565efSmrg PASS_LIST_NUM 4010d565efSmrg }; 4110d565efSmrg #undef DEF_PASS_LIST 4210d565efSmrg 4310d565efSmrg namespace gcc { 4410d565efSmrg 4510d565efSmrg class context; 4610d565efSmrg 4710d565efSmrg class pass_manager 4810d565efSmrg { 4910d565efSmrg public: 5010d565efSmrg pass_manager (context *ctxt); 5110d565efSmrg ~pass_manager (); 5210d565efSmrg 5310d565efSmrg void register_pass (struct register_pass_info *pass_info); 5410d565efSmrg void register_one_dump_file (opt_pass *pass); 5510d565efSmrg 5610d565efSmrg opt_pass *get_pass_for_id (int id) const; 5710d565efSmrg 5810d565efSmrg void dump_passes () const; 5910d565efSmrg 6010d565efSmrg void dump_profile_report () const; 6110d565efSmrg 6210d565efSmrg void finish_optimization_passes (); 6310d565efSmrg 6410d565efSmrg /* Access to specific passes, so that the majority can be private. */ 6510d565efSmrg void execute_early_local_passes (); 6610d565efSmrg unsigned int execute_pass_mode_switching (); 6710d565efSmrg 6810d565efSmrg /* Various passes are manually cloned by epiphany. */ get_pass_split_all_insns()6910d565efSmrg opt_pass *get_pass_split_all_insns () const { 7010d565efSmrg return pass_split_all_insns_1; 7110d565efSmrg } get_pass_mode_switching()7210d565efSmrg opt_pass *get_pass_mode_switching () const { 7310d565efSmrg return pass_mode_switching_1; 7410d565efSmrg } get_pass_peephole2()7510d565efSmrg opt_pass *get_pass_peephole2 () const { return pass_peephole2_1; } get_pass_profile()7610d565efSmrg opt_pass *get_pass_profile () const { return pass_profile_1; } 7710d565efSmrg 7810d565efSmrg void register_pass_name (opt_pass *pass, const char *name); 7910d565efSmrg 8010d565efSmrg opt_pass *get_pass_by_name (const char *name); 8110d565efSmrg get_rest_of_compilation()8210d565efSmrg opt_pass *get_rest_of_compilation () const 8310d565efSmrg { 8410d565efSmrg return pass_rest_of_compilation_1; 8510d565efSmrg } get_clean_slate()8610d565efSmrg opt_pass *get_clean_slate () const { return pass_clean_state_1; } 8710d565efSmrg 8810d565efSmrg public: 8910d565efSmrg /* The root of the compilation pass tree, once constructed. */ 9010d565efSmrg opt_pass *all_passes; 9110d565efSmrg opt_pass *all_small_ipa_passes; 9210d565efSmrg opt_pass *all_lowering_passes; 9310d565efSmrg opt_pass *all_regular_ipa_passes; 9410d565efSmrg opt_pass *all_late_ipa_passes; 9510d565efSmrg 9610d565efSmrg /* A map from static pass id to optimization pass. */ 9710d565efSmrg opt_pass **passes_by_id; 9810d565efSmrg int passes_by_id_size; 9910d565efSmrg 10010d565efSmrg opt_pass **pass_lists[PASS_LIST_NUM]; 10110d565efSmrg 10210d565efSmrg private: 10310d565efSmrg void set_pass_for_id (int id, opt_pass *pass); 10410d565efSmrg void register_dump_files (opt_pass *pass); 10510d565efSmrg void create_pass_tab () const; 10610d565efSmrg 10710d565efSmrg private: 10810d565efSmrg context *m_ctxt; 10910d565efSmrg hash_map<nofree_string_hash, opt_pass *> *m_name_to_pass_map; 11010d565efSmrg 11110d565efSmrg /* References to all of the individual passes. 11210d565efSmrg These fields are generated via macro expansion. 11310d565efSmrg 11410d565efSmrg For example: 11510d565efSmrg NEXT_PASS (pass_build_cfg, 1); 11610d565efSmrg within pass-instances.def means that there is a field: 11710d565efSmrg opt_pass *pass_build_cfg_1; 11810d565efSmrg 11910d565efSmrg Similarly, the various: 12010d565efSmrg NEXT_PASS (pass_copy_prop, 1); 12110d565efSmrg ... 12210d565efSmrg NEXT_PASS (pass_copy_prop, 8); 12310d565efSmrg in pass-instances.def lead to fields: 12410d565efSmrg opt_pass *pass_copy_prop_1; 12510d565efSmrg ... 12610d565efSmrg opt_pass *pass_copy_prop_8; */ 12710d565efSmrg 12810d565efSmrg #define INSERT_PASSES_AFTER(PASS) 12910d565efSmrg #define PUSH_INSERT_PASSES_WITHIN(PASS) 13010d565efSmrg #define POP_INSERT_PASSES() 13110d565efSmrg #define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM 13210d565efSmrg #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM) 13310d565efSmrg #define TERMINATE_PASS_LIST(PASS) 13410d565efSmrg 13510d565efSmrg #include "pass-instances.def" 13610d565efSmrg 13710d565efSmrg #undef INSERT_PASSES_AFTER 13810d565efSmrg #undef PUSH_INSERT_PASSES_WITHIN 13910d565efSmrg #undef POP_INSERT_PASSES 14010d565efSmrg #undef NEXT_PASS 14110d565efSmrg #undef NEXT_PASS_WITH_ARG 14210d565efSmrg #undef TERMINATE_PASS_LIST 14310d565efSmrg 14410d565efSmrg }; // class pass_manager 14510d565efSmrg 14610d565efSmrg } // namespace gcc 14710d565efSmrg 14810d565efSmrg #endif /* ! GCC_PASS_MANAGER_H */ 14910d565efSmrg 150