bool tryParsePipelineText(PassBuilder &PB, StringRef PipelineText) { if (PipelineText.empty()) return false; // Verify the pipeline is parseable: PassManagerT PM; if (PB.parsePassPipeline(PM, PipelineText)) return true; errs() << "Could not parse pipeline '" << PipelineText << "'. I'm going to igore it.\n"; return false; }
TEST(PluginsTests, LoadPlugin) { #if !defined(LLVM_ENABLE_PLUGINS) // Disable the test if plugins are disabled. return; #endif auto PluginPath = LibPath(); ASSERT_NE("", PluginPath); Expected<PassPlugin> Plugin = PassPlugin::Load(PluginPath); ASSERT_TRUE(!!Plugin) << "Plugin path: " << PluginPath; ASSERT_EQ(TEST_PLUGIN_NAME, Plugin->getPluginName()); ASSERT_EQ(TEST_PLUGIN_VERSION, Plugin->getPluginVersion()); PassBuilder PB; ModulePassManager PM; ASSERT_THAT_ERROR(PB.parsePassPipeline(PM, "plugin-pass"), Failed()); Plugin->registerPassBuilderCallbacks(PB); ASSERT_THAT_ERROR(PB.parsePassPipeline(PM, "plugin-pass"), Succeeded()); }
/// If one of the EPPipeline command line options was given, register callbacks /// for parsing and inserting the given pipeline static void registerEPCallbacks(PassBuilder &PB, bool VerifyEachPass, bool DebugLogging) { if (tryParsePipelineText<FunctionPassManager>(PB, PeepholeEPPipeline)) PB.registerPeepholeEPCallback([&PB, VerifyEachPass, DebugLogging]( FunctionPassManager &PM, PassBuilder::OptimizationLevel Level) { PB.parsePassPipeline(PM, PeepholeEPPipeline, VerifyEachPass, DebugLogging); }); if (tryParsePipelineText<LoopPassManager>(PB, LateLoopOptimizationsEPPipeline)) PB.registerLateLoopOptimizationsEPCallback( [&PB, VerifyEachPass, DebugLogging]( LoopPassManager &PM, PassBuilder::OptimizationLevel Level) { PB.parsePassPipeline(PM, LateLoopOptimizationsEPPipeline, VerifyEachPass, DebugLogging); }); if (tryParsePipelineText<LoopPassManager>(PB, LoopOptimizerEndEPPipeline)) PB.registerLoopOptimizerEndEPCallback([&PB, VerifyEachPass, DebugLogging]( LoopPassManager &PM, PassBuilder::OptimizationLevel Level) { PB.parsePassPipeline(PM, LoopOptimizerEndEPPipeline, VerifyEachPass, DebugLogging); }); if (tryParsePipelineText<FunctionPassManager>(PB, ScalarOptimizerLateEPPipeline)) PB.registerScalarOptimizerLateEPCallback( [&PB, VerifyEachPass, DebugLogging]( FunctionPassManager &PM, PassBuilder::OptimizationLevel Level) { PB.parsePassPipeline(PM, ScalarOptimizerLateEPPipeline, VerifyEachPass, DebugLogging); }); if (tryParsePipelineText<CGSCCPassManager>(PB, CGSCCOptimizerLateEPPipeline)) PB.registerCGSCCOptimizerLateEPCallback([&PB, VerifyEachPass, DebugLogging]( CGSCCPassManager &PM, PassBuilder::OptimizationLevel Level) { PB.parsePassPipeline(PM, CGSCCOptimizerLateEPPipeline, VerifyEachPass, DebugLogging); }); if (tryParsePipelineText<FunctionPassManager>(PB, VectorizerStartEPPipeline)) PB.registerVectorizerStartEPCallback([&PB, VerifyEachPass, DebugLogging]( FunctionPassManager &PM, PassBuilder::OptimizationLevel Level) { PB.parsePassPipeline(PM, VectorizerStartEPPipeline, VerifyEachPass, DebugLogging); }); }