@@ -194,8 +194,9 @@ pub(crate) unsafe fn codegen(
194
194
. temp_path ( OutputType :: LlvmAssembly , module_name) ;
195
195
let out = out. to_str ( ) . unwrap ( ) ;
196
196
197
- let result =
198
- unsafe { llvm:: LLVMRustPrintModule ( llmod, out. as_c_char_ptr ( ) , out. len ( ) , demangle_callback) } ;
197
+ let result = unsafe {
198
+ llvm:: LLVMRustPrintModule ( llmod, out. as_c_char_ptr ( ) , out. len ( ) , demangle_callback)
199
+ } ;
199
200
200
201
result. into_result ( ) . map_err ( |( ) | {
201
202
let msg = format ! ( "failed to write NVVM IR to {}" , out) ;
@@ -350,56 +351,59 @@ pub(crate) unsafe fn optimize(
350
351
351
352
let tm = ( cgcx. tm_factory ) ( tm_factory_config) . expect ( "failed to create target machine" ) ;
352
353
353
- if config. opt_level . is_some ( ) { unsafe {
354
- let fpm = llvm:: LLVMCreateFunctionPassManagerForModule ( llmod) ;
355
- let mpm = llvm:: LLVMCreatePassManager ( ) ;
354
+ if config. opt_level . is_some ( ) {
355
+ unsafe {
356
+ let fpm = llvm:: LLVMCreateFunctionPassManagerForModule ( llmod) ;
357
+ let mpm = llvm:: LLVMCreatePassManager ( ) ;
356
358
357
- let addpass = |pass_name : & str | {
358
- let pass = llvm:: LLVMRustFindAndCreatePass ( pass_name. as_c_char_ptr ( ) , pass_name. len ( ) ) ;
359
- if pass. is_none ( ) {
360
- return false ;
361
- }
362
- let pass = pass. unwrap ( ) ;
363
- let pass_manager = match llvm:: LLVMRustPassKind ( pass) {
364
- llvm:: PassKind :: Function => & fpm,
365
- llvm:: PassKind :: Module => & mpm,
366
- llvm:: PassKind :: Other => {
367
- diag_handler. err ( "Encountered LLVM pass kind we can't handle" ) ;
368
- return true ;
359
+ let addpass = |pass_name : & str | {
360
+ let pass =
361
+ llvm:: LLVMRustFindAndCreatePass ( pass_name. as_c_char_ptr ( ) , pass_name. len ( ) ) ;
362
+ if pass. is_none ( ) {
363
+ return false ;
369
364
}
365
+ let pass = pass. unwrap ( ) ;
366
+ let pass_manager = match llvm:: LLVMRustPassKind ( pass) {
367
+ llvm:: PassKind :: Function => & fpm,
368
+ llvm:: PassKind :: Module => & mpm,
369
+ llvm:: PassKind :: Other => {
370
+ diag_handler. err ( "Encountered LLVM pass kind we can't handle" ) ;
371
+ return true ;
372
+ }
373
+ } ;
374
+ llvm:: LLVMRustAddPass ( pass_manager, pass) ;
375
+ true
370
376
} ;
371
- llvm:: LLVMRustAddPass ( pass_manager, pass) ;
372
- true
373
- } ;
374
377
375
- if !config. no_prepopulate_passes {
376
- llvm:: LLVMRustAddAnalysisPasses ( tm, fpm, llmod) ;
377
- llvm:: LLVMRustAddAnalysisPasses ( tm, mpm, llmod) ;
378
- let opt_level = config
379
- . opt_level
380
- . map_or ( llvm:: CodeGenOptLevel :: None , |x| to_llvm_opt_settings ( x) . 0 ) ;
381
- with_llvm_pmb ( llmod, config, opt_level, & mut |b| {
382
- llvm:: LLVMPassManagerBuilderPopulateFunctionPassManager ( b, fpm) ;
383
- llvm:: LLVMPassManagerBuilderPopulateModulePassManager ( b, mpm) ;
384
- } )
385
- }
378
+ if !config. no_prepopulate_passes {
379
+ llvm:: LLVMRustAddAnalysisPasses ( tm, fpm, llmod) ;
380
+ llvm:: LLVMRustAddAnalysisPasses ( tm, mpm, llmod) ;
381
+ let opt_level = config
382
+ . opt_level
383
+ . map_or ( llvm:: CodeGenOptLevel :: None , |x| to_llvm_opt_settings ( x) . 0 ) ;
384
+ with_llvm_pmb ( llmod, config, opt_level, & mut |b| {
385
+ llvm:: LLVMPassManagerBuilderPopulateFunctionPassManager ( b, fpm) ;
386
+ llvm:: LLVMPassManagerBuilderPopulateModulePassManager ( b, mpm) ;
387
+ } )
388
+ }
386
389
387
- for pass in & config. passes {
388
- if !addpass ( pass) {
389
- diag_handler. warn ( format ! ( "unknown pass `{}`, ignoring" , pass) ) ;
390
+ for pass in & config. passes {
391
+ if !addpass ( pass) {
392
+ diag_handler. warn ( format ! ( "unknown pass `{}`, ignoring" , pass) ) ;
393
+ }
390
394
}
391
- }
392
395
393
- diag_handler. abort_if_errors ( ) ;
396
+ diag_handler. abort_if_errors ( ) ;
394
397
395
- // Finally, run the actual optimization passes
396
- llvm:: LLVMRustRunFunctionPassManager ( fpm, llmod) ;
397
- llvm:: LLVMRunPassManager ( mpm, llmod) ;
398
+ // Finally, run the actual optimization passes
399
+ llvm:: LLVMRustRunFunctionPassManager ( fpm, llmod) ;
400
+ llvm:: LLVMRunPassManager ( mpm, llmod) ;
398
401
399
- // Deallocate managers that we're now done with
400
- llvm:: LLVMDisposePassManager ( fpm) ;
401
- llvm:: LLVMDisposePassManager ( mpm) ;
402
- } }
402
+ // Deallocate managers that we're now done with
403
+ llvm:: LLVMDisposePassManager ( fpm) ;
404
+ llvm:: LLVMDisposePassManager ( mpm) ;
405
+ }
406
+ }
403
407
404
408
Ok ( ( ) )
405
409
}
@@ -409,61 +413,63 @@ unsafe fn with_llvm_pmb(
409
413
config : & ModuleConfig ,
410
414
opt_level : llvm:: CodeGenOptLevel ,
411
415
f : & mut impl FnMut ( & llvm:: PassManagerBuilder ) ,
412
- ) { unsafe {
413
- use std:: ptr;
414
-
415
- let builder = llvm:: LLVMPassManagerBuilderCreate ( ) ;
416
- let opt_size = config
417
- . opt_size
418
- . map_or ( llvm:: CodeGenOptSizeNone , |x| to_llvm_opt_settings ( x) . 1 ) ;
419
-
420
- llvm:: LLVMRustConfigurePassManagerBuilder (
421
- builder,
422
- opt_level,
423
- config. merge_functions ,
424
- config. vectorize_slp ,
425
- config. vectorize_loop ,
426
- false ,
427
- ptr:: null ( ) ,
428
- ptr:: null ( ) ,
429
- ) ;
430
-
431
- llvm:: LLVMPassManagerBuilderSetSizeLevel ( builder, opt_size as u32 ) ;
432
-
433
- if opt_size != llvm:: CodeGenOptSizeNone {
434
- llvm:: LLVMPassManagerBuilderSetDisableUnrollLoops ( builder, 1 ) ;
435
- }
416
+ ) {
417
+ unsafe {
418
+ use std:: ptr;
419
+
420
+ let builder = llvm:: LLVMPassManagerBuilderCreate ( ) ;
421
+ let opt_size = config
422
+ . opt_size
423
+ . map_or ( llvm:: CodeGenOptSizeNone , |x| to_llvm_opt_settings ( x) . 1 ) ;
424
+
425
+ llvm:: LLVMRustConfigurePassManagerBuilder (
426
+ builder,
427
+ opt_level,
428
+ config. merge_functions ,
429
+ config. vectorize_slp ,
430
+ config. vectorize_loop ,
431
+ false ,
432
+ ptr:: null ( ) ,
433
+ ptr:: null ( ) ,
434
+ ) ;
435
+
436
+ llvm:: LLVMPassManagerBuilderSetSizeLevel ( builder, opt_size as u32 ) ;
437
+
438
+ if opt_size != llvm:: CodeGenOptSizeNone {
439
+ llvm:: LLVMPassManagerBuilderSetDisableUnrollLoops ( builder, 1 ) ;
440
+ }
436
441
437
- llvm:: LLVMRustAddBuilderLibraryInfo ( builder, llmod, config. no_builtins ) ;
442
+ llvm:: LLVMRustAddBuilderLibraryInfo ( builder, llmod, config. no_builtins ) ;
438
443
439
- // Here we match what clang does (kinda). For O0 we only inline
440
- // always-inline functions (but don't add lifetime intrinsics), at O1 we
441
- // inline with lifetime intrinsics, and O2+ we add an inliner with a
442
- // thresholds copied from clang.
443
- match ( opt_level, opt_size) {
444
- ( llvm:: CodeGenOptLevel :: Aggressive , ..) => {
445
- llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 275 ) ;
446
- }
447
- ( _, llvm:: CodeGenOptSizeDefault ) => {
448
- llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 75 ) ;
449
- }
450
- ( _, llvm:: CodeGenOptSizeAggressive ) => {
451
- llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 25 ) ;
452
- }
453
- ( llvm:: CodeGenOptLevel :: None , ..) => {
454
- llvm:: LLVMRustAddAlwaysInlinePass ( builder, false ) ;
455
- }
456
- ( llvm:: CodeGenOptLevel :: Less , ..) => {
457
- llvm:: LLVMRustAddAlwaysInlinePass ( builder, true ) ;
458
- }
459
- ( llvm:: CodeGenOptLevel :: Default , ..) => {
460
- llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 225 ) ;
461
- }
462
- ( llvm:: CodeGenOptLevel :: Other , ..) => {
463
- bug ! ( "CodeGenOptLevel::Other selected" )
444
+ // Here we match what clang does (kinda). For O0 we only inline
445
+ // always-inline functions (but don't add lifetime intrinsics), at O1 we
446
+ // inline with lifetime intrinsics, and O2+ we add an inliner with a
447
+ // thresholds copied from clang.
448
+ match ( opt_level, opt_size) {
449
+ ( llvm:: CodeGenOptLevel :: Aggressive , ..) => {
450
+ llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 275 ) ;
451
+ }
452
+ ( _, llvm:: CodeGenOptSizeDefault ) => {
453
+ llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 75 ) ;
454
+ }
455
+ ( _, llvm:: CodeGenOptSizeAggressive ) => {
456
+ llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 25 ) ;
457
+ }
458
+ ( llvm:: CodeGenOptLevel :: None , ..) => {
459
+ llvm:: LLVMRustAddAlwaysInlinePass ( builder, false ) ;
460
+ }
461
+ ( llvm:: CodeGenOptLevel :: Less , ..) => {
462
+ llvm:: LLVMRustAddAlwaysInlinePass ( builder, true ) ;
463
+ }
464
+ ( llvm:: CodeGenOptLevel :: Default , ..) => {
465
+ llvm:: LLVMPassManagerBuilderUseInlinerWithThreshold ( builder, 225 ) ;
466
+ }
467
+ ( llvm:: CodeGenOptLevel :: Other , ..) => {
468
+ bug ! ( "CodeGenOptLevel::Other selected" )
469
+ }
464
470
}
465
- }
466
471
467
- f ( builder) ;
468
- llvm:: LLVMPassManagerBuilderDispose ( builder) ;
469
- } }
472
+ f ( builder) ;
473
+ llvm:: LLVMPassManagerBuilderDispose ( builder) ;
474
+ }
475
+ }
0 commit comments