diff options
Diffstat (limited to 'tools/opt/Passes.cpp')
-rw-r--r-- | tools/opt/Passes.cpp | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/tools/opt/Passes.cpp b/tools/opt/Passes.cpp index e79ac422eb..36fe6ad126 100644 --- a/tools/opt/Passes.cpp +++ b/tools/opt/Passes.cpp @@ -17,6 +17,7 @@ #include "Passes.h" #include "llvm/IR/IRPrintingPasses.h" #include "llvm/IR/PassManager.h" +#include "llvm/IR/Verifier.h" #include "llvm/Support/Debug.h" using namespace llvm; @@ -78,7 +79,8 @@ static bool parseFunctionPassName(FunctionPassManager &FPM, StringRef Name) { } static bool parseFunctionPassPipeline(FunctionPassManager &FPM, - StringRef &PipelineText) { + StringRef &PipelineText, + bool VerifyEachPass) { for (;;) { // Parse nested pass managers by recursing. if (PipelineText.startswith("function(")) { @@ -86,7 +88,7 @@ static bool parseFunctionPassPipeline(FunctionPassManager &FPM, // Parse the inner pipeline inte the nested manager. PipelineText = PipelineText.substr(strlen("function(")); - if (!parseFunctionPassPipeline(NestedFPM, PipelineText) || + if (!parseFunctionPassPipeline(NestedFPM, PipelineText, VerifyEachPass) || PipelineText.empty()) return false; assert(PipelineText[0] == ')'); @@ -99,6 +101,8 @@ static bool parseFunctionPassPipeline(FunctionPassManager &FPM, size_t End = PipelineText.find_first_of(",)"); if (!parseFunctionPassName(FPM, PipelineText.substr(0, End))) return false; + if (VerifyEachPass) + FPM.addPass(VerifierPass()); PipelineText = PipelineText.substr(End); } @@ -112,7 +116,8 @@ static bool parseFunctionPassPipeline(FunctionPassManager &FPM, } static bool parseModulePassPipeline(ModulePassManager &MPM, - StringRef &PipelineText) { + StringRef &PipelineText, + bool VerifyEachPass) { for (;;) { // Parse nested pass managers by recursing. if (PipelineText.startswith("module(")) { @@ -120,7 +125,7 @@ static bool parseModulePassPipeline(ModulePassManager &MPM, // Parse the inner pipeline into the nested manager. PipelineText = PipelineText.substr(strlen("module(")); - if (!parseModulePassPipeline(NestedMPM, PipelineText) || + if (!parseModulePassPipeline(NestedMPM, PipelineText, VerifyEachPass) || PipelineText.empty()) return false; assert(PipelineText[0] == ')'); @@ -133,7 +138,7 @@ static bool parseModulePassPipeline(ModulePassManager &MPM, // Parse the inner pipeline inte the nested manager. PipelineText = PipelineText.substr(strlen("function(")); - if (!parseFunctionPassPipeline(NestedFPM, PipelineText) || + if (!parseFunctionPassPipeline(NestedFPM, PipelineText, VerifyEachPass) || PipelineText.empty()) return false; assert(PipelineText[0] == ')'); @@ -146,6 +151,8 @@ static bool parseModulePassPipeline(ModulePassManager &MPM, size_t End = PipelineText.find_first_of(",)"); if (!parseModulePassName(MPM, PipelineText.substr(0, End))) return false; + if (VerifyEachPass) + MPM.addPass(VerifierPass()); PipelineText = PipelineText.substr(End); } @@ -161,13 +168,16 @@ static bool parseModulePassPipeline(ModulePassManager &MPM, // Primary pass pipeline description parsing routine. // FIXME: Should this routine accept a TargetMachine or require the caller to // pre-populate the analysis managers with target-specific stuff? -bool llvm::parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText) { +bool llvm::parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText, + bool VerifyEachPass) { // Look at the first entry to figure out which layer to start parsing at. if (PipelineText.startswith("module(")) - return parseModulePassPipeline(MPM, PipelineText) && PipelineText.empty(); + return parseModulePassPipeline(MPM, PipelineText, VerifyEachPass) && + PipelineText.empty(); if (PipelineText.startswith("function(")) { FunctionPassManager FPM; - if (!parseFunctionPassPipeline(FPM, PipelineText) || !PipelineText.empty()) + if (!parseFunctionPassPipeline(FPM, PipelineText, VerifyEachPass) || + !PipelineText.empty()) return false; MPM.addPass(createModuleToFunctionPassAdaptor(FPM)); return true; @@ -177,11 +187,13 @@ bool llvm::parsePassPipeline(ModulePassManager &MPM, StringRef PipelineText) { StringRef FirstName = PipelineText.substr(0, PipelineText.find_first_of(",)")); if (isModulePassName(FirstName)) - return parseModulePassPipeline(MPM, PipelineText) && PipelineText.empty(); + return parseModulePassPipeline(MPM, PipelineText, VerifyEachPass) && + PipelineText.empty(); if (isFunctionPassName(FirstName)) { FunctionPassManager FPM; - if (!parseFunctionPassPipeline(FPM, PipelineText) || !PipelineText.empty()) + if (!parseFunctionPassPipeline(FPM, PipelineText, VerifyEachPass) || + !PipelineText.empty()) return false; MPM.addPass(createModuleToFunctionPassAdaptor(FPM)); return true; |