diff options
author | Chris Lattner <sabre@nondot.org> | 2003-08-31 19:27:11 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-08-31 19:27:11 +0000 |
commit | 8d0a23ab42b01600118c28dbf767ed90afd4b902 (patch) | |
tree | 95395209d1d1569c836aa3aab055249be129d51a /tools/opt/PrintSCC.cpp | |
parent | 23ebd75affba7de4a3bef20690609af9e42615e6 (diff) | |
download | external_llvm-8d0a23ab42b01600118c28dbf767ed90afd4b902.zip external_llvm-8d0a23ab42b01600118c28dbf767ed90afd4b902.tar.gz external_llvm-8d0a23ab42b01600118c28dbf767ed90afd4b902.tar.bz2 |
Indent classes correctly in the namespace
move bodies out-of-line
Add getAnalysisUsage method for SFGSCC
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8259 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/opt/PrintSCC.cpp')
-rw-r--r-- | tools/opt/PrintSCC.cpp | 102 |
1 files changed, 56 insertions, 46 deletions
diff --git a/tools/opt/PrintSCC.cpp b/tools/opt/PrintSCC.cpp index aaf54ef..83dd16d 100644 --- a/tools/opt/PrintSCC.cpp +++ b/tools/opt/PrintSCC.cpp @@ -24,58 +24,28 @@ #include "Support/TarjanSCCIterator.h" namespace { -struct CFGSCC: public FunctionPass { - bool runOnFunction(Function& func) { - unsigned long sccNum = 0; - std::cout << "SCCs for Function " << func.getName() << " in PostOrder:"; - for (TarjanSCC_iterator<Function*> I = tarj_begin(&func), - E = tarj_end(&func); I != E; ++I) { - SCC<Function*> &nextSCC = **I; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC<Function*>::const_iterator I = nextSCC.begin(),E = nextSCC.end(); - I != E; ++I) - std::cout << (*I)->getName() << ", "; - if (nextSCC.size() == 1 && nextSCC.HasLoop()) - std::cout << " (Has self-loop)."; - } - std::cout << "\n"; - - return true; - } - void print(std::ostream &O) const { } -}; + struct CFGSCC : public FunctionPass { + bool runOnFunction(Function& func); + void print(std::ostream &O) const { } -struct CallGraphSCC : public Pass { - // run - Print out SCCs in the call graph for the specified module. - bool run(Module &M) { - CallGraphNode* rootNode = getAnalysis<CallGraph>().getRoot(); - unsigned long sccNum = 0; - std::cout << "SCCs for the program in PostOrder:"; - for (TarjanSCC_iterator<CallGraphNode*> SCCI = tarj_begin(rootNode), - E = tarj_end(rootNode); SCCI != E; ++SCCI) { - const SCC<CallGraphNode*> &nextSCC = **SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC<CallGraphNode*>::const_iterator I = nextSCC.begin(), - E = nextSCC.end(); I != E; ++I) - std::cout << ((*I)->getFunction() ? (*I)->getFunction()->getName() - : std::string("Indirect CallGraph node")) << ", "; - if (nextSCC.size() == 1 && nextSCC.HasLoop()) - std::cout << " (Has self-loop)."; + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); } - std::cout << "\n"; + }; - return true; - } + struct CallGraphSCC : public Pass { + // run - Print out SCCs in the call graph for the specified module. + bool run(Module &M); - void print(std::ostream &O) const { } + void print(std::ostream &O) const { } - // getAnalysisUsage - This pass requires the CallGraph. - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired<CallGraph>(); - } -}; + // getAnalysisUsage - This pass requires the CallGraph. + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired<CallGraph>(); + } + }; RegisterAnalysis<CFGSCC> Y("cfgscc", "Print SCCs of each function CFG"); @@ -83,3 +53,43 @@ struct CallGraphSCC : public Pass { RegisterAnalysis<CallGraphSCC> Z("callscc", "Print SCCs of the Call Graph"); } + +bool CFGSCC::runOnFunction(Function &F) { + unsigned sccNum = 0; + std::cout << "SCCs for Function " << F.getName() << " in PostOrder:"; + for (TarjanSCC_iterator<Function*> I = tarj_begin(&F), + E = tarj_end(&F); I != E; ++I) { + SCC<Function*> &nextSCC = **I; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC<Function*>::const_iterator I = nextSCC.begin(), + E = nextSCC.end(); I != E; ++I) + std::cout << (*I)->getName() << ", "; + if (nextSCC.size() == 1 && nextSCC.HasLoop()) + std::cout << " (Has self-loop)."; + } + std::cout << "\n"; + + return true; +} + + +// run - Print out SCCs in the call graph for the specified module. +bool CallGraphSCC::run(Module &M) { + CallGraphNode* rootNode = getAnalysis<CallGraph>().getRoot(); + unsigned sccNum = 0; + std::cout << "SCCs for the program in PostOrder:"; + for (TarjanSCC_iterator<CallGraphNode*> SCCI = tarj_begin(rootNode), + E = tarj_end(rootNode); SCCI != E; ++SCCI) { + const SCC<CallGraphNode*> &nextSCC = **SCCI; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC<CallGraphNode*>::const_iterator I = nextSCC.begin(), + E = nextSCC.end(); I != E; ++I) + std::cout << ((*I)->getFunction() ? (*I)->getFunction()->getName() + : std::string("Indirect CallGraph node")) << ", "; + if (nextSCC.size() == 1 && nextSCC.HasLoop()) + std::cout << " (Has self-loop)."; + } + std::cout << "\n"; + + return true; +} |