1*38fd1498Szrj /* pass_manager.h - The pipeline of optimization passes 2*38fd1498Szrj Copyright (C) 2013-2018 Free Software Foundation, Inc. 3*38fd1498Szrj 4*38fd1498Szrj This file is part of GCC. 5*38fd1498Szrj 6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 7*38fd1498Szrj the terms of the GNU General Public License as published by the Free 8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 9*38fd1498Szrj version. 10*38fd1498Szrj 11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*38fd1498Szrj for more details. 15*38fd1498Szrj 16*38fd1498Szrj You should have received a copy of the GNU General Public License 17*38fd1498Szrj along with GCC; see the file COPYING3. If not see 18*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj #ifndef GCC_PASS_MANAGER_H 21*38fd1498Szrj #define GCC_PASS_MANAGER_H 22*38fd1498Szrj 23*38fd1498Szrj class opt_pass; 24*38fd1498Szrj struct register_pass_info; 25*38fd1498Szrj 26*38fd1498Szrj /* Define a list of pass lists so that both passes.c and plugins can easily 27*38fd1498Szrj find all the pass lists. */ 28*38fd1498Szrj #define GCC_PASS_LISTS \ 29*38fd1498Szrj DEF_PASS_LIST (all_lowering_passes) \ 30*38fd1498Szrj DEF_PASS_LIST (all_small_ipa_passes) \ 31*38fd1498Szrj DEF_PASS_LIST (all_regular_ipa_passes) \ 32*38fd1498Szrj DEF_PASS_LIST (all_late_ipa_passes) \ 33*38fd1498Szrj DEF_PASS_LIST (all_passes) 34*38fd1498Szrj 35*38fd1498Szrj #define DEF_PASS_LIST(LIST) PASS_LIST_NO_##LIST, 36*38fd1498Szrj enum pass_list 37*38fd1498Szrj { 38*38fd1498Szrj GCC_PASS_LISTS 39*38fd1498Szrj PASS_LIST_NUM 40*38fd1498Szrj }; 41*38fd1498Szrj #undef DEF_PASS_LIST 42*38fd1498Szrj 43*38fd1498Szrj namespace gcc { 44*38fd1498Szrj 45*38fd1498Szrj class context; 46*38fd1498Szrj 47*38fd1498Szrj class pass_manager 48*38fd1498Szrj { 49*38fd1498Szrj public: 50*38fd1498Szrj pass_manager (context *ctxt); 51*38fd1498Szrj ~pass_manager (); 52*38fd1498Szrj 53*38fd1498Szrj void register_pass (struct register_pass_info *pass_info); 54*38fd1498Szrj void register_one_dump_file (opt_pass *pass); 55*38fd1498Szrj 56*38fd1498Szrj opt_pass *get_pass_for_id (int id) const; 57*38fd1498Szrj 58*38fd1498Szrj void dump_passes () const; 59*38fd1498Szrj 60*38fd1498Szrj void dump_profile_report () const; 61*38fd1498Szrj 62*38fd1498Szrj void finish_optimization_passes (); 63*38fd1498Szrj 64*38fd1498Szrj /* Access to specific passes, so that the majority can be private. */ 65*38fd1498Szrj void execute_early_local_passes (); 66*38fd1498Szrj unsigned int execute_pass_mode_switching (); 67*38fd1498Szrj 68*38fd1498Szrj /* Various passes are manually cloned by epiphany. */ get_pass_split_all_insns()69*38fd1498Szrj opt_pass *get_pass_split_all_insns () const { 70*38fd1498Szrj return pass_split_all_insns_1; 71*38fd1498Szrj } get_pass_mode_switching()72*38fd1498Szrj opt_pass *get_pass_mode_switching () const { 73*38fd1498Szrj return pass_mode_switching_1; 74*38fd1498Szrj } get_pass_peephole2()75*38fd1498Szrj opt_pass *get_pass_peephole2 () const { return pass_peephole2_1; } get_pass_profile()76*38fd1498Szrj opt_pass *get_pass_profile () const { return pass_profile_1; } 77*38fd1498Szrj 78*38fd1498Szrj void register_pass_name (opt_pass *pass, const char *name); 79*38fd1498Szrj 80*38fd1498Szrj opt_pass *get_pass_by_name (const char *name); 81*38fd1498Szrj get_rest_of_compilation()82*38fd1498Szrj opt_pass *get_rest_of_compilation () const 83*38fd1498Szrj { 84*38fd1498Szrj return pass_rest_of_compilation_1; 85*38fd1498Szrj } get_clean_slate()86*38fd1498Szrj opt_pass *get_clean_slate () const { return pass_clean_state_1; } 87*38fd1498Szrj 88*38fd1498Szrj public: 89*38fd1498Szrj /* The root of the compilation pass tree, once constructed. */ 90*38fd1498Szrj opt_pass *all_passes; 91*38fd1498Szrj opt_pass *all_small_ipa_passes; 92*38fd1498Szrj opt_pass *all_lowering_passes; 93*38fd1498Szrj opt_pass *all_regular_ipa_passes; 94*38fd1498Szrj opt_pass *all_late_ipa_passes; 95*38fd1498Szrj 96*38fd1498Szrj /* A map from static pass id to optimization pass. */ 97*38fd1498Szrj opt_pass **passes_by_id; 98*38fd1498Szrj int passes_by_id_size; 99*38fd1498Szrj 100*38fd1498Szrj opt_pass **pass_lists[PASS_LIST_NUM]; 101*38fd1498Szrj 102*38fd1498Szrj private: 103*38fd1498Szrj void set_pass_for_id (int id, opt_pass *pass); 104*38fd1498Szrj void register_dump_files (opt_pass *pass); 105*38fd1498Szrj void create_pass_tab () const; 106*38fd1498Szrj 107*38fd1498Szrj private: 108*38fd1498Szrj context *m_ctxt; 109*38fd1498Szrj hash_map<nofree_string_hash, opt_pass *> *m_name_to_pass_map; 110*38fd1498Szrj 111*38fd1498Szrj /* References to all of the individual passes. 112*38fd1498Szrj These fields are generated via macro expansion. 113*38fd1498Szrj 114*38fd1498Szrj For example: 115*38fd1498Szrj NEXT_PASS (pass_build_cfg, 1); 116*38fd1498Szrj within pass-instances.def means that there is a field: 117*38fd1498Szrj opt_pass *pass_build_cfg_1; 118*38fd1498Szrj 119*38fd1498Szrj Similarly, the various: 120*38fd1498Szrj NEXT_PASS (pass_copy_prop, 1); 121*38fd1498Szrj ... 122*38fd1498Szrj NEXT_PASS (pass_copy_prop, 8); 123*38fd1498Szrj in pass-instances.def lead to fields: 124*38fd1498Szrj opt_pass *pass_copy_prop_1; 125*38fd1498Szrj ... 126*38fd1498Szrj opt_pass *pass_copy_prop_8; */ 127*38fd1498Szrj 128*38fd1498Szrj #define INSERT_PASSES_AFTER(PASS) 129*38fd1498Szrj #define PUSH_INSERT_PASSES_WITHIN(PASS) 130*38fd1498Szrj #define POP_INSERT_PASSES() 131*38fd1498Szrj #define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM 132*38fd1498Szrj #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM) 133*38fd1498Szrj #define TERMINATE_PASS_LIST(PASS) 134*38fd1498Szrj 135*38fd1498Szrj #include "pass-instances.def" 136*38fd1498Szrj 137*38fd1498Szrj #undef INSERT_PASSES_AFTER 138*38fd1498Szrj #undef PUSH_INSERT_PASSES_WITHIN 139*38fd1498Szrj #undef POP_INSERT_PASSES 140*38fd1498Szrj #undef NEXT_PASS 141*38fd1498Szrj #undef NEXT_PASS_WITH_ARG 142*38fd1498Szrj #undef TERMINATE_PASS_LIST 143*38fd1498Szrj 144*38fd1498Szrj }; // class pass_manager 145*38fd1498Szrj 146*38fd1498Szrj } // namespace gcc 147*38fd1498Szrj 148*38fd1498Szrj #endif /* ! GCC_PASS_MANAGER_H */ 149*38fd1498Szrj 150