svf-lib 1.0.2207 → 1.0.2209
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-linux/Release-build/bin/ae +0 -0
- package/SVF-linux/Release-build/bin/cfl +0 -0
- package/SVF-linux/Release-build/bin/dvf +0 -0
- package/SVF-linux/Release-build/bin/llvm2svf +0 -0
- package/SVF-linux/Release-build/bin/mta +0 -0
- package/SVF-linux/Release-build/bin/saber +0 -0
- package/SVF-linux/Release-build/bin/svf-ex +0 -0
- package/SVF-linux/Release-build/bin/wpa +0 -0
- package/SVF-linux/Release-build/include/AE/Svfexe/AbstractInterpretation.h +2 -2
- package/SVF-linux/Release-build/include/Graphs/PTACallGraph.h +9 -1
- package/SVF-linux/Release-build/include/Graphs/ThreadCallGraph.h +1 -1
- package/SVF-linux/Release-build/include/SVF-LLVM/LLVMModule.h +1 -12
- package/SVF-linux/Release-build/include/SVFIR/SVFIR.h +11 -12
- package/SVF-linux/Release-build/include/SVFIR/SVFValue.h +0 -10
- package/SVF-linux/Release-build/include/SVFIR/SVFVariables.h +13 -13
- package/SVF-linux/Release-build/include/Util/CallGraphBuilder.h +1 -1
- package/SVF-linux/Release-build/lib/libSvfCore.a +0 -0
- package/SVF-linux/Release-build/lib/libSvfLLVM.a +0 -0
- package/SVF-osx/Release-build/bin/ae +0 -0
- package/SVF-osx/Release-build/bin/cfl +0 -0
- package/SVF-osx/Release-build/bin/dvf +0 -0
- package/SVF-osx/Release-build/bin/llvm2svf +0 -0
- package/SVF-osx/Release-build/bin/mta +0 -0
- package/SVF-osx/Release-build/bin/saber +0 -0
- package/SVF-osx/Release-build/bin/svf-ex +0 -0
- package/SVF-osx/Release-build/bin/wpa +0 -0
- package/SVF-osx/Release-build/include/AE/Svfexe/AbstractInterpretation.h +1 -1
- package/SVF-osx/Release-build/include/DDA/DDAVFSolver.h +4 -4
- package/SVF-osx/Release-build/include/Graphs/{PTACallGraph.h → CallGraph.h} +38 -38
- package/SVF-osx/Release-build/include/Graphs/ICFG.h +2 -2
- package/SVF-osx/Release-build/include/Graphs/ThreadCallGraph.h +25 -25
- package/SVF-osx/Release-build/include/Graphs/VFG.h +4 -4
- package/SVF-osx/Release-build/include/MSSA/MemRegion.h +4 -4
- package/SVF-osx/Release-build/include/MTA/LockAnalysis.h +1 -1
- package/SVF-osx/Release-build/include/MTA/MHP.h +2 -2
- package/SVF-osx/Release-build/include/MTA/TCT.h +6 -6
- package/SVF-osx/Release-build/include/MemoryModel/PointerAnalysis.h +5 -5
- package/SVF-osx/Release-build/include/SABER/SaberSVFGBuilder.h +1 -1
- package/SVF-osx/Release-build/include/SABER/SrcSnkDDA.h +2 -2
- package/SVF-osx/Release-build/include/SVF-LLVM/LLVMModule.h +1 -1
- package/SVF-osx/Release-build/include/SVF-LLVM/SVFIRBuilder.h +1 -1
- package/SVF-osx/Release-build/include/SVFIR/SVFIR.h +3 -3
- package/SVF-osx/Release-build/include/Util/CallGraphBuilder.h +2 -2
- package/SVF-osx/Release-build/lib/libSvfCore.a +0 -0
- package/SVF-osx/Release-build/lib/libSvfLLVM.a +0 -0
- package/package.json +1 -1
- package/SVF-linux/Release-build/include/Graphs/CallGraph.h +0 -266
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
#ifndef RCG_H_
|
|
31
31
|
#define RCG_H_
|
|
32
32
|
|
|
33
|
-
#include "Graphs/
|
|
33
|
+
#include "Graphs/CallGraph.h"
|
|
34
34
|
|
|
35
35
|
namespace SVF
|
|
36
36
|
{
|
|
@@ -41,13 +41,13 @@ class PointerAnalysis;
|
|
|
41
41
|
/*!
|
|
42
42
|
* PTA thread fork edge from fork site to the entry of a start routine function
|
|
43
43
|
*/
|
|
44
|
-
class ThreadForkEdge: public
|
|
44
|
+
class ThreadForkEdge: public CallGraphEdge
|
|
45
45
|
{
|
|
46
46
|
|
|
47
47
|
public:
|
|
48
48
|
/// Constructor
|
|
49
|
-
ThreadForkEdge(
|
|
50
|
-
|
|
49
|
+
ThreadForkEdge(CallGraphNode* s, CallGraphNode* d, CallSiteID csId) :
|
|
50
|
+
CallGraphEdge(s, d, CallGraphEdge::TDForkEdge, csId)
|
|
51
51
|
{
|
|
52
52
|
}
|
|
53
53
|
/// Destructor
|
|
@@ -61,9 +61,9 @@ public:
|
|
|
61
61
|
{
|
|
62
62
|
return true;
|
|
63
63
|
}
|
|
64
|
-
static inline bool classof(const
|
|
64
|
+
static inline bool classof(const CallGraphEdge*edge)
|
|
65
65
|
{
|
|
66
|
-
return edge->getEdgeKind() ==
|
|
66
|
+
return edge->getEdgeKind() == CallGraphEdge::TDForkEdge;
|
|
67
67
|
}
|
|
68
68
|
//@}
|
|
69
69
|
|
|
@@ -78,19 +78,19 @@ public:
|
|
|
78
78
|
return rawstr.str();
|
|
79
79
|
}
|
|
80
80
|
|
|
81
|
-
typedef GenericNode<
|
|
81
|
+
typedef GenericNode<CallGraphNode, ThreadForkEdge>::GEdgeSetTy ForkEdgeSet;
|
|
82
82
|
};
|
|
83
83
|
|
|
84
84
|
/*!
|
|
85
85
|
* PTA thread join edge from the exit of a start routine function to a join point of the thread
|
|
86
86
|
*/
|
|
87
|
-
class ThreadJoinEdge: public
|
|
87
|
+
class ThreadJoinEdge: public CallGraphEdge
|
|
88
88
|
{
|
|
89
89
|
|
|
90
90
|
public:
|
|
91
91
|
/// Constructor
|
|
92
|
-
ThreadJoinEdge(
|
|
93
|
-
|
|
92
|
+
ThreadJoinEdge(CallGraphNode* s, CallGraphNode* d, CallSiteID csId) :
|
|
93
|
+
CallGraphEdge(s, d, CallGraphEdge::TDJoinEdge, csId)
|
|
94
94
|
{
|
|
95
95
|
}
|
|
96
96
|
/// Destructor
|
|
@@ -102,9 +102,9 @@ public:
|
|
|
102
102
|
{
|
|
103
103
|
return true;
|
|
104
104
|
}
|
|
105
|
-
static inline bool classof(const
|
|
105
|
+
static inline bool classof(const CallGraphEdge*edge)
|
|
106
106
|
{
|
|
107
|
-
return edge->getEdgeKind() ==
|
|
107
|
+
return edge->getEdgeKind() == CallGraphEdge::TDJoinEdge;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
virtual const std::string toString() const
|
|
@@ -118,19 +118,19 @@ public:
|
|
|
118
118
|
return rawstr.str();
|
|
119
119
|
}
|
|
120
120
|
|
|
121
|
-
typedef GenericNode<
|
|
121
|
+
typedef GenericNode<CallGraphNode, ThreadJoinEdge>::GEdgeSetTy JoinEdgeSet;
|
|
122
122
|
};
|
|
123
123
|
|
|
124
124
|
/*!
|
|
125
125
|
* hare_parallel_for edge from fork site to the entry of a start routine function
|
|
126
126
|
*/
|
|
127
|
-
class HareParForEdge: public
|
|
127
|
+
class HareParForEdge: public CallGraphEdge
|
|
128
128
|
{
|
|
129
129
|
|
|
130
130
|
public:
|
|
131
131
|
/// Constructor
|
|
132
|
-
HareParForEdge(
|
|
133
|
-
|
|
132
|
+
HareParForEdge(CallGraphNode* s, CallGraphNode* d, CallSiteID csId) :
|
|
133
|
+
CallGraphEdge(s, d, CallGraphEdge::HareParForEdge, csId)
|
|
134
134
|
{
|
|
135
135
|
}
|
|
136
136
|
/// Destructor
|
|
@@ -144,20 +144,20 @@ public:
|
|
|
144
144
|
{
|
|
145
145
|
return true;
|
|
146
146
|
}
|
|
147
|
-
static inline bool classof(const
|
|
147
|
+
static inline bool classof(const CallGraphEdge*edge)
|
|
148
148
|
{
|
|
149
|
-
return edge->getEdgeKind() ==
|
|
149
|
+
return edge->getEdgeKind() == CallGraphEdge::HareParForEdge;
|
|
150
150
|
}
|
|
151
151
|
//@}
|
|
152
152
|
|
|
153
|
-
typedef GenericNode<
|
|
153
|
+
typedef GenericNode<CallGraphNode, HareParForEdge>::GEdgeSetTy ParForEdgeSet;
|
|
154
154
|
};
|
|
155
155
|
|
|
156
156
|
|
|
157
157
|
/*!
|
|
158
158
|
* Thread sensitive call graph
|
|
159
159
|
*/
|
|
160
|
-
class ThreadCallGraph: public
|
|
160
|
+
class ThreadCallGraph: public CallGraph
|
|
161
161
|
{
|
|
162
162
|
|
|
163
163
|
public:
|
|
@@ -172,7 +172,7 @@ public:
|
|
|
172
172
|
typedef Map<const CallICFGNode*, ParForEdgeSet> CallInstToParForEdgesMap;
|
|
173
173
|
|
|
174
174
|
/// Constructor
|
|
175
|
-
ThreadCallGraph(const
|
|
175
|
+
ThreadCallGraph(const CallGraph& cg);
|
|
176
176
|
|
|
177
177
|
ThreadCallGraph(ThreadCallGraph& cg) = delete;
|
|
178
178
|
|
|
@@ -187,9 +187,9 @@ public:
|
|
|
187
187
|
{
|
|
188
188
|
return true;
|
|
189
189
|
}
|
|
190
|
-
static inline bool classof(const
|
|
190
|
+
static inline bool classof(const CallGraph*g)
|
|
191
191
|
{
|
|
192
|
-
return g->getKind() ==
|
|
192
|
+
return g->getKind() == CallGraph::ThdCallGraph;
|
|
193
193
|
}
|
|
194
194
|
//@}
|
|
195
195
|
|
|
@@ -239,7 +239,7 @@ public:
|
|
|
239
239
|
assert(it != callinstToThreadJoinEdgesMap.end() && "call instruction does not have a valid callee");
|
|
240
240
|
return it->second.end();
|
|
241
241
|
}
|
|
242
|
-
inline void getJoinSites(const
|
|
242
|
+
inline void getJoinSites(const CallGraphNode* routine, InstSet& csSet)
|
|
243
243
|
{
|
|
244
244
|
for(CallInstToJoinEdgesMap::const_iterator it = callinstToThreadJoinEdgesMap.begin(), eit = callinstToThreadJoinEdgesMap.end(); it!=eit; ++it)
|
|
245
245
|
{
|
|
@@ -390,7 +390,7 @@ public:
|
|
|
390
390
|
}
|
|
391
391
|
|
|
392
392
|
/// has thread join edge
|
|
393
|
-
inline ThreadJoinEdge* hasThreadJoinEdge(const CallICFGNode* call,
|
|
393
|
+
inline ThreadJoinEdge* hasThreadJoinEdge(const CallICFGNode* call, CallGraphNode* joinFunNode, CallGraphNode* threadRoutineFunNode, CallSiteID csId) const
|
|
394
394
|
{
|
|
395
395
|
ThreadJoinEdge joinEdge(joinFunNode,threadRoutineFunNode, csId);
|
|
396
396
|
CallInstToJoinEdgesMap::const_iterator it = callinstToThreadJoinEdgesMap.find(call);
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
#include "SVFIR/SVFIR.h"
|
|
35
|
-
#include "Graphs/
|
|
35
|
+
#include "Graphs/CallGraph.h"
|
|
36
36
|
#include "Graphs/VFGNode.h"
|
|
37
37
|
#include "Graphs/VFGEdge.h"
|
|
38
38
|
|
|
@@ -100,7 +100,7 @@ protected:
|
|
|
100
100
|
FunToVFGNodesMapTy funToVFGNodesMap; ///< map a function to its VFGNodes;
|
|
101
101
|
|
|
102
102
|
GlobalVFGNodeSet globalVFGNodes; ///< set of global store VFG nodes
|
|
103
|
-
|
|
103
|
+
CallGraph* callgraph;
|
|
104
104
|
SVFIR* pag;
|
|
105
105
|
VFGK kind;
|
|
106
106
|
|
|
@@ -109,7 +109,7 @@ protected:
|
|
|
109
109
|
|
|
110
110
|
public:
|
|
111
111
|
/// Constructor
|
|
112
|
-
VFG(
|
|
112
|
+
VFG(CallGraph* callgraph, VFGK k = FULLSVFG);
|
|
113
113
|
|
|
114
114
|
/// Destructor
|
|
115
115
|
virtual ~VFG()
|
|
@@ -136,7 +136,7 @@ public:
|
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
/// Return PTACallGraph
|
|
139
|
-
inline
|
|
139
|
+
inline CallGraph* getCallGraph() const
|
|
140
140
|
{
|
|
141
141
|
return callgraph;
|
|
142
142
|
}
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
#define MEMORYREGION_H_
|
|
36
36
|
|
|
37
37
|
#include "Graphs/ICFG.h"
|
|
38
|
-
#include "Graphs/
|
|
38
|
+
#include "Graphs/CallGraph.h"
|
|
39
39
|
#include "Graphs/SCC.h"
|
|
40
40
|
#include "SVFIR/SVFIR.h"
|
|
41
41
|
#include "Util/WorkList.h"
|
|
@@ -175,7 +175,7 @@ public:
|
|
|
175
175
|
/// SVFIR edge list
|
|
176
176
|
typedef SVFIR::SVFStmtList SVFStmtList;
|
|
177
177
|
/// Call Graph SCC
|
|
178
|
-
typedef SCCDetection<
|
|
178
|
+
typedef SCCDetection<CallGraph*> SCC;
|
|
179
179
|
|
|
180
180
|
MRSet& getMRSet()
|
|
181
181
|
{
|
|
@@ -196,7 +196,7 @@ private:
|
|
|
196
196
|
|
|
197
197
|
BVDataPTAImpl* pta;
|
|
198
198
|
SCC* callGraphSCC;
|
|
199
|
-
|
|
199
|
+
CallGraph* callGraph;
|
|
200
200
|
bool ptrOnlyMSSA;
|
|
201
201
|
|
|
202
202
|
/// Map a function to all its memory regions
|
|
@@ -328,7 +328,7 @@ protected:
|
|
|
328
328
|
}
|
|
329
329
|
|
|
330
330
|
/// Mod-Ref analysis for callsite invoking this callGraphNode
|
|
331
|
-
virtual void modRefAnalysis(
|
|
331
|
+
virtual void modRefAnalysis(CallGraphNode* callGraphNode, WorkList& worklist);
|
|
332
332
|
|
|
333
333
|
/// Get Mod-Ref of a callee function
|
|
334
334
|
virtual bool handleCallsiteModRef(NodeBS& mod, NodeBS& ref, const CallICFGNode* cs, const SVFFunction* fun);
|
|
@@ -339,7 +339,7 @@ private:
|
|
|
339
339
|
void handleIntra(const CxtStmt& cts);
|
|
340
340
|
|
|
341
341
|
/// Handle call relations
|
|
342
|
-
void handleCallRelation(CxtLockProc& clp, const
|
|
342
|
+
void handleCallRelation(CxtLockProc& clp, const CallGraphEdge* cgEdge, const CallICFGNode* call);
|
|
343
343
|
|
|
344
344
|
/// Return true it a lock matches an unlock
|
|
345
345
|
bool isAliasedLocks(const CxtLock& cl1, const CxtLock& cl2)
|
|
@@ -123,7 +123,7 @@ public:
|
|
|
123
123
|
|
|
124
124
|
private:
|
|
125
125
|
|
|
126
|
-
inline const
|
|
126
|
+
inline const CallGraph::FunctionSet& getCallee(const CallICFGNode* inst, CallGraph::FunctionSet& callees)
|
|
127
127
|
{
|
|
128
128
|
tcg->getCallees(inst, callees);
|
|
129
129
|
return callees;
|
|
@@ -482,7 +482,7 @@ private:
|
|
|
482
482
|
{
|
|
483
483
|
return getTCG()->getThreadAPI()->getJoinedThread(call);
|
|
484
484
|
}
|
|
485
|
-
inline const
|
|
485
|
+
inline const CallGraph::FunctionSet& getCallee(const ICFGNode* inst, CallGraph::FunctionSet& callees)
|
|
486
486
|
{
|
|
487
487
|
getTCG()->getCallees(SVFUtil::cast<CallICFGNode>(inst), callees);
|
|
488
488
|
return callees;
|
|
@@ -160,14 +160,14 @@ public:
|
|
|
160
160
|
typedef Set<const SVFFunction*> FunSet;
|
|
161
161
|
typedef std::vector<const ICFGNode*> InstVec;
|
|
162
162
|
typedef Set<const ICFGNode*> InstSet;
|
|
163
|
-
typedef Set<const
|
|
163
|
+
typedef Set<const CallGraphNode*> PTACGNodeSet;
|
|
164
164
|
typedef Map<CxtThread,TCTNode*> CxtThreadToNodeMap;
|
|
165
165
|
typedef Map<CxtThread,CallStrCxt> CxtThreadToForkCxt;
|
|
166
166
|
typedef Map<CxtThread,const SVFFunction*> CxtThreadToFun;
|
|
167
167
|
typedef Map<const ICFGNode*, LoopBBs> InstToLoopMap;
|
|
168
168
|
typedef FIFOWorkList<CxtThreadProc> CxtThreadProcVec;
|
|
169
169
|
typedef Set<CxtThreadProc> CxtThreadProcSet;
|
|
170
|
-
typedef SCCDetection<
|
|
170
|
+
typedef SCCDetection<CallGraph*> ThreadCallGraphSCC;
|
|
171
171
|
|
|
172
172
|
/// Constructor
|
|
173
173
|
TCT(PointerAnalysis* p) :pta(p),TCTNodeNum(0),TCTEdgeNum(0),MaxCxtSize(0)
|
|
@@ -288,9 +288,9 @@ public:
|
|
|
288
288
|
//@}
|
|
289
289
|
|
|
290
290
|
/// Whether it is a candidate function for indirect call
|
|
291
|
-
inline bool isCandidateFun(const
|
|
291
|
+
inline bool isCandidateFun(const CallGraph::FunctionSet& callees) const
|
|
292
292
|
{
|
|
293
|
-
for(
|
|
293
|
+
for(CallGraph::FunctionSet::const_iterator cit = callees.begin(),
|
|
294
294
|
ecit = callees.end(); cit!=ecit; cit++)
|
|
295
295
|
{
|
|
296
296
|
if(candidateFuncSet.find((*cit))!=candidateFuncSet.end())
|
|
@@ -303,7 +303,7 @@ public:
|
|
|
303
303
|
return candidateFuncSet.find(fun)!=candidateFuncSet.end();
|
|
304
304
|
}
|
|
305
305
|
/// Whether two functions in the same callgraph scc
|
|
306
|
-
inline bool inSameCallGraphSCC(const
|
|
306
|
+
inline bool inSameCallGraphSCC(const CallGraphNode* src,const CallGraphNode* dst)
|
|
307
307
|
{
|
|
308
308
|
return (tcgSCC->repNode(src->getId()) == tcgSCC->repNode(dst->getId()));
|
|
309
309
|
}
|
|
@@ -506,7 +506,7 @@ private:
|
|
|
506
506
|
//@}
|
|
507
507
|
|
|
508
508
|
/// Handle call relations
|
|
509
|
-
void handleCallRelation(CxtThreadProc& ctp, const
|
|
509
|
+
void handleCallRelation(CxtThreadProc& ctp, const CallGraphEdge* cgEdge, const CallICFGNode* call);
|
|
510
510
|
|
|
511
511
|
/// Get or create a tct node based on CxtThread
|
|
512
512
|
//@{
|
|
@@ -103,7 +103,7 @@ public:
|
|
|
103
103
|
typedef SVFIR::CallSiteToFunPtrMap CallSiteToFunPtrMap;
|
|
104
104
|
typedef Set<const SVFFunction*> FunctionSet;
|
|
105
105
|
typedef OrderedMap<const CallICFGNode*, FunctionSet> CallEdgeMap;
|
|
106
|
-
typedef SCCDetection<
|
|
106
|
+
typedef SCCDetection<CallGraph*> CallGraphSCC;
|
|
107
107
|
typedef Set<const GlobalObjVar*> VTableSet;
|
|
108
108
|
typedef Set<const SVFFunction*> VFunSet;
|
|
109
109
|
//@}
|
|
@@ -148,7 +148,7 @@ protected:
|
|
|
148
148
|
/// Statistics
|
|
149
149
|
PTAStat* stat;
|
|
150
150
|
/// Call graph used for pointer analysis
|
|
151
|
-
|
|
151
|
+
CallGraph* callgraph;
|
|
152
152
|
/// SCC for PTACallGraph
|
|
153
153
|
CallGraphSCC* callGraphSCC;
|
|
154
154
|
/// Interprocedural control-flow graph
|
|
@@ -168,7 +168,7 @@ public:
|
|
|
168
168
|
return getCallGraph()->getNumOfResolvedIndCallEdge();
|
|
169
169
|
}
|
|
170
170
|
/// Return call graph
|
|
171
|
-
inline
|
|
171
|
+
inline CallGraph* getCallGraph() const
|
|
172
172
|
{
|
|
173
173
|
return callgraph;
|
|
174
174
|
}
|
|
@@ -398,8 +398,8 @@ public:
|
|
|
398
398
|
/// Return TRUE if this edge is inside a PTACallGraph SCC, i.e., src node and dst node are in the same SCC on the SVFG.
|
|
399
399
|
inline bool inSameCallGraphSCC(const SVFFunction* fun1,const SVFFunction* fun2)
|
|
400
400
|
{
|
|
401
|
-
const
|
|
402
|
-
const
|
|
401
|
+
const CallGraphNode* src = callgraph->getCallGraphNode(fun1);
|
|
402
|
+
const CallGraphNode* dst = callgraph->getCallGraphNode(fun2);
|
|
403
403
|
return (getCallGraphSCCRepNode(src->getId()) == getCallGraphSCCRepNode(dst->getId()));
|
|
404
404
|
}
|
|
405
405
|
inline bool isInRecursion(const SVFFunction* fun) const
|
|
@@ -89,7 +89,7 @@ protected:
|
|
|
89
89
|
|
|
90
90
|
/// Add actual parameter SVFGNode for 1st argument of a deallocation like external function
|
|
91
91
|
/// In order to path sensitive leak detection
|
|
92
|
-
virtual void AddExtActualParmSVFGNodes(
|
|
92
|
+
virtual void AddExtActualParmSVFGNodes(CallGraph* callgraph);
|
|
93
93
|
|
|
94
94
|
/// Collect memory pointed global pointers,
|
|
95
95
|
/// note that this collection is recursively performed, for example gp-->obj-->obj'
|
|
@@ -76,7 +76,7 @@ private:
|
|
|
76
76
|
protected:
|
|
77
77
|
SaberSVFGBuilder memSSA;
|
|
78
78
|
SVFG* svfg;
|
|
79
|
-
|
|
79
|
+
CallGraph* callgraph;
|
|
80
80
|
SVFBugReport report; /// Bug Reporter
|
|
81
81
|
|
|
82
82
|
public:
|
|
@@ -129,7 +129,7 @@ public:
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
/// Get Callgraph
|
|
132
|
-
inline
|
|
132
|
+
inline CallGraph* getCallgraph() const
|
|
133
133
|
{
|
|
134
134
|
return callgraph;
|
|
135
135
|
}
|
|
@@ -110,7 +110,7 @@ private:
|
|
|
110
110
|
InstToBlockNodeMapTy InstToBlockNodeMap; ///< map a basic block to its ICFGNode
|
|
111
111
|
FunToFunEntryNodeMapTy FunToFunEntryNodeMap; ///< map a function to its FunExitICFGNode
|
|
112
112
|
FunToFunExitNodeMapTy FunToFunExitNodeMap; ///< map a function to its FunEntryICFGNode
|
|
113
|
-
|
|
113
|
+
CallGraph* callgraph;
|
|
114
114
|
|
|
115
115
|
Map<const Function*, DominatorTree> FunToDominatorTree;
|
|
116
116
|
|
|
@@ -99,7 +99,7 @@ private:
|
|
|
99
99
|
ICFG* icfg; // ICFG
|
|
100
100
|
CommonCHGraph* chgraph; // class hierarchy graph
|
|
101
101
|
CallSiteSet callSiteSet; /// all the callsites of a program
|
|
102
|
-
|
|
102
|
+
CallGraph* callGraph; /// call graph
|
|
103
103
|
|
|
104
104
|
static std::unique_ptr<SVFIR> pag; ///< Singleton pattern here to enable instance of SVFIR can only be created once.
|
|
105
105
|
|
|
@@ -186,11 +186,11 @@ public:
|
|
|
186
186
|
}
|
|
187
187
|
|
|
188
188
|
/// Set/Get CG
|
|
189
|
-
inline void setCallGraph(
|
|
189
|
+
inline void setCallGraph(CallGraph* c)
|
|
190
190
|
{
|
|
191
191
|
callGraph = c;
|
|
192
192
|
}
|
|
193
|
-
inline
|
|
193
|
+
inline CallGraph* getCallGraph()
|
|
194
194
|
{
|
|
195
195
|
assert(callGraph && "empty CallGraph! Build SVF IR first!");
|
|
196
196
|
return callGraph;
|
|
@@ -47,10 +47,10 @@ public:
|
|
|
47
47
|
CallGraphBuilder()=default;
|
|
48
48
|
|
|
49
49
|
/// Buidl SVFIR callgraoh
|
|
50
|
-
|
|
50
|
+
CallGraph* buildSVFIRCallGraph(SVFModule* svfModule);
|
|
51
51
|
|
|
52
52
|
/// Buidl PTA callgraoh
|
|
53
|
-
|
|
53
|
+
CallGraph* buildPTACallGraph();
|
|
54
54
|
|
|
55
55
|
/// Build thread-aware callgraph
|
|
56
56
|
ThreadCallGraph* buildThreadCallGraph();
|
|
Binary file
|
|
Binary file
|