1 //===- CallGraph.h - Build a Module's call graph ----------------*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 /// This file provides interfaces used to build and manipulate a call graph,
11 /// which is a very useful tool for interprocedural optimization.
13 /// Every function in a module is represented as a node in the call graph. The
14 /// callgraph node keeps track of which functions are called by the function
15 /// corresponding to the node.
17 /// A call graph may contain nodes where the function that they correspond to
18 /// is null. These 'external' nodes are used to represent control flow that is
19 /// not represented (or analyzable) in the module. In particular, this
20 /// analysis builds one external node such that:
21 /// 1. All functions in the module without internal linkage will have edges
22 /// from this external node, indicating that they could be called by
23 /// functions outside of the module.
24 /// 2. All functions whose address is used for something more than a direct
25 /// call, for example being stored into a memory location will also have
26 /// an edge from this external node. Since they may be called by an
27 /// unknown caller later, they must be tracked as such.
29 /// There is a second external node added for calls that leave this module.
30 /// Functions have a call edge to the external node iff:
31 /// 1. The function is external, reflecting the fact that they could call
32 /// anything without internal linkage or that has its address taken.
33 /// 2. The function contains an indirect function call.
35 /// As an extension in the future, there may be multiple nodes with a null
36 /// function. These will be used when we can prove (through pointer analysis)
37 /// that an indirect call site can call only a specific set of functions.
39 /// Because of these properties, the CallGraph captures a conservative superset
40 /// of all of the caller-callee relationships, which is useful for
43 //===----------------------------------------------------------------------===//
45 #ifndef LLVM_ANALYSIS_CALLGRAPH_H
46 #define LLVM_ANALYSIS_CALLGRAPH_H
48 #include "llvm/ADT/GraphTraits.h"
49 #include "llvm/ADT/STLExtras.h"
50 #include "llvm/IR/Function.h"
51 #include "llvm/IR/InstrTypes.h"
52 #include "llvm/IR/Intrinsics.h"
53 #include "llvm/IR/PassManager.h"
54 #include "llvm/IR/ValueHandle.h"
55 #include "llvm/Pass.h"
68 /// The basic data container for the call graph of a \c Module of IR.
70 /// This class exposes both the interface to the call graph for a module of IR.
72 /// The core call graph itself can also be updated to reflect changes to the IR.
77 std::map
<const Function
*, std::unique_ptr
<CallGraphNode
>>;
79 /// A map from \c Function* to \c CallGraphNode*.
80 FunctionMapTy FunctionMap
;
82 /// This node has edges to all external functions and those internal
83 /// functions that have their address taken.
84 CallGraphNode
*ExternalCallingNode
;
86 /// This node has edges to it from all functions making indirect calls
87 /// or calling an external function.
88 std::unique_ptr
<CallGraphNode
> CallsExternalNode
;
90 /// Replace the function represented by this node by another.
92 /// This does not rescan the body of the function, so it is suitable when
93 /// splicing the body of one function to another while also updating all
94 /// callers from the old function to the new.
95 void spliceFunction(const Function
*From
, const Function
*To
);
97 /// Add a function to the call graph, and link the node to all of the
98 /// functions that it calls.
99 void addToCallGraph(Function
*F
);
102 explicit CallGraph(Module
&M
);
103 CallGraph(CallGraph
&&Arg
);
106 void print(raw_ostream
&OS
) const;
109 using iterator
= FunctionMapTy::iterator
;
110 using const_iterator
= FunctionMapTy::const_iterator
;
112 /// Returns the module the call graph corresponds to.
113 Module
&getModule() const { return M
; }
115 inline iterator
begin() { return FunctionMap
.begin(); }
116 inline iterator
end() { return FunctionMap
.end(); }
117 inline const_iterator
begin() const { return FunctionMap
.begin(); }
118 inline const_iterator
end() const { return FunctionMap
.end(); }
120 /// Returns the call graph node for the provided function.
121 inline const CallGraphNode
*operator[](const Function
*F
) const {
122 const_iterator I
= FunctionMap
.find(F
);
123 assert(I
!= FunctionMap
.end() && "Function not in callgraph!");
124 return I
->second
.get();
127 /// Returns the call graph node for the provided function.
128 inline CallGraphNode
*operator[](const Function
*F
) {
129 const_iterator I
= FunctionMap
.find(F
);
130 assert(I
!= FunctionMap
.end() && "Function not in callgraph!");
131 return I
->second
.get();
134 /// Returns the \c CallGraphNode which is used to represent
135 /// undetermined calls into the callgraph.
136 CallGraphNode
*getExternalCallingNode() const { return ExternalCallingNode
; }
138 CallGraphNode
*getCallsExternalNode() const {
139 return CallsExternalNode
.get();
142 //===---------------------------------------------------------------------
143 // Functions to keep a call graph up to date with a function that has been
147 /// Unlink the function from this module, returning it.
149 /// Because this removes the function from the module, the call graph node is
150 /// destroyed. This is only valid if the function does not call any other
151 /// functions (ie, there are no edges in it's CGN). The easiest way to do
152 /// this is to dropAllReferences before calling this.
153 Function
*removeFunctionFromModule(CallGraphNode
*CGN
);
155 /// Similar to operator[], but this will insert a new CallGraphNode for
156 /// \c F if one does not already exist.
157 CallGraphNode
*getOrInsertFunction(const Function
*F
);
160 /// A node in the call graph for a module.
162 /// Typically represents a function in the call graph. There are also special
163 /// "null" nodes used to represent theoretical entries in the call graph.
164 class CallGraphNode
{
166 /// A pair of the calling instruction (a call or invoke)
167 /// and the call graph node being called.
168 using CallRecord
= std::pair
<WeakTrackingVH
, CallGraphNode
*>;
171 using CalledFunctionsVector
= std::vector
<CallRecord
>;
173 /// Creates a node for the specified function.
174 inline CallGraphNode(Function
*F
) : F(F
) {}
176 CallGraphNode(const CallGraphNode
&) = delete;
177 CallGraphNode
&operator=(const CallGraphNode
&) = delete;
180 assert(NumReferences
== 0 && "Node deleted while references remain");
183 using iterator
= std::vector
<CallRecord
>::iterator
;
184 using const_iterator
= std::vector
<CallRecord
>::const_iterator
;
186 /// Returns the function that this call graph node represents.
187 Function
*getFunction() const { return F
; }
189 inline iterator
begin() { return CalledFunctions
.begin(); }
190 inline iterator
end() { return CalledFunctions
.end(); }
191 inline const_iterator
begin() const { return CalledFunctions
.begin(); }
192 inline const_iterator
end() const { return CalledFunctions
.end(); }
193 inline bool empty() const { return CalledFunctions
.empty(); }
194 inline unsigned size() const { return (unsigned)CalledFunctions
.size(); }
196 /// Returns the number of other CallGraphNodes in this CallGraph that
197 /// reference this node in their callee list.
198 unsigned getNumReferences() const { return NumReferences
; }
200 /// Returns the i'th called function.
201 CallGraphNode
*operator[](unsigned i
) const {
202 assert(i
< CalledFunctions
.size() && "Invalid index");
203 return CalledFunctions
[i
].second
;
206 /// Print out this call graph node.
208 void print(raw_ostream
&OS
) const;
210 //===---------------------------------------------------------------------
211 // Methods to keep a call graph up to date with a function that has been
215 /// Removes all edges from this CallGraphNode to any functions it
217 void removeAllCalledFunctions() {
218 while (!CalledFunctions
.empty()) {
219 CalledFunctions
.back().second
->DropRef();
220 CalledFunctions
.pop_back();
224 /// Moves all the callee information from N to this node.
225 void stealCalledFunctionsFrom(CallGraphNode
*N
) {
226 assert(CalledFunctions
.empty() &&
227 "Cannot steal callsite information if I already have some");
228 std::swap(CalledFunctions
, N
->CalledFunctions
);
231 /// Adds a function to the list of functions called by this one.
232 void addCalledFunction(CallBase
*Call
, CallGraphNode
*M
) {
233 assert(!Call
|| !Call
->getCalledFunction() ||
234 !Call
->getCalledFunction()->isIntrinsic() ||
235 !Intrinsic::isLeaf(Call
->getCalledFunction()->getIntrinsicID()));
236 CalledFunctions
.emplace_back(Call
, M
);
240 void removeCallEdge(iterator I
) {
241 I
->second
->DropRef();
242 *I
= CalledFunctions
.back();
243 CalledFunctions
.pop_back();
246 /// Removes the edge in the node for the specified call site.
248 /// Note that this method takes linear time, so it should be used sparingly.
249 void removeCallEdgeFor(CallBase
&Call
);
251 /// Removes all call edges from this node to the specified callee
254 /// This takes more time to execute than removeCallEdgeTo, so it should not
255 /// be used unless necessary.
256 void removeAnyCallEdgeTo(CallGraphNode
*Callee
);
258 /// Removes one edge associated with a null callsite from this node to
259 /// the specified callee function.
260 void removeOneAbstractEdgeTo(CallGraphNode
*Callee
);
262 /// Replaces the edge in the node for the specified call site with a
265 /// Note that this method takes linear time, so it should be used sparingly.
266 void replaceCallEdge(CallBase
&Call
, CallBase
&NewCall
,
267 CallGraphNode
*NewNode
);
270 friend class CallGraph
;
274 std::vector
<CallRecord
> CalledFunctions
;
276 /// The number of times that this CallGraphNode occurs in the
277 /// CalledFunctions array of this or other CallGraphNodes.
278 unsigned NumReferences
= 0;
280 void DropRef() { --NumReferences
; }
281 void AddRef() { ++NumReferences
; }
283 /// A special function that should only be used by the CallGraph class.
284 void allReferencesDropped() { NumReferences
= 0; }
287 /// An analysis pass to compute the \c CallGraph for a \c Module.
289 /// This class implements the concept of an analysis pass used by the \c
290 /// ModuleAnalysisManager to run an analysis over a module and cache the
292 class CallGraphAnalysis
: public AnalysisInfoMixin
<CallGraphAnalysis
> {
293 friend AnalysisInfoMixin
<CallGraphAnalysis
>;
295 static AnalysisKey Key
;
298 /// A formulaic type to inform clients of the result type.
299 using Result
= CallGraph
;
301 /// Compute the \c CallGraph for the module \c M.
303 /// The real work here is done in the \c CallGraph constructor.
304 CallGraph
run(Module
&M
, ModuleAnalysisManager
&) { return CallGraph(M
); }
307 /// Printer pass for the \c CallGraphAnalysis results.
308 class CallGraphPrinterPass
: public PassInfoMixin
<CallGraphPrinterPass
> {
312 explicit CallGraphPrinterPass(raw_ostream
&OS
) : OS(OS
) {}
314 PreservedAnalyses
run(Module
&M
, ModuleAnalysisManager
&AM
);
317 /// The \c ModulePass which wraps up a \c CallGraph and the logic to
320 /// This class exposes both the interface to the call graph container and the
321 /// module pass which runs over a module of IR and produces the call graph. The
322 /// call graph interface is entirelly a wrapper around a \c CallGraph object
323 /// which is stored internally for each module.
324 class CallGraphWrapperPass
: public ModulePass
{
325 std::unique_ptr
<CallGraph
> G
;
328 static char ID
; // Class identification, replacement for typeinfo
330 CallGraphWrapperPass();
331 ~CallGraphWrapperPass() override
;
333 /// The internal \c CallGraph around which the rest of this interface
335 const CallGraph
&getCallGraph() const { return *G
; }
336 CallGraph
&getCallGraph() { return *G
; }
338 using iterator
= CallGraph::iterator
;
339 using const_iterator
= CallGraph::const_iterator
;
341 /// Returns the module the call graph corresponds to.
342 Module
&getModule() const { return G
->getModule(); }
344 inline iterator
begin() { return G
->begin(); }
345 inline iterator
end() { return G
->end(); }
346 inline const_iterator
begin() const { return G
->begin(); }
347 inline const_iterator
end() const { return G
->end(); }
349 /// Returns the call graph node for the provided function.
350 inline const CallGraphNode
*operator[](const Function
*F
) const {
354 /// Returns the call graph node for the provided function.
355 inline CallGraphNode
*operator[](const Function
*F
) { return (*G
)[F
]; }
357 /// Returns the \c CallGraphNode which is used to represent
358 /// undetermined calls into the callgraph.
359 CallGraphNode
*getExternalCallingNode() const {
360 return G
->getExternalCallingNode();
363 CallGraphNode
*getCallsExternalNode() const {
364 return G
->getCallsExternalNode();
367 //===---------------------------------------------------------------------
368 // Functions to keep a call graph up to date with a function that has been
372 /// Unlink the function from this module, returning it.
374 /// Because this removes the function from the module, the call graph node is
375 /// destroyed. This is only valid if the function does not call any other
376 /// functions (ie, there are no edges in it's CGN). The easiest way to do
377 /// this is to dropAllReferences before calling this.
378 Function
*removeFunctionFromModule(CallGraphNode
*CGN
) {
379 return G
->removeFunctionFromModule(CGN
);
382 /// Similar to operator[], but this will insert a new CallGraphNode for
383 /// \c F if one does not already exist.
384 CallGraphNode
*getOrInsertFunction(const Function
*F
) {
385 return G
->getOrInsertFunction(F
);
388 //===---------------------------------------------------------------------
389 // Implementation of the ModulePass interface needed here.
392 void getAnalysisUsage(AnalysisUsage
&AU
) const override
;
393 bool runOnModule(Module
&M
) override
;
394 void releaseMemory() override
;
396 void print(raw_ostream
&o
, const Module
*) const override
;
400 //===----------------------------------------------------------------------===//
401 // GraphTraits specializations for call graphs so that they can be treated as
402 // graphs by the generic graph algorithms.
405 // Provide graph traits for tranversing call graphs using standard graph
407 template <> struct GraphTraits
<CallGraphNode
*> {
408 using NodeRef
= CallGraphNode
*;
409 using CGNPairTy
= CallGraphNode::CallRecord
;
411 static NodeRef
getEntryNode(CallGraphNode
*CGN
) { return CGN
; }
412 static CallGraphNode
*CGNGetValue(CGNPairTy P
) { return P
.second
; }
414 using ChildIteratorType
=
415 mapped_iterator
<CallGraphNode::iterator
, decltype(&CGNGetValue
)>;
417 static ChildIteratorType
child_begin(NodeRef N
) {
418 return ChildIteratorType(N
->begin(), &CGNGetValue
);
421 static ChildIteratorType
child_end(NodeRef N
) {
422 return ChildIteratorType(N
->end(), &CGNGetValue
);
426 template <> struct GraphTraits
<const CallGraphNode
*> {
427 using NodeRef
= const CallGraphNode
*;
428 using CGNPairTy
= CallGraphNode::CallRecord
;
429 using EdgeRef
= const CallGraphNode::CallRecord
&;
431 static NodeRef
getEntryNode(const CallGraphNode
*CGN
) { return CGN
; }
432 static const CallGraphNode
*CGNGetValue(CGNPairTy P
) { return P
.second
; }
434 using ChildIteratorType
=
435 mapped_iterator
<CallGraphNode::const_iterator
, decltype(&CGNGetValue
)>;
436 using ChildEdgeIteratorType
= CallGraphNode::const_iterator
;
438 static ChildIteratorType
child_begin(NodeRef N
) {
439 return ChildIteratorType(N
->begin(), &CGNGetValue
);
442 static ChildIteratorType
child_end(NodeRef N
) {
443 return ChildIteratorType(N
->end(), &CGNGetValue
);
446 static ChildEdgeIteratorType
child_edge_begin(NodeRef N
) {
449 static ChildEdgeIteratorType
child_edge_end(NodeRef N
) { return N
->end(); }
451 static NodeRef
edge_dest(EdgeRef E
) { return E
.second
; }
455 struct GraphTraits
<CallGraph
*> : public GraphTraits
<CallGraphNode
*> {
457 std::pair
<const Function
*const, std::unique_ptr
<CallGraphNode
>>;
459 static NodeRef
getEntryNode(CallGraph
*CGN
) {
460 return CGN
->getExternalCallingNode(); // Start at the external node!
463 static CallGraphNode
*CGGetValuePtr(const PairTy
&P
) {
464 return P
.second
.get();
467 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
468 using nodes_iterator
=
469 mapped_iterator
<CallGraph::iterator
, decltype(&CGGetValuePtr
)>;
471 static nodes_iterator
nodes_begin(CallGraph
*CG
) {
472 return nodes_iterator(CG
->begin(), &CGGetValuePtr
);
475 static nodes_iterator
nodes_end(CallGraph
*CG
) {
476 return nodes_iterator(CG
->end(), &CGGetValuePtr
);
481 struct GraphTraits
<const CallGraph
*> : public GraphTraits
<
482 const CallGraphNode
*> {
484 std::pair
<const Function
*const, std::unique_ptr
<CallGraphNode
>>;
486 static NodeRef
getEntryNode(const CallGraph
*CGN
) {
487 return CGN
->getExternalCallingNode(); // Start at the external node!
490 static const CallGraphNode
*CGGetValuePtr(const PairTy
&P
) {
491 return P
.second
.get();
494 // nodes_iterator/begin/end - Allow iteration over all nodes in the graph
495 using nodes_iterator
=
496 mapped_iterator
<CallGraph::const_iterator
, decltype(&CGGetValuePtr
)>;
498 static nodes_iterator
nodes_begin(const CallGraph
*CG
) {
499 return nodes_iterator(CG
->begin(), &CGGetValuePtr
);
502 static nodes_iterator
nodes_end(const CallGraph
*CG
) {
503 return nodes_iterator(CG
->end(), &CGGetValuePtr
);
507 } // end namespace llvm
509 #endif // LLVM_ANALYSIS_CALLGRAPH_H