@@ -25,7 +25,7 @@ use rustc::session::config::{self, OutputFilenames, OutputType, Passes, SomePass
2525use rustc:: session:: Session ;
2626use rustc:: util:: nodemap:: FxHashMap ;
2727use time_graph:: { self , TimeGraph , Timeline } ;
28- use llvm:: { self , DiagnosticInfo , PassManagerRef , SMDiagnostic } ;
28+ use llvm:: { self , DiagnosticInfo , PassManager , SMDiagnostic } ;
2929use { CodegenResults , ModuleSource , ModuleCodegen , CompiledModule , ModuleKind } ;
3030use CrateInfo ;
3131use rustc:: hir:: def_id:: { CrateNum , LOCAL_CRATE } ;
@@ -92,9 +92,9 @@ pub fn llvm_err(handler: &errors::Handler, msg: String) -> FatalError {
9292
9393pub fn write_output_file (
9494 handler : & errors:: Handler ,
95- target : & llvm:: TargetMachine ,
96- pm : llvm:: PassManagerRef ,
97- m : & llvm:: Module ,
95+ target : & ' ll llvm:: TargetMachine ,
96+ pm : & llvm:: PassManager < ' ll > ,
97+ m : & ' ll llvm:: Module ,
9898 output : & Path ,
9999 file_type : llvm:: FileType ) -> Result < ( ) , FatalError > {
100100 unsafe {
@@ -516,50 +516,52 @@ unsafe fn optimize(cgcx: &CodegenContext,
516516 let fpm = llvm:: LLVMCreateFunctionPassManagerForModule ( llmod) ;
517517 let mpm = llvm:: LLVMCreatePassManager ( ) ;
518518
519- // If we're verifying or linting, add them to the function pass
520- // manager.
521- let addpass = |pass_name : & str | {
522- let pass_name = CString :: new ( pass_name) . unwrap ( ) ;
523- let pass = match llvm:: LLVMRustFindAndCreatePass ( pass_name. as_ptr ( ) ) {
524- Some ( pass) => pass,
525- None => return false ,
526- } ;
527- let pass_manager = match llvm:: LLVMRustPassKind ( pass) {
528- llvm:: PassKind :: Function => fpm,
529- llvm:: PassKind :: Module => mpm,
530- llvm:: PassKind :: Other => {
531- diag_handler. err ( "Encountered LLVM pass kind we can't handle" ) ;
532- return true
533- } ,
519+ {
520+ // If we're verifying or linting, add them to the function pass
521+ // manager.
522+ let addpass = |pass_name : & str | {
523+ let pass_name = CString :: new ( pass_name) . unwrap ( ) ;
524+ let pass = match llvm:: LLVMRustFindAndCreatePass ( pass_name. as_ptr ( ) ) {
525+ Some ( pass) => pass,
526+ None => return false ,
527+ } ;
528+ let pass_manager = match llvm:: LLVMRustPassKind ( pass) {
529+ llvm:: PassKind :: Function => & * fpm,
530+ llvm:: PassKind :: Module => & * mpm,
531+ llvm:: PassKind :: Other => {
532+ diag_handler. err ( "Encountered LLVM pass kind we can't handle" ) ;
533+ return true
534+ } ,
535+ } ;
536+ llvm:: LLVMRustAddPass ( pass_manager, pass) ;
537+ true
534538 } ;
535- llvm:: LLVMRustAddPass ( pass_manager, pass) ;
536- true
537- } ;
538539
539- if config. verify_llvm_ir { assert ! ( addpass( "verify" ) ) ; }
540- if !config. no_prepopulate_passes {
541- llvm:: LLVMRustAddAnalysisPasses ( tm, fpm, llmod) ;
542- llvm:: LLVMRustAddAnalysisPasses ( tm, mpm, llmod) ;
543- let opt_level = config. opt_level . unwrap_or ( llvm:: CodeGenOptLevel :: None ) ;
544- let prepare_for_thin_lto = cgcx. lto == Lto :: Thin || cgcx. lto == Lto :: ThinLocal ;
545- with_llvm_pmb ( llmod, & config, opt_level, prepare_for_thin_lto, & mut |b| {
546- llvm:: LLVMPassManagerBuilderPopulateFunctionPassManager ( b, fpm) ;
547- llvm:: LLVMPassManagerBuilderPopulateModulePassManager ( b, mpm) ;
548- } )
549- }
540+ if config. verify_llvm_ir { assert ! ( addpass( "verify" ) ) ; }
541+ if !config. no_prepopulate_passes {
542+ llvm:: LLVMRustAddAnalysisPasses ( tm, fpm, llmod) ;
543+ llvm:: LLVMRustAddAnalysisPasses ( tm, mpm, llmod) ;
544+ let opt_level = config. opt_level . unwrap_or ( llvm:: CodeGenOptLevel :: None ) ;
545+ let prepare_for_thin_lto = cgcx. lto == Lto :: Thin || cgcx. lto == Lto :: ThinLocal ;
546+ with_llvm_pmb ( llmod, & config, opt_level, prepare_for_thin_lto, & mut |b| {
547+ llvm:: LLVMPassManagerBuilderPopulateFunctionPassManager ( b, fpm) ;
548+ llvm:: LLVMPassManagerBuilderPopulateModulePassManager ( b, mpm) ;
549+ } )
550+ }
550551
551- for pass in & config. passes {
552- if !addpass ( pass) {
553- diag_handler. warn ( & format ! ( "unknown pass `{}`, ignoring" ,
554- pass) ) ;
552+ for pass in & config. passes {
553+ if !addpass ( pass) {
554+ diag_handler. warn ( & format ! ( "unknown pass `{}`, ignoring" ,
555+ pass) ) ;
556+ }
555557 }
556- }
557558
558- for pass in & cgcx. plugin_passes {
559- if !addpass ( pass) {
560- diag_handler. err ( & format ! ( "a plugin asked for LLVM pass \
561- `{}` but LLVM does not \
562- recognize it", pass) ) ;
559+ for pass in & cgcx. plugin_passes {
560+ if !addpass ( pass) {
561+ diag_handler. err ( & format ! ( "a plugin asked for LLVM pass \
562+ `{}` but LLVM does not \
563+ recognize it", pass) ) ;
564+ }
563565 }
564566 }
565567
@@ -636,11 +638,11 @@ unsafe fn codegen(cgcx: &CodegenContext,
636638 // pass manager passed to the closure should be ensured to not
637639 // escape the closure itself, and the manager should only be
638640 // used once.
639- unsafe fn with_codegen < F , R > ( tm : & llvm:: TargetMachine ,
640- llmod : & llvm:: Module ,
641+ unsafe fn with_codegen < ' ll , F , R > ( tm : & ' ll llvm:: TargetMachine ,
642+ llmod : & ' ll llvm:: Module ,
641643 no_builtins : bool ,
642644 f : F ) -> R
643- where F : FnOnce ( PassManagerRef ) -> R ,
645+ where F : FnOnce ( & ' ll mut PassManager < ' ll > ) -> R ,
644646 {
645647 let cpm = llvm:: LLVMCreatePassManager ( ) ;
646648 llvm:: LLVMRustAddAnalysisPasses ( tm, cpm, llmod) ;
0 commit comments