1a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick//===- CallPrinter.cpp - DOT printer for call graph -----------------------===// 2a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// 3a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// The LLVM Compiler Infrastructure 4a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// 5a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// This file is distributed under the University of Illinois Open Source 6a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// License. See LICENSE.TXT for details. 7a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// 8a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick//===----------------------------------------------------------------------===// 9a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// 10a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// This file defines '-dot-callgraph', which emit a callgraph.<fnname>.dot 11a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// containing the call graph of a module. 12a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// 13a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// There is also a pass available to directly call dotty ('-view-callgraph'). 14a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// 15a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick//===----------------------------------------------------------------------===// 16a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 17a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick#include "llvm/Analysis/CallGraph.h" 18a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick#include "llvm/Analysis/CallPrinter.h" 19a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick#include "llvm/Analysis/DOTGraphTraitsPass.h" 20a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 21a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trickusing namespace llvm; 22a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 23a125cacf7d154d0e5cad47f011e619e45517c839Andrew Tricknamespace llvm { 24a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestemplate <> struct DOTGraphTraits<CallGraph *> : public DefaultDOTGraphTraits { 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {} 27a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 2836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static std::string getGraphName(CallGraph *Graph) { return "Call graph"; } 29a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 30a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) { 31a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick if (Function *Func = Node->getFunction()) 32a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick return Func->getName(); 33a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 34a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick return "external node"; 35a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick } 36a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick}; 37a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 3836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct AnalysisCallGraphWrapperPassTraits { 3936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines static CallGraph *getGraph(CallGraphWrapperPass *P) { 4036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return &P->getCallGraph(); 4136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 4236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 4336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick} // end llvm namespace 45a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 46a125cacf7d154d0e5cad47f011e619e45517c839Andrew Tricknamespace { 47a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 48a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trickstruct CallGraphViewer 4936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : public DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *, 5036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AnalysisCallGraphWrapperPassTraits> { 51a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick static char ID; 52a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 53a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick CallGraphViewer() 5436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *, 5536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AnalysisCallGraphWrapperPassTraits>( 5636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "callgraph", ID) { 57a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick initializeCallGraphViewerPass(*PassRegistry::getPassRegistry()); 58a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick } 59a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick}; 60a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 6136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesstruct CallGraphPrinter : public DOTGraphTraitsModulePrinter< 6236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines CallGraphWrapperPass, true, CallGraph *, 6336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AnalysisCallGraphWrapperPassTraits> { 64a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick static char ID; 65a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 66a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick CallGraphPrinter() 6736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines : DOTGraphTraitsModulePrinter<CallGraphWrapperPass, true, CallGraph *, 6836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines AnalysisCallGraphWrapperPassTraits>( 6936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "callgraph", ID) { 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines initializeCallGraphPrinterPass(*PassRegistry::getPassRegistry()); 71a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick } 72a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick}; 73a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 74a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick} // end anonymous namespace 75a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 76a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trickchar CallGraphViewer::ID = 0; 7736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesINITIALIZE_PASS(CallGraphViewer, "view-callgraph", "View call graph", false, 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines false) 79a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 80a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trickchar CallGraphPrinter::ID = 0; 81a125cacf7d154d0e5cad47f011e619e45517c839Andrew TrickINITIALIZE_PASS(CallGraphPrinter, "dot-callgraph", 8236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines "Print call graph to 'dot' file", false, false) 83a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 84a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// Create methods available outside of this file, to use them 85a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by 86a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick// the link time optimization. 87a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 8836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesModulePass *llvm::createCallGraphViewerPass() { return new CallGraphViewer(); } 89a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick 90a125cacf7d154d0e5cad47f011e619e45517c839Andrew TrickModulePass *llvm::createCallGraphPrinterPass() { 91a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick return new CallGraphPrinter(); 92a125cacf7d154d0e5cad47f011e619e45517c839Andrew Trick} 93