@@ -528,6 +528,102 @@ PassBuilder::PassBuilder(TargetMachine *TM, PipelineTuningOptions PTO,
528528#include " llvm/Passes/MachinePassRegistry.def"
529529 });
530530 }
531+ auto parseLevelParam = [](StringRef P) -> Expected<OptimizationLevel> {
532+ if (P == " O0" ) return OptimizationLevel::O0;
533+ if (P == " O1" ) return OptimizationLevel::O1;
534+ if (P == " O2" ) return OptimizationLevel::O2;
535+ if (P == " O3" ) return OptimizationLevel::O3;
536+ if (P == " Os" ) return OptimizationLevel::Os;
537+ if (P == " Oz" ) return OptimizationLevel::Oz;
538+ return make_error<StringError>(
539+ formatv (" invalid optimization level '{}'" , P).str (),
540+ inconvertibleErrorCode ());
541+ };
542+
543+ // Module-level callbacks without LTO phase
544+ this ->registerPipelineParsingCallback (
545+ [this , parseLevelParam](StringRef Name, ModulePassManager &PM,
546+ ArrayRef<PassBuilder::PipelineElement>) {
547+ #define MODULE_CALLBACK (NAME, INVOKE ) \
548+ if (PassBuilder::checkParametrizedPassName (Name, NAME)) { \
549+ auto L = PassBuilder::parsePassParameters (parseLevelParam, Name, NAME); \
550+ if (!L) \
551+ return (errs () << NAME " : " << toString (L.takeError ()) << ' \n ' , false ); \
552+ this ->INVOKE (PM, L.get ()); \
553+ return true ; \
554+ }
555+ #include " PassRegistry.def"
556+ #undef MODULE_CALLBACK
557+ return false ;
558+ });
559+
560+ // Module-level callbacks with LTO phase (use Phase::None for string API)
561+ this ->registerPipelineParsingCallback (
562+ [this , parseLevelParam](StringRef Name, ModulePassManager &PM,
563+ ArrayRef<PassBuilder::PipelineElement>) {
564+ #define MODULE_LTO_CALLBACK (NAME, INVOKE ) \
565+ if (PassBuilder::checkParametrizedPassName (Name, NAME)) { \
566+ auto L = PassBuilder::parsePassParameters (parseLevelParam, Name, NAME); \
567+ if (!L) \
568+ return (errs () << NAME " : " << toString (L.takeError ()) << ' \n ' , false ); \
569+ this ->INVOKE (PM, L.get (), ThinOrFullLTOPhase::None); \
570+ return true ; \
571+ }
572+ #include " PassRegistry.def"
573+ #undef MODULE_LTO_CALLBACK
574+ return false ;
575+ });
576+
577+ // Function-level callbacks
578+ this ->registerPipelineParsingCallback (
579+ [this , parseLevelParam](StringRef Name, FunctionPassManager &PM,
580+ ArrayRef<PassBuilder::PipelineElement>) {
581+ #define FUNCTION_CALLBACK (NAME, INVOKE ) \
582+ if (PassBuilder::checkParametrizedPassName (Name, NAME)) { \
583+ auto L = PassBuilder::parsePassParameters (parseLevelParam, Name, NAME); \
584+ if (!L) \
585+ return (errs () << NAME " : " << toString (L.takeError ()) << ' \n ' , false ); \
586+ this ->INVOKE (PM, L.get ()); \
587+ return true ; \
588+ }
589+ #include " PassRegistry.def"
590+ #undef FUNCTION_CALLBACK
591+ return false ;
592+ });
593+
594+ // CGSCC-level callbacks
595+ this ->registerPipelineParsingCallback (
596+ [this , parseLevelParam](StringRef Name, CGSCCPassManager &PM,
597+ ArrayRef<PassBuilder::PipelineElement>) {
598+ #define CGSCC_CALLBACK (NAME, INVOKE ) \
599+ if (PassBuilder::checkParametrizedPassName (Name, NAME)) { \
600+ auto L = PassBuilder::parsePassParameters (parseLevelParam, Name, NAME); \
601+ if (!L) \
602+ return (errs () << NAME " : " << toString (L.takeError ()) << ' \n ' , false ); \
603+ this ->INVOKE (PM, L.get ()); \
604+ return true ; \
605+ }
606+ #include " PassRegistry.def"
607+ #undef CGSCC_CALLBACK
608+ return false ;
609+ });
610+
611+ // Loop-level callbacks
612+ this ->registerPipelineParsingCallback (
613+ [this , parseLevelParam](StringRef Name, LoopPassManager &PM,
614+ ArrayRef<PassBuilder::PipelineElement>) {
615+ #define LOOP_CALLBACK (NAME, INVOKE ) \
616+ if (PassBuilder::checkParametrizedPassName (Name, NAME)) { \
617+ auto L = PassBuilder::parsePassParameters (parseLevelParam, Name, NAME); \
618+ if (!L) \
619+ return (errs () << NAME " : " << toString (L.takeError ()) << ' \n ' , false ); \
620+ this ->INVOKE (PM, L.get ()); \
621+ return true ; \
622+ }
623+ #include " PassRegistry.def"
624+ #undef LOOP_CALLBACK
625+ return false ;
626+ });
531627}
532628
533629void PassBuilder::registerModuleAnalyses (ModuleAnalysisManager &MAM) {
0 commit comments