blob: e7017e77652af7c176eb0143b0056576badac36d [file] [log] [blame]
Andrew Tricka125cac2013-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
Andrew Tricka125cac2013-01-11 17:28:14 +000017#include "llvm/Analysis/CallPrinter.h"
Chandler Carruthe3e43d92017-06-06 11:49:48 +000018#include "llvm/Analysis/CallGraph.h"
Andrew Tricka125cac2013-01-11 17:28:14 +000019#include "llvm/Analysis/DOTGraphTraitsPass.h"
20
21using namespace llvm;
22
23namespace llvm {
24
Sean Fertile551913f2018-06-29 17:48:58 +000025template <> struct DOTGraphTraits<CallGraph *> : public DefaultDOTGraphTraits {
Chandler Carruthbdd300b2013-11-26 03:45:26 +000026 DOTGraphTraits(bool isSimple = false) : DefaultDOTGraphTraits(isSimple) {}
Andrew Tricka125cac2013-01-11 17:28:14 +000027
Sean Fertile551913f2018-06-29 17:48:58 +000028 static std::string getGraphName(CallGraph *Graph) { return "Call graph"; }
Andrew Tricka125cac2013-01-11 17:28:14 +000029
Sean Fertile551913f2018-06-29 17:48:58 +000030 std::string getNodeLabel(CallGraphNode *Node, CallGraph *Graph) {
Andrew Tricka125cac2013-01-11 17:28:14 +000031 if (Function *Func = Node->getFunction())
32 return Func->getName();
33
34 return "external node";
35 }
Sean Fertile551913f2018-06-29 17:48:58 +000036};
Andrew Tricka125cac2013-01-11 17:28:14 +000037
Sean Fertile551913f2018-06-29 17:48:58 +000038struct AnalysisCallGraphWrapperPassTraits {
39 static CallGraph *getGraph(CallGraphWrapperPass *P) {
40 return &P->getCallGraph();
Chandler Carruth54fec072013-11-26 04:19:30 +000041 }
42};
43
Sean Fertile551913f2018-06-29 17:48:58 +000044} // end llvm namespace
Andrew Tricka125cac2013-01-11 17:28:14 +000045
46namespace {
47
Sean Fertile551913f2018-06-29 17:48:58 +000048struct CallGraphViewer
49 : public DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
50 AnalysisCallGraphWrapperPassTraits> {
Sean Fertile8b6f52a2018-06-29 17:13:58 +000051 static char ID;
Sean Fertile8b6f52a2018-06-29 17:13:58 +000052
Sean Fertile551913f2018-06-29 17:48:58 +000053 CallGraphViewer()
54 : DOTGraphTraitsModuleViewer<CallGraphWrapperPass, true, CallGraph *,
55 AnalysisCallGraphWrapperPassTraits>(
56 "callgraph", ID) {
57 initializeCallGraphViewerPass(*PassRegistry::getPassRegistry());
58 }
Andrew Tricka125cac2013-01-11 17:28:14 +000059};
60
Sean Fertile551913f2018-06-29 17:48:58 +000061struct CallGraphDOTPrinter : public DOTGraphTraitsModulePrinter<
62 CallGraphWrapperPass, true, CallGraph *,
63 AnalysisCallGraphWrapperPassTraits> {
Sean Fertile8b6f52a2018-06-29 17:13:58 +000064 static char ID;
Sean Fertile8b6f52a2018-06-29 17:13:58 +000065
Sean Fertile551913f2018-06-29 17:48:58 +000066 CallGraphDOTPrinter()
67 : DOTGraphTraitsModulePrinter<CallGraphWrapperPass, true, CallGraph *,
68 AnalysisCallGraphWrapperPassTraits>(
69 "callgraph", ID) {
70 initializeCallGraphDOTPrinterPass(*PassRegistry::getPassRegistry());
71 }
Andrew Tricka125cac2013-01-11 17:28:14 +000072};
73
74} // end anonymous namespace
75
76char CallGraphViewer::ID = 0;
Chandler Carruthbdd300b2013-11-26 03:45:26 +000077INITIALIZE_PASS(CallGraphViewer, "view-callgraph", "View call graph", false,
78 false)
Andrew Tricka125cac2013-01-11 17:28:14 +000079
Chandler Carruth562873f2016-03-10 11:04:40 +000080char CallGraphDOTPrinter::ID = 0;
81INITIALIZE_PASS(CallGraphDOTPrinter, "dot-callgraph",
Chandler Carruthbdd300b2013-11-26 03:45:26 +000082 "Print call graph to 'dot' file", false, false)
Andrew Tricka125cac2013-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 Carruthbdd300b2013-11-26 03:45:26 +000088ModulePass *llvm::createCallGraphViewerPass() { return new CallGraphViewer(); }
Andrew Tricka125cac2013-01-11 17:28:14 +000089
Chandler Carruth562873f2016-03-10 11:04:40 +000090ModulePass *llvm::createCallGraphDOTPrinterPass() {
91 return new CallGraphDOTPrinter();
Andrew Tricka125cac2013-01-11 17:28:14 +000092}