diff options
-rw-r--r-- | include/llvm/PassManagers.h | 5 | ||||
-rw-r--r-- | lib/Analysis/IPA/CallGraphSCCPass.cpp | 15 | ||||
-rw-r--r-- | lib/VMCore/PassManager.cpp | 17 |
3 files changed, 32 insertions, 5 deletions
diff --git a/include/llvm/PassManagers.h b/include/llvm/PassManagers.h index 1c4c741d43..6a14b152bb 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -380,6 +380,11 @@ protected: // then PMT_Last active pass mangers. std::map<AnalysisID, Pass *> *InheritedAnalysis[PMT_Last]; + + /// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions + /// or higher is specified. + bool isPassDebuggingExecutionsOrMore() const; + private: void dumpAnalysisUsage(const StringRef &Msg, const Pass *P, const AnalysisUsage::VectorType &Set) const; diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp index e4e0ecb2c9..801ae1952c 100644 --- a/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp @@ -317,7 +317,20 @@ bool CGPassManager::runOnModule(Module &M) { PassNo != e; ++PassNo) { Pass *P = getContainedPass(PassNo); - dumpPassInfo(P, EXECUTION_MSG, ON_CG_MSG, ""); + // If we're in -debug-pass=Executions mode, construct the SCC node list, + // otherwise avoid constructing this string as it is expensive. + if (isPassDebuggingExecutionsOrMore()) { + std::string Functions; +#ifndef NDEBUG + raw_string_ostream OS(Functions); + for (unsigned i = 0, e = CurSCC.size(); i != e; ++i) { + if (i) OS << ", "; + CurSCC[i]->print(OS); + } + OS.flush(); +#endif + dumpPassInfo(P, EXECUTION_MSG, ON_CG_MSG, Functions); + } dumpRequiredSet(P); initializeAnalysisImpl(P); diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 83045cd4ab..f2c9ea3b99 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -67,6 +67,15 @@ PassDebugging("debug-pass", cl::Hidden, clEnumValEnd)); } // End of llvm namespace +/// isPassDebuggingExecutionsOrMore - Return true if -debug-pass=Executions +/// or higher is specified. +bool PMDataManager::isPassDebuggingExecutionsOrMore() const { + return PassDebugging >= Executions; +} + + + + void PassManagerPrettyStackEntry::print(raw_ostream &OS) const { if (V == 0 && M == 0) OS << "Releasing pass '"; @@ -1044,7 +1053,7 @@ void PMDataManager::dumpPassInfo(Pass *P, enum PassDebuggingString S1, errs() << "' on Loop '" << Msg << "'...\n"; break; case ON_CG_MSG: - errs() << "' on Call Graph '" << Msg << "'...\n"; + errs() << "' on Call Graph Nodes '" << Msg << "'...\n"; break; default: break; @@ -1076,10 +1085,10 @@ void PMDataManager::dumpAnalysisUsage(const StringRef &Msg, const Pass *P, return; errs() << (void*)P << std::string(getDepth()*2+3, ' ') << Msg << " Analyses:"; for (unsigned i = 0; i != Set.size(); ++i) { - if (i) errs() << ","; - errs() << " " << Set[i]->getPassName(); + if (i) errs() << ','; + errs() << ' ' << Set[i]->getPassName(); } - errs() << "\n"; + errs() << '\n'; } /// Add RequiredPass into list of lower level passes required by pass P. |