bool PassBuilder::parseLoopPass(LoopPassManager &LPM, const PipelineElement &E, bool VerifyEachPass, bool DebugLogging) { StringRef Name = E.Name; auto &InnerPipeline = E.InnerPipeline; // First handle complex passes like the pass managers which carry pipelines. if (!InnerPipeline.empty()) { if (Name == "loop") { LoopPassManager NestedLPM(DebugLogging); if (!parseLoopPassPipeline(NestedLPM, InnerPipeline, VerifyEachPass, DebugLogging)) return false; // Add the nested pass manager with the appropriate adaptor. LPM.addPass(std::move(NestedLPM)); return true; } if (auto Count = parseRepeatPassName(Name)) { LoopPassManager NestedLPM(DebugLogging); if (!parseLoopPassPipeline(NestedLPM, InnerPipeline, VerifyEachPass, DebugLogging)) return false; LPM.addPass(createRepeatedPass(*Count, std::move(NestedLPM))); return true; } // Normal passes can't have pipelines. return false; } // Now expand the basic registered passes from the .inc file. #define LOOP_PASS(NAME, CREATE_PASS) \ if (Name == NAME) { \ LPM.addPass(CREATE_PASS); \ return true; \ } #define LOOP_ANALYSIS(NAME, CREATE_PASS) \ if (Name == "require<" NAME ">") { \ LPM.addPass(RequireAnalysisPass< \ std::remove_reference<decltype(CREATE_PASS)>::type, Loop>()); \ return true; \ } \ if (Name == "invalidate<" NAME ">") { \ LPM.addPass(InvalidateAnalysisPass< \ std::remove_reference<decltype(CREATE_PASS)>::type>()); \ return true; \ } #include "PassRegistry.def" return false; }
bool PassBuilder::parseLoopPassPipeline(LoopPassManager &LPM, StringRef &PipelineText, bool VerifyEachPass, bool DebugLogging) { for (;;) { // Parse nested pass managers by recursing. if (PipelineText.startswith("loop(")) { LoopPassManager NestedLPM(DebugLogging); // Parse the inner pipeline inte the nested manager. PipelineText = PipelineText.substr(strlen("loop(")); if (!parseLoopPassPipeline(NestedLPM, PipelineText, VerifyEachPass, DebugLogging) || PipelineText.empty()) return false; assert(PipelineText[0] == ')'); PipelineText = PipelineText.substr(1); // Add the nested pass manager with the appropriate adaptor. LPM.addPass(std::move(NestedLPM)); } else { // Otherwise try to parse a pass name. size_t End = PipelineText.find_first_of(",)"); if (!parseLoopPassName(LPM, PipelineText.substr(0, End))) return false; // TODO: Ideally, we would run a LoopVerifierPass() here in the // VerifyEachPass case, but we don't have such a verifier yet. PipelineText = PipelineText.substr(End); } if (PipelineText.empty() || PipelineText[0] == ')') return true; assert(PipelineText[0] == ','); PipelineText = PipelineText.substr(1); } }