diff options
author | Chris Lattner <sabre@nondot.org> | 2003-08-31 19:23:41 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-08-31 19:23:41 +0000 |
commit | 23ebd75affba7de4a3bef20690609af9e42615e6 (patch) | |
tree | 1872c6b47b9d53a10f06711fc3f20c9bc12e7fdd /tools/opt | |
parent | 237ef567f6764f24a47c63121cc0a599ddc8f56d (diff) | |
download | external_llvm-23ebd75affba7de4a3bef20690609af9e42615e6.zip external_llvm-23ebd75affba7de4a3bef20690609af9e42615e6.tar.gz external_llvm-23ebd75affba7de4a3bef20690609af9e42615e6.tar.bz2 |
* Cleanups
* Iterate from tarj_begin -> tarj_end, not from tarj_begin -> NULL
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@8258 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/opt')
-rw-r--r-- | tools/opt/PrintSCC.cpp | 68 |
1 files changed, 30 insertions, 38 deletions
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"); } |