@@ -19,8 +19,7 @@ use llvm_sys::prelude::*;
19
19
use llvm_sys:: support:: LLVMParseCommandLineOptions ;
20
20
use llvm_sys:: target:: * ;
21
21
use llvm_sys:: target_machine:: * ;
22
- use llvm_sys:: transforms:: ipo:: * ;
23
- use llvm_sys:: transforms:: pass_manager_builder:: * ;
22
+ use llvm_sys:: transforms:: pass_builder:: * ;
24
23
use llvm_sys:: LLVMAttributeFunctionIndex ;
25
24
use llvm_sys:: { LLVMLinkage , LLVMVisibility } ;
26
25
use log:: * ;
@@ -179,65 +178,44 @@ pub unsafe fn optimize(
179
178
LLVMSetModuleInlineAsm2 ( module, ptr:: null_mut ( ) , 0 ) ;
180
179
}
181
180
182
- let mpm = LLVMCreatePassManager ( ) ;
183
- let fpm = LLVMCreateFunctionPassManagerForModule ( module) ;
184
-
185
- LLVMAddAnalysisPasses ( tm, mpm) ;
186
- LLVMAddAnalysisPasses ( tm, fpm) ;
187
-
188
- // even with -O0 and without LTO we still want to avoid linking in unused code from core etc
189
- LLVMAddGlobalDCEPass ( mpm) ;
190
-
191
- let pmb = LLVMPassManagerBuilderCreate ( ) ;
192
-
193
- use OptLevel :: * ;
194
- let ( inline_threshold, opt) = match opt_level {
195
- No | SizeMin => ( 0 , 1 ) , // Pretty much nothing compiles with -O0 s∫o make it an alias for -O1
196
- Less => ( 25 , 1 ) ,
197
- Default => ( 225 , 2 ) ,
198
- Aggressive => ( 275 , 3 ) ,
199
- Size => ( 25 , 0 ) ,
200
- } ;
201
- LLVMPassManagerBuilderSetOptLevel ( pmb, opt) ;
202
- LLVMPassManagerBuilderSetSizeLevel (
203
- pmb,
204
- match opt_level {
205
- Size => 1 ,
206
- SizeMin => 2 ,
207
- _ => 0 ,
208
- } ,
209
- ) ;
210
- LLVMPassManagerBuilderUseInlinerWithThreshold ( pmb, inline_threshold) ;
211
-
212
- // populate the pass managers
213
- LLVMPassManagerBuilderPopulateFunctionPassManager ( pmb, fpm) ;
214
- LLVMPassManagerBuilderPopulateModulePassManager ( pmb, mpm) ;
215
-
216
181
for sym in module. globals_iter ( ) {
217
182
internalize ( sym, symbol_name ( sym) , export_symbols) ;
218
183
}
219
184
for sym in module. global_aliases_iter ( ) {
220
185
internalize ( sym, symbol_name ( sym) , export_symbols) ;
221
186
}
222
187
223
- debug ! ( "running function passes" ) ;
224
- LLVMInitializeFunctionPassManager ( fpm) ;
225
188
for function in module. functions_iter ( ) {
226
189
let name = symbol_name ( function) ;
227
190
if !name. starts_with ( "llvm." ) {
228
191
if ignore_inline_never {
229
192
remove_attribute ( function, "noinline" ) ;
230
193
}
231
194
internalize ( function, name, export_symbols) ;
232
- if LLVMIsDeclaration ( function) == 0 {
233
- LLVMRunFunctionPassManager ( fpm, function) ;
234
- }
235
195
}
236
196
}
237
- LLVMFinalizeFunctionPassManager ( fpm) ;
238
197
239
- debug ! ( "running module passes" ) ;
240
- LLVMRunPassManager ( mpm, module) ;
198
+ let options = LLVMCreatePassBuilderOptions ( ) ;
199
+
200
+ // even with -O0 and without LTO we still want to avoid linking in unused code from core etc
201
+ let dce = CString :: new ( "dce" ) . unwrap ( ) ;
202
+ debug ! ( "running dce passe" ) ;
203
+ LLVMRunPasses ( module, dce. as_ptr ( ) , tm, options) ;
204
+
205
+ let opt = CString :: new ( match opt_level {
206
+ // Pretty much nothing compiles with -O0 so make it an alias for -O1
207
+ OptLevel :: No | OptLevel :: Less => "default<O1>" ,
208
+ OptLevel :: Default => "default<O2>" ,
209
+ OptLevel :: Aggressive => "default<O3>" ,
210
+ OptLevel :: Size => "default<Os>" ,
211
+ OptLevel :: SizeMin => "default<Oz>" ,
212
+ } )
213
+ . unwrap ( ) ;
214
+
215
+ debug ! ( "running optimization pass" ) ;
216
+ LLVMRunPasses ( module, opt. as_ptr ( ) , tm, options) ;
217
+
218
+ LLVMDisposePassBuilderOptions ( options) ;
241
219
242
220
// Some debug info generated by rustc seems to trigger a segfault in the
243
221
// BTF code in llvm, so strip it until that is fixed
0 commit comments