@@ -319,6 +319,8 @@ struct CodegenContext<'a> {
319
319
lto_ctxt : Option < ( & ' a Session , & ' a [ String ] ) > ,
320
320
// Handler to use for diagnostics produced during codegen.
321
321
handler : & ' a Handler ,
322
+ // LLVM passes added by plugins.
323
+ plugin_passes : Vec < String > ,
322
324
// LLVM optimizations for which we want to print remarks.
323
325
remark : Passes ,
324
326
}
@@ -328,6 +330,7 @@ impl<'a> CodegenContext<'a> {
328
330
CodegenContext {
329
331
lto_ctxt : Some ( ( sess, reachable) ) ,
330
332
handler : sess. diagnostic ( ) . handler ( ) ,
333
+ plugin_passes : sess. plugin_llvm_passes . borrow ( ) . clone ( ) ,
331
334
remark : sess. opts . cg . remark . clone ( ) ,
332
335
}
333
336
}
@@ -461,6 +464,16 @@ unsafe fn optimize_and_codegen(cgcx: &CodegenContext,
461
464
}
462
465
}
463
466
467
+ for pass in & cgcx. plugin_passes {
468
+ let pass = CString :: new ( pass. clone ( ) ) . unwrap ( ) ;
469
+ if !llvm:: LLVMRustAddPass ( mpm, pass. as_ptr ( ) ) {
470
+ cgcx. handler . err ( & format ! ( "a plugin asked for LLVM pass {:?} but LLVM \
471
+ does not recognize it", pass) ) ;
472
+ }
473
+ }
474
+
475
+ cgcx. handler . abort_if_errors ( ) ;
476
+
464
477
// Finally, run the actual optimization passes
465
478
time ( config. time_passes , "llvm function passes" , ( ) , |( ) |
466
479
llvm:: LLVMRustRunFunctionPassManager ( fpm, llmod) ) ;
@@ -907,6 +920,7 @@ fn run_work_multithreaded(sess: &Session,
907
920
for i in 0 ..num_workers {
908
921
let work_items_arc = work_items_arc. clone ( ) ;
909
922
let diag_emitter = diag_emitter. clone ( ) ;
923
+ let plugin_passes = sess. plugin_llvm_passes . borrow ( ) . clone ( ) ;
910
924
let remark = sess. opts . cg . remark . clone ( ) ;
911
925
912
926
let ( tx, rx) = channel ( ) ;
@@ -921,6 +935,7 @@ fn run_work_multithreaded(sess: &Session,
921
935
let cgcx = CodegenContext {
922
936
lto_ctxt : None ,
923
937
handler : & diag_handler,
938
+ plugin_passes : plugin_passes,
924
939
remark : remark,
925
940
} ;
926
941
0 commit comments