X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fopt%2FPrintSCC.cpp;h=66709ffa196a9f5d00fb3f1e00a1abfb5bb60f38;hb=63e944b05e75bc026cb3a0bb0697f364682fc794;hp=345938115871d51c33e3c40d3fa8e4b2cd81a853;hpb=b576c94c15af9a440f69d9d03c2afead7971118c;p=oota-llvm.git diff --git a/tools/opt/PrintSCC.cpp b/tools/opt/PrintSCC.cpp index 34593811587..66709ffa196 100644 --- a/tools/opt/PrintSCC.cpp +++ b/tools/opt/PrintSCC.cpp @@ -1,10 +1,10 @@ //===- PrintSCC.cpp - Enumerate SCCs in some key graphs -------------------===// -// +// // The LLVM Compiler Infrastructure // -// This file was developed by the LLVM research group and is distributed under -// the University of Illinois Open Source License. See LICENSE.TXT for details. -// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// //===----------------------------------------------------------------------===// // // This file provides passes to print out SCCs in a CFG or a CallGraph. @@ -14,13 +14,13 @@ // // (1) As a reference for how to use the scc_iterator. // (2) To print out the SCCs for a CFG or a CallGraph: -// analyze -cfgscc to print the SCCs in each CFG of a module. -// analyze -cfgscc -stats to print the #SCCs and the maximum SCC size. -// analyze -cfgscc -debug > /dev/null to watch the algorithm in action. -// +// analyze -print-cfg-sccs to print the SCCs in each CFG of a module. +// analyze -print-cfg-sccs -stats to print the #SCCs and the maximum SCC size. +// analyze -print-cfg-sccs -debug > /dev/null to watch the algorithm in action. +// // and similarly: -// analyze -callscc [-stats] [-debug] to print SCCs in the CallGraph -// +// analyze -print-callgraph-sccs [-stats] [-debug] to print SCCs in the CallGraph +// // (3) To test the scc_iterator. // //===----------------------------------------------------------------------===// @@ -29,24 +29,31 @@ #include "llvm/Module.h" #include "llvm/Analysis/CallGraph.h" #include "llvm/Support/CFG.h" -#include "Support/SCCIterator.h" +#include "llvm/Support/raw_ostream.h" +#include "llvm/ADT/SCCIterator.h" +using namespace llvm; namespace { struct CFGSCC : public FunctionPass { + static char ID; // Pass identification, replacement for typeid + CFGSCC() : FunctionPass(&ID) {} bool runOnFunction(Function& func); - void print(std::ostream &O) const { } + void print(raw_ostream &O, const Module* = 0) const { } virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); } }; - struct CallGraphSCC : public Pass { + struct CallGraphSCC : public ModulePass { + static char ID; // Pass identification, replacement for typeid + CallGraphSCC() : ModulePass(&ID) {} + // run - Print out SCCs in the call graph for the specified module. - bool run(Module &M); + bool runOnModule(Module &M); - void print(std::ostream &O) const { } + void print(raw_ostream &O, const Module* = 0) const { } // getAnalysisUsage - This pass requires the CallGraph. virtual void getAnalysisUsage(AnalysisUsage &AU) const { @@ -55,49 +62,51 @@ namespace { } }; - RegisterAnalysis - Y("cfgscc", "Print SCCs of each function CFG"); + char CFGSCC::ID = 0; + RegisterPass + Y("print-cfg-sccs", "Print SCCs of each function CFG"); - RegisterAnalysis - Z("callscc", "Print SCCs of the Call Graph"); + char CallGraphSCC::ID = 0; + RegisterPass + Z("print-callgraph-sccs", "Print SCCs of the Call Graph"); } bool CFGSCC::runOnFunction(Function &F) { unsigned sccNum = 0; - std::cout << "SCCs for Function " << F.getName() << " in PostOrder:"; + outs() << "SCCs for Function " << F.getName() << " in PostOrder:"; for (scc_iterator SCCI = scc_begin(&F), E = scc_end(&F); SCCI != E; ++SCCI) { std::vector &nextSCC = *SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; + outs() << "\nSCC #" << ++sccNum << " : "; for (std::vector::const_iterator I = nextSCC.begin(), E = nextSCC.end(); I != E; ++I) - std::cout << (*I)->getName() << ", "; + outs() << (*I)->getName() << ", "; if (nextSCC.size() == 1 && SCCI.hasLoop()) - std::cout << " (Has self-loop)."; + outs() << " (Has self-loop)."; } - std::cout << "\n"; + outs() << "\n"; return true; } // run - Print out SCCs in the call graph for the specified module. -bool CallGraphSCC::run(Module &M) { +bool CallGraphSCC::runOnModule(Module &M) { CallGraphNode* rootNode = getAnalysis().getRoot(); unsigned sccNum = 0; - std::cout << "SCCs for the program in PostOrder:"; + outs() << "SCCs for the program in PostOrder:"; for (scc_iterator SCCI = scc_begin(rootNode), E = scc_end(rootNode); SCCI != E; ++SCCI) { const std::vector &nextSCC = *SCCI; - std::cout << "\nSCC #" << ++sccNum << " : "; + outs() << "\nSCC #" << ++sccNum << " : "; for (std::vector::const_iterator I = nextSCC.begin(), E = nextSCC.end(); I != E; ++I) - std::cout << ((*I)->getFunction() ? (*I)->getFunction()->getName() - : std::string("Indirect CallGraph node")) << ", "; + outs() << ((*I)->getFunction() ? (*I)->getFunction()->getNameStr() + : std::string("Indirect CallGraph node")) << ", "; if (nextSCC.size() == 1 && SCCI.hasLoop()) - std::cout << " (Has self-loop)."; + outs() << " (Has self-loop)."; } - std::cout << "\n"; + outs() << "\n"; return true; }