blob: af942e9ed3e975f77479feff11c9b7a0c2ef1239 [file] [log] [blame]
Andrew Trick962318f62013-01-11 17:28:14 +00001//===- 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
21using namespace llvm;
22
23namespace llvm {
24
Chandler Carruth878b5532013-11-26 03:45:26 +000025template <> struct DOTGraphTraits<CallGraph *> : public DefaultDOTGraphTraits {
26 DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
Andrew Trick962318f62013-01-11 17:28:14 +000027
Chandler Carruth878b5532013-11-26 03:45:26 +000028 static std::string getGraphName(CallGraph *Graph) { return "Call graph"; }
Andrew Trick962318f62013-01-11 17:28:14 +000029
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
Chandler Carruth6378cf52013-11-26 04:19:30 +000038struct AnalysisCallGraphWrapperPassTraits {
39 static CallGraph *getGraph(CallGraphWrapperPass *P) {
40 return &P->getCallGraph();
41 }
42};
43
Alexander Kornienkof00654e2015-06-23 09:49:53 +000044} // end llvm namespace
Andrew Trick962318f62013-01-11 17:28:14 +000045
46namespace {
47
Chandler Carruth6378cf52013-11-26 04:19:30 +000048struct CallGraphViewer
49 : public DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
50 AnalysisCallGraphWrapperPassTraits> {
Andrew Trick962318f62013-01-11 17:28:14 +000051 static char ID;
52
53 CallGraphViewer()
Chandler Carruth6378cf52013-11-26 04:19:30 +000054 : DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
55 AnalysisCallGraphWrapperPassTraits>(
56 "callgraph", ID) {
Andrew Trick962318f62013-01-11 17:28:14 +000057 initializeCallGraphViewerPass(*PassRegistry::getPassRegistry());
58 }
59};
60
Chandler Carruth5f432292016-03-10 11:04:40 +000061struct CallGraphDOTPrinter : public DOTGraphTraitsModulePrinter<
Chandler Carruth6378cf52013-11-26 04:19:30 +000062 CallGraphWrapperPass, true, CallGraph *,
63 AnalysisCallGraphWrapperPassTraits> {
Andrew Trick962318f62013-01-11 17:28:14 +000064 static char ID;
65
Chandler Carruth5f432292016-03-10 11:04:40 +000066 CallGraphDOTPrinter()
Chandler Carruth6378cf52013-11-26 04:19:30 +000067 : DOTGraphTraitsModulePrinter<CallGraphWrapperPass, true, CallGraph *,
68 AnalysisCallGraphWrapperPassTraits>(
69 "callgraph", ID) {
Chandler Carruth5f432292016-03-10 11:04:40 +000070 initializeCallGraphDOTPrinterPass(*PassRegistry::getPassRegistry());
Andrew Trick962318f62013-01-11 17:28:14 +000071 }
72};
73
74} // end anonymous namespace
75
76char CallGraphViewer::ID = 0;
Chandler Carruth878b5532013-11-26 03:45:26 +000077INITIALIZE_PASS(CallGraphViewer, "view-callgraph", "View call graph", false,
78 false)
Andrew Trick962318f62013-01-11 17:28:14 +000079
Chandler Carruth5f432292016-03-10 11:04:40 +000080char CallGraphDOTPrinter::ID = 0;
81INITIALIZE_PASS(CallGraphDOTPrinter, "dot-callgraph",
Chandler Carruth878b5532013-11-26 03:45:26 +000082 "Print call graph to 'dot' file", false, false)
Andrew Trick962318f62013-01-11 17:28:14 +000083
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
Chandler Carruth878b5532013-11-26 03:45:26 +000088ModulePass *llvm::createCallGraphViewerPass() { return new CallGraphViewer(); }
Andrew Trick962318f62013-01-11 17:28:14 +000089
Chandler Carruth5f432292016-03-10 11:04:40 +000090ModulePass *llvm::createCallGraphDOTPrinterPass() {
91 return new CallGraphDOTPrinter();
Andrew Trick962318f62013-01-11 17:28:14 +000092}