From 50438771c09ad1c55ab7ee8bb8dc2044a6f0f351 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 15 Sep 2009 05:03:04 +0000 Subject: [PATCH] make -debug-pass=Executions show information about what call graph nodes are in the SCC for each execution of a CGSCC pass. llvm-svn: 81838 --- include/llvm/PassManagers.h | 5 +++++ lib/Analysis/IPA/CallGraphSCCPass.cpp | 15 ++++++++++++++- 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 1c4c741d434..6a14b152bb5 100644 --- a/include/llvm/PassManagers.h +++ b/include/llvm/PassManagers.h @@ -380,6 +380,11 @@ protected: // then PMT_Last active pass mangers. std::map *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 e4e0ecb2c9a..801ae1952cb 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 83045cd4ab5..f2c9ea3b997 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.