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 +1 -1
- package/svf/include/Graphs/IRGraph.h +6 -34
- package/svf/include/SVFIR/SVFIR.h +9 -1
- package/svf/include/SVFIR/SVFVariables.h +1 -1
- package/svf/include/Util/GeneralType.h +0 -1
- package/svf/include/Util/SVFUtil.h +0 -1
- package/svf/lib/DDA/ContextDDA.cpp +1 -1
- package/svf/lib/Graphs/IRGraph.cpp +27 -71
- package/svf/lib/Util/SVFStat.cpp +2 -2
- package/svf/lib/Util/SVFUtil.cpp +1 -15
- package/svf/lib/WPA/AndersenStat.cpp +2 -2
- package/svf/lib/WPA/FlowSensitiveStat.cpp +4 -4
- package/svf/lib/WPA/VersionedFlowSensitiveStat.cpp +4 -4
- package/svf-llvm/include/SVF-LLVM/LLVMModule.h +43 -1
- package/svf-llvm/include/SVF-LLVM/SVFIRBuilder.h +2 -2
- package/svf-llvm/include/SVF-LLVM/SymbolTableBuilder.h +6 -2
- package/svf-llvm/lib/CHGBuilder.cpp +1 -1
- package/svf-llvm/lib/DCHG.cpp +1 -1
- package/svf-llvm/lib/LLVMModule.cpp +71 -0
- package/svf-llvm/lib/SVFIRBuilder.cpp +37 -37
- package/svf-llvm/lib/SVFIRExtAPI.cpp +9 -9
- package/svf-llvm/lib/SymbolTableBuilder.cpp +37 -38
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
|
|
@@ -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()->
|
|
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
|
/*!
|
package/svf/lib/Util/SVFStat.cpp
CHANGED
|
@@ -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<
|
|
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()
|
|
177
|
+
generalNumMap["TotalPointers"] = pag->getValueNodeNum();
|
|
178
178
|
generalNumMap["TotalObjects"] = pag->getObjectNodeNum();
|
|
179
179
|
generalNumMap["TotalFieldObjects"] = pag->getFieldObjNodeNum();
|
|
180
180
|
generalNumMap["MaxStructSize"] = pag->getMaxStructSize();
|
package/svf/lib/Util/SVFUtil.cpp
CHANGED
|
@@ -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()
|
|
317
|
-
PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum()
|
|
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<
|
|
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
|
-
|
|
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()
|
|
158
|
-
PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum()
|
|
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<
|
|
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
|
-
|
|
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()
|
|
102
|
-
PTNumStatMap["TotalObjects"] = pag->getObjectNodeNum()
|
|
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
|
|
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
|
|
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(
|
|
125
|
+
ObjTypeInfo* createBlkObjTypeInfo(NodeID symId);
|
|
122
126
|
|
|
123
|
-
ObjTypeInfo* createConstantObjTypeInfo(
|
|
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
|
-
|
|
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);
|
package/svf-llvm/lib/DCHG.cpp
CHANGED
|
@@ -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
|
-
|
|
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 =
|
|
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 (
|
|
198
|
-
|
|
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 (
|
|
270
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 (
|
|
388
|
-
|
|
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 =
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
549
|
-
NodeID nsrc1 =
|
|
550
|
-
NodeID nsrc2 =
|
|
551
|
-
NodeID nres =
|
|
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(
|
|
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(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
779
|
-
NodeID src =
|
|
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,
|
|
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(
|
|
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(
|
|
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(
|
|
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 (!
|
|
64
|
+
if (!llvmModuleSet()->hasValueNode(svfOffset))
|
|
65
65
|
{
|
|
66
66
|
SymbolTableBuilder builder(pag);
|
|
67
67
|
builder.collectSym(offset);
|
|
68
|
-
|
|
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(
|
|
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 =
|
|
138
|
-
NodeID obj =
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(),
|
|
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(
|
|
47
|
+
ObjTypeInfo* SymbolTableBuilder::createBlkObjTypeInfo(NodeID symId)
|
|
48
48
|
{
|
|
49
49
|
assert(svfir->isBlkObj(symId));
|
|
50
|
-
LLVMModuleSet* llvmset =
|
|
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(
|
|
61
|
+
ObjTypeInfo* SymbolTableBuilder::createConstantObjTypeInfo(NodeID symId)
|
|
62
62
|
{
|
|
63
63
|
assert(IRGraph::isConstantSym(symId));
|
|
64
|
-
LLVMModuleSet* llvmset =
|
|
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 :
|
|
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
|
-
|
|
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
|
-
<<
|
|
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
|
-
|
|
299
|
-
|
|
300
|
-
if (iter ==
|
|
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 =
|
|
304
|
-
|
|
305
|
-
|
|
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
|
|
324
|
-
|
|
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
|
-
|
|
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
|
-
|
|
339
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
<<
|
|
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
|
-
<<
|
|
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
|
-
<<
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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("(" +
|
|
677
|
+
writeWrnMsg("(" + llvmModuleSet()->getSVFValue(val)->getSourceLoc() + ")");
|
|
679
678
|
if (isConstantObjSym(val))
|
|
680
679
|
{
|
|
681
680
|
ObjTypeInfo* typeInfo = new ObjTypeInfo(
|
|
682
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
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(
|
|
822
|
-
|
|
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
|
|
961
|
+
return llvmModuleSet()->getSVFType(T)->getTypeInfo();
|
|
963
962
|
}
|