@@ -194,8 +194,9 @@ pub(crate) unsafe fn codegen(
194194 . temp_path ( OutputType :: LlvmAssembly , module_name) ;
195195 let out = out. to_str ( ) . unwrap ( ) ;
196196
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+ } ;
199200
200201 result. into_result ( ) . map_err ( |( ) | {
201202 let msg = format ! ( "failed to write NVVM IR to {}" , out) ;
@@ -350,56 +351,59 @@ pub(crate) unsafe fn optimize(
350351
351352 let tm = ( cgcx. tm_factory ) ( tm_factory_config) . expect ( "failed to create target machine" ) ;
352353
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 ( ) ;
356358
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 ;
369364 }
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
370376 } ;
371- llvm:: LLVMRustAddPass ( pass_manager, pass) ;
372- true
373- } ;
374377
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+ }
386389
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+ }
390394 }
391- }
392395
393- diag_handler. abort_if_errors ( ) ;
396+ diag_handler. abort_if_errors ( ) ;
394397
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) ;
398401
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+ }
403407
404408 Ok ( ( ) )
405409}
@@ -409,61 +413,63 @@ unsafe fn with_llvm_pmb(
409413 config : & ModuleConfig ,
410414 opt_level : llvm:: CodeGenOptLevel ,
411415 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+ }
436441
437- llvm:: LLVMRustAddBuilderLibraryInfo ( builder, llmod, config. no_builtins ) ;
442+ llvm:: LLVMRustAddBuilderLibraryInfo ( builder, llmod, config. no_builtins ) ;
438443
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+ }
464470 }
465- }
466471
467- f ( builder) ;
468- llvm:: LLVMPassManagerBuilderDispose ( builder) ;
469- } }
472+ f ( builder) ;
473+ llvm:: LLVMPassManagerBuilderDispose ( builder) ;
474+ }
475+ }
0 commit comments