diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/analyze/PrintSCC.cpp | 68 | ||||
-rw-r--r-- | tools/opt/PrintSCC.cpp | 68 |
2 files changed, 60 insertions, 76 deletions
diff --git a/tools/analyze/PrintSCC.cpp b/tools/analyze/PrintSCC.cpp index 70049d2..aaf54ef 100644 --- a/tools/analyze/PrintSCC.cpp +++ b/tools/analyze/PrintSCC.cpp @@ -1,4 +1,4 @@ -//===- PrintSCC.cpp - Enumerate SCCs in some key graphs ---------*- C++ -*-===// +//===- PrintSCC.cpp - Enumerate SCCs in some key graphs -------------------===// // // This file provides passes to print out SCCs in a CFG or a CallGraph. // Normally, you would not use these passes; instead, you would use the @@ -14,34 +14,30 @@ // analyze -callscc [-stats] [-debug] to print SCCs in the CallGraph // // (3) To test the TarjanSCCIterator. +// //===----------------------------------------------------------------------===// #include "llvm/Pass.h" #include "llvm/Module.h" -#include "llvm/Function.h" -#include "llvm/BasicBlock.h" #include "llvm/Analysis/CallGraph.h" #include "llvm/Support/CFG.h" #include "Support/TarjanSCCIterator.h" namespace { - -class CFGSCC: public FunctionPass { -public: +struct CFGSCC: public FunctionPass { bool runOnFunction(Function& func) { unsigned long sccNum = 0; - const SCC<Function*>* nextSCC; std::cout << "SCCs for Function " << func.getName() << " in PostOrder:"; - for (TarjanSCC_iterator<Function*> tarjSCCiter = tarj_begin(&func); - (nextSCC = *tarjSCCiter); ++tarjSCCiter) - { - 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)."; - } + 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; @@ -50,26 +46,23 @@ public: }; -class CallGraphSCC: public Pass { -public: +struct CallGraphSCC : public Pass { // run - Print out SCCs in the call graph for the specified module. - bool run(Module& M) { + bool run(Module &M) { CallGraphNode* rootNode = getAnalysis<CallGraph>().getRoot(); unsigned long sccNum = 0; - const SCC<CallGraphNode*>* nextSCC; std::cout << "SCCs for the program in PostOrder:"; - for (TarjanSCC_iterator<CallGraphNode*> tarjSCCiter = tarj_begin(rootNode); - (nextSCC = *tarjSCCiter); ++tarjSCCiter) - { - 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("Null CallGraph node")) - << ", "; - if (nextSCC->size() == 1 && nextSCC->HasLoop()) - std::cout << " (Has self-loop)."; - } + 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; @@ -84,10 +77,9 @@ public: } }; -static RegisterAnalysis<CFGSCC> -Y("cfgscc", "Print SCCs of each function CFG"); - -static RegisterAnalysis<CallGraphSCC> -Z("callscc", "Print SCCs of the Call Graph"); + RegisterAnalysis<CFGSCC> + Y("cfgscc", "Print SCCs of each function CFG"); + RegisterAnalysis<CallGraphSCC> + Z("callscc", "Print SCCs of the Call Graph"); } diff --git a/tools/opt/PrintSCC.cpp b/tools/opt/PrintSCC.cpp index 70049d2..aaf54ef 100644 --- a/tools/opt/PrintSCC.cpp +++ b/tools/opt/PrintSCC.cpp @@ -1,4 +1,4 @@ -//===- PrintSCC.cpp - Enumerate SCCs in some key graphs ---------*- C++ -*-===// +//===- PrintSCC.cpp - Enumerate SCCs in some key graphs -------------------===// // // This file provides passes to print out SCCs in a CFG or a CallGraph. // Normally, you would not use these passes; instead, you would use the @@ -14,34 +14,30 @@ // analyze -callscc [-stats] [-debug] to print SCCs in the CallGraph // // (3) To test the TarjanSCCIterator. +// //===----------------------------------------------------------------------===// #include "llvm/Pass.h" #include "llvm/Module.h" -#include "llvm/Function.h" -#include "llvm/BasicBlock.h" #include "llvm/Analysis/CallGraph.h" #include "llvm/Support/CFG.h" #include "Support/TarjanSCCIterator.h" namespace { - -class CFGSCC: public FunctionPass { -public: +struct CFGSCC: public FunctionPass { bool runOnFunction(Function& func) { unsigned long sccNum = 0; - const SCC<Function*>* nextSCC; std::cout << "SCCs for Function " << func.getName() << " in PostOrder:"; - for (TarjanSCC_iterator<Function*> tarjSCCiter = tarj_begin(&func); - (nextSCC = *tarjSCCiter); ++tarjSCCiter) - { - 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)."; - } + 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; @@ -50,26 +46,23 @@ public: }; -class CallGraphSCC: public Pass { -public: +struct CallGraphSCC : public Pass { // run - Print out SCCs in the call graph for the specified module. - bool run(Module& M) { + bool run(Module &M) { CallGraphNode* rootNode = getAnalysis<CallGraph>().getRoot(); unsigned long sccNum = 0; - const SCC<CallGraphNode*>* nextSCC; std::cout << "SCCs for the program in PostOrder:"; - for (TarjanSCC_iterator<CallGraphNode*> tarjSCCiter = tarj_begin(rootNode); - (nextSCC = *tarjSCCiter); ++tarjSCCiter) - { - 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("Null CallGraph node")) - << ", "; - if (nextSCC->size() == 1 && nextSCC->HasLoop()) - std::cout << " (Has self-loop)."; - } + 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; @@ -84,10 +77,9 @@ public: } }; -static RegisterAnalysis<CFGSCC> -Y("cfgscc", "Print SCCs of each function CFG"); - -static RegisterAnalysis<CallGraphSCC> -Z("callscc", "Print SCCs of the Call Graph"); + RegisterAnalysis<CFGSCC> + Y("cfgscc", "Print SCCs of each function CFG"); + RegisterAnalysis<CallGraphSCC> + Z("callscc", "Print SCCs of the Call Graph"); } |