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 21 using namespace llvm; 22 23 namespace llvm { 24 25 template<> 26 struct 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 43 namespace { 44 45 struct 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 55 struct 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 67 char CallGraphViewer::ID = 0; 68 INITIALIZE_PASS(CallGraphViewer, "view-callgraph", 69 "View call graph", 70 false, false) 71 72 char CallGraphPrinter::ID = 0; 73 INITIALIZE_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 81 ModulePass *llvm::createCallGraphViewerPass() { 82 return new CallGraphViewer(); 83 } 84 85 ModulePass *llvm::createCallGraphPrinterPass() { 86 return new CallGraphPrinter(); 87 } 88