1//===- CallPrinter.cpp - DOT printer for call graph -----------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines '-dot-callgraph', which emit a callgraph.<fnname>.dot 11// containing the call graph of a module. 12// 13// There is also a pass available to directly call dotty ('-view-callgraph'). 14// 15//===----------------------------------------------------------------------===// 16 17#include "llvm/Analysis/CallGraph.h" 18#include "llvm/Analysis/CallPrinter.h" 19#include "llvm/Analysis/DOTGraphTraitsPass.h" 20 21using namespace llvm; 22 23namespace llvm { 24 25template<> 26struct DOTGraphTraits<CallGraph*> : public DefaultDOTGraphTraits { 27 DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {} 28 29 static std::string getGraphName(CallGraph *Graph) { 30 return "Call graph"; 31 } 32 33 std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { 34 if (Function *Func = Node->getFunction()) 35 return Func->getName(); 36 37 return "external node"; 38 } 39}; 40 41} // end llvm namespace 42 43namespace { 44 45struct CallGraphViewer 46 : public DOTGraphTraitsModuleViewer<CallGraph, true> { 47 static char ID; 48 49 CallGraphViewer() 50 : DOTGraphTraitsModuleViewer<CallGraph, true>("callgraph", ID) { 51 initializeCallGraphViewerPass(*PassRegistry::getPassRegistry()); 52 } 53}; 54 55struct CallGraphPrinter 56 : public DOTGraphTraitsModulePrinter<CallGraph, true> { 57 static char ID; 58 59 CallGraphPrinter() 60 : DOTGraphTraitsModulePrinter<CallGraph, true>("callgraph", ID) { 61 initializeCallGraphPrinterPass(*PassRegistry::getPassRegistry()); 62 } 63}; 64 65} // end anonymous namespace 66 67char CallGraphViewer::ID = 0; 68INITIALIZE_PASS(CallGraphViewer, "view-callgraph", 69 "View call graph", 70 false, false) 71 72char CallGraphPrinter::ID = 0; 73INITIALIZE_PASS(CallGraphPrinter, "dot-callgraph", 74 "Print call graph to 'dot' file", 75 false, false) 76 77// Create methods available outside of this file, to use them 78// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by 79// the link time optimization. 80 81ModulePass *llvm::createCallGraphViewerPass() { 82 return new CallGraphViewer(); 83} 84 85ModulePass *llvm::createCallGraphPrinterPass() { 86 return new CallGraphPrinter(); 87} 88