Index: llvm/test/Feature/load_extension.ll =================================================================== --- llvm/test/Feature/load_extension.ll +++ llvm/test/Feature/load_extension.ll @@ -1,6 +1,7 @@ ; REQUIRES: x86-registered-target ; RUN: opt %s %loadbye -goodbye -wave-goodbye -disable-output -enable-new-pm=0 2>&1 | FileCheck %s ; RUN: opt %s %loadnewpmbye %loadbye -passes="goodbye" -wave-goodbye -disable-output 2>&1 | FileCheck %s +; RUN: opt %s %loadnewpmbye -passes="goodbye" -wave-goodbye -disable-output 2>&1 | FileCheck %s ; RUN: opt -module-summary %s -o %t.o ; RUN: llvm-lto2 run %t.o %loadbye -wave-goodbye -use-new-pm=0 -o %t -r %t.o,somefunk,plx -r %t.o,junk,plx 2>&1 | FileCheck %s ; RUN: llvm-lto2 run %t.o %loadbye %loadnewpmbye -wave-goodbye -use-new-pm -o %t -r %t.o,somefunk,plx -r %t.o,junk,plx 2>&1 | FileCheck %s Index: llvm/tools/opt/NewPMDriver.h =================================================================== --- llvm/tools/opt/NewPMDriver.h +++ llvm/tools/opt/NewPMDriver.h @@ -26,6 +26,7 @@ namespace llvm { class StringRef; class Module; +class PassPlugin; class TargetMachine; class ToolOutputFile; class TargetLibraryInfoImpl; @@ -69,7 +70,8 @@ TargetLibraryInfoImpl *TLII, ToolOutputFile *Out, ToolOutputFile *ThinLinkOut, ToolOutputFile *OptRemarkFile, StringRef PassPipeline, ArrayRef PassInfos, - opt_tool::OutputKind OK, opt_tool::VerifierKind VK, + ArrayRef PassPlugins, opt_tool::OutputKind OK, + opt_tool::VerifierKind VK, bool ShouldPreserveAssemblyUseListOrder, bool ShouldPreserveBitcodeUseListOrder, bool EmitSummaryIndex, bool EmitModuleHash, Index: llvm/tools/opt/NewPMDriver.cpp =================================================================== --- llvm/tools/opt/NewPMDriver.cpp +++ llvm/tools/opt/NewPMDriver.cpp @@ -66,10 +66,6 @@ DebugLogging::Verbose, "verbose", "Print extra information about adaptors and pass managers"))); -static cl::list - PassPlugins("load-pass-plugin", - cl::desc("Load passes from plugin library")); - // This flag specifies a textual description of the alias analysis pipeline to // use when querying for aliasing information. It only works in concert with // the "passes" flag above. @@ -269,6 +265,7 @@ ToolOutputFile *ThinLTOLinkOut, ToolOutputFile *OptRemarkFile, StringRef PassPipeline, ArrayRef Passes, + ArrayRef PassPlugins, OutputKind OK, VerifierKind VK, bool ShouldPreserveAssemblyUseListOrder, bool ShouldPreserveBitcodeUseListOrder, @@ -341,17 +338,9 @@ PassBuilder PB(TM, PTO, P, &PIC); registerEPCallbacks(PB); - // Load requested pass plugins and let them register pass builder callbacks - for (auto &PluginFN : PassPlugins) { - auto PassPlugin = PassPlugin::Load(PluginFN); - if (!PassPlugin) { - errs() << "Failed to load passes from '" << PluginFN - << "'. Request ignored.\n"; - continue; - } - - PassPlugin->registerPassBuilderCallbacks(PB); - } + // For any loaded plugins, let them register pass builder callbacks. + for (auto &PassPlugin : PassPlugins) + PassPlugin.registerPassBuilderCallbacks(PB); PB.registerPipelineParsingCallback( [](StringRef Name, ModulePassManager &MPM, Index: llvm/tools/opt/opt.cpp =================================================================== --- llvm/tools/opt/opt.cpp +++ llvm/tools/opt/opt.cpp @@ -39,6 +39,7 @@ #include "llvm/LinkAllPasses.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/MC/TargetRegistry.h" +#include "llvm/Passes/PassPlugin.h" #include "llvm/Remarks/HotnessThresholdParser.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FileSystem.h" @@ -300,6 +301,10 @@ cl::desc("The format used for serializing remarks (default: YAML)"), cl::value_desc("format"), cl::init("yaml")); +static cl::list + PassPlugins("load-pass-plugin", + cl::desc("Load passes from plugin library")); + namespace llvm { cl::opt PGOKindFlag("pgo-kind", cl::init(NoPGO), cl::Hidden, @@ -581,6 +586,17 @@ initializeExampleIRTransforms(Registry); #endif + SmallVector PluginList; + PassPlugins.setCallback([&](const std::string &PluginPath) { + auto Plugin = PassPlugin::Load(PluginPath); + if (!Plugin) { + errs() << "Failed to load passes from '" << PluginPath + << "'. Request ignored.\n"; + return; + } + PluginList.emplace_back(Plugin.get()); + }); + cl::ParseCommandLineOptions(argc, argv, "llvm .bc -> .bc modular optimizer and analysis printer\n"); @@ -821,7 +837,7 @@ // layer. return runPassPipeline(argv[0], *M, TM.get(), &TLII, Out.get(), ThinLinkOut.get(), RemarksFile.get(), Pipeline, - Passes, OK, VK, PreserveAssemblyUseListOrder, + Passes, PluginList, OK, VK, PreserveAssemblyUseListOrder, PreserveBitcodeUseListOrder, EmitSummaryIndex, EmitModuleHash, EnableDebugify) ? 0