From eb75f906dad539496e2a175429b3f6675316493c Mon Sep 17 00:00:00 2001 From: Philip Pfaffe Date: Tue, 11 Jul 2017 11:17:44 +0000 Subject: [PATCH] [PM] Another post-commit fix in NewPMDriver There were two errors in the parsing of opt's command line options for extension point pipelines. The EP callbacks are not supposed to return a value. To check the pipeline text for correctness, I now try to parse it into a temporary PM object, and print a message on failure. This solves the compile time error for the lambda return type, as well as correctly handles unparsable pipelines now. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@307649 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/opt/NewPMDriver.cpp | 53 ++++++++++++++++++++++++++------------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/tools/opt/NewPMDriver.cpp b/tools/opt/NewPMDriver.cpp index 07ba102e371..94242d795aa 100644 --- a/tools/opt/NewPMDriver.cpp +++ b/tools/opt/NewPMDriver.cpp @@ -83,47 +83,64 @@ static cl::opt VectorizerStartEPPipeline( cl::Hidden); /// @}} +template +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; +} + /// 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 (!PeepholeEPPipeline.empty()) + if (tryParsePipelineText(PB, PeepholeEPPipeline)) PB.registerPeepholeEPCallback([&PB, VerifyEachPass, DebugLogging]( FunctionPassManager &PM, PassBuilder::OptimizationLevel Level) { - return PB.parsePassPipeline(PM, PeepholeEPPipeline, VerifyEachPass, - DebugLogging); + PB.parsePassPipeline(PM, PeepholeEPPipeline, VerifyEachPass, + DebugLogging); }); - if (!LateLoopOptimizationsEPPipeline.empty()) + if (tryParsePipelineText(PB, + LateLoopOptimizationsEPPipeline)) PB.registerLateLoopOptimizationsEPCallback( [&PB, VerifyEachPass, DebugLogging]( LoopPassManager &PM, PassBuilder::OptimizationLevel Level) { - return PB.parsePassPipeline(PM, LateLoopOptimizationsEPPipeline, - VerifyEachPass, DebugLogging); + PB.parsePassPipeline(PM, LateLoopOptimizationsEPPipeline, + VerifyEachPass, DebugLogging); }); - if (!LoopOptimizerEndEPPipeline.empty()) + if (tryParsePipelineText(PB, LoopOptimizerEndEPPipeline)) PB.registerLoopOptimizerEndEPCallback([&PB, VerifyEachPass, DebugLogging]( LoopPassManager &PM, PassBuilder::OptimizationLevel Level) { - return PB.parsePassPipeline(PM, LoopOptimizerEndEPPipeline, - VerifyEachPass, DebugLogging); + PB.parsePassPipeline(PM, LoopOptimizerEndEPPipeline, VerifyEachPass, + DebugLogging); }); - if (!ScalarOptimizerLateEPPipeline.empty()) + if (tryParsePipelineText(PB, + ScalarOptimizerLateEPPipeline)) PB.registerScalarOptimizerLateEPCallback( [&PB, VerifyEachPass, DebugLogging]( FunctionPassManager &PM, PassBuilder::OptimizationLevel Level) { - return PB.parsePassPipeline(PM, ScalarOptimizerLateEPPipeline, - VerifyEachPass, DebugLogging); + PB.parsePassPipeline(PM, ScalarOptimizerLateEPPipeline, + VerifyEachPass, DebugLogging); }); - if (!CGSCCOptimizerLateEPPipeline.empty()) + if (tryParsePipelineText(PB, CGSCCOptimizerLateEPPipeline)) PB.registerCGSCCOptimizerLateEPCallback([&PB, VerifyEachPass, DebugLogging]( CGSCCPassManager &PM, PassBuilder::OptimizationLevel Level) { - return PB.parsePassPipeline(PM, CGSCCOptimizerLateEPPipeline, - VerifyEachPass, DebugLogging); + PB.parsePassPipeline(PM, CGSCCOptimizerLateEPPipeline, VerifyEachPass, + DebugLogging); }); - if (!VectorizerStartEPPipeline.empty()) + if (tryParsePipelineText(PB, VectorizerStartEPPipeline)) PB.registerVectorizerStartEPCallback([&PB, VerifyEachPass, DebugLogging]( FunctionPassManager &PM, PassBuilder::OptimizationLevel Level) { - return PB.parsePassPipeline(PM, VectorizerStartEPPipeline, VerifyEachPass, - DebugLogging); + PB.parsePassPipeline(PM, VectorizerStartEPPipeline, VerifyEachPass, + DebugLogging); }); }