Home | History | Annotate | Download | only in Analysis
      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 <> struct DOTGraphTraits<CallGraph *> : public DefaultDOTGraphTraits {
     26   DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
     27 
     28   static std::string getGraphName(CallGraph *Graph) { return "Call graph"; }
     29 
     30   std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) {
     31     if (Function *Func = Node->getFunction())
     32       return Func->getName();
     33 
     34     return "external node";
     35   }
     36 };
     37 
     38 struct AnalysisCallGraphWrapperPassTraits {
     39   static CallGraph *getGraph(CallGraphWrapperPass *P) {
     40     return &P->getCallGraph();
     41   }
     42 };
     43 
     44 } // end llvm namespace
     45 
     46 namespace {
     47 
     48 struct CallGraphViewer
     49     : public DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
     50                                         AnalysisCallGraphWrapperPassTraits> {
     51   static char ID;
     52 
     53   CallGraphViewer()
     54       : DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
     55                                    AnalysisCallGraphWrapperPassTraits>(
     56             "callgraph", ID) {
     57     initializeCallGraphViewerPass(*PassRegistry::getPassRegistry());
     58   }
     59 };
     60 
     61 struct CallGraphDOTPrinter : public DOTGraphTraitsModulePrinter<
     62                               CallGraphWrapperPass, true, CallGraph *,
     63                               AnalysisCallGraphWrapperPassTraits> {
     64   static char ID;
     65 
     66   CallGraphDOTPrinter()
     67       : DOTGraphTraitsModulePrinter<CallGraphWrapperPass, true, CallGraph *,
     68                                     AnalysisCallGraphWrapperPassTraits>(
     69             "callgraph", ID) {
     70     initializeCallGraphDOTPrinterPass(*PassRegistry::getPassRegistry());
     71   }
     72 };
     73 
     74 } // end anonymous namespace
     75 
     76 char CallGraphViewer::ID = 0;
     77 INITIALIZE_PASS(CallGraphViewer, "view-callgraph", "View call graph", false,
     78                 false)
     79 
     80 char CallGraphDOTPrinter::ID = 0;
     81 INITIALIZE_PASS(CallGraphDOTPrinter, "dot-callgraph",
     82                 "Print call graph to 'dot' file", false, false)
     83 
     84 // Create methods available outside of this file, to use them
     85 // "include/llvm/LinkAllPasses.h". Otherwise the pass would be deleted by
     86 // the link time optimization.
     87 
     88 ModulePass *llvm::createCallGraphViewerPass() { return new CallGraphViewer(); }
     89 
     90 ModulePass *llvm::createCallGraphDOTPrinterPass() {
     91   return new CallGraphDOTPrinter();
     92 }
     93