svf-lib 1.0.730 → 1.0.734

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.
Files changed (98) hide show
  1. package/SVF-linux/Release-build/lib/libSvf.a +0 -0
  2. package/SVF-linux/include/DDA/ContextDDA.h +1 -1
  3. package/SVF-linux/include/DDA/DDAClient.h +8 -8
  4. package/SVF-linux/include/DDA/DDAVFSolver.h +6 -6
  5. package/SVF-linux/include/DDA/FlowDDA.h +1 -1
  6. package/SVF-linux/include/Graphs/ConsG.h +6 -6
  7. package/SVF-linux/include/Graphs/ConsGEdge.h +2 -2
  8. package/SVF-linux/include/Graphs/ConsGNode.h +1 -1
  9. package/SVF-linux/include/Graphs/ExternalPAG.h +14 -14
  10. package/SVF-linux/include/Graphs/ICFGNode.h +14 -14
  11. package/SVF-linux/include/Graphs/IRGraph.h +245 -0
  12. package/SVF-linux/include/Graphs/OfflineConsG.h +1 -1
  13. package/SVF-linux/include/Graphs/PAG.h +4 -4
  14. package/SVF-linux/include/Graphs/PAGNode.h +3 -3
  15. package/SVF-linux/include/Graphs/SVFG.h +1 -1
  16. package/SVF-linux/include/Graphs/SVFGOPT.h +3 -3
  17. package/SVF-linux/include/Graphs/VFG.h +19 -19
  18. package/SVF-linux/include/Graphs/VFGNode.h +2 -3
  19. package/SVF-linux/include/MSSA/MemRegion.h +11 -11
  20. package/SVF-linux/include/MSSA/MemSSA.h +4 -4
  21. package/SVF-linux/include/MTA/FSMPTA.h +1 -1
  22. package/SVF-linux/include/MemoryModel/PAGBuilderFromFile.h +8 -8
  23. package/SVF-linux/include/MemoryModel/PTAStat.h +31 -31
  24. package/SVF-linux/include/MemoryModel/PointerAnalysis.h +9 -9
  25. package/SVF-linux/include/MemoryModel/PointerAnalysisImpl.h +3 -3
  26. package/SVF-linux/include/MemoryModel/SVFIR.h +591 -233
  27. package/SVF-linux/include/MemoryModel/SVFStatements.h +738 -0
  28. package/SVF-linux/include/MemoryModel/SVFSymbols.h +648 -0
  29. package/SVF-linux/include/MemoryModel/SVFVariables.h +842 -0
  30. package/SVF-linux/include/MemoryModel/SymbolTableInfo.h +343 -40
  31. package/SVF-linux/include/SABER/SaberSVFGBuilder.h +0 -2
  32. package/SVF-linux/include/SABER/SrcSnkDDA.h +3 -3
  33. package/SVF-linux/include/SVF-FE/Graph2Json.h +1 -3
  34. package/SVF-linux/include/SVF-FE/SVFIRBuilder.h +392 -0
  35. package/SVF-linux/include/SVF-FE/SymbolTableBuilder.h +0 -1
  36. package/SVF-linux/include/Util/CFLSolver.h +1 -1
  37. package/SVF-linux/include/Util/ExtAPI.h +1 -1
  38. package/SVF-linux/include/Util/IRAnnotator.h +6 -6
  39. package/SVF-linux/include/Util/Options.h +1 -1
  40. package/SVF-linux/include/Util/TypeBasedHeapCloning.h +11 -11
  41. package/SVF-linux/include/WPA/Andersen.h +11 -11
  42. package/SVF-linux/include/WPA/AndersenSFR.h +4 -4
  43. package/SVF-linux/include/WPA/FlowSensitive.h +2 -2
  44. package/SVF-linux/include/WPA/FlowSensitiveTBHC.h +1 -1
  45. package/SVF-linux/include/WPA/Steensgaard.h +2 -2
  46. package/SVF-linux/include/WPA/TypeAnalysis.h +1 -1
  47. package/SVF-linux/include/WPA/VersionedFlowSensitive.h +2 -2
  48. package/SVF-linux/include/WPA/WPAStat.h +1 -2
  49. package/SVF-osx/Release-build/lib/CUDD/libCudd.a +0 -0
  50. package/SVF-osx/Release-build/lib/libSvf.a +0 -0
  51. package/SVF-osx/include/DDA/ContextDDA.h +1 -1
  52. package/SVF-osx/include/DDA/DDAClient.h +8 -8
  53. package/SVF-osx/include/DDA/DDAVFSolver.h +6 -6
  54. package/SVF-osx/include/DDA/FlowDDA.h +1 -1
  55. package/SVF-osx/include/Graphs/ConsG.h +6 -6
  56. package/SVF-osx/include/Graphs/ConsGEdge.h +2 -2
  57. package/SVF-osx/include/Graphs/ConsGNode.h +1 -1
  58. package/SVF-osx/include/Graphs/ExternalPAG.h +14 -14
  59. package/SVF-osx/include/Graphs/ICFGNode.h +14 -14
  60. package/SVF-osx/include/Graphs/IRGraph.h +245 -0
  61. package/SVF-osx/include/Graphs/OfflineConsG.h +1 -1
  62. package/SVF-osx/include/Graphs/PAG.h +4 -4
  63. package/SVF-osx/include/Graphs/PAGNode.h +3 -3
  64. package/SVF-osx/include/Graphs/SVFG.h +1 -1
  65. package/SVF-osx/include/Graphs/SVFGOPT.h +3 -3
  66. package/SVF-osx/include/Graphs/VFG.h +19 -19
  67. package/SVF-osx/include/Graphs/VFGNode.h +2 -3
  68. package/SVF-osx/include/MSSA/MemRegion.h +11 -11
  69. package/SVF-osx/include/MSSA/MemSSA.h +4 -4
  70. package/SVF-osx/include/MTA/FSMPTA.h +1 -1
  71. package/SVF-osx/include/MemoryModel/PAGBuilderFromFile.h +8 -8
  72. package/SVF-osx/include/MemoryModel/PTAStat.h +31 -31
  73. package/SVF-osx/include/MemoryModel/PointerAnalysis.h +9 -9
  74. package/SVF-osx/include/MemoryModel/PointerAnalysisImpl.h +3 -3
  75. package/SVF-osx/include/MemoryModel/SVFIR.h +591 -233
  76. package/SVF-osx/include/MemoryModel/SVFStatements.h +738 -0
  77. package/SVF-osx/include/MemoryModel/SVFSymbols.h +648 -0
  78. package/SVF-osx/include/MemoryModel/SVFVariables.h +842 -0
  79. package/SVF-osx/include/MemoryModel/SymbolTableInfo.h +343 -40
  80. package/SVF-osx/include/SABER/SaberSVFGBuilder.h +0 -2
  81. package/SVF-osx/include/SABER/SrcSnkDDA.h +3 -3
  82. package/SVF-osx/include/SVF-FE/Graph2Json.h +1 -3
  83. package/SVF-osx/include/SVF-FE/SVFIRBuilder.h +392 -0
  84. package/SVF-osx/include/SVF-FE/SymbolTableBuilder.h +0 -1
  85. package/SVF-osx/include/Util/CFLSolver.h +1 -1
  86. package/SVF-osx/include/Util/ExtAPI.h +1 -1
  87. package/SVF-osx/include/Util/IRAnnotator.h +6 -6
  88. package/SVF-osx/include/Util/Options.h +1 -1
  89. package/SVF-osx/include/Util/TypeBasedHeapCloning.h +11 -11
  90. package/SVF-osx/include/WPA/Andersen.h +11 -11
  91. package/SVF-osx/include/WPA/AndersenSFR.h +4 -4
  92. package/SVF-osx/include/WPA/FlowSensitive.h +2 -2
  93. package/SVF-osx/include/WPA/FlowSensitiveTBHC.h +1 -1
  94. package/SVF-osx/include/WPA/Steensgaard.h +2 -2
  95. package/SVF-osx/include/WPA/TypeAnalysis.h +1 -1
  96. package/SVF-osx/include/WPA/VersionedFlowSensitive.h +2 -2
  97. package/SVF-osx/include/WPA/WPAStat.h +1 -2
  98. package/package.json +1 -1
@@ -28,7 +28,7 @@ class ContextDDA : public CondPTAImpl<ContextCond>, public DDAVFSolver<CxtVar,Cx
28
28
 
29
29
  public:
30
30
  /// Constructor
31
- ContextDDA(PAG* _pag, DDAClient* client);
31
+ ContextDDA(SVFIR* _pag, DDAClient* client);
32
32
 
33
33
  /// Destructor
34
34
  virtual ~ContextDDA();
@@ -11,7 +11,7 @@
11
11
  #ifndef DDACLIENT_H_
12
12
  #define DDACLIENT_H_
13
13
 
14
- #include "Graphs/PAG.h"
14
+ #include "MemoryModel/SVFIR.h"
15
15
  #include "MemoryModel/PointerAnalysisImpl.h"
16
16
  #include "Graphs/SVFG.h"
17
17
  #include "Util/BasicTypes.h"
@@ -32,7 +32,7 @@ public:
32
32
  virtual inline void initialise(SVFModule*) {}
33
33
 
34
34
  /// Collect candidate pointers for query.
35
- virtual inline OrderedNodeSet& collectCandidateQueries(PAG* p)
35
+ virtual inline OrderedNodeSet& collectCandidateQueries(SVFIR* p)
36
36
  {
37
37
  setPAG(p);
38
38
  if (solveAll)
@@ -52,8 +52,8 @@ public:
52
52
 
53
53
  /// Call back used by DDAVFSolver.
54
54
  virtual inline void handleStatement(const SVFGNode*, NodeID) {}
55
- /// Set PAG graph.
56
- inline void setPAG(PAG* g)
55
+ /// Set SVFIR graph.
56
+ inline void setPAG(SVFIR* g)
57
57
  {
58
58
  pag = g;
59
59
  }
@@ -81,11 +81,11 @@ public:
81
81
  protected:
82
82
  void addCandidate(NodeID id)
83
83
  {
84
- if (pag->isValidTopLevelPtr(pag->getPAGNode(id)))
84
+ if (pag->isValidTopLevelPtr(pag->getGNode(id)))
85
85
  candidateQueries.insert(id);
86
86
  }
87
87
 
88
- PAG* pag; ///< PAG graph used by current DDA analysis
88
+ SVFIR* pag; ///< SVFIR graph used by current DDA analysis
89
89
  SVFModule* module; ///< LLVM module
90
90
  NodeID curPtr; ///< current pointer being queried
91
91
  OrderedNodeSet candidateQueries; ///< store all candidate pointers to be queried
@@ -109,7 +109,7 @@ public:
109
109
  ~FunptrDDAClient() {}
110
110
 
111
111
  /// Only collect function pointers as query candidates.
112
- virtual OrderedNodeSet& collectCandidateQueries(PAG* p);
112
+ virtual OrderedNodeSet& collectCandidateQueries(SVFIR* p);
113
113
  virtual void performStat(PointerAnalysis* pta);
114
114
  };
115
115
 
@@ -128,7 +128,7 @@ public:
128
128
  ~AliasDDAClient() {}
129
129
 
130
130
  /// Only collect function pointers as query candidates.
131
- virtual OrderedNodeSet& collectCandidateQueries(PAG* pag);
131
+ virtual OrderedNodeSet& collectCandidateQueries(SVFIR* pag);
132
132
 
133
133
  virtual void performStat(PointerAnalysis* pta);
134
134
 
@@ -29,7 +29,7 @@ public:
29
29
  typedef SCCDetection<SVFG*> SVFGSCC;
30
30
  typedef SCCDetection<PTACallGraph*> CallGraphSCC;
31
31
  typedef PTACallGraphEdge::CallInstSet CallInstSet;
32
- typedef PAG::CallSiteSet CallSiteSet;
32
+ typedef SVFIR::CallSiteSet CallSiteSet;
33
33
  typedef OrderedSet<DPIm> DPTItemSet;
34
34
  typedef OrderedMap<DPIm, CPtSet> DPImToCPtSetMap;
35
35
  typedef OrderedMap<DPIm,CVar> DPMToCVarMap;
@@ -287,7 +287,7 @@ protected:
287
287
  }
288
288
 
289
289
  /// Build SVFG
290
- virtual inline void buildSVFG(PAG* pag)
290
+ virtual inline void buildSVFG(SVFIR* pag)
291
291
  {
292
292
  _ander = AndersenWaveDiff::createAndersenWaveDiff(pag);
293
293
  _svfg = svfgBuilder.buildPTROnlySVFGWithoutOPT(_ander);
@@ -448,7 +448,7 @@ protected:
448
448
  assert(obj && "object not found!!");
449
449
  if(obj->isStack())
450
450
  {
451
- if(const AllocaInst* local = SVFUtil::dyn_cast<AllocaInst>(obj->getRefVal()))
451
+ if(const AllocaInst* local = SVFUtil::dyn_cast<AllocaInst>(obj->getValue()))
452
452
  {
453
453
  const SVFFunction* fun = LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(local->getFunction());
454
454
  return _callGraphSCC->isInCycle(_callGraph->getCallGraphNode(fun)->getId());
@@ -473,7 +473,7 @@ protected:
473
473
  {
474
474
  NodeID funPtr = _pag->getFunPtr(cbn);
475
475
  DPIm funPtrDpm(dpm);
476
- funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->getPAGNode(funPtr)),funPtr);
476
+ funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->getGNode(funPtr)),funPtr);
477
477
  findPT(funPtrDpm);
478
478
  }
479
479
  }
@@ -486,7 +486,7 @@ protected:
486
486
  {
487
487
  NodeID funPtr = _pag->getFunPtr(*it);
488
488
  DPIm funPtrDpm(dpm);
489
- funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->getPAGNode(funPtr)),funPtr);
489
+ funPtrDpm.setLocVar(getSVFG()->getDefSVFGNode(_pag->getGNode(funPtr)),funPtr);
490
490
  findPT(funPtrDpm);
491
491
  }
492
492
  }
@@ -750,7 +750,7 @@ protected:
750
750
  }
751
751
 
752
752
  bool outOfBudgetQuery; ///< Whether the current query is out of step limits
753
- PAG* _pag; ///< PAG
753
+ SVFIR* _pag; ///< SVFIR
754
754
  SVFG* _svfg; ///< SVFG
755
755
  AndersenWaveDiff* _ander; ///< Andersen's analysis
756
756
  NodeBS candidateQueries; ///< candidate pointers;
@@ -30,7 +30,7 @@ public:
30
30
  typedef BVDataPTAImpl::CallEdgeMap CallEdgeMap;
31
31
  typedef BVDataPTAImpl::FunctionSet FunctionSet;
32
32
  /// Constructor
33
- FlowDDA(PAG* _pag, DDAClient* client): BVDataPTAImpl(_pag, PointerAnalysis::FlowS_DDA),
33
+ FlowDDA(SVFIR* _pag, DDAClient* client): BVDataPTAImpl(_pag, PointerAnalysis::FlowS_DDA),
34
34
  DDAVFSolver<NodeID,PointsTo,LocDPItem>(),
35
35
  _client(client)
36
36
  {
@@ -52,7 +52,7 @@ public:
52
52
  typedef FIFOWorkList<NodeID> WorkList;
53
53
 
54
54
  protected:
55
- PAG*pag;
55
+ SVFIR*pag;
56
56
  NodeToRepMap nodeToRepMap;
57
57
  NodeToSubsMap nodeToSubsMap;
58
58
  WorkList nodesToBeCollapsed;
@@ -92,7 +92,7 @@ protected:
92
92
 
93
93
  public:
94
94
  /// Constructor
95
- ConstraintGraph(PAG* p): pag(p), edgeIndex(0)
95
+ ConstraintGraph(SVFIR* p): pag(p), edgeIndex(0)
96
96
  {
97
97
  buildCG();
98
98
  }
@@ -172,7 +172,7 @@ public:
172
172
  }
173
173
  }
174
174
 
175
- ///Add a PAG edge into Edge map
175
+ ///Add a SVFIR edge into Edge map
176
176
  //@{
177
177
  /// Add Address edge
178
178
  AddrCGEdge* addAddrCGEdge(NodeID src, NodeID dst);
@@ -187,7 +187,7 @@ public:
187
187
  StoreCGEdge* addStoreCGEdge(NodeID src, NodeID dst);
188
188
  //@}
189
189
 
190
- ///Get PAG edge
190
+ ///Get SVFIR edge
191
191
  //@{
192
192
  /// Get Address edges
193
193
  inline ConstraintEdge::ConstraintEdgeSetTy& getAddrCGEdges()
@@ -296,9 +296,9 @@ public:
296
296
  return false;
297
297
  }
298
298
 
299
- /// Wrappers for invoking PAG methods
299
+ /// Wrappers for invoking SVFIR methods
300
300
  //@{
301
- inline const PAG::CallSiteToFunPtrMap& getIndirectCallsites() const
301
+ inline const SVFIR::CallSiteToFunPtrMap& getIndirectCallsites() const
302
302
  {
303
303
  return pag->getIndirectCallsites();
304
304
  }
@@ -30,7 +30,7 @@
30
30
  #ifndef CONSGEDGE_H_
31
31
  #define CONSGEDGE_H_
32
32
 
33
- #include "Graphs/PAG.h"
33
+ #include "MemoryModel/SVFIR.h"
34
34
  #include "Util/WorkList.h"
35
35
 
36
36
  #include <map>
@@ -42,7 +42,7 @@ namespace SVF
42
42
  class ConstraintNode;
43
43
  /*!
44
44
  * Self-defined edge for constraint resolution
45
- * including add/remove/re-target, but all the operations do not affect original PAG Edges
45
+ * including add/remove/re-target, but all the operations do not affect original SVFIR Edges
46
46
  */
47
47
  typedef GenericEdge<ConstraintNode> GenericConsEdgeTy;
48
48
  class ConstraintEdge : public GenericConsEdgeTy
@@ -101,7 +101,7 @@ public:
101
101
  }
102
102
  //@}
103
103
 
104
- /// Direct and Indirect PAG edges
104
+ /// Direct and Indirect SVFIR edges
105
105
  inline bool isdirectEdge(ConstraintEdge::ConstraintEdgeK kind)
106
106
  {
107
107
  return (kind == ConstraintEdge::Copy || kind == ConstraintEdge::NormalGep || kind == ConstraintEdge::VariantGep );
@@ -10,15 +10,15 @@
10
10
  #ifndef EXTERNALPAG_H_
11
11
  #define EXTERNALPAG_H_
12
12
 
13
- #include "Graphs/PAGNode.h"
13
+ #include "MemoryModel/SVFVariables.h"
14
14
 
15
15
  extern llvm::cl::list<std::string> DumpPAGFunctions;
16
16
 
17
17
  namespace SVF
18
18
  {
19
19
 
20
- /// Represents the PAG of a function loaded externally (i.e. from file).
21
- /// It's purpose is to be attached to the main PAG (almost) seamlessly.
20
+ /// Represents the SVFIR of a function loaded externally (i.e. from file).
21
+ /// It's purpose is to be attached to the main SVFIR (almost) seamlessly.
22
22
  class ExternalPAG
23
23
  {
24
24
  private:
@@ -28,17 +28,17 @@ private:
28
28
  functionToExternalPAGEntries;
29
29
  static Map<const SVFFunction*, PAGNode *> functionToExternalPAGReturns;
30
30
 
31
- /// Name of the function this external PAG represents.
31
+ /// Name of the function this external SVFIR represents.
32
32
  std::string functionName;
33
33
 
34
- /// Value nodes in this external PAG, represented by NodeIDs
35
- /// because we will rebuild these nodes in the main PAG.
34
+ /// Value nodes in this external SVFIR, represented by NodeIDs
35
+ /// because we will rebuild these nodes in the main SVFIR.
36
36
  NodeSet valueNodes;
37
- /// Object nodes in this external PAG, represented by NodeIDs
38
- /// because we will rebuild these nodes in the main PAG.
37
+ /// Object nodes in this external SVFIR, represented by NodeIDs
38
+ /// because we will rebuild these nodes in the main SVFIR.
39
39
  NodeSet objectNodes;
40
- /// Edges in this external PAG, represented by the parts of an Edge because
41
- /// we will rebuild these edges in the main PAG.
40
+ /// Edges in this external SVFIR, represented by the parts of an Edge because
41
+ /// we will rebuild these edges in the main SVFIR.
42
42
  OrderedSet<std::tuple<NodeID, NodeID, std::string, int>> edges;
43
43
 
44
44
  // Special nodes.
@@ -82,15 +82,15 @@ public:
82
82
  ~ExternalPAG() {}
83
83
 
84
84
  /// Parses command line arguments and attaches external PAGs to main
85
- /// PAG.
85
+ /// SVFIR.
86
86
  static void initialise(SVFModule* svfModule);
87
87
 
88
- /// Connects callsite if a external PAG implementing the relevant function
88
+ /// Connects callsite if a external SVFIR implementing the relevant function
89
89
  /// has been added.
90
90
  /// Returns true on success, false otherwise.
91
91
  static bool connectCallsiteToExternalPAG(CallSite *cs);
92
92
 
93
- /// Whether an external PAG implementing function exists.
93
+ /// Whether an external SVFIR implementing function exists.
94
94
  static bool hasExternalPAG(const SVFFunction* function);
95
95
 
96
96
  /// Dump individual PAGs of specified functions. Currently to outs().
@@ -136,7 +136,7 @@ public:
136
136
  }
137
137
 
138
138
  /// Adds (creates new equivalents) all the nodes and edges of this extpag to
139
- /// the main PAG. function is used as a key for future lookups.
139
+ /// the main SVFIR. function is used as a key for future lookups.
140
140
  /// Returns true on success, false otherwise (incl. if it already exists).
141
141
  bool addExternalPAG(const SVFFunction* function);
142
142
 
@@ -41,8 +41,8 @@ class ICFGNode;
41
41
  class RetBlockNode;
42
42
  class CallPE;
43
43
  class RetPE;
44
- class PAGEdge;
45
- class PAGNode;
44
+ class SVFStmt;
45
+ class SVFVar;
46
46
  class VFGNode;
47
47
 
48
48
  /*!
@@ -67,7 +67,7 @@ public:
67
67
  typedef Set<const CallPE *> CallPESet;
68
68
  typedef Set<const RetPE *> RetPESet;
69
69
  typedef std::list<const VFGNode*> VFGNodeList;
70
- typedef std::list<const PAGEdge*> PAGEdgeList;
70
+ typedef std::list<const SVFStmt*> PAGEdgeList;
71
71
 
72
72
  public:
73
73
  /// Constructor
@@ -113,7 +113,7 @@ public:
113
113
 
114
114
  /// Set/Get methods of VFGNodes
115
115
  ///@{
116
- inline void addPAGEdge(const PAGEdge *edge)
116
+ inline void addPAGEdge(const SVFStmt *edge)
117
117
  {
118
118
  pagEdges.push_back(edge);
119
119
  }
@@ -252,7 +252,7 @@ class FunEntryBlockNode : public InterBlockNode
252
252
  {
253
253
 
254
254
  public:
255
- typedef std::vector<const PAGNode *> FormalParmNodeVec;
255
+ typedef std::vector<const SVFVar *> FormalParmNodeVec;
256
256
  private:
257
257
  FormalParmNodeVec FPNodes;
258
258
  public:
@@ -271,7 +271,7 @@ public:
271
271
  }
272
272
 
273
273
  /// Add formal parameters
274
- inline void addFormalParms(const PAGNode *fp)
274
+ inline void addFormalParms(const SVFVar *fp)
275
275
  {
276
276
  FPNodes.push_back(fp);
277
277
  }
@@ -310,7 +310,7 @@ class FunExitBlockNode : public InterBlockNode
310
310
 
311
311
  private:
312
312
  const SVFFunction* fun;
313
- const PAGNode *formalRet;
313
+ const SVFVar *formalRet;
314
314
  public:
315
315
  FunExitBlockNode(NodeID id, const SVFFunction* f);
316
316
 
@@ -321,13 +321,13 @@ public:
321
321
  }
322
322
 
323
323
  /// Return actual return parameter
324
- inline const PAGNode *getFormalRet() const
324
+ inline const SVFVar *getFormalRet() const
325
325
  {
326
326
  return formalRet;
327
327
  }
328
328
 
329
329
  /// Add actual return parameter
330
- inline void addFormalRet(const PAGNode *fr)
330
+ inline void addFormalRet(const SVFVar *fr)
331
331
  {
332
332
  formalRet = fr;
333
333
  }
@@ -365,7 +365,7 @@ class CallBlockNode : public InterBlockNode
365
365
  {
366
366
 
367
367
  public:
368
- typedef std::vector<const PAGNode *> ActualParmVFGNodeVec;
368
+ typedef std::vector<const SVFVar *> ActualParmVFGNodeVec;
369
369
  private:
370
370
  const Instruction* cs;
371
371
  const RetBlockNode* ret;
@@ -421,7 +421,7 @@ public:
421
421
  }
422
422
 
423
423
  /// Add actual parameters
424
- inline void addActualParms(const PAGNode *ap)
424
+ inline void addActualParms(const SVFVar *ap)
425
425
  {
426
426
  APNodes.push_back(ap);
427
427
  }
@@ -461,7 +461,7 @@ class RetBlockNode : public InterBlockNode
461
461
 
462
462
  private:
463
463
  const Instruction* cs;
464
- const PAGNode *actualRet;
464
+ const SVFVar *actualRet;
465
465
  const CallBlockNode* callBlockNode;
466
466
  public:
467
467
  RetBlockNode(NodeID id, const Instruction* c, CallBlockNode* cb) :
@@ -482,13 +482,13 @@ public:
482
482
  return callBlockNode;
483
483
  }
484
484
  /// Return actual return parameter
485
- inline const PAGNode *getActualRet() const
485
+ inline const SVFVar *getActualRet() const
486
486
  {
487
487
  return actualRet;
488
488
  }
489
489
 
490
490
  /// Add actual return parameter
491
- inline void addActualRet(const PAGNode *ar)
491
+ inline void addActualRet(const SVFVar *ar)
492
492
  {
493
493
  actualRet = ar;
494
494
  }
@@ -0,0 +1,245 @@
1
+ //===- SVFIR.h -- SVF IR Graph or PAG (Program Assignment Graph)--------------------------------------//
2
+ //
3
+ // SVF: Static Value-Flow Analysis
4
+ //
5
+ // Copyright (C) <2013-2017> <Yulei Sui>
6
+ //
7
+
8
+ // This program is free software: you can redistribute it and/or modify
9
+ // it under the terms of the GNU General Public License as published by
10
+ // the Free Software Foundation, either version 3 of the License, or
11
+ // (at your option) any later version.
12
+
13
+ // This program is distributed in the hope that it will be useful,
14
+ // but WITHOUT ANY WARRANTY; without even the implied warranty of
15
+ // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
+ // GNU General Public License for more details.
17
+
18
+ // You should have received a copy of the GNU General Public License
19
+ // along with this program. If not, see <http://www.gnu.org/licenses/>.
20
+ //
21
+ //===----------------------------------------------------------------------===//
22
+
23
+ /*
24
+ * IRGraph.h
25
+ *
26
+ * Created on: Nov 1, 2013
27
+ * Author: Yulei Sui
28
+ */
29
+
30
+
31
+ #ifndef IRGRAPH_H_
32
+ #define IRGRAPH_H_
33
+
34
+ #include "MemoryModel/SVFStatements.h"
35
+ #include "MemoryModel/SVFVariables.h"
36
+ #include "Util/NodeIDAllocator.h"
37
+ #include "Util/SVFUtil.h"
38
+ #include "Graphs/ICFG.h"
39
+
40
+ namespace SVF
41
+ {
42
+ typedef SVFVar PAGNode;
43
+ typedef SVFStmt PAGEdge;
44
+
45
+ /*
46
+ * Graph representation of SVF IR. It can be seen as a program assignment graph (PAG)
47
+ */
48
+ class IRGraph : public GenericGraph<SVFVar,SVFStmt>
49
+ {
50
+ public:
51
+ typedef Set<const SVFStmt*> PAGEdgeSet;
52
+ typedef Map<const Value*,PAGEdgeSet> ValueToEdgeMap;
53
+
54
+ private:
55
+ bool fromFile; ///< Whether the SVFIR is built according to user specified data from a txt file
56
+ NodeID nodeNumAfterPAGBuild; // initial node number after building SVFIR, excluding later added nodes, e.g., gepobj nodes
57
+ u32_t totalPTAPAGEdge;
58
+ SVFStmt::PAGKindToEdgeSetMapTy PAGEdgeKindToSetMap; // < SVFIR edge map containing all PAGEdges
59
+ SVFStmt::PAGKindToEdgeSetMapTy PTAPAGEdgeKindToSetMap; // < SVFIR edge map containing only pointer-related edges, i.e, both RHS and RHS are of pointer type
60
+ ValueToEdgeMap valueToEdgeMap; ///< Map llvm::Values to all corresponding PAGEdges
61
+ SymbolTableInfo* symInfo;
62
+
63
+ protected:
64
+ /// Add a node into the graph
65
+ inline NodeID addNode(SVFVar* node, NodeID i)
66
+ {
67
+ addGNode(i,node);
68
+ return i;
69
+ }
70
+ /// Add an edge into the graph
71
+ bool addEdge(SVFVar* src, SVFVar* dst, SVFStmt* edge);
72
+
73
+ //// Return true if this edge exits
74
+ SVFStmt* hasNonlabeledEdge(SVFVar* src, SVFVar* dst, SVFStmt::PEDGEK kind);
75
+ /// Return true if this labeled edge exits, including store, call and load
76
+ /// two store edge can have same dst and src but located in different basic blocks, thus flags are needed to distinguish them
77
+ SVFStmt* hasLabeledEdge(SVFVar* src, SVFVar* dst, SVFStmt::PEDGEK kind, const ICFGNode* cs);
78
+ /// Map a value to a set of edges
79
+ inline void mapValueToEdge(const Value *V, SVFStmt *edge)
80
+ {
81
+ auto inserted = valueToEdgeMap.emplace(V, PAGEdgeSet{edge});
82
+ if (!inserted.second) {
83
+ inserted.first->second.emplace(edge);
84
+ }
85
+ }
86
+ /// get MemObj according to LLVM value
87
+ inline const MemObj* getMemObj(const Value* val) const{
88
+ return symInfo->getObj(symInfo->getObjSym(val));
89
+ }
90
+
91
+ public:
92
+ IRGraph(bool buildFromFile): fromFile(buildFromFile), nodeNumAfterPAGBuild(0), totalPTAPAGEdge(0){
93
+ symInfo = SymbolTableInfo::SymbolInfo();
94
+ // insert dummy value if a correct value cannot be found
95
+ valueToEdgeMap[nullptr] = PAGEdgeSet();
96
+ }
97
+
98
+ virtual ~IRGraph();
99
+
100
+ /// Whether this SVFIR built from a txt file
101
+ inline bool isBuiltFromFile()
102
+ {
103
+ return fromFile;
104
+ }
105
+ /// Get edges set according to its kind
106
+ inline SVFStmt::PAGEdgeSetTy& getEdgeSet(SVFStmt::PEDGEK kind)
107
+ {
108
+ return PAGEdgeKindToSetMap[kind];
109
+ }
110
+ /// Get PTA edges set according to its kind
111
+ inline SVFStmt::PAGEdgeSetTy& getPTAEdgeSet(SVFStmt::PEDGEK kind)
112
+ {
113
+ return PTAPAGEdgeKindToSetMap[kind];
114
+ }
115
+
116
+ /// Get all SVFIR Edges that corresponds to an LLVM value
117
+ inline const PAGEdgeSet& getValueEdges(const Value *V)
118
+ {
119
+ auto it = valueToEdgeMap.find(V);
120
+ if (it == valueToEdgeMap.end()) {
121
+ //special empty set
122
+ return valueToEdgeMap.at(nullptr);
123
+ }
124
+ return it->second;
125
+ }
126
+
127
+ /// Get SVFIR Node according to LLVM value
128
+ ///getNode - Return the node corresponding to the specified pointer.
129
+ inline NodeID getValueNode(const Value *V)
130
+ {
131
+ return symInfo->getValSym(V);
132
+ }
133
+ inline bool hasValueNode(const Value* V)
134
+ {
135
+ return symInfo->hasValSym(V);
136
+ }
137
+ /// getObject - Return the obj node id refer to the memory object for the
138
+ /// specified global, heap or alloca instruction according to llvm value.
139
+ inline NodeID getObjectNode(const Value *V)
140
+ {
141
+ return symInfo->getObjSym(V);
142
+ }
143
+ /// GetReturnNode - Return the unique node representing the return value of a function
144
+ inline NodeID getReturnNode(const SVFFunction* func) const
145
+ {
146
+ return symInfo->getRetSym(func->getLLVMFun());
147
+ }
148
+ /// getVarargNode - Return the unique node representing the variadic argument of a variadic function.
149
+ inline NodeID getVarargNode(const SVFFunction* func) const
150
+ {
151
+ return symInfo->getVarargSym(func->getLLVMFun());
152
+ }
153
+ inline NodeID getBlackHoleNode() const
154
+ {
155
+ return symInfo->blackholeSymID();
156
+ }
157
+ inline NodeID getConstantNode() const
158
+ {
159
+ return symInfo->constantSymID();
160
+ }
161
+ inline NodeID getBlkPtr() const
162
+ {
163
+ return symInfo->blkPtrSymID();
164
+ }
165
+ inline NodeID getNullPtr() const
166
+ {
167
+ return symInfo->nullPtrSymID();
168
+ }
169
+ inline const MemObj* getBlackHoleObj() const
170
+ {
171
+ return symInfo->getBlkObj();
172
+ }
173
+ inline const MemObj* getConstantObj() const
174
+ {
175
+ return symInfo->getConstantObj();
176
+ }
177
+
178
+ inline Size_t getValueNodeNum() const
179
+ {
180
+ return symInfo->valSyms().size();
181
+ }
182
+ inline Size_t getObjectNodeNum() const
183
+ {
184
+ return symInfo->idToObjMap().size();
185
+ }
186
+ inline u32_t getNodeNumAfterPAGBuild() const
187
+ {
188
+ return nodeNumAfterPAGBuild;
189
+ }
190
+ inline void setNodeNumAfterPAGBuild(u32_t num)
191
+ {
192
+ nodeNumAfterPAGBuild = num;
193
+ }
194
+
195
+ inline Size_t getPAGNodeNum() const
196
+ {
197
+ return nodeNum;
198
+ }
199
+ inline Size_t getPAGEdgeNum() const
200
+ {
201
+ return edgeNum;
202
+ }
203
+ inline Size_t getPTAPAGEdgeNum() const
204
+ {
205
+ return totalPTAPAGEdge;
206
+ }
207
+ /// Return graph name
208
+ inline std::string getGraphName() const
209
+ {
210
+ return "SVFIR";
211
+ }
212
+
213
+ /// Dump SVFIR
214
+ void dump(std::string name);
215
+
216
+ /// View graph from the debugger
217
+ void view();
218
+ };
219
+
220
+ }
221
+
222
+
223
+ namespace llvm
224
+ {
225
+
226
+ /* !
227
+ * GraphTraits specializations of SVFIR to be used for the generic graph algorithms.
228
+ * Provide graph traits for tranversing from a SVFIR node using standard graph traversals.
229
+ */
230
+ template<> struct GraphTraits<SVF::SVFVar*> : public GraphTraits<SVF::GenericNode<SVF::SVFVar,SVF::SVFStmt>* >
231
+ {
232
+ };
233
+
234
+ /// Inverse GraphTraits specializations for SVFIR node, it is used for inverse traversal.
235
+ template<> struct GraphTraits<Inverse<SVF::SVFVar *> > : public GraphTraits<Inverse<SVF::GenericNode<SVF::SVFVar,SVF::SVFStmt>* > >
236
+ {
237
+ };
238
+
239
+ template<> struct GraphTraits<SVF::IRGraph*> : public GraphTraits<SVF::GenericGraph<SVF::SVFVar,SVF::SVFStmt>* >
240
+ {
241
+ typedef SVF::SVFVar *NodeRef;
242
+ };
243
+
244
+ } // End namespace llvm
245
+ #endif /* IRGRAPH_H_ */
@@ -55,7 +55,7 @@ protected:
55
55
  NodeToRepMap norToRepMap; // for each *a construct a --> rep, i.e., mapping a node of to a rep node for online constraint solving
56
56
 
57
57
  public:
58
- OfflineConsG(PAG *p) : ConstraintGraph(p),
58
+ OfflineConsG(SVFIR *p) : ConstraintGraph(p),
59
59
  nodeToRefMap( {}), norToRepMap({})
60
60
  {
61
61
  buildOfflineCG();
@@ -561,7 +561,7 @@ public:
561
561
  /// getObject - return mem object id
562
562
  inline NodeID getObjectNode(const MemObj *mem)
563
563
  {
564
- return mem->getSymId();
564
+ return mem->getId();
565
565
  }
566
566
  /// Get all PAG Edges that corresponds to an LLVM value
567
567
  inline const PAGEdgeSet& getValueEdges(const Value *V)
@@ -618,7 +618,7 @@ public:
618
618
  //@{
619
619
  inline NodeID getFIObjNode(const MemObj* obj) const
620
620
  {
621
- return obj->getSymId();
621
+ return obj->getId();
622
622
  }
623
623
  inline NodeID getFIObjNode(NodeID id) const
624
624
  {
@@ -716,7 +716,7 @@ public:
716
716
  LocationSet getLocationSetFromBaseNode(NodeID nodeId);
717
717
  inline NodeID getBaseObjNode(NodeID id) const
718
718
  {
719
- return getBaseObj(id)->getSymId();
719
+ return getBaseObj(id)->getId();
720
720
  }
721
721
  inline const MemObj* getBaseObj(NodeID id) const
722
722
  {
@@ -752,7 +752,7 @@ public:
752
752
  inline NodeID addObjNode(const Value* val, NodeID i)
753
753
  {
754
754
  MemObj* mem = symInfo->getObj(symInfo->getObjSym(val));
755
- assert(((mem->getSymId() == i)) && "not same object id?");
755
+ assert(((mem->getId() == i)) && "not same object id?");
756
756
  return addFIObjNode(mem);
757
757
  }
758
758
  /// Add a unique return node for a procedure