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