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