@@ -52,6 +52,10 @@ namespace LCompilers {
52
52
array_dim_intrinsics_update, pass_array_by_data
53
53
};
54
54
55
+ static inline void set_runtime_library_dir (PassOptions& pass_options) {
56
+ pass_options.runtime_library_dir = LFortran::get_runtime_library_dir ();
57
+ }
58
+
55
59
class PassManager {
56
60
private:
57
61
@@ -85,88 +89,88 @@ namespace LCompilers {
85
89
bool apply_default_passes;
86
90
87
91
void _apply_passes (Allocator& al, LFortran::ASR::TranslationUnit_t* asr,
88
- std::vector<ASRPass>& passes, std::string& run_fun,
89
- bool always_run) {
92
+ std::vector<ASRPass>& passes, PassOptions pass_options) {
93
+ set_runtime_library_dir (pass_options);
90
94
for (size_t i = 0 ; i < passes.size (); i++) {
91
95
switch (passes[i]) {
92
96
case (ASRPass::do_loops) : {
93
- LFortran::pass_replace_do_loops (al, *asr);
97
+ LFortran::pass_replace_do_loops (al, *asr, pass_options );
94
98
break ;
95
99
}
96
100
case (ASRPass::global_stmts) : {
97
- LFortran::pass_wrap_global_stmts_into_function (al, *asr, run_fun );
101
+ LFortran::pass_wrap_global_stmts_into_function (al, *asr, pass_options );
98
102
break ;
99
103
}
100
104
case (ASRPass::implied_do_loops) : {
101
- LFortran::pass_replace_implied_do_loops (al, *asr, LFortran::get_runtime_library_dir () );
105
+ LFortran::pass_replace_implied_do_loops (al, *asr, pass_options );
102
106
break ;
103
107
}
104
108
case (ASRPass::array_op) : {
105
- LFortran::pass_replace_array_op (al, *asr, LFortran::get_runtime_library_dir () );
109
+ LFortran::pass_replace_array_op (al, *asr, pass_options );
106
110
break ;
107
111
}
108
112
case (ASRPass::flip_sign) : {
109
- LFortran::pass_replace_flip_sign (al, *asr, LFortran::get_runtime_library_dir () );
113
+ LFortran::pass_replace_flip_sign (al, *asr, pass_options );
110
114
break ;
111
115
}
112
116
case (ASRPass::fma) : {
113
- LFortran::pass_replace_fma (al, *asr, LFortran::get_runtime_library_dir () );
117
+ LFortran::pass_replace_fma (al, *asr, pass_options );
114
118
break ;
115
119
}
116
120
case (ASRPass::loop_unroll) : {
117
- LFortran::pass_loop_unroll (al, *asr, LFortran::get_runtime_library_dir () );
121
+ LFortran::pass_loop_unroll (al, *asr, pass_options );
118
122
break ;
119
123
}
120
124
case (ASRPass::inline_function_calls) : {
121
- LFortran::pass_inline_function_calls (al, *asr, LFortran::get_runtime_library_dir () );
125
+ LFortran::pass_inline_function_calls (al, *asr, pass_options );
122
126
break ;
123
127
}
124
128
case (ASRPass::dead_code_removal) : {
125
- LFortran::pass_dead_code_removal (al, *asr, LFortran::get_runtime_library_dir () );
129
+ LFortran::pass_dead_code_removal (al, *asr, pass_options );
126
130
break ;
127
131
}
128
132
case (ASRPass::sign_from_value) : {
129
- LFortran::pass_replace_sign_from_value (al, *asr, LFortran::get_runtime_library_dir () );
133
+ LFortran::pass_replace_sign_from_value (al, *asr, pass_options );
130
134
break ;
131
135
}
132
136
case (ASRPass::div_to_mul) : {
133
- LFortran::pass_replace_div_to_mul (al, *asr, LFortran::get_runtime_library_dir () );
137
+ LFortran::pass_replace_div_to_mul (al, *asr, pass_options );
134
138
break ;
135
139
}
136
140
case (ASRPass::class_constructor) : {
137
- LFortran::pass_replace_class_constructor (al, *asr);
141
+ LFortran::pass_replace_class_constructor (al, *asr, pass_options );
138
142
break ;
139
143
}
140
144
case (ASRPass::arr_slice) : {
141
- LFortran::pass_replace_arr_slice (al, *asr, LFortran::get_runtime_library_dir () );
145
+ LFortran::pass_replace_arr_slice (al, *asr, pass_options );
142
146
break ;
143
147
}
144
148
case (ASRPass::print_arr) : {
145
- LFortran::pass_replace_print_arr (al, *asr, LFortran::get_runtime_library_dir () );
149
+ LFortran::pass_replace_print_arr (al, *asr, pass_options );
146
150
break ;
147
151
}
148
152
case (ASRPass::unused_functions) : {
149
- LFortran::pass_unused_functions (al, *asr, always_run );
153
+ LFortran::pass_unused_functions (al, *asr, pass_options );
150
154
break ;
151
155
}
152
156
case (ASRPass::forall) : {
153
- LFortran::pass_replace_forall (al, *asr);
157
+ LFortran::pass_replace_forall (al, *asr, pass_options );
154
158
break ;
155
159
}
156
160
case (ASRPass::select_case) : {
157
- LFortran::pass_replace_select_case (al, *asr);
161
+ LFortran::pass_replace_select_case (al, *asr, pass_options );
158
162
break ;
159
163
}
160
164
case (ASRPass::loop_vectorise) : {
161
- LFortran::pass_loop_vectorise (al, *asr, LFortran::get_runtime_library_dir () );
165
+ LFortran::pass_loop_vectorise (al, *asr, pass_options );
162
166
break ;
163
167
}
164
168
case (ASRPass::array_dim_intrinsics_update): {
165
- LFortran::pass_update_array_dim_intrinsic_calls (al, *asr);
169
+ LFortran::pass_update_array_dim_intrinsic_calls (al, *asr, pass_options );
166
170
break ;
167
171
}
168
172
case (ASRPass::pass_array_by_data): {
169
- LFortran::pass_array_by_data (al, *asr);
173
+ LFortran::pass_array_by_data (al, *asr, pass_options );
170
174
break ;
171
175
}
172
176
}
@@ -246,14 +250,14 @@ namespace LCompilers {
246
250
}
247
251
248
252
void apply_passes (Allocator& al, LFortran::ASR::TranslationUnit_t* asr,
249
- std::string run_fun, bool always_run= false ) {
253
+ PassOptions& pass_options ) {
250
254
if ( !_user_defined_passes.empty () ) {
251
- _apply_passes (al, asr, _user_defined_passes, run_fun, always_run );
255
+ _apply_passes (al, asr, _user_defined_passes, pass_options );
252
256
} else if ( apply_default_passes ) {
253
257
if ( is_fast ) {
254
- _apply_passes (al, asr, _with_optimization_passes, run_fun, always_run );
258
+ _apply_passes (al, asr, _with_optimization_passes, pass_options );
255
259
} else {
256
- _apply_passes (al, asr, _passes, run_fun, always_run );
260
+ _apply_passes (al, asr, _passes, pass_options );
257
261
}
258
262
}
259
263
}
@@ -273,6 +277,7 @@ namespace LCompilers {
273
277
void do_not_use_default_passes () {
274
278
apply_default_passes = false ;
275
279
}
280
+
276
281
};
277
282
278
283
}
0 commit comments