GraphPrinters.cpp revision 5d8925c7c506a54ebdfb0bc93437ec9f602eaaa0
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 <fstream> 22using namespace llvm; 23 24template<typename GraphType> 25static void WriteGraphToFile(std::ostream &O, const std::string &GraphName, 26 const GraphType >) { 27 std::string Filename = GraphName + ".dot"; 28 O << "Writing '" << Filename << "'..."; 29 std::ofstream F(Filename.c_str()); 30 31 if (F.good()) 32 WriteGraph(F, GT); 33 else 34 O << " error opening file for writing!"; 35 O << "\n"; 36} 37 38 39//===----------------------------------------------------------------------===// 40// Call Graph Printer 41//===----------------------------------------------------------------------===// 42 43namespace llvm { 44 template<> 45 struct DOTGraphTraits<CallGraph*> : public DefaultDOTGraphTraits { 46 static std::string getGraphName(CallGraph *F) { 47 return "Call Graph"; 48 } 49 50 static std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { 51 if (Node->getFunction()) 52 return ((Value*)Node->getFunction())->getName(); 53 else 54 return "Indirect call node"; 55 } 56 }; 57} 58 59 60namespace { 61 struct CallGraphPrinter : public ModulePass { 62 virtual bool runOnModule(Module &M) { 63 WriteGraphToFile(std::cerr, "callgraph", &getAnalysis<CallGraph>()); 64 return false; 65 } 66 67 void print(std::ostream &OS) const {} 68 69 virtual void getAnalysisUsage(AnalysisUsage &AU) const { 70 AU.addRequired<CallGraph>(); 71 AU.setPreservesAll(); 72 } 73 }; 74 75 RegisterPass<CallGraphPrinter> P2("print-callgraph", 76 "Print Call Graph to 'dot' file"); 77} 78