]>
Commit | Line | Data |
---|---|---|
315f8c0e | 1 | /* pass_manager.h - The pipeline of optimization passes |
cbe34bb5 | 2 | Copyright (C) 2013-2017 Free Software Foundation, Inc. |
315f8c0e DM |
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) \ | |
1f1e44ed | 32 | DEF_PASS_LIST (all_late_ipa_passes) \ |
315f8c0e DM |
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 | ||
6cd4d135 | 47 | class pass_manager |
315f8c0e DM |
48 | { |
49 | public: | |
6a389ed5 | 50 | void *operator new (size_t sz); |
10fdd6e9 | 51 | void operator delete (void *ptr); |
6a389ed5 | 52 | |
c3284718 | 53 | pass_manager (context *ctxt); |
10fdd6e9 | 54 | ~pass_manager (); |
315f8c0e DM |
55 | |
56 | void register_pass (struct register_pass_info *pass_info); | |
6a5ac314 | 57 | void register_one_dump_file (opt_pass *pass); |
315f8c0e DM |
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 | ||
f7695dbf DM |
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 | ||
05555c4a DM |
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; } | |
103ff0d6 | 79 | opt_pass *get_pass_profile () const { return pass_profile_1; } |
05555c4a | 80 | |
58d4c836 DM |
81 | void register_pass_name (opt_pass *pass, const char *name); |
82 | ||
83 | opt_pass *get_pass_by_name (const char *name); | |
84 | ||
315f8c0e DM |
85 | public: |
86 | /* The root of the compilation pass tree, once constructed. */ | |
87 | opt_pass *all_passes; | |
88 | opt_pass *all_small_ipa_passes; | |
89 | opt_pass *all_lowering_passes; | |
90 | opt_pass *all_regular_ipa_passes; | |
315f8c0e DM |
91 | opt_pass *all_late_ipa_passes; |
92 | ||
93 | /* A map from static pass id to optimization pass. */ | |
94 | opt_pass **passes_by_id; | |
95 | int passes_by_id_size; | |
96 | ||
97 | opt_pass **pass_lists[PASS_LIST_NUM]; | |
98 | ||
99 | private: | |
100 | void set_pass_for_id (int id, opt_pass *pass); | |
a23c217d | 101 | void register_dump_files (opt_pass *pass); |
58d4c836 | 102 | void create_pass_tab () const; |
315f8c0e DM |
103 | |
104 | private: | |
65d3284b | 105 | context *m_ctxt; |
58d4c836 | 106 | hash_map<nofree_string_hash, opt_pass *> *m_name_to_pass_map; |
315f8c0e | 107 | |
f7695dbf DM |
108 | /* References to all of the individual passes. |
109 | These fields are generated via macro expansion. | |
110 | ||
111 | For example: | |
112 | NEXT_PASS (pass_build_cfg, 1); | |
113 | within pass-instances.def means that there is a field: | |
114 | opt_pass *pass_build_cfg_1; | |
115 | ||
116 | Similarly, the various: | |
117 | NEXT_PASS (pass_copy_prop, 1); | |
118 | ... | |
119 | NEXT_PASS (pass_copy_prop, 8); | |
120 | in pass-instances.def lead to fields: | |
121 | opt_pass *pass_copy_prop_1; | |
122 | ... | |
123 | opt_pass *pass_copy_prop_8; */ | |
124 | ||
125 | #define INSERT_PASSES_AFTER(PASS) | |
126 | #define PUSH_INSERT_PASSES_WITHIN(PASS) | |
127 | #define POP_INSERT_PASSES() | |
128 | #define NEXT_PASS(PASS, NUM) opt_pass *PASS ## _ ## NUM | |
b0c77505 | 129 | #define NEXT_PASS_WITH_ARG(PASS, NUM, ARG) NEXT_PASS (PASS, NUM) |
17e7ab87 | 130 | #define TERMINATE_PASS_LIST(PASS) |
f7695dbf DM |
131 | |
132 | #include "pass-instances.def" | |
133 | ||
134 | #undef INSERT_PASSES_AFTER | |
135 | #undef PUSH_INSERT_PASSES_WITHIN | |
136 | #undef POP_INSERT_PASSES | |
137 | #undef NEXT_PASS | |
b0c77505 | 138 | #undef NEXT_PASS_WITH_ARG |
f7695dbf DM |
139 | #undef TERMINATE_PASS_LIST |
140 | ||
315f8c0e DM |
141 | }; // class pass_manager |
142 | ||
143 | } // namespace gcc | |
144 | ||
145 | #endif /* ! GCC_PASS_MANAGER_H */ | |
6cd4d135 | 146 |