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.cpp68
1 files changed, 30 insertions, 38 deletions
diff --git a/tools/opt/PrintSCC.cpp b/tools/opt/PrintSCC.cpp
index 70049d20c9..aaf54ef219 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");
}