1 | /* pass_manager.h - The pipeline of optimization passes |
2 | Copyright (C) 2013-2023 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.cc 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<free_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 | |