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