summaryrefslogtreecommitdiff
path: root/tools/opt/PrintSCC.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/opt/PrintSCC.cpp')
-rw-r--r--tools/opt/PrintSCC.cpp102
1 files changed, 56 insertions, 46 deletions
diff --git a/tools/opt/PrintSCC.cpp b/tools/opt/PrintSCC.cpp
index aaf54ef219..83dd16dcf3 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;
+}