svf-tools 1.0.1036 → 1.0.1037

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svf-tools",
3
- "version": "1.0.1036",
3
+ "version": "1.0.1037",
4
4
  "description": "* <b>[TypeClone](https://github.com/SVF-tools/SVF/wiki/TypeClone) published in our [ECOOP paper](https://yuleisui.github.io/publications/ecoop20.pdf) is now available in SVF </b> * <b>SVF now uses a single script for its build. Just type [`source ./build.sh`](https://github.com/SVF-tools/SVF/blob/master/build.sh) in your terminal, that's it!</b> * <b>SVF now supports LLVM-10.0.0! </b> * <b>We thank [bsauce](https://github.com/bsauce) for writing a user manual of SVF ([link1](https://www.jianshu.com/p/068a08ec749c) and [link2](https://www.jianshu.com/p/777c30d4240e)) in Chinese </b> * <b>SVF now supports LLVM-9.0.0 (Thank [Byoungyoung Lee](https://github.com/SVF-tools/SVF/issues/142) for his help!). </b> * <b>SVF now supports a set of [field-sensitive pointer analyses](https://yuleisui.github.io/publications/sas2019a.pdf). </b> * <b>[Use SVF as an external lib](https://github.com/SVF-tools/SVF/wiki/Using-SVF-as-a-lib-in-your-own-tool) for your own project (Contributed by [Hongxu Chen](https://github.com/HongxuChen)). </b> * <b>SVF now supports LLVM-7.0.0. </b> * <b>SVF now supports Docker. [Try SVF in Docker](https://github.com/SVF-tools/SVF/wiki/Try-SVF-in-Docker)! </b> * <b>SVF now supports [LLVM-6.0.0](https://github.com/svf-tools/SVF/pull/38) (Contributed by [Jack Anthony](https://github.com/jackanth)). </b> * <b>SVF now supports [LLVM-4.0.0](https://github.com/svf-tools/SVF/pull/23) (Contributed by Jared Carlson. Thank [Jared](https://github.com/jcarlson23) and [Will](https://github.com/dtzWill) for their in-depth [discussions](https://github.com/svf-tools/SVF/pull/18) about updating SVF!) </b> * <b>SVF now supports analysis for C++ programs.</b> <br />",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -71,9 +71,6 @@ public:
71
71
 
72
72
  /// various maps defined
73
73
  //{@
74
- /// llvm value to sym id map
75
- /// local (%) and global (@) identifiers are pointer types which have a value node id.
76
- typedef OrderedMap<const SVFValue*, NodeID> ValueToIDMapTy;
77
74
  /// sym id to obj type info map
78
75
  typedef OrderedMap<NodeID, ObjTypeInfo*> IDToTypeInfoMapTy;
79
76
 
@@ -84,8 +81,6 @@ public:
84
81
  //@}
85
82
 
86
83
  private:
87
- ValueToIDMapTy valSymMap; ///< map a value to its sym id
88
- ValueToIDMapTy objSymMap; ///< map a obj reference to its sym id
89
84
  FunToIDMapTy returnSymMap; ///< return map
90
85
  FunToIDMapTy varargSymMap; ///< vararg map
91
86
  IDToTypeInfoMapTy objTypeInfoMap; ///< map a memory sym id to its obj
@@ -114,6 +109,8 @@ protected:
114
109
  bool fromFile; ///< Whether the SVFIR is built according to user specified data from a txt file
115
110
  NodeID nodeNumAfterPAGBuild; ///< initial node number after building SVFIR, excluding later added nodes, e.g., gepobj nodes
116
111
  u32_t totalPTAPAGEdge;
112
+ u32_t valVarNum;
113
+ u32_t objVarNum;
117
114
 
118
115
  /// Add a node into the graph
119
116
  inline NodeID addNode(SVFVar* node)
@@ -139,7 +136,7 @@ protected:
139
136
 
140
137
  public:
141
138
  IRGraph(bool buildFromFile)
142
- : totalSymNum(0), fromFile(buildFromFile), nodeNumAfterPAGBuild(0), totalPTAPAGEdge(0),
139
+ : totalSymNum(0), fromFile(buildFromFile), nodeNumAfterPAGBuild(0), totalPTAPAGEdge(0), valVarNum(0), objVarNum(0),
143
140
  maxStruct(nullptr), maxStSize(0)
144
141
  {
145
142
  }
@@ -210,16 +207,6 @@ public:
210
207
 
211
208
  /// Get different kinds of syms maps
212
209
  //@{
213
- inline ValueToIDMapTy& valSyms()
214
- {
215
- return valSymMap;
216
- }
217
-
218
- inline ValueToIDMapTy& objSyms()
219
- {
220
- return objSymMap;
221
- }
222
-
223
210
  inline IDToTypeInfoMapTy& idToObjTypeInfoMap()
224
211
  {
225
212
  return objTypeInfoMap;
@@ -242,16 +229,6 @@ public:
242
229
 
243
230
  //@}
244
231
 
245
- /// Get SVFIR Node according to LLVM value
246
- ///getNode - Return the node corresponding to the specified pointer.
247
- NodeID getValueNode(const SVFValue* V);
248
-
249
- bool hasValueNode(const SVFValue* V);
250
-
251
- /// getObject - Return the obj node id refer to the memory object for the
252
- /// specified global, heap or alloca instruction according to llvm value.
253
- NodeID getObjectNode(const SVFValue* V);
254
-
255
232
  inline ObjTypeInfo* getObjTypeInfo(NodeID id) const
256
233
  {
257
234
  IDToTypeInfoMapTy::const_iterator iter = objTypeInfoMap.find(id);
@@ -282,14 +259,9 @@ public:
282
259
  return nullPtrSymID();
283
260
  }
284
261
 
285
- inline u32_t getValueNodeNum() const
286
- {
287
- return valSymMap.size();
288
- }
289
- inline u32_t getObjectNodeNum() const
290
- {
291
- return objTypeInfoMap.size();
292
- }
262
+ u32_t getValueNodeNum();
263
+
264
+ u32_t getObjectNodeNum();
293
265
 
294
266
  /// Constant reader that won't change the state of the symbol table
295
267
  //@{
@@ -39,7 +39,6 @@ class CallGraph;
39
39
  /*!
40
40
  * SVF Intermediate representation, representing variables and statements as a Program Assignment Graph (PAG)
41
41
  * Variables as nodes and statements as edges.
42
- * SymID and NodeID are equal here (same numbering).
43
42
  */
44
43
  class SVFIR : public IRGraph
45
44
  {
@@ -63,6 +62,7 @@ public:
63
62
  typedef Map<const CallICFGNode*,SVFVarList> CSToArgsListMap;
64
63
  typedef Map<const RetICFGNode*,const SVFVar*> CSToRetMap;
65
64
  typedef Map<const SVFFunction*,const SVFVar*> FunToRetMap;
65
+ typedef Map<const CallGraphNode*,const FunObjVar *> FunToFunObjVarMap;
66
66
  typedef Map<const SVFFunction*,SVFStmtSet> FunToPAGEdgeSetMap;
67
67
  typedef Map<const ICFGNode*,SVFStmtList> ICFGNode2SVFStmtsMap;
68
68
  typedef Map<NodeID, NodeID> NodeToNodeMap;
@@ -90,6 +90,7 @@ private:
90
90
  CSToArgsListMap callSiteArgsListMap; ///< Map a callsite to a list of all its actual parameters
91
91
  CSToRetMap callSiteRetMap; ///< Map a callsite to its callsite returns PAGNodes
92
92
  FunToRetMap funRetMap; ///< Map a function to its unique function return PAGNodes
93
+ FunToFunObjVarMap funToFunObjvarMap; ///< Map a function to its unique function object PAGNodes
93
94
  CallSiteToFunPtrMap indCallSiteToFunPtrMap; ///< Map an indirect callsite to its function pointer
94
95
  FunPtrToCallSitesMap funPtrToCallSitesMap; ///< Map a function pointer to the callsites where it is used
95
96
  /// Valid pointers for pointer analysis resolution connected by SVFIR edges (constraints)
@@ -330,6 +331,12 @@ public:
330
331
  }
331
332
  //@}
332
333
 
334
+ inline const FunObjVar* getFunObjVar(const CallGraphNode* node) const
335
+ {
336
+ FunToFunObjVarMap::const_iterator it = funToFunObjvarMap.find(node);
337
+ assert(it != funToFunObjvarMap.end() && "this function doesn't have funobjvar");
338
+ return it->second;
339
+ }
333
340
  /// Node and edge statistics
334
341
  //@{
335
342
  inline u32_t getFieldValNodeNum() const
@@ -622,6 +629,7 @@ private:
622
629
  {
623
630
  memToFieldsMap[id].set(id);
624
631
  FunObjVar* funObj = new FunObjVar(id, ti, callGraphNode, type, node);
632
+ funToFunObjvarMap[callGraphNode] = funObj;
625
633
  return addObjNode(funObj);
626
634
  }
627
635
 
@@ -598,7 +598,7 @@ public:
598
598
  virtual const std::string toString() const;
599
599
 
600
600
  /// Get the memory object id
601
- inline SymID getId() const
601
+ inline NodeID getId() const
602
602
  {
603
603
  return id;
604
604
  }
@@ -54,7 +54,6 @@ typedef signed short s16_t;
54
54
 
55
55
  typedef u32_t NodeID;
56
56
  typedef u32_t EdgeID;
57
- typedef unsigned SymID;
58
57
  typedef unsigned CallSiteID;
59
58
  typedef unsigned ThreadID;
60
59
  typedef s64_t APOffset;
@@ -167,7 +167,6 @@ typedef OrderedSet<PointsTo, equalPointsTo> PointsToList;
167
167
  void dumpPointsToList(const PointsToList& ptl);
168
168
 
169
169
  /// Return true if it is an llvm intrinsic instruction
170
- bool isIntrinsicInst(const SVFInstruction* inst);
171
170
  bool isIntrinsicInst(const ICFGNode* inst);
172
171
  //@}
173
172
 
@@ -195,7 +195,7 @@ bool ContextDDA::testIndCallReachability(CxtLocDPItem& dpm, const SVFFunction* c
195
195
  CxtVar funptrVar(dpm.getCondVar().get_cond(), id);
196
196
  CxtLocDPItem funptrDpm = getDPIm(funptrVar,getDefSVFGNode(node));
197
197
  PointsTo pts = getBVPointsTo(findPT(funptrDpm));
198
- if(pts.test(getPAG()->getObjectNode(callee)))
198
+ if(pts.test(getPAG()->getFunObjVar(callee->getCallGraphNode())->getId()))
199
199
  return true;
200
200
  else
201
201
  return false;
@@ -56,38 +56,6 @@ IRGraph::~IRGraph()
56
56
  destorySymTable();
57
57
  }
58
58
 
59
- NodeID IRGraph::getValueNode(const SVFValue* val)
60
- {
61
- if(val->isNullPtr())
62
- return nullPtrSymID();
63
- else if (val->isblackHole())
64
- return blkPtrSymID();
65
- else
66
- {
67
- ValueToIDMapTy::const_iterator iter = valSymMap.find(val);
68
- assert(iter!=valSymMap.end() &&"value sym not found");
69
- return iter->second;
70
- }
71
- }
72
-
73
- bool IRGraph::hasValueNode(const SVFValue *val)
74
- {
75
- if (val->isNullPtr() || val->isblackHole())
76
- return true;
77
- else
78
- return (valSymMap.find(val) != valSymMap.end());
79
- }
80
-
81
- NodeID IRGraph::getObjectNode(const SVFValue *val)
82
- {
83
- const SVFValue* svfVal = val;
84
- if(const SVFGlobalValue* g = SVFUtil::dyn_cast<SVFGlobalValue>(val))
85
- svfVal = g->getDefGlobalForMultipleModule();
86
- ValueToIDMapTy::const_iterator iter = objSymMap.find(svfVal);
87
- assert(iter!=objSymMap.end() && "obj sym not found");
88
- return iter->second;
89
- }
90
-
91
59
  NodeID IRGraph::getReturnNode(const SVFFunction *func) const
92
60
  {
93
61
  FunToIDMapTy::const_iterator iter = returnSymMap.find(func);
@@ -102,45 +70,6 @@ NodeID IRGraph::getVarargNode(const SVFFunction *func) const
102
70
  return iter->second;
103
71
  }
104
72
 
105
- void IRGraph::dumpSymTable()
106
- {
107
- OrderedMap<NodeID, SVFValue*> idmap;
108
- for (ValueToIDMapTy::iterator iter = valSymMap.begin(); iter != valSymMap.end();
109
- ++iter)
110
- {
111
- const NodeID i = iter->second;
112
- SVFValue* val = (SVFValue*) iter->first;
113
- idmap[i] = val;
114
- }
115
- for (ValueToIDMapTy::iterator iter = objSymMap.begin(); iter != objSymMap.end();
116
- ++iter)
117
- {
118
- const NodeID i = iter->second;
119
- SVFValue* val = (SVFValue*) iter->first;
120
- idmap[i] = val;
121
- }
122
- for (FunToIDMapTy::iterator iter = returnSymMap.begin(); iter != returnSymMap.end();
123
- ++iter)
124
- {
125
- const NodeID i = iter->second;
126
- SVFValue* val = (SVFValue*) iter->first;
127
- idmap[i] = val;
128
- }
129
- for (FunToIDMapTy::iterator iter = varargSymMap.begin(); iter != varargSymMap.end();
130
- ++iter)
131
- {
132
- const NodeID i = iter->second;
133
- SVFValue* val = (SVFValue*) iter->first;
134
- idmap[i] = val;
135
- }
136
- outs() << "{SymbolTableInfo \n";
137
- for (auto iter : idmap)
138
- {
139
- outs() << iter.first << " " << iter.second->toString() << "\n";
140
- }
141
- outs() << "}\n";
142
- }
143
-
144
73
  void IRGraph::printFlattenFields(const SVFType *type)
145
74
  {
146
75
  if (const SVFArrayType* at = SVFUtil::dyn_cast<SVFArrayType>(type))
@@ -392,6 +321,33 @@ void IRGraph::view()
392
321
  }
393
322
 
394
323
 
324
+ u32_t IRGraph::getValueNodeNum()
325
+ {
326
+ if (valVarNum != 0) return valVarNum;
327
+ u32_t num = 0;
328
+ for (const auto& item: *this)
329
+ {
330
+ if (SVFUtil::isa<ValVar>(item.second))
331
+ num++;
332
+ }
333
+ return valVarNum = num;
334
+ }
335
+
336
+
337
+ u32_t IRGraph::getObjectNodeNum()
338
+ {
339
+ if (objVarNum != 0) return objVarNum;
340
+ u32_t num = 0;
341
+ for (const auto& item: *this)
342
+ {
343
+ if (SVFUtil::isa<ObjVar>(item.second))
344
+ num++;
345
+ }
346
+ return objVarNum = num;
347
+ }
348
+
349
+
350
+
395
351
  namespace SVF
396
352
  {
397
353
  /*!
@@ -127,7 +127,7 @@ void SVFStat::performStat()
127
127
  u32_t numOfConstant = 0;
128
128
  u32_t fiObjNumber = 0;
129
129
  u32_t fsObjNumber = 0;
130
- Set<SymID> memObjSet;
130
+ Set<NodeID> memObjSet;
131
131
  for(SVFIR::iterator it = pag->begin(), eit = pag->end(); it!=eit; ++it)
132
132
  {
133
133
  PAGNode* node = it->second;
@@ -174,7 +174,7 @@ void SVFStat::performStat()
174
174
 
175
175
 
176
176
 
177
- generalNumMap["TotalPointers"] = pag->getValueNodeNum() + pag->getFieldValNodeNum();
177
+ generalNumMap["TotalPointers"] = pag->getValueNodeNum();
178
178
  generalNumMap["TotalObjects"] = pag->getObjectNodeNum();
179
179
  generalNumMap["TotalFieldObjects"] = pag->getFieldObjNodeNum();
180
180
  generalNumMap["MaxStructSize"] = pag->getMaxStructSize();
@@ -242,21 +242,7 @@ void SVFUtil::increaseStackSize()
242
242
  }
243
243
  }
244
244
 
245
- /*!
246
- * Return true if it is an llvm intrinsic instruction
247
- */
248
- bool SVFUtil::isIntrinsicInst(const SVFInstruction* inst)
249
- {
250
- if (const SVFCallInst* call = SVFUtil::dyn_cast<SVFCallInst>(inst))
251
- {
252
- const SVFFunction* func = call->getCalledFunction();
253
- if (func && func->isIntrinsic())
254
- {
255
- return true;
256
- }
257
- }
258
- return false;
259
- }
245
+
260
246
 
261
247
  std::string SVFUtil::hclustMethodToString(hclust_fast_methods method)
262
248
  {
@@ -313,8 +313,8 @@ void AndersenStat::performStat()
313
313
  timeStatMap["CopyGepTime"] = Andersen::timeOfProcessCopyGep;
314
314
  timeStatMap["UpdateCGTime"] = Andersen::timeOfUpdateCallGraph;
315
315
 
316
- PTNumStatMap["TotalPointers"] = pag->getValueNodeNum() + pag->getFieldValNodeNum();
317
- PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum() + pag->getFieldObjNodeNum();
316
+ PTNumStatMap["TotalPointers"] = pag->getValueNodeNum();
317
+ PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum();
318
318
 
319
319
 
320
320
  PTNumStatMap["AddrProcessed"] = Andersen::numOfProcessedAddr;
@@ -101,7 +101,7 @@ void FlowSensitiveStat::performStat()
101
101
 
102
102
  u32_t fiObjNumber = 0;
103
103
  u32_t fsObjNumber = 0;
104
- Set<SymID> nodeSet;
104
+ Set<NodeID> nodeSet;
105
105
  for (SVFIR::const_iterator nodeIt = pag->begin(), nodeEit = pag->end(); nodeIt != nodeEit; nodeIt++)
106
106
  {
107
107
  NodeID nodeId = nodeIt->first;
@@ -109,7 +109,7 @@ void FlowSensitiveStat::performStat()
109
109
  if(SVFUtil::isa<ObjVar>(pagNode))
110
110
  {
111
111
  const BaseObjVar* baseObj = pag->getBaseObject(nodeId);
112
- SymID baseId = baseObj->getId();
112
+ NodeID baseId = baseObj->getId();
113
113
  if (nodeSet.insert(baseId).second)
114
114
  {
115
115
  if (baseObj->isFieldInsensitive())
@@ -154,8 +154,8 @@ void FlowSensitiveStat::performStat()
154
154
  timeStatMap["UpdateCGTime"] = fspta->updateCallGraphTime;
155
155
  timeStatMap["PhiTime"] = fspta->phiTime;
156
156
 
157
- PTNumStatMap["TotalPointers"] = pag->getValueNodeNum() + pag->getFieldValNodeNum();
158
- PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum() + pag->getFieldObjNodeNum();
157
+ PTNumStatMap["TotalPointers"] = pag->getValueNodeNum();
158
+ PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum();
159
159
 
160
160
  PTNumStatMap["Pointers"] = pag->getValueNodeNum();
161
161
  PTNumStatMap["MemObjects"] = pag->getObjectNodeNum();
@@ -48,7 +48,7 @@ void VersionedFlowSensitiveStat::performStat()
48
48
 
49
49
  u32_t fiObjNumber = 0;
50
50
  u32_t fsObjNumber = 0;
51
- Set<SymID> nodeSet;
51
+ Set<NodeID> nodeSet;
52
52
  for (SVFIR::const_iterator it = pag->begin(); it != pag->end(); ++it)
53
53
  {
54
54
  NodeID nodeId = it->first;
@@ -56,7 +56,7 @@ void VersionedFlowSensitiveStat::performStat()
56
56
  if (SVFUtil::isa<ObjVar>(pagNode))
57
57
  {
58
58
  const BaseObjVar* baseObj = pag->getBaseObject(nodeId);
59
- SymID baseId = baseObj->getId();
59
+ NodeID baseId = baseObj->getId();
60
60
  if (nodeSet.insert(baseId).second)
61
61
  {
62
62
  if (baseObj->isFieldInsensitive()) fiObjNumber++;
@@ -98,8 +98,8 @@ void VersionedFlowSensitiveStat::performStat()
98
98
  timeStatMap["PrelabelingTime"] = vfspta->prelabelingTime;
99
99
  timeStatMap["VersionPropTime"] = vfspta->versionPropTime;
100
100
 
101
- PTNumStatMap["TotalPointers"] = pag->getValueNodeNum() + pag->getFieldValNodeNum();
102
- PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum() + pag->getFieldObjNodeNum();
101
+ PTNumStatMap["TotalPointers"] = pag->getValueNodeNum();
102
+ PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum();
103
103
 
104
104
  PTNumStatMap["Pointers"] = pag->getValueNodeNum();
105
105
  PTNumStatMap["MemObjects"] = pag->getObjectNodeNum();
@@ -39,13 +39,13 @@
39
39
  namespace SVF
40
40
  {
41
41
 
42
- class SymbolTableInfo;
43
42
  class ObjTypeInference;
44
43
 
45
44
  class LLVMModuleSet
46
45
  {
47
46
  friend class SVFIRBuilder;
48
47
  friend class ICFGBuilder;
48
+ friend class SymbolTableBuilder;
49
49
 
50
50
  public:
51
51
 
@@ -73,6 +73,10 @@ public:
73
73
  typedef Map<const Function*, FunEntryICFGNode *> FunToFunEntryNodeMapTy;
74
74
  typedef Map<const Function*, FunExitICFGNode *> FunToFunExitNodeMapTy;
75
75
 
76
+ /// llvm value to sym id map
77
+ /// local (%) and global (@) identifiers are pointer types which have a value node id.
78
+ typedef OrderedMap<const SVFValue*, NodeID> ValueToIDMapTy;
79
+
76
80
  private:
77
81
  static LLVMModuleSet* llvmModuleSet;
78
82
  static bool preProcessed;
@@ -112,6 +116,9 @@ private:
112
116
 
113
117
  Map<const Function*, DominatorTree> FunToDominatorTree;
114
118
 
119
+ ValueToIDMapTy valSymMap; ///< map a value to its sym id
120
+ ValueToIDMapTy objSymMap; ///< map a obj reference to its sym id
121
+
115
122
  /// Constructor
116
123
  LLVMModuleSet();
117
124
 
@@ -170,6 +177,41 @@ public:
170
177
  // Dump modules to files
171
178
  void dumpModulesToFile(const std::string& suffix);
172
179
 
180
+ public:
181
+
182
+ inline u32_t getValueNodeNum() const
183
+ {
184
+ return valSymMap.size();
185
+ }
186
+
187
+ inline u32_t getObjNodeNum() const
188
+ {
189
+ return objSymMap.size();
190
+ }
191
+
192
+ inline ValueToIDMapTy& valSyms()
193
+ {
194
+ return valSymMap;
195
+ }
196
+
197
+ inline ValueToIDMapTy& objSyms()
198
+ {
199
+ return objSymMap;
200
+ }
201
+
202
+ /// Get SVFIR Node according to LLVM value
203
+ ///getNode - Return the node corresponding to the specified pointer.
204
+ NodeID getValueNode(const SVFValue* V);
205
+
206
+ bool hasValueNode(const SVFValue* V);
207
+
208
+ /// getObject - Return the obj node id refer to the memory object for the
209
+ /// specified global, heap or alloca instruction according to llvm value.
210
+ NodeID getObjectNode(const SVFValue* V);
211
+
212
+ void dumpSymTable();
213
+
214
+ public:
173
215
  inline void addFunctionMap(const Function* func, SVFFunction* svfFunc)
174
216
  {
175
217
  LLVMFunc2SVFFunc[func] = svfFunc;
@@ -91,14 +91,14 @@ public:
91
91
 
92
92
  // strip off the constant cast and return the value node
93
93
  SVFValue* svfVal = llvmModuleSet()->getSVFValue(V);
94
- return pag->getValueNode(svfVal);
94
+ return llvmModuleSet()->getValueNode(svfVal);
95
95
  }
96
96
 
97
97
  /// GetObject - Return the object node (stack/global/heap/function) according to a LLVM Value
98
98
  inline NodeID getObjectNode(const Value* V)
99
99
  {
100
100
  SVFValue* svfVal = llvmModuleSet()->getSVFValue(V);
101
- return pag->getObjectNode(svfVal);
101
+ return llvmModuleSet()->getObjectNode(svfVal);
102
102
  }
103
103
 
104
104
  /// getReturnNode - Return the node representing the unique return value of a function.
@@ -84,6 +84,10 @@ protected:
84
84
  void handleCE(const Value* val);
85
85
  // @}
86
86
 
87
+ inline LLVMModuleSet* llvmModuleSet()
88
+ {
89
+ return LLVMModuleSet::getLLVMModuleSet();
90
+ }
87
91
 
88
92
  ObjTypeInference* getTypeInference();
89
93
 
@@ -118,9 +122,9 @@ protected:
118
122
  ///Get a reference to StructInfo.
119
123
  StInfo* getOrAddSVFTypeInfo(const Type* T);
120
124
 
121
- ObjTypeInfo* createBlkObjTypeInfo(SymID symId);
125
+ ObjTypeInfo* createBlkObjTypeInfo(NodeID symId);
122
126
 
123
- ObjTypeInfo* createConstantObjTypeInfo(SymID symId);
127
+ ObjTypeInfo* createConstantObjTypeInfo(NodeID symId);
124
128
  };
125
129
 
126
130
  } // End namespace SVF
@@ -377,7 +377,7 @@ void CHGBuilder::analyzeVTables(const Module &M)
377
377
  string vtblClassName = getClassNameFromVtblObj(globalvalue->getName().str());
378
378
  CHNode *node = chg->getNode(vtblClassName);
379
379
  assert(node && "node not found?");
380
- SymID i = PAG::getPAG()->getObjectNode(llvmModuleSet()->getSVFGlobalValue(globalvalue));
380
+ NodeID i = llvmModuleSet()->getObjectNode(llvmModuleSet()->getSVFGlobalValue(globalvalue));
381
381
  SVFVar* pVar = PAG::getPAG()->getGNode(i);
382
382
  GlobalObjVar* globalObjVar = SVFUtil::cast<GlobalObjVar>(pVar);
383
383
  globalObjVar->setName(vtblClassName);
@@ -178,7 +178,7 @@ void DCHGraph::buildVTables(const SVFModule &module)
178
178
  assert(type && "DCHG::buildVTables: bad metadata for ctir.vt");
179
179
  DCHNode *node = getOrCreateNode(type);
180
180
  const SVFGlobalValue* svfgv = LLVMModuleSet::getLLVMModuleSet()->getSVFGlobalValue(gv);
181
- SymID i = PAG::getPAG()->getObjectNode(svfgv);
181
+ NodeID i = LLVMModuleSet::getLLVMModuleSet()->getObjectNode(svfgv);
182
182
  GlobalObjVar* globalObjVar =
183
183
  SVFUtil::cast<GlobalObjVar>(PAG::getPAG()->getGNode(i));
184
184
  node->setVTable(globalObjVar);
@@ -1218,6 +1218,77 @@ void LLVMModuleSet::dumpModulesToFile(const std::string& suffix)
1218
1218
  }
1219
1219
  }
1220
1220
 
1221
+ NodeID LLVMModuleSet::getValueNode(const SVFValue *val)
1222
+ {
1223
+ if (val->isNullPtr())
1224
+ return svfir->nullPtrSymID();
1225
+ else if (val->isblackHole())
1226
+ return svfir->blkPtrSymID();
1227
+ else
1228
+ {
1229
+ ValueToIDMapTy::const_iterator iter = valSymMap.find(val);
1230
+ assert(iter!=valSymMap.end() &&"value sym not found");
1231
+ return iter->second;
1232
+ }
1233
+ }
1234
+ bool LLVMModuleSet::hasValueNode(const SVFValue *val)
1235
+ {
1236
+ if (val->isNullPtr() || val->isblackHole())
1237
+ return true;
1238
+ else
1239
+ return (valSymMap.find(val) != valSymMap.end());
1240
+ }
1241
+
1242
+ NodeID LLVMModuleSet::getObjectNode(const SVFValue *val)
1243
+ {
1244
+ const SVFValue *svfVal = val;
1245
+ if (const SVFGlobalValue *g = SVFUtil::dyn_cast<SVFGlobalValue>(val))
1246
+ svfVal = g->getDefGlobalForMultipleModule();
1247
+ ValueToIDMapTy::const_iterator iter = objSymMap.find(svfVal);
1248
+ assert(iter!=objSymMap.end() && "obj sym not found");
1249
+ return iter->second;
1250
+ }
1251
+
1252
+
1253
+ void LLVMModuleSet::dumpSymTable()
1254
+ {
1255
+ OrderedMap<NodeID, SVFValue*> idmap;
1256
+ for (ValueToIDMapTy::iterator iter = valSymMap.begin(); iter != valSymMap.end();
1257
+ ++iter)
1258
+ {
1259
+ const NodeID i = iter->second;
1260
+ SVFValue* val = (SVFValue*) iter->first;
1261
+ idmap[i] = val;
1262
+ }
1263
+ for (ValueToIDMapTy::iterator iter = objSymMap.begin(); iter != objSymMap.end();
1264
+ ++iter)
1265
+ {
1266
+ const NodeID i = iter->second;
1267
+ SVFValue* val = (SVFValue*) iter->first;
1268
+ idmap[i] = val;
1269
+ }
1270
+ for (SVFIR::FunToIDMapTy::iterator iter = svfir->retSyms().begin(); iter != svfir->retSyms().end();
1271
+ ++iter)
1272
+ {
1273
+ const NodeID i = iter->second;
1274
+ SVFValue* val = (SVFValue*) iter->first;
1275
+ idmap[i] = val;
1276
+ }
1277
+ for (SVFIR::FunToIDMapTy::iterator iter = svfir->varargSyms().begin(); iter != svfir->varargSyms().end();
1278
+ ++iter)
1279
+ {
1280
+ const NodeID i = iter->second;
1281
+ SVFValue* val = (SVFValue*) iter->first;
1282
+ idmap[i] = val;
1283
+ }
1284
+ SVFUtil::outs() << "{SymbolTableInfo \n";
1285
+ for (auto iter : idmap)
1286
+ {
1287
+ SVFUtil::outs() << iter.first << " " << iter.second->toString() << "\n";
1288
+ }
1289
+ SVFUtil::outs() << "}\n";
1290
+ }
1291
+
1221
1292
  void LLVMModuleSet::addFunctionMap(const Function* func, CallGraphNode* svfFunc)
1222
1293
  {
1223
1294
  LLVMFunc2CallGraphNode[func] = svfFunc;
@@ -118,7 +118,7 @@ SVFIR* SVFIRBuilder::build()
118
118
  I != E; ++I)
119
119
  {
120
120
  setCurrentLocation(&*I,&fun.getEntryBlock());
121
- NodeID argValNodeId = pag->getValueNode(llvmModuleSet()->getSVFValue(&*I));
121
+ NodeID argValNodeId = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(&*I));
122
122
  // if this is the function does not have caller (e.g. main)
123
123
  // or a dead function, shall we create a black hole address edge for it?
124
124
  // it is (1) too conservative, and (2) make FormalParmVFGNode defined at blackhole address PAGEdge.
@@ -194,8 +194,8 @@ void SVFIRBuilder::initialiseNodes()
194
194
  addNullPtrNode();
195
195
 
196
196
  // Iterate over all value symbols in the symbol table
197
- for (IRGraph::ValueToIDMapTy::iterator iter =
198
- pag->valSyms().begin(); iter != pag->valSyms().end();
197
+ for (LLVMModuleSet::ValueToIDMapTy::iterator iter =
198
+ llvmModuleSet()->valSyms().begin(); iter != llvmModuleSet()->valSyms().end();
199
199
  ++iter)
200
200
  {
201
201
  // Debug output for adding value node
@@ -266,8 +266,8 @@ void SVFIRBuilder::initialiseNodes()
266
266
  }
267
267
 
268
268
  // Iterate over all object symbols in the symbol table
269
- for (IRGraph::ValueToIDMapTy::iterator iter =
270
- pag->objSyms().begin(); iter != pag->objSyms().end();
269
+ for (LLVMModuleSet::ValueToIDMapTy::iterator iter =
270
+ llvmModuleSet()->objSyms().begin(); iter != llvmModuleSet()->objSyms().end();
271
271
  ++iter)
272
272
  {
273
273
  // Debug output for adding object node
@@ -290,57 +290,57 @@ void SVFIRBuilder::initialiseNodes()
290
290
  // Check if the value is a function and add a function object node
291
291
  if (const Function* func = SVFUtil::dyn_cast<Function>(llvmValue))
292
292
  {
293
- SymID id = pag->getObjectNode(llvmModuleSet()->getCallGraphNode(func)->getFunction());
293
+ NodeID id = llvmModuleSet()->getObjectNode(llvmModuleSet()->getCallGraphNode(func)->getFunction());
294
294
  pag->addFunObjNode(iter->second, pag->getObjTypeInfo(id), llvmModuleSet()->getCallGraphNode(func), iter->first->getType(), icfgNode);
295
295
  }
296
296
  // Check if the value is a heap object and add a heap object node
297
297
  else if (LLVMUtil::isHeapObj(llvmValue))
298
298
  {
299
- SymID id = pag->getObjectNode(iter->first);
299
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
300
300
  pag->addHeapObjNode(iter->second, pag->getObjTypeInfo(id), iter->first->getType(), icfgNode);
301
301
  }
302
302
  // Check if the value is an alloca instruction and add a stack object node
303
303
  else if (LLVMUtil::isStackObj(llvmValue))
304
304
  {
305
- NodeID id = pag->getObjectNode(iter->first);
305
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
306
306
  pag->addStackObjNode(iter->second, pag->getObjTypeInfo(id), iter->first->getType(), icfgNode);
307
307
  }
308
308
  else if (auto fpValue = SVFUtil::dyn_cast<ConstantFP>(llvmValue))
309
309
  {
310
- NodeID id = pag->getObjectNode(iter->first);
310
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
311
311
  pag->addConstantFPObjNode(iter->second, pag->getObjTypeInfo(id), LLVMUtil::getDoubleValue(fpValue), iter->first->getType(), icfgNode);
312
312
  }
313
313
  else if (auto intValue = SVFUtil::dyn_cast<ConstantInt>(llvmValue))
314
314
  {
315
- NodeID id = pag->getObjectNode(iter->first);
315
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
316
316
  pag->addConstantIntObjNode(iter->second, pag->getObjTypeInfo(id), LLVMUtil::getIntegerValue(intValue), iter->first->getType(), icfgNode);
317
317
  }
318
318
  else if (SVFUtil::isa<ConstantPointerNull>(llvmValue))
319
319
  {
320
- NodeID id = pag->getObjectNode(iter->first);
320
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
321
321
  pag->addConstantNullPtrObjNode(iter->second, pag->getObjTypeInfo(id), iter->first->getType(), icfgNode);
322
322
  }
323
323
  else if (SVFUtil::isa<GlobalValue>(llvmValue))
324
324
  {
325
- NodeID id = pag->getObjectNode(iter->first);
325
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
326
326
  pag->addGlobalObjNode(iter->second,
327
327
  pag->getObjTypeInfo(id),
328
328
  iter->first->getType(), icfgNode);
329
329
  }
330
330
  else if (SVFUtil::isa<ConstantData, MetadataAsValue, BlockAddress>(llvmValue))
331
331
  {
332
- NodeID id = pag->getObjectNode(iter->first);
332
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
333
333
  pag->addConstantDataObjNode(iter->second, pag->getObjTypeInfo(id), iter->first->getType(), icfgNode);
334
334
  }
335
335
  else if (SVFUtil::isa<ConstantAggregate>(llvmValue))
336
336
  {
337
- NodeID id = pag->getObjectNode(iter->first);
337
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
338
338
  pag->addConstantAggObjNode(iter->second, pag->getObjTypeInfo(id), iter->first->getType(), icfgNode);
339
339
  }
340
340
  // Add a generic object node for other types of values
341
341
  else
342
342
  {
343
- NodeID id = pag->getObjectNode(iter->first);
343
+ NodeID id = llvmModuleSet()->getObjectNode(iter->first);
344
344
  pag->addObjNode(iter->second,
345
345
  pag->getObjTypeInfo(id), iter->first->getType(), icfgNode);
346
346
  }
@@ -384,14 +384,14 @@ void SVFIRBuilder::initialiseNodes()
384
384
  }
385
385
 
386
386
  /// add address edges for constant nodes.
387
- for (IRGraph::ValueToIDMapTy::iterator iter =
388
- pag->objSyms().begin(); iter != pag->objSyms().end(); ++iter)
387
+ for (LLVMModuleSet::ValueToIDMapTy::iterator iter =
388
+ llvmModuleSet()->objSyms().begin(); iter != llvmModuleSet()->objSyms().end(); ++iter)
389
389
  {
390
390
  DBOUT(DPAGBuild, outs() << "add address edges for constant node " << iter->second << "\n");
391
391
  const SVFValue* val = iter->first;
392
392
  if (isConstantObjSym(val))
393
393
  {
394
- NodeID ptr = pag->getValueNode(val);
394
+ NodeID ptr = llvmModuleSet()->getValueNode(val);
395
395
  if(ptr!= pag->getBlkPtr() && ptr!= pag->getNullPtr())
396
396
  {
397
397
  setCurrentLocation(val, nullptr);
@@ -452,7 +452,7 @@ bool SVFIRBuilder::computeGepOffset(const User *V, AccessPath& ap)
452
452
  const Value* offsetVal = gi.getOperand();
453
453
  const SVFValue* offsetSvfVal = llvmModuleSet()->getSVFValue(offsetVal);
454
454
  assert(gepTy != offsetVal->getType() && "iteration and operand have the same type?");
455
- ap.addOffsetVarAndGepTypePair(getPAG()->getGNode(getPAG()->getValueNode(offsetSvfVal)), svfGepTy);
455
+ ap.addOffsetVarAndGepTypePair(getPAG()->getGNode(llvmModuleSet()->getValueNode(offsetSvfVal)), svfGepTy);
456
456
 
457
457
  //The int value of the current index operand
458
458
  const ConstantInt* op = SVFUtil::dyn_cast<ConstantInt>(offsetVal);
@@ -521,7 +521,7 @@ void SVFIRBuilder::processCE(const Value* val)
521
521
  * The gep edge created are like constexpr (same edge may appear at multiple callsites)
522
522
  * so bb/inst of this edge may be rewritten several times, we treat it as global here.
523
523
  */
524
- addGepEdge(pag->getValueNode(llvmModuleSet()->getSVFValue(opnd)), pag->getValueNode(llvmModuleSet()->getSVFValue(gepce)), ap, constGep);
524
+ addGepEdge(llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(opnd)), llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(gepce)), ap, constGep);
525
525
  setCurrentLocation(cval, cbb);
526
526
  }
527
527
  else if (const ConstantExpr* castce = isCastConstantExpr(ref))
@@ -532,7 +532,7 @@ void SVFIRBuilder::processCE(const Value* val)
532
532
  const SVFValue* cval = getCurrentValue();
533
533
  const SVFBasicBlock* cbb = getCurrentBB();
534
534
  setCurrentLocation(castce, nullptr);
535
- addCopyEdge(pag->getValueNode(llvmModuleSet()->getSVFValue(opnd)), pag->getValueNode(llvmModuleSet()->getSVFValue(castce)), CopyStmt::BITCAST);
535
+ addCopyEdge(llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(opnd)), llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(castce)), CopyStmt::BITCAST);
536
536
  setCurrentLocation(cval, cbb);
537
537
  }
538
538
  else if (const ConstantExpr* selectce = isSelectConstantExpr(ref))
@@ -545,10 +545,10 @@ void SVFIRBuilder::processCE(const Value* val)
545
545
  const SVFValue* cval = getCurrentValue();
546
546
  const SVFBasicBlock* cbb = getCurrentBB();
547
547
  setCurrentLocation(selectce, nullptr);
548
- NodeID cond = pag->getValueNode(llvmModuleSet()->getSVFValue(selectce->getOperand(0)));
549
- NodeID nsrc1 = pag->getValueNode(llvmModuleSet()->getSVFValue(src1));
550
- NodeID nsrc2 = pag->getValueNode(llvmModuleSet()->getSVFValue(src2));
551
- NodeID nres = pag->getValueNode(llvmModuleSet()->getSVFValue(selectce));
548
+ NodeID cond = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(selectce->getOperand(0)));
549
+ NodeID nsrc1 = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(src1));
550
+ NodeID nsrc2 = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(src2));
551
+ NodeID nres = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(selectce));
552
552
  addSelectStmt(nres,nsrc1, nsrc2, cond);
553
553
  setCurrentLocation(cval, cbb);
554
554
  }
@@ -560,7 +560,7 @@ void SVFIRBuilder::processCE(const Value* val)
560
560
  const SVFBasicBlock* cbb = getCurrentBB();
561
561
  const SVFValue* cval = getCurrentValue();
562
562
  setCurrentLocation(int2Ptrce, nullptr);
563
- addCopyEdge(pag->getValueNode(llvmModuleSet()->getSVFValue(opnd)), pag->getValueNode(llvmModuleSet()->getSVFValue(int2Ptrce)), CopyStmt::INTTOPTR);
563
+ addCopyEdge(llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(opnd)), llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(int2Ptrce)), CopyStmt::INTTOPTR);
564
564
  setCurrentLocation(cval, cbb);
565
565
  }
566
566
  else if (const ConstantExpr* ptr2Intce = isPtr2IntConstantExpr(ref))
@@ -570,7 +570,7 @@ void SVFIRBuilder::processCE(const Value* val)
570
570
  const SVFBasicBlock* cbb = getCurrentBB();
571
571
  const SVFValue* cval = getCurrentValue();
572
572
  setCurrentLocation(ptr2Intce, nullptr);
573
- addCopyEdge(pag->getValueNode(llvmModuleSet()->getSVFValue(opnd)), pag->getValueNode(llvmModuleSet()->getSVFValue(ptr2Intce)), CopyStmt::PTRTOINT);
573
+ addCopyEdge(llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(opnd)), llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(ptr2Intce)), CopyStmt::PTRTOINT);
574
574
  setCurrentLocation(cval, cbb);
575
575
  }
576
576
  else if(isTruncConstantExpr(ref) || isCmpConstantExpr(ref))
@@ -579,7 +579,7 @@ void SVFIRBuilder::processCE(const Value* val)
579
579
  const SVFValue* cval = getCurrentValue();
580
580
  const SVFBasicBlock* cbb = getCurrentBB();
581
581
  setCurrentLocation(ref, nullptr);
582
- NodeID dst = pag->getValueNode(llvmModuleSet()->getSVFValue(ref));
582
+ NodeID dst = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(ref));
583
583
  addBlackHoleAddrEdge(dst);
584
584
  setCurrentLocation(cval, cbb);
585
585
  }
@@ -589,7 +589,7 @@ void SVFIRBuilder::processCE(const Value* val)
589
589
  const SVFValue* cval = getCurrentValue();
590
590
  const SVFBasicBlock* cbb = getCurrentBB();
591
591
  setCurrentLocation(ref, nullptr);
592
- NodeID dst = pag->getValueNode(llvmModuleSet()->getSVFValue(ref));
592
+ NodeID dst = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(ref));
593
593
  addBlackHoleAddrEdge(dst);
594
594
  setCurrentLocation(cval, cbb);
595
595
  }
@@ -599,7 +599,7 @@ void SVFIRBuilder::processCE(const Value* val)
599
599
  const SVFValue* cval = getCurrentValue();
600
600
  const SVFBasicBlock* cbb = getCurrentBB();
601
601
  setCurrentLocation(ref, nullptr);
602
- NodeID dst = pag->getValueNode(llvmModuleSet()->getSVFValue(ref));
602
+ NodeID dst = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(ref));
603
603
  addBlackHoleAddrEdge(dst);
604
604
  setCurrentLocation(cval, cbb);
605
605
  }
@@ -614,7 +614,7 @@ void SVFIRBuilder::processCE(const Value* val)
614
614
  const SVFValue* cval = getCurrentValue();
615
615
  const SVFBasicBlock* cbb = getCurrentBB();
616
616
  setCurrentLocation(ref, nullptr);
617
- NodeID dst = pag->getValueNode(llvmModuleSet()->getSVFValue(ref));
617
+ NodeID dst = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(ref));
618
618
  addAddrEdge(pag->getConstantNode(), dst);
619
619
  setCurrentLocation(cval, cbb);
620
620
  }
@@ -775,8 +775,8 @@ void SVFIRBuilder::visitGlobal(SVFModule* svfModule)
775
775
  for (Module::alias_iterator I = M.alias_begin(), E = M.alias_end(); I != E; I++)
776
776
  {
777
777
  const GlobalAlias* alias = &*I;
778
- NodeID dst = pag->getValueNode(llvmModuleSet()->getSVFValue(alias));
779
- NodeID src = pag->getValueNode(llvmModuleSet()->getSVFValue(alias->getAliasee()));
778
+ NodeID dst = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(alias));
779
+ NodeID src = llvmModuleSet()->getValueNode(llvmModuleSet()->getSVFValue(alias->getAliasee()));
780
780
  processCE(alias->getAliasee());
781
781
  setCurrentLocation(alias, nullptr);
782
782
  addCopyEdge(src, dst, CopyStmt::COPYVAL);
@@ -1317,7 +1317,7 @@ void SVFIRBuilder::handleIndCall(CallBase* cs)
1317
1317
  const SVFValue* svfcalledval = llvmModuleSet()->getSVFValue(cs->getCalledOperand());
1318
1318
 
1319
1319
  const CallICFGNode* cbn = llvmModuleSet()->getCallICFGNode(cs);
1320
- pag->addIndirectCallsites(cbn,pag->getValueNode(svfcalledval));
1320
+ pag->addIndirectCallsites(cbn,llvmModuleSet()->getValueNode(svfcalledval));
1321
1321
  }
1322
1322
 
1323
1323
  void SVFIRBuilder::updateCallGraph(PTACallGraph* callgraph)
@@ -1385,7 +1385,7 @@ void SVFIRBuilder::sanityCheck()
1385
1385
  NodeID SVFIRBuilder::getGepValVar(const Value* val, const AccessPath& ap, const SVFType* elementType)
1386
1386
  {
1387
1387
  NodeID base = getValueNode(val);
1388
- NodeID gepval = pag->getGepValVar(pag->getValueNode(curVal), base, ap);
1388
+ NodeID gepval = pag->getGepValVar(llvmModuleSet()->getValueNode(curVal), base, ap);
1389
1389
  if (gepval==UINT_MAX)
1390
1390
  {
1391
1391
  assert(((int) UINT_MAX)==-1 && "maximum limit of unsigned int is not -1?");
@@ -1411,7 +1411,7 @@ NodeID SVFIRBuilder::getGepValVar(const Value* val, const AccessPath& ap, const
1411
1411
  {
1412
1412
  node = llvmmodule->getICFGNode(inst);
1413
1413
  }
1414
- NodeID gepNode = pag->addGepValNode(pag->getValueNode(curVal), cast<ValVar>(pag->getGNode(getValueNode(val))), ap,
1414
+ NodeID gepNode = pag->addGepValNode(llvmModuleSet()->getValueNode(curVal), cast<ValVar>(pag->getGNode(getValueNode(val))), ap,
1415
1415
  NodeIDAllocator::get()->allocateValueId(),
1416
1416
  llvmmodule->getSVFType(PointerType::getUnqual(llvmmodule->getContext())), node);
1417
1417
  addGepEdge(base, gepNode, ap, true);
@@ -1443,7 +1443,7 @@ void SVFIRBuilder::setCurrentBBAndValueForPAGEdge(PAGEdge* edge)
1443
1443
 
1444
1444
  assert(curVal && "current Val is nullptr?");
1445
1445
  edge->setBB(curBB!=nullptr ? curBB : nullptr);
1446
- edge->setValue(pag->getGNode(pag->getValueNode(curVal)));
1446
+ edge->setValue(pag->getGNode(llvmModuleSet()->getValueNode(curVal)));
1447
1447
  ICFGNode* icfgNode = pag->getICFG()->getGlobalICFGNode();
1448
1448
  LLVMModuleSet* llvmMS = llvmModuleSet();
1449
1449
  if (const SVFInstruction* curInst = SVFUtil::dyn_cast<SVFInstruction>(curVal))
@@ -61,16 +61,16 @@ const Type* SVFIRBuilder::getBaseTypeAndFlattenedFields(const Value* V, std::vec
61
61
  // make a ConstantInt and create char for the content type due to byte-wise copy
62
62
  const ConstantInt* offset = ConstantInt::get(context, llvm::APInt(32, ei));
63
63
  const SVFValue* svfOffset = LLVMModuleSet::getLLVMModuleSet()->getSVFValue(offset);
64
- if (!pag->hasValueNode(svfOffset))
64
+ if (!llvmModuleSet()->hasValueNode(svfOffset))
65
65
  {
66
66
  SymbolTableBuilder builder(pag);
67
67
  builder.collectSym(offset);
68
- SymID id = pag->getValueNode(svfOffset);
68
+ NodeID id = llvmModuleSet()->getValueNode(svfOffset);
69
69
  pag->addConstantIntValNode(id, LLVMUtil::getIntegerValue(offset), nullptr, svfOffset->getType());
70
70
  llvmModuleSet()->addToSVFVar2LLVMValueMap(offset,
71
71
  pag->getGNode(id));
72
72
  }
73
- ls.addOffsetVarAndGepTypePair(getPAG()->getGNode(getPAG()->getValueNode(svfOffset)), nullptr);
73
+ ls.addOffsetVarAndGepTypePair(getPAG()->getGNode(llvmModuleSet()->getValueNode(svfOffset)), nullptr);
74
74
  fields.push_back(ls);
75
75
  }
76
76
  return objType;
@@ -134,8 +134,8 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
134
134
 
135
135
  if (isHeapAllocExtCallViaRet(callICFGNode))
136
136
  {
137
- NodeID val = pag->getValueNode(svfInst);
138
- NodeID obj = pag->getObjectNode(svfInst);
137
+ NodeID val = llvmModuleSet()->getValueNode(svfInst);
138
+ NodeID obj = llvmModuleSet()->getObjectNode(svfInst);
139
139
  addAddrWithHeapSz(obj, val, cs);
140
140
  }
141
141
  else if (isHeapAllocExtCallViaArg(callICFGNode))
@@ -144,7 +144,7 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
144
144
  const SVFValue* arg = svfCall->getArgOperand(arg_pos);
145
145
  if (arg->getType()->isPointerTy())
146
146
  {
147
- NodeID vnArg = pag->getValueNode(arg);
147
+ NodeID vnArg = llvmModuleSet()->getValueNode(arg);
148
148
  NodeID dummy = pag->addDummyValNode();
149
149
  NodeID obj = pag->addDummyObjNode(arg->getType());
150
150
  if (vnArg && dummy && obj)
@@ -237,7 +237,7 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
237
237
 
238
238
  // We have vArg3 points to the entry of _Rb_tree_node_base { color; parent; left; right; }.
239
239
  // Now we calculate the offset from base to vArg3
240
- NodeID vnArg3 = pag->getValueNode(svfCall->getArgOperand(3));
240
+ NodeID vnArg3 = llvmModuleSet()->getValueNode(svfCall->getArgOperand(3));
241
241
  APOffset offset =
242
242
  getAccessPathFromBaseNode(vnArg3).getConstantStructFldIdx();
243
243
 
@@ -253,7 +253,7 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
253
253
  const SVFType* elementType = pag->getFlatternedElemType(pag->getTypeLocSetsMap(vnArg3).first,
254
254
  fields[i].getConstantStructFldIdx());
255
255
  NodeID vnD = getGepValVar(cs->getArgOperand(3), fields[i], elementType);
256
- NodeID vnS = pag->getValueNode(svfCall->getArgOperand(1));
256
+ NodeID vnS = llvmModuleSet()->getValueNode(svfCall->getArgOperand(1));
257
257
  if(vnD && vnS)
258
258
  addStoreEdge(vnS,vnD);
259
259
  }
@@ -277,7 +277,7 @@ void SVFIRBuilder::handleExtCall(const CallBase* cs, const SVFFunction* svfCalle
277
277
  if (actualParm->isPointer() && formalParm->getType()->isPointerTy())
278
278
  {
279
279
  FunEntryICFGNode *entry = pag->getICFG()->getFunEntryICFGNode(forkedFun);
280
- addThreadForkEdge(actualParm->getId(), pag->getValueNode(formalParm), callICFGNode, entry);
280
+ addThreadForkEdge(actualParm->getId(), llvmModuleSet()->getValueNode(formalParm), callICFGNode, entry);
281
281
  }
282
282
  }
283
283
  }
@@ -44,10 +44,10 @@ using namespace SVF;
44
44
  using namespace SVFUtil;
45
45
  using namespace LLVMUtil;
46
46
 
47
- ObjTypeInfo* SymbolTableBuilder::createBlkObjTypeInfo(SymID symId)
47
+ ObjTypeInfo* SymbolTableBuilder::createBlkObjTypeInfo(NodeID symId)
48
48
  {
49
49
  assert(svfir->isBlkObj(symId));
50
- LLVMModuleSet* llvmset = LLVMModuleSet::getLLVMModuleSet();
50
+ LLVMModuleSet* llvmset = llvmModuleSet();
51
51
  if (svfir->objTypeInfoMap.find(symId)==svfir->objTypeInfoMap.end())
52
52
  {
53
53
  ObjTypeInfo* ti =svfir->createObjTypeInfo(llvmset->getSVFType(
@@ -58,10 +58,10 @@ ObjTypeInfo* SymbolTableBuilder::createBlkObjTypeInfo(SymID symId)
58
58
  return ti;
59
59
  }
60
60
 
61
- ObjTypeInfo* SymbolTableBuilder::createConstantObjTypeInfo(SymID symId)
61
+ ObjTypeInfo* SymbolTableBuilder::createConstantObjTypeInfo(NodeID symId)
62
62
  {
63
63
  assert(IRGraph::isConstantSym(symId));
64
- LLVMModuleSet* llvmset = LLVMModuleSet::getLLVMModuleSet();
64
+ LLVMModuleSet* llvmset = llvmModuleSet();
65
65
  if (svfir->objTypeInfoMap.find(symId)==svfir->objTypeInfoMap.end())
66
66
  {
67
67
  ObjTypeInfo* ti = svfir->createObjTypeInfo(
@@ -94,7 +94,7 @@ void SymbolTableBuilder::buildMemModel(SVFModule* svfModule)
94
94
  assert(svfir->totalSymNum++ == IRGraph::ConstantObj && "Something changed!");
95
95
  createConstantObjTypeInfo(IRGraph::ConstantObj);
96
96
 
97
- for (Module &M : LLVMModuleSet::getLLVMModuleSet()->getLLVMModules())
97
+ for (Module &M : llvmModuleSet()->getLLVMModules())
98
98
  {
99
99
  // Add symbols for all the globals .
100
100
  for (const GlobalVariable& gv : M.globals())
@@ -235,7 +235,7 @@ void SymbolTableBuilder::buildMemModel(SVFModule* svfModule)
235
235
  svfir->totalSymNum = NodeIDAllocator::get()->endSymbolAllocation();
236
236
  if (Options::SymTabPrint())
237
237
  {
238
- svfir->dumpSymTable();
238
+ llvmModuleSet()->dumpSymTable();
239
239
  }
240
240
  }
241
241
 
@@ -267,7 +267,7 @@ void SymbolTableBuilder::collectSym(const Value* val)
267
267
  DBOUT(DMemModel,
268
268
  outs()
269
269
  << "collect sym from ##"
270
- << LLVMModuleSet::getLLVMModuleSet()->getSVFValue(val)->toString()
270
+ << llvmModuleSet()->getSVFValue(val)->toString()
271
271
  << " \n");
272
272
  //TODO handle constant expression value here??
273
273
  handleCE(val);
@@ -295,14 +295,14 @@ void SymbolTableBuilder::collectVal(const Value* val)
295
295
  {
296
296
  return;
297
297
  }
298
- IRGraph::ValueToIDMapTy::iterator iter = svfir->valSymMap.find(
299
- LLVMModuleSet::getLLVMModuleSet()->getSVFValue(val));
300
- if (iter == svfir->valSymMap.end())
298
+ LLVMModuleSet::ValueToIDMapTy::iterator iter = llvmModuleSet()->valSymMap.find(
299
+ llvmModuleSet()->getSVFValue(val));
300
+ if (iter == llvmModuleSet()->valSymMap.end())
301
301
  {
302
302
  // create val sym and sym type
303
- SVFValue* svfVal = LLVMModuleSet::getLLVMModuleSet()->getSVFValue(val);
304
- SymID id = NodeIDAllocator::get()->allocateValueId();
305
- svfir->valSymMap.insert(std::make_pair(svfVal, id));
303
+ SVFValue* svfVal = llvmModuleSet()->getSVFValue(val);
304
+ NodeID id = NodeIDAllocator::get()->allocateValueId();
305
+ llvmModuleSet()->valSymMap.insert(std::make_pair(svfVal, id));
306
306
  DBOUT(DMemModel,
307
307
  outs() << "create a new value sym " << id << "\n");
308
308
  /// handle global constant expression here
@@ -320,23 +320,22 @@ void SymbolTableBuilder::collectVal(const Value* val)
320
320
  void SymbolTableBuilder::collectObj(const Value* val)
321
321
  {
322
322
  val = LLVMUtil::getGlobalRep(val);
323
- LLVMModuleSet* llvmModuleSet = LLVMModuleSet::getLLVMModuleSet();
324
- IRGraph::ValueToIDMapTy::iterator iter = svfir->objSymMap.find(llvmModuleSet->getSVFValue(val));
325
- if (iter == svfir->objSymMap.end())
323
+ LLVMModuleSet::ValueToIDMapTy::iterator iter = llvmModuleSet()->objSymMap.find(llvmModuleSet()->getSVFValue(val));
324
+ if (iter == llvmModuleSet()->objSymMap.end())
326
325
  {
327
- SVFValue* svfVal = llvmModuleSet->getSVFValue(val);
326
+ SVFValue* svfVal = llvmModuleSet()->getSVFValue(val);
328
327
  // if the object pointed by the pointer is a constant data (e.g., i32 0) or a global constant object (e.g. string)
329
328
  // then we treat them as one ConstantObj
330
329
  if (isConstantObjSym(val) && !Options::ModelConsts())
331
330
  {
332
- svfir->objSymMap.insert(std::make_pair(svfVal, svfir->constantSymID()));
331
+ llvmModuleSet()->objSymMap.insert(std::make_pair(svfVal, svfir->constantSymID()));
333
332
  }
334
333
  // otherwise, we will create an object for each abstract memory location
335
334
  else
336
335
  {
337
336
  // create obj sym and sym type
338
- SymID id = NodeIDAllocator::get()->allocateObjectId();
339
- svfir->objSymMap.insert(std::make_pair(svfVal, id));
337
+ NodeID id = NodeIDAllocator::get()->allocateObjectId();
338
+ llvmModuleSet()->objSymMap.insert(std::make_pair(svfVal, id));
340
339
  DBOUT(DMemModel,
341
340
  outs() << "create a new obj sym " << id << "\n");
342
341
 
@@ -354,12 +353,12 @@ void SymbolTableBuilder::collectObj(const Value* val)
354
353
  void SymbolTableBuilder::collectRet(const Function* val)
355
354
  {
356
355
  const SVFFunction* svffun =
357
- LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(val);
356
+ llvmModuleSet()->getSVFFunction(val);
358
357
  IRGraph::FunToIDMapTy::iterator iter =
359
358
  svfir->returnSymMap.find(svffun);
360
359
  if (iter == svfir->returnSymMap.end())
361
360
  {
362
- SymID id = NodeIDAllocator::get()->allocateValueId();
361
+ NodeID id = NodeIDAllocator::get()->allocateValueId();
363
362
  svfir->returnSymMap.insert(std::make_pair(svffun, id));
364
363
  DBOUT(DMemModel, outs() << "create a return sym " << id << "\n");
365
364
  }
@@ -371,12 +370,12 @@ void SymbolTableBuilder::collectRet(const Function* val)
371
370
  void SymbolTableBuilder::collectVararg(const Function* val)
372
371
  {
373
372
  const SVFFunction* svffun =
374
- LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(val);
373
+ llvmModuleSet()->getSVFFunction(val);
375
374
  IRGraph::FunToIDMapTy::iterator iter =
376
375
  svfir->varargSymMap.find(svffun);
377
376
  if (iter == svfir->varargSymMap.end())
378
377
  {
379
- SymID id = NodeIDAllocator::get()->allocateValueId();
378
+ NodeID id = NodeIDAllocator::get()->allocateValueId();
380
379
  svfir->varargSymMap.insert(std::make_pair(svffun, id));
381
380
  DBOUT(DMemModel, outs() << "create a vararg sym " << id << "\n");
382
381
  }
@@ -392,7 +391,7 @@ void SymbolTableBuilder::handleCE(const Value* val)
392
391
  if (const ConstantExpr* ce = isGepConstantExpr(ref))
393
392
  {
394
393
  DBOUT(DMemModelCE, outs() << "handle constant expression "
395
- << LLVMModuleSet::getLLVMModuleSet()
394
+ << llvmModuleSet()
396
395
  ->getSVFValue(ref)
397
396
  ->toString()
398
397
  << "\n");
@@ -409,7 +408,7 @@ void SymbolTableBuilder::handleCE(const Value* val)
409
408
  else if (const ConstantExpr* ce = isCastConstantExpr(ref))
410
409
  {
411
410
  DBOUT(DMemModelCE, outs() << "handle constant expression "
412
- << LLVMModuleSet::getLLVMModuleSet()
411
+ << llvmModuleSet()
413
412
  ->getSVFValue(ref)
414
413
  ->toString()
415
414
  << "\n");
@@ -422,7 +421,7 @@ void SymbolTableBuilder::handleCE(const Value* val)
422
421
  else if (const ConstantExpr* ce = isSelectConstantExpr(ref))
423
422
  {
424
423
  DBOUT(DMemModelCE, outs() << "handle constant expression "
425
- << LLVMModuleSet::getLLVMModuleSet()
424
+ << llvmModuleSet()
426
425
  ->getSVFValue(ref)
427
426
  ->toString()
428
427
  << "\n");
@@ -575,7 +574,7 @@ void SymbolTableBuilder::handleGlobalInitializerCE(const Constant* C)
575
574
 
576
575
  ObjTypeInference *SymbolTableBuilder::getTypeInference()
577
576
  {
578
- return LLVMModuleSet::getLLVMModuleSet()->getTypeInference();
577
+ return llvmModuleSet()->getTypeInference();
579
578
  }
580
579
 
581
580
 
@@ -593,7 +592,7 @@ const Type* SymbolTableBuilder::inferTypeOfHeapObjOrStaticObj(const Instruction
593
592
  const PointerType *originalPType = SVFUtil::dyn_cast<PointerType>(inst->getType());
594
593
  const Type* inferedType = nullptr;
595
594
  assert(originalPType && "empty type?");
596
- const SVFInstruction* svfinst = LLVMModuleSet::getLLVMModuleSet()->getSVFInstruction(inst);
595
+ const SVFInstruction* svfinst = llvmModuleSet()->getSVFInstruction(inst);
597
596
  if(LLVMUtil::isHeapAllocExtCallViaRet(inst))
598
597
  {
599
598
  if(const Value* v = getFirstUseViaCastInst(inst))
@@ -666,7 +665,7 @@ ObjTypeInfo* SymbolTableBuilder::createObjTypeInfo(const Value* val)
666
665
  {
667
666
  (void) getOrAddSVFTypeInfo(objTy);
668
667
  ObjTypeInfo* typeInfo = new ObjTypeInfo(
669
- LLVMModuleSet::getLLVMModuleSet()->getSVFType(objTy),
668
+ llvmModuleSet()->getSVFType(objTy),
670
669
  Options::MaxFieldLimit());
671
670
  initTypeInfo(typeInfo,val, objTy);
672
671
  return typeInfo;
@@ -675,11 +674,11 @@ ObjTypeInfo* SymbolTableBuilder::createObjTypeInfo(const Value* val)
675
674
  {
676
675
  writeWrnMsg("try to create an object with a non-pointer type.");
677
676
  writeWrnMsg(val->getName().str());
678
- writeWrnMsg("(" + LLVMModuleSet::getLLVMModuleSet()->getSVFValue(val)->getSourceLoc() + ")");
677
+ writeWrnMsg("(" + llvmModuleSet()->getSVFValue(val)->getSourceLoc() + ")");
679
678
  if (isConstantObjSym(val))
680
679
  {
681
680
  ObjTypeInfo* typeInfo = new ObjTypeInfo(
682
- LLVMModuleSet::getLLVMModuleSet()->getSVFType(val->getType()),
681
+ llvmModuleSet()->getSVFType(val->getType()),
683
682
  0);
684
683
  initTypeInfo(typeInfo,val, val->getType());
685
684
  return typeInfo;
@@ -697,7 +696,7 @@ ObjTypeInfo* SymbolTableBuilder::createObjTypeInfo(const Value* val)
697
696
  */
698
697
  void SymbolTableBuilder::analyzeObjType(ObjTypeInfo* typeinfo, const Value* val)
699
698
  {
700
- const Type *elemTy = LLVMModuleSet::getLLVMModuleSet()->getLLVMType(typeinfo->getType());
699
+ const Type *elemTy = llvmModuleSet()->getLLVMType(typeinfo->getType());
701
700
  // Find the inter nested array element
702
701
  while (const ArrayType* AT = SVFUtil::dyn_cast<ArrayType>(elemTy))
703
702
  {
@@ -744,7 +743,7 @@ u32_t SymbolTableBuilder::analyzeHeapAllocByteSize(const Value* val)
744
743
  callInst->getCalledFunction())
745
744
  {
746
745
  const SVFFunction* svfFunction =
747
- LLVMModuleSet::getLLVMModuleSet()->getSVFFunction(
746
+ llvmModuleSet()->getSVFFunction(
748
747
  calledFunction);
749
748
  std::vector<const Value*> args;
750
749
  // Heap alloc functions have annoation like "AllocSize:Arg1"
@@ -810,7 +809,7 @@ u32_t SymbolTableBuilder::analyzeHeapObjType(ObjTypeInfo* typeinfo, const Value*
810
809
  {
811
810
  typeinfo->setFlag(ObjTypeInfo::HEAP_OBJ);
812
811
  analyzeObjType(typeinfo, val);
813
- const Type* objTy = LLVMModuleSet::getLLVMModuleSet()->getLLVMType(typeinfo->getType());
812
+ const Type* objTy = llvmModuleSet()->getLLVMType(typeinfo->getType());
814
813
  if(SVFUtil::isa<ArrayType>(objTy))
815
814
  return getNumOfElements(objTy);
816
815
  else if(const StructType* st = SVFUtil::dyn_cast<StructType>(objTy))
@@ -818,8 +817,8 @@ u32_t SymbolTableBuilder::analyzeHeapObjType(ObjTypeInfo* typeinfo, const Value*
818
817
  /// For an C++ class, it can have variant elements depending on the vtable size,
819
818
  /// Hence we only handle non-cpp-class object, the type of the cpp class is treated as default PointerType
820
819
  if(cppUtil::classTyHasVTable(st))
821
- typeinfo->resetTypeForHeapStaticObj(LLVMModuleSet::getLLVMModuleSet()->getSVFType(
822
- LLVMModuleSet::getLLVMModuleSet()->getTypeInference()->ptrType()));
820
+ typeinfo->resetTypeForHeapStaticObj(llvmModuleSet()->getSVFType(
821
+ llvmModuleSet()->getTypeInference()->ptrType()));
823
822
  else
824
823
  return getNumOfElements(objTy);
825
824
  }
@@ -959,5 +958,5 @@ u32_t SymbolTableBuilder::getNumOfFlattenElements(const Type* T)
959
958
 
960
959
  StInfo* SymbolTableBuilder::getOrAddSVFTypeInfo(const Type* T)
961
960
  {
962
- return LLVMModuleSet::getLLVMModuleSet()->getSVFType(T)->getTypeInfo();
961
+ return llvmModuleSet()->getSVFType(T)->getTypeInfo();
963
962
  }