@@ -515,20 +515,23 @@ void jl_dump_native_impl(void *native_code,
515515 std::vector<NewArchiveMember> unopt_bc_Archive;
516516 std::vector<std::string> outputs;
517517
518- legacy::PassManager preopt, postopt;
518+ PassBuilder emptyPB;
519+ AnalysisManagers empty (emptyPB);
520+ ModulePassManager preopt, postopt;
521+ legacy::PassManager emitter; // MC emission is only supported on legacy PM
519522
520523 if (unopt_bc_fname)
521- preopt.add ( createBitcodeWriterPass (unopt_bc_OS));
524+ preopt.addPass ( BitcodeWriterPass (unopt_bc_OS));
522525
523- // Is this necessary for TM?
524- // addTargetPasses(&postopt, TM->getTargetTriple(), TM->getTargetIRAnalysis());
525526 if (bc_fname)
526- postopt.add (createBitcodeWriterPass (bc_OS));
527+ postopt.addPass (BitcodeWriterPass (bc_OS));
528+ // Is this necessary for TM?
529+ addTargetPasses (&emitter, TM->getTargetTriple (), TM->getTargetIRAnalysis ());
527530 if (obj_fname)
528- if (TM->addPassesToEmitFile (postopt , obj_OS, nullptr , CGFT_ObjectFile, false ))
531+ if (TM->addPassesToEmitFile (emitter , obj_OS, nullptr , CGFT_ObjectFile, false ))
529532 jl_safe_printf (" ERROR: target does not support generation of object files\n " );
530533 if (asm_fname)
531- if (TM->addPassesToEmitFile (postopt , asm_OS, nullptr , CGFT_AssemblyFile, false ))
534+ if (TM->addPassesToEmitFile (emitter , asm_OS, nullptr , CGFT_AssemblyFile, false ))
532535 jl_safe_printf (" ERROR: target does not support generation of object files\n " );
533536
534537 legacy::PassManager optimizer;
@@ -567,7 +570,7 @@ void jl_dump_native_impl(void *native_code,
567570
568571 // do the actual work
569572 auto add_output = [&] (Module &M, StringRef unopt_bc_Name, StringRef bc_Name, StringRef obj_Name, StringRef asm_Name) {
570- preopt.run (M);
573+ preopt.run (M, empty. MAM );
571574 optimizer.run (M);
572575
573576 // We would like to emit an alias or an weakref alias to redirect these symbols
@@ -585,7 +588,8 @@ void jl_dump_native_impl(void *native_code,
585588 injectCRTAlias (M, " __truncdfhf2" , " julia__truncdfhf2" ,
586589 FunctionType::get (Type::getHalfTy (Context), { Type::getDoubleTy (Context) }, false ));
587590
588- postopt.run (M);
591+ postopt.run (M, empty.MAM );
592+ emitter.run (M);
589593
590594 if (unopt_bc_fname)
591595 emit_result (unopt_bc_Archive, unopt_bc_Buffer, unopt_bc_Name, outputs);
@@ -946,79 +950,27 @@ static void registerCallbacks(PassBuilder &PB) {
946950 PB.registerPipelineParsingCallback (
947951 [](StringRef Name, FunctionPassManager &PM,
948952 ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
949- if (Name == " DemoteFloat16" ) {
950- PM.addPass (DemoteFloat16 ());
951- return true ;
952- }
953- if (Name == " CombineMulAdd" ) {
954- PM.addPass (CombineMulAdd ());
955- return true ;
956- }
957- if (Name == " LateLowerGCFrame" ) {
958- PM.addPass (LateLowerGC ());
959- return true ;
960- }
961- if (Name == " AllocOpt" ) {
962- PM.addPass (AllocOptPass ());
963- return true ;
964- }
965- if (Name == " PropagateJuliaAddrspaces" ) {
966- PM.addPass (PropagateJuliaAddrspacesPass ());
967- return true ;
968- }
969- if (Name == " LowerExcHandlers" ) {
970- PM.addPass (LowerExcHandlers ());
971- return true ;
972- }
973- if (Name == " GCInvariantVerifier" ) {
974- // TODO: Parse option and allow users to set `Strong`
975- PM.addPass (GCInvariantVerifierPass ());
976- return true ;
977- }
953+ #define FUNCTION_PASS (NAME, CREATE_PASS ) if (Name == NAME) { PM.addPass (CREATE_PASS); return true ; }
954+ #include " llvm-julia-passes.inc"
955+ #undef FUNCTION_PASS
978956 return false ;
979957 });
980958
981959 PB.registerPipelineParsingCallback (
982960 [](StringRef Name, ModulePassManager &PM,
983961 ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
984- if (Name == " CPUFeatures" ) {
985- PM.addPass (CPUFeatures ());
986- return true ;
987- }
988- if (Name == " RemoveNI" ) {
989- PM.addPass (RemoveNI ());
990- return true ;
991- }
992- if (Name == " LowerSIMDLoop" ) {
993- PM.addPass (LowerSIMDLoop ());
994- return true ;
995- }
996- if (Name == " FinalLowerGC" ) {
997- PM.addPass (FinalLowerGCPass ());
998- return true ;
999- }
1000- if (Name == " RemoveJuliaAddrspaces" ) {
1001- PM.addPass (RemoveJuliaAddrspacesPass ());
1002- return true ;
1003- }
1004- if (Name == " MultiVersioning" ) {
1005- PM.addPass (MultiVersioning ());
1006- return true ;
1007- }
1008- if (Name == " LowerPTLS" ) {
1009- PM.addPass (LowerPTLSPass ());
1010- return true ;
1011- }
962+ #define MODULE_PASS (NAME, CREATE_PASS ) if (Name == NAME) { PM.addPass (CREATE_PASS); return true ; }
963+ #include " llvm-julia-passes.inc"
964+ #undef MODULE_PASS
1012965 return false ;
1013966 });
1014967
1015968 PB.registerPipelineParsingCallback (
1016969 [](StringRef Name, LoopPassManager &PM,
1017970 ArrayRef<PassBuilder::PipelineElement> InnerPipeline) {
1018- if (Name == " JuliaLICM" ) {
1019- PM.addPass (JuliaLICMPass ());
1020- return true ;
1021- }
971+ #define LOOP_PASS (NAME, CREATE_PASS ) if (Name == NAME) { PM.addPass (CREATE_PASS); return true ; }
972+ #include " llvm-julia-passes.inc"
973+ #undef LOOP_PASS
1022974 return false ;
1023975 });
1024976}
0 commit comments