1249259Sdim//===- CallPrinter.cpp - DOT printer for call graph -----------------------===// 2249259Sdim// 3249259Sdim// The LLVM Compiler Infrastructure 4249259Sdim// 5249259Sdim// This file is distributed under the University of Illinois Open Source 6249259Sdim// License. See LICENSE.TXT for details. 7249259Sdim// 8249259Sdim//===----------------------------------------------------------------------===// 9249259Sdim// 10249259Sdim// This file defines '-dot-callgraph', which emit a callgraph.<fnname>.dot 11249259Sdim// containing the call graph of a module. 12249259Sdim// 13249259Sdim// There is also a pass available to directly call dotty ('-view-callgraph'). 14249259Sdim// 15249259Sdim//===----------------------------------------------------------------------===// 16249259Sdim 17249259Sdim#include "llvm/Analysis/CallGraph.h" 18249259Sdim#include "llvm/Analysis/CallPrinter.h" 19249259Sdim#include "llvm/Analysis/DOTGraphTraitsPass.h" 20249259Sdim 21249259Sdimusing namespace llvm; 22249259Sdim 23249259Sdimnamespace llvm { 24249259Sdim 25249259Sdimtemplate<> 26249259Sdimstruct DOTGraphTraits<CallGraph*> : public DefaultDOTGraphTraits { 27249259Sdim DOTGraphTraits (bool isSimple=false) : DefaultDOTGraphTraits(isSimple) {} 28249259Sdim 29249259Sdim static std::string getGraphName(CallGraph *Graph) { 30249259Sdim return "Call graph"; 31249259Sdim } 32249259Sdim 33249259Sdim std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { 34249259Sdim if (Function *Func = Node->getFunction()) 35249259Sdim return Func->getName(); 36249259Sdim 37249259Sdim return "external node"; 38249259Sdim } 39249259Sdim}; 40249259Sdim 41249259Sdim} // end llvm namespace 42249259Sdim 43249259Sdimnamespace { 44249259Sdim 45249259Sdimstruct CallGraphViewer 46249259Sdim : public DOTGraphTraitsModuleViewer<CallGraph, true> { 47249259Sdim static char ID; 48249259Sdim 49249259Sdim CallGraphViewer() 50249259Sdim : DOTGraphTraitsModuleViewer<CallGraph, true>("callgraph", ID) { 51249259Sdim initializeCallGraphViewerPass(*PassRegistry::getPassRegistry()); 52249259Sdim } 53249259Sdim}; 54249259Sdim 55249259Sdimstruct CallGraphPrinter 56249259Sdim : public DOTGraphTraitsModulePrinter<CallGraph, true> { 57249259Sdim static char ID; 58249259Sdim 59249259Sdim CallGraphPrinter() 60249259Sdim : DOTGraphTraitsModulePrinter<CallGraph, true>("callgraph", ID) { 61249259Sdim initializeCallGraphPrinterPass(*PassRegistry::getPassRegistry()); 62249259Sdim } 63249259Sdim}; 64249259Sdim 65249259Sdim} // end anonymous namespace 66249259Sdim 67249259Sdimchar CallGraphViewer::ID = 0; 68249259SdimINITIALIZE_PASS(CallGraphViewer, "view-callgraph", 69249259Sdim "View call graph", 70249259Sdim false, false) 71249259Sdim 72249259Sdimchar CallGraphPrinter::ID = 0; 73249259SdimINITIALIZE_PASS(CallGraphPrinter, "dot-callgraph", 74249259Sdim "Print call graph to 'dot' file", 75249259Sdim false, false) 76249259Sdim 77249259Sdim// Create methods available outside of this file, to use them 78249259Sdim// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by 79249259Sdim// the link time optimization. 80249259Sdim 81249259SdimModulePass *llvm::createCallGraphViewerPass() { 82249259Sdim return new CallGraphViewer(); 83249259Sdim} 84249259Sdim 85249259SdimModulePass *llvm::createCallGraphPrinterPass() { 86249259Sdim return new CallGraphPrinter(); 87249259Sdim} 88