GraphPrinters.cpp revision 31bf2b4979d82a45eca5b37efd3db601304e51e7
1//===- GraphPrinters.cpp - DOT printers for various graph types -----------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file was developed by the LLVM research group and is distributed under 6// the University of Illinois Open Source License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines several printers for various different types of graphs used 11// by the LLVM infrastructure. It uses the generic graph interface to convert 12// the graph into a .dot graph. These graphs can then be processed with the 13// "dot" tool to convert them to postscript or some other suitable format. 14// 15//===----------------------------------------------------------------------===// 16 17#include "llvm/Support/GraphWriter.h" 18#include "llvm/Pass.h" 19#include "llvm/Value.h" 20#include "llvm/Analysis/CallGraph.h" 21#include <iostream> 22#include <fstream> 23using namespace llvm; 24 25template<typename GraphType> 26static void WriteGraphToFile(std::ostream &O, const std::string &GraphName, 27 const GraphType >) { 28 std::string Filename = GraphName + ".dot"; 29 O << "Writing '" << Filename << "'..."; 30 std::ofstream F(Filename.c_str()); 31 32 if (F.good()) 33 WriteGraph(F, GT); 34 else 35 O << " error opening file for writing!"; 36 O << "\n"; 37} 38 39 40//===----------------------------------------------------------------------===// 41// Call Graph Printer 42//===----------------------------------------------------------------------===// 43 44namespace llvm { 45 template<> 46 struct DOTGraphTraits<CallGraph*> : public DefaultDOTGraphTraits { 47 static std::string getGraphName(CallGraph *F) { 48 return "Call Graph"; 49 } 50 51 static std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { 52 if (Node->getFunction()) 53 return ((Value*)Node->getFunction())->getName(); 54 else 55 return "Indirect call node"; 56 } 57 }; 58} 59 60 61namespace { 62 struct CallGraphPrinter : public ModulePass { 63 virtual bool runOnModule(Module &M) { 64 WriteGraphToFile(std::cerr, "callgraph", &getAnalysis<CallGraph>()); 65 return false; 66 } 67 68 void print(std::ostream &OS) const {} 69 void print(std::ostream &OS, const llvm::Module*) const {} 70 71 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 72 AU.addRequired<CallGraph>(); 73 AU.setPreservesAll(); 74 } 75 }; 76 77 RegisterPass<CallGraphPrinter> P2("print-callgraph", 78 "Print Call Graph to 'dot' file"); 79} 80