diff --git a/lib/Analysis/IPA/PrintSCC.cpp b/lib/Analysis/IPA/PrintSCC.cpp index aaf54ef219c..83dd16dcf3b 100644 --- a/lib/Analysis/IPA/PrintSCC.cpp +++ b/lib/Analysis/IPA/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 I = tarj_begin(&func), - E = tarj_end(&func); I != E; ++I) { - SCC &nextSCC = **I; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + struct CFGSCC : public FunctionPass { + bool runOnFunction(Function& func); + + void print(std::ostream &O) const { } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); } - std::cout << "\n"; + }; - return true; - } - 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); + 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().getRoot(); - unsigned long sccNum = 0; - std::cout << "SCCs for the program in PostOrder:"; - for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), - E = tarj_end(rootNode); SCCI != E; ++SCCI) { - const SCC &nextSCC = **SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + // getAnalysisUsage - This pass requires the CallGraph. + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); } - std::cout << "\n"; - - return true; - } - - void print(std::ostream &O) const { } - - // getAnalysisUsage - This pass requires the CallGraph. - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } -}; + }; RegisterAnalysis Y("cfgscc", "Print SCCs of each function CFG"); @@ -83,3 +53,43 @@ struct CallGraphSCC : public Pass { RegisterAnalysis 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 I = tarj_begin(&F), + E = tarj_end(&F); I != E; ++I) { + SCC &nextSCC = **I; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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().getRoot(); + unsigned sccNum = 0; + std::cout << "SCCs for the program in PostOrder:"; + for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), + E = tarj_end(rootNode); SCCI != E; ++SCCI) { + const SCC &nextSCC = **SCCI; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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; +} diff --git a/lib/Analysis/PrintSCC.cpp b/lib/Analysis/PrintSCC.cpp index aaf54ef219c..83dd16dcf3b 100644 --- a/lib/Analysis/PrintSCC.cpp +++ b/lib/Analysis/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 I = tarj_begin(&func), - E = tarj_end(&func); I != E; ++I) { - SCC &nextSCC = **I; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + struct CFGSCC : public FunctionPass { + bool runOnFunction(Function& func); + + void print(std::ostream &O) const { } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); } - std::cout << "\n"; + }; - return true; - } - 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); + 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().getRoot(); - unsigned long sccNum = 0; - std::cout << "SCCs for the program in PostOrder:"; - for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), - E = tarj_end(rootNode); SCCI != E; ++SCCI) { - const SCC &nextSCC = **SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + // getAnalysisUsage - This pass requires the CallGraph. + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); } - std::cout << "\n"; - - return true; - } - - void print(std::ostream &O) const { } - - // getAnalysisUsage - This pass requires the CallGraph. - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } -}; + }; RegisterAnalysis Y("cfgscc", "Print SCCs of each function CFG"); @@ -83,3 +53,43 @@ struct CallGraphSCC : public Pass { RegisterAnalysis 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 I = tarj_begin(&F), + E = tarj_end(&F); I != E; ++I) { + SCC &nextSCC = **I; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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().getRoot(); + unsigned sccNum = 0; + std::cout << "SCCs for the program in PostOrder:"; + for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), + E = tarj_end(rootNode); SCCI != E; ++SCCI) { + const SCC &nextSCC = **SCCI; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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; +} diff --git a/tools/analyze/PrintSCC.cpp b/tools/analyze/PrintSCC.cpp index aaf54ef219c..83dd16dcf3b 100644 --- a/tools/analyze/PrintSCC.cpp +++ b/tools/analyze/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 I = tarj_begin(&func), - E = tarj_end(&func); I != E; ++I) { - SCC &nextSCC = **I; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + struct CFGSCC : public FunctionPass { + bool runOnFunction(Function& func); + + void print(std::ostream &O) const { } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); } - std::cout << "\n"; + }; - return true; - } - 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); + 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().getRoot(); - unsigned long sccNum = 0; - std::cout << "SCCs for the program in PostOrder:"; - for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), - E = tarj_end(rootNode); SCCI != E; ++SCCI) { - const SCC &nextSCC = **SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + // getAnalysisUsage - This pass requires the CallGraph. + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); } - std::cout << "\n"; - - return true; - } - - void print(std::ostream &O) const { } - - // getAnalysisUsage - This pass requires the CallGraph. - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } -}; + }; RegisterAnalysis Y("cfgscc", "Print SCCs of each function CFG"); @@ -83,3 +53,43 @@ struct CallGraphSCC : public Pass { RegisterAnalysis 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 I = tarj_begin(&F), + E = tarj_end(&F); I != E; ++I) { + SCC &nextSCC = **I; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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().getRoot(); + unsigned sccNum = 0; + std::cout << "SCCs for the program in PostOrder:"; + for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), + E = tarj_end(rootNode); SCCI != E; ++SCCI) { + const SCC &nextSCC = **SCCI; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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; +} diff --git a/tools/opt/PrintSCC.cpp b/tools/opt/PrintSCC.cpp index aaf54ef219c..83dd16dcf3b 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 I = tarj_begin(&func), - E = tarj_end(&func); I != E; ++I) { - SCC &nextSCC = **I; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + struct CFGSCC : public FunctionPass { + bool runOnFunction(Function& func); + + void print(std::ostream &O) const { } + + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); } - std::cout << "\n"; + }; - return true; - } - 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); + 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().getRoot(); - unsigned long sccNum = 0; - std::cout << "SCCs for the program in PostOrder:"; - for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), - E = tarj_end(rootNode); SCCI != E; ++SCCI) { - const SCC &nextSCC = **SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; - for (SCC::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)."; + // getAnalysisUsage - This pass requires the CallGraph. + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired(); } - std::cout << "\n"; - - return true; - } - - void print(std::ostream &O) const { } - - // getAnalysisUsage - This pass requires the CallGraph. - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - AU.addRequired(); - } -}; + }; RegisterAnalysis Y("cfgscc", "Print SCCs of each function CFG"); @@ -83,3 +53,43 @@ struct CallGraphSCC : public Pass { RegisterAnalysis 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 I = tarj_begin(&F), + E = tarj_end(&F); I != E; ++I) { + SCC &nextSCC = **I; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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().getRoot(); + unsigned sccNum = 0; + std::cout << "SCCs for the program in PostOrder:"; + for (TarjanSCC_iterator SCCI = tarj_begin(rootNode), + E = tarj_end(rootNode); SCCI != E; ++SCCI) { + const SCC &nextSCC = **SCCI; + std::cout << "\nSCC #" << ++sccNum << " : "; + for (SCC::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; +}