X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Fopt%2FGraphPrinters.cpp;h=867e33480879aafa2ab511d24ac8ab1115076404;hb=56867520990a4fea1353d55f71bb74a0126554e6;hp=83708ecbf71fc537eaec8028170ba78bbb1a4d5f;hpb=7c0e022c5c4be4b11e199a53f73bbdd84e34aa80;p=oota-llvm.git diff --git a/tools/opt/GraphPrinters.cpp b/tools/opt/GraphPrinters.cpp index 83708ecbf71..867e3348087 100644 --- a/tools/opt/GraphPrinters.cpp +++ b/tools/opt/GraphPrinters.cpp @@ -1,12 +1,11 @@ //===- GraphPrinters.cpp - DOT printers for various graph types -----------===// -// +// // 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 defines several printers for various different types of graphs used // by the LLVM infrastructure. It uses the generic graph interface to convert @@ -15,56 +14,13 @@ // //===----------------------------------------------------------------------===// -#include "Support/GraphWriter.h" +#include "llvm/Support/GraphWriter.h" #include "llvm/Pass.h" -#include "llvm/iTerminators.h" +#include "llvm/Value.h" #include "llvm/Analysis/CallGraph.h" -#include "llvm/Support/CFG.h" -#include +#include #include - -//===----------------------------------------------------------------------===// -// Control Flow Graph Printer -//===----------------------------------------------------------------------===// - -template<> -struct DOTGraphTraits : public DefaultDOTGraphTraits { - static std::string getGraphName(Function *F) { - return "CFG for '" + F->getName() + "' function"; - } - - static std::string getNodeLabel(BasicBlock *Node, Function *Graph) { - std::ostringstream Out; - Out << Node; - std::string OutStr = Out.str(); - if (OutStr[0] == '\n') OutStr.erase(OutStr.begin()); - - // Process string output to make it nicer... - for (unsigned i = 0; i != OutStr.length(); ++i) - if (OutStr[i] == '\n') { // Left justify - OutStr[i] = '\\'; - OutStr.insert(OutStr.begin()+i+1, 'l'); - } else if (OutStr[i] == ';') { // Delete comments! - unsigned Idx = OutStr.find('\n', i+1); // Find end of line - OutStr.erase(OutStr.begin()+i, OutStr.begin()+Idx); - --i; - } - - return OutStr; - } - - static std::string getNodeAttributes(BasicBlock *N) { - return "fontname=Courier"; - } - - static std::string getEdgeSourceLabel(BasicBlock *Node, succ_iterator I) { - // Label source of conditional branches with "T" or "F" - if (BranchInst *BI = dyn_cast(Node->getTerminator())) - if (BI->isConditional()) - return (I == succ_begin(Node)) ? "T" : "F"; - return ""; - } -}; +using namespace llvm; template static void WriteGraphToFile(std::ostream &O, const std::string &GraphName, @@ -72,7 +28,7 @@ static void WriteGraphToFile(std::ostream &O, const std::string &GraphName, std::string Filename = GraphName + ".dot"; O << "Writing '" << Filename << "'..."; std::ofstream F(Filename.c_str()); - + if (F.good()) WriteGraph(F, GT); else @@ -81,60 +37,47 @@ static void WriteGraphToFile(std::ostream &O, const std::string &GraphName, } -namespace { - struct CFGPrinter : public FunctionPass { - virtual bool runOnFunction(Function &Func) { - WriteGraphToFile(std::cerr, "cfg."+Func.getName(), &Func); - return false; - } - - void print(std::ostream &OS) const {} - - virtual void getAnalysisUsage(AnalysisUsage &AU) const { - AU.setPreservesAll(); - } - }; - - RegisterAnalysis P1("print-cfg", - "Print CFG of function to 'dot' file"); -}; - - - //===----------------------------------------------------------------------===// // Call Graph Printer //===----------------------------------------------------------------------===// -template<> -struct DOTGraphTraits : public DefaultDOTGraphTraits { - static std::string getGraphName(CallGraph *F) { - return "Call Graph"; - } +namespace llvm { + template<> + struct DOTGraphTraits : public DefaultDOTGraphTraits { + static std::string getGraphName(CallGraph *F) { + return "Call Graph"; + } - static std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { - if (Node->getFunction()) - return Node->getFunction()->getName(); - else - return "Indirect call node"; - } -}; + static std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { + if (Node->getFunction()) + return ((Value*)Node->getFunction())->getName(); + else + return "Indirect call node"; + } + }; +} namespace { - struct CallGraphPrinter : public Pass { - virtual bool run(Module &M) { + struct CallGraphPrinter : public ModulePass { + static char ID; // Pass ID, replacement for typeid + CallGraphPrinter() : ModulePass((intptr_t)&ID) {} + + virtual bool runOnModule(Module &M) { WriteGraphToFile(std::cerr, "callgraph", &getAnalysis()); return false; } void print(std::ostream &OS) const {} - + void print(std::ostream &OS, const llvm::Module*) const {} + virtual void getAnalysisUsage(AnalysisUsage &AU) const { AU.addRequired(); AU.setPreservesAll(); } }; - RegisterAnalysis P2("print-callgraph", - "Print Call Graph to 'dot' file"); -}; + char CallGraphPrinter::ID = 0; + RegisterPass P2("print-callgraph", + "Print Call Graph to 'dot' file"); +}