diff --git a/llvm/include/llvm/IR/PassManager.h b/llvm/include/llvm/IR/PassManager.h --- a/llvm/include/llvm/IR/PassManager.h +++ b/llvm/include/llvm/IR/PassManager.h @@ -381,6 +381,16 @@ Name = Name.drop_front(strlen("llvm::")); return Name; } + + static void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) { + auto PassName = PIC.getPassNameForClassName(name()); + if (!PassName.empty()) { + if (!PassesStr.empty() && PassesStr.back() != '(') + PassesStr += ","; + PassesStr += PassName; + } + } }; /// A CRTP mix-in that provides informational APIs needed for analysis passes. @@ -480,6 +490,14 @@ return *this; } + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) { + for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) { + auto *P = Passes[Idx].get(); + P->buildPassesStr(PIC, PassesStr); + } + } + /// Run all of the passes in this manager over the given unit of IR. /// ExtraArgs are passed to each pass. PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, @@ -1195,6 +1213,8 @@ /// Runs the function pass across every function in the module. PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr); static bool isRequired() { return true; } diff --git a/llvm/include/llvm/IR/PassManagerInternal.h b/llvm/include/llvm/IR/PassManagerInternal.h --- a/llvm/include/llvm/IR/PassManagerInternal.h +++ b/llvm/include/llvm/IR/PassManagerInternal.h @@ -46,6 +46,8 @@ virtual PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs) = 0; + virtual void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) = 0; /// Polymorphic method to access the name of a pass. virtual StringRef name() const = 0; @@ -85,6 +87,11 @@ return Pass.run(IR, AM, ExtraArgs...); } + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) override { + Pass.buildPassesStr(PIC, PassesStr); + } + StringRef name() const override { return PassT::name(); } template diff --git a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h --- a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h +++ b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h @@ -424,6 +424,8 @@ /// Runs the loop passes across every loop in the function. PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr); static bool isRequired() { return true; } diff --git a/llvm/lib/IR/PassManager.cpp b/llvm/lib/IR/PassManager.cpp --- a/llvm/lib/IR/PassManager.cpp +++ b/llvm/lib/IR/PassManager.cpp @@ -91,6 +91,15 @@ } } // namespace llvm +void ModuleToFunctionPassAdaptor::buildPassesStr( + PassInstrumentationCallbacks &PIC, std::string &PassesStr) { + if (!PassesStr.empty() && PassesStr.back() != '(') + PassesStr += ","; + PassesStr += "function("; + Pass->buildPassesStr(PIC, PassesStr); + PassesStr += ")"; +} + PreservedAnalyses ModuleToFunctionPassAdaptor::run(Module &M, ModuleAnalysisManager &AM) { FunctionAnalysisManager &FAM = diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp --- a/llvm/lib/Passes/PassBuilder.cpp +++ b/llvm/lib/Passes/PassBuilder.cpp @@ -439,7 +439,7 @@ /// it. This should be updated if new pass instrumentation wants to use the map. /// We currently only use this for --print-before/after. bool shouldPopulateClassToPassNames() { - return !printBeforePasses().empty() || !printAfterPasses().empty(); + return true || !printBeforePasses().empty() || !printAfterPasses().empty(); } } // namespace diff --git a/llvm/lib/Transforms/Scalar/LoopPassManager.cpp b/llvm/lib/Transforms/Scalar/LoopPassManager.cpp --- a/llvm/lib/Transforms/Scalar/LoopPassManager.cpp +++ b/llvm/lib/Transforms/Scalar/LoopPassManager.cpp @@ -172,6 +172,14 @@ } } // namespace llvm +void FunctionToLoopPassAdaptor::buildPassesStr( + PassInstrumentationCallbacks &PIC, std::string &PassesStr) { + if (!PassesStr.empty() && PassesStr.back() != '(') + PassesStr += ","; + PassesStr += UseMemorySSA ? "loop-mssa(" : "loop("; + Pass->buildPassesStr(PIC, PassesStr); + PassesStr += ")"; +} PreservedAnalyses FunctionToLoopPassAdaptor::run(Function &F, FunctionAnalysisManager &AM) { // Before we even compute any loop analyses, first run a miniature function diff --git a/llvm/tools/opt/NewPMDriver.cpp b/llvm/tools/opt/NewPMDriver.cpp --- a/llvm/tools/opt/NewPMDriver.cpp +++ b/llvm/tools/opt/NewPMDriver.cpp @@ -452,6 +452,10 @@ // Before executing passes, print the final values of the LLVM options. cl::PrintOptionValues(); + std::string PassesStr; + MPM.buildPassesStr(PIC, PassesStr); + errs() << "-passes='" << PassesStr << "'\n"; + // Now that we have all of the passes ready, run them. MPM.run(M, MAM);