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