@@ -415,11 +415,12 @@ pub(crate) fn should_use_new_llvm_pass_manager(config: &ModuleConfig) -> bool {
415
415
416
416
pub ( crate ) unsafe fn optimize_with_new_llvm_pass_manager (
417
417
cgcx : & CodegenContext < LlvmCodegenBackend > ,
418
+ diag_handler : & Handler ,
418
419
module : & ModuleCodegen < ModuleLlvm > ,
419
420
config : & ModuleConfig ,
420
421
opt_level : config:: OptLevel ,
421
422
opt_stage : llvm:: OptStage ,
422
- ) {
423
+ ) -> Result < ( ) , FatalError > {
423
424
let unroll_loops =
424
425
opt_level != config:: OptLevel :: Size && opt_level != config:: OptLevel :: SizeMin ;
425
426
let using_thin_buffers = opt_stage == llvm:: OptStage :: PreLinkThinLTO || config. bitcode_needed ( ) ;
@@ -449,13 +450,12 @@ pub(crate) unsafe fn optimize_with_new_llvm_pass_manager(
449
450
std:: ptr:: null_mut ( )
450
451
} ;
451
452
453
+ let extra_passes = config. passes . join ( "," ) ;
454
+
452
455
// FIXME: NewPM doesn't provide a facility to pass custom InlineParams.
453
456
// We would have to add upstream support for this first, before we can support
454
457
// config.inline_threshold and our more aggressive default thresholds.
455
- // FIXME: NewPM uses an different and more explicit way to textually represent
456
- // pass pipelines. It would probably make sense to expose this, but it would
457
- // require a different format than the current -C passes.
458
- llvm:: LLVMRustOptimizeWithNewPassManager (
458
+ let result = llvm:: LLVMRustOptimizeWithNewPassManager (
459
459
module. module_llvm . llmod ( ) ,
460
460
& * module. module_llvm . tm ,
461
461
to_pass_builder_opt_level ( opt_level) ,
@@ -477,7 +477,10 @@ pub(crate) unsafe fn optimize_with_new_llvm_pass_manager(
477
477
llvm_selfprofiler,
478
478
selfprofile_before_pass_callback,
479
479
selfprofile_after_pass_callback,
480
+ extra_passes. as_ptr ( ) . cast ( ) ,
481
+ extra_passes. len ( ) ,
480
482
) ;
483
+ result. into_result ( ) . map_err ( |( ) | llvm_err ( diag_handler, "failed to run LLVM passes" ) )
481
484
}
482
485
483
486
// Unsafe due to LLVM calls.
@@ -486,7 +489,7 @@ pub(crate) unsafe fn optimize(
486
489
diag_handler : & Handler ,
487
490
module : & ModuleCodegen < ModuleLlvm > ,
488
491
config : & ModuleConfig ,
489
- ) {
492
+ ) -> Result < ( ) , FatalError > {
490
493
let _timer = cgcx. prof . generic_activity_with_arg ( "LLVM_module_optimize" , & module. name [ ..] ) ;
491
494
492
495
let llmod = module. module_llvm . llmod ( ) ;
@@ -511,8 +514,14 @@ pub(crate) unsafe fn optimize(
511
514
_ if cgcx. opts . cg . linker_plugin_lto . enabled ( ) => llvm:: OptStage :: PreLinkThinLTO ,
512
515
_ => llvm:: OptStage :: PreLinkNoLTO ,
513
516
} ;
514
- optimize_with_new_llvm_pass_manager ( cgcx, module, config, opt_level, opt_stage) ;
515
- return ;
517
+ return optimize_with_new_llvm_pass_manager (
518
+ cgcx,
519
+ diag_handler,
520
+ module,
521
+ config,
522
+ opt_level,
523
+ opt_stage,
524
+ ) ;
516
525
}
517
526
518
527
if cgcx. prof . llvm_recording_enabled ( ) {
@@ -647,6 +656,7 @@ pub(crate) unsafe fn optimize(
647
656
llvm:: LLVMDisposePassManager ( fpm) ;
648
657
llvm:: LLVMDisposePassManager ( mpm) ;
649
658
}
659
+ Ok ( ( ) )
650
660
}
651
661
652
662
unsafe fn add_sanitizer_passes ( config : & ModuleConfig , passes : & mut Vec < & ' static mut llvm:: Pass > ) {
0 commit comments