svf-lib 1.0.2535 → 1.0.2537
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-linux-x86_64/bin/ae +0 -0
- package/SVF-linux-x86_64/bin/svf-ex +0 -0
- package/SVF-linux-x86_64/bin/wpa +0 -0
- package/SVF-linux-x86_64/include/SVF-LLVM/BasicTypes.h +5 -0
- package/SVF-linux-x86_64/include/SVFIR/SVFIR.h +12 -0
- package/SVF-linux-x86_64/include/SVFIR/SVFValue.h +6 -3
- package/SVF-linux-x86_64/include/SVFIR/SVFVariables.h +130 -4
- package/SVF-linux-x86_64/lib/libSvfCore.so.3.3 +0 -0
- package/SVF-linux-x86_64/lib/libSvfLLVM.so.3.3 +0 -0
- package/SVF-osx/bin/ae +0 -0
- package/SVF-osx/bin/cfl +0 -0
- package/SVF-osx/bin/dvf +0 -0
- package/SVF-osx/bin/mta +0 -0
- package/SVF-osx/bin/saber +0 -0
- package/SVF-osx/bin/svf-ex +0 -0
- package/SVF-osx/bin/wpa +0 -0
- package/SVF-osx/include/Graphs/VFG.h +2 -4
- package/SVF-osx/include/Graphs/VFGNode.h +8 -13
- package/SVF-osx/include/SVFIR/SVFIR.h +9 -1
- package/SVF-osx/include/SVFIR/SVFStatements.h +83 -75
- package/SVF-osx/lib/cmake/SVF/SVFTargets.cmake +2 -2
- package/SVF-osx/lib/libSvfCore.3.3.dylib +0 -0
- package/SVF-osx/lib/libSvfLLVM.3.3.dylib +0 -0
- package/package.json +1 -1
package/SVF-linux-x86_64/bin/ae
CHANGED
|
Binary file
|
|
Binary file
|
package/SVF-linux-x86_64/bin/wpa
CHANGED
|
Binary file
|
|
@@ -42,6 +42,8 @@
|
|
|
42
42
|
#include <llvm/IR/DerivedTypes.h>
|
|
43
43
|
#include <llvm/IR/Statepoint.h>
|
|
44
44
|
#include <llvm/IR/Intrinsics.h>
|
|
45
|
+
#include <llvm/IR/InlineAsm.h>
|
|
46
|
+
#include <llvm/IR/Constants.h>
|
|
45
47
|
|
|
46
48
|
#include <llvm/Analysis/MemoryLocation.h>
|
|
47
49
|
#include <llvm/Analysis/DominanceFrontier.h>
|
|
@@ -127,6 +129,9 @@ typedef llvm::Constant Constant;
|
|
|
127
129
|
typedef llvm::ConstantInt ConstantInt;
|
|
128
130
|
typedef llvm::ConstantFP ConstantFP;
|
|
129
131
|
typedef llvm::ConstantPointerNull ConstantPointerNull;
|
|
132
|
+
typedef llvm::InlineAsm InlineAsm;
|
|
133
|
+
typedef llvm::DSOLocalEquivalent DSOLocalEquivalent;
|
|
134
|
+
typedef llvm::NoCFIValue NoCFIValue;
|
|
130
135
|
typedef llvm::GlobalAlias GlobalAlias;
|
|
131
136
|
typedef llvm::GlobalIFunc GlobalIFunc;
|
|
132
137
|
typedef llvm::GlobalVariable GlobalVariable;
|
|
@@ -837,6 +837,18 @@ private:
|
|
|
837
837
|
{
|
|
838
838
|
return addDummyValNode(getBlkPtr(), nullptr);
|
|
839
839
|
}
|
|
840
|
+
inline NodeID addIntrinsicValNode(NodeID i, const SVFType* type)
|
|
841
|
+
{
|
|
842
|
+
return addValNode(new IntrinsicValVar(i, type));
|
|
843
|
+
}
|
|
844
|
+
inline NodeID addBasicBlockValNode(NodeID i, const SVFType* type)
|
|
845
|
+
{
|
|
846
|
+
return addValNode(new BasicBlockValVar(i, type));
|
|
847
|
+
}
|
|
848
|
+
inline NodeID addAsmPCValNode(NodeID i, const SVFType* type)
|
|
849
|
+
{
|
|
850
|
+
return addValNode(new AsmPCValVar(i, type));
|
|
851
|
+
}
|
|
840
852
|
//@}
|
|
841
853
|
|
|
842
854
|
/// Add a value (pointer) node
|
|
@@ -80,6 +80,9 @@ public:
|
|
|
80
80
|
ConstNullptrValNode, // │ └── Represents a constant nullptr value node
|
|
81
81
|
// │ └─ Subclass: DummyValVar
|
|
82
82
|
DummyValNode, // │ └── Dummy node for uninitialized values
|
|
83
|
+
IntrinsicValNode, // │ └── LLVM intrinsic call instruction (e.g. llvm.dbg.declare)
|
|
84
|
+
BasicBlockValNode, // │ └── LLVM BasicBlock (label operand of br/switch)
|
|
85
|
+
AsmPCValNode, // │ └── InlineAsm, DSOLocalEquivalent, NoCFIValue
|
|
83
86
|
|
|
84
87
|
// └─ Subclass: ObjVar (Object variable nodes)
|
|
85
88
|
ObjNode, // ├── Represents an object variable
|
|
@@ -230,7 +233,7 @@ protected:
|
|
|
230
233
|
|
|
231
234
|
static inline bool isSVFVarKind(GNodeK n)
|
|
232
235
|
{
|
|
233
|
-
static_assert(DummyObjNode - ValNode ==
|
|
236
|
+
static_assert(DummyObjNode - ValNode == 29,
|
|
234
237
|
"The number of SVFVarKinds has changed, make sure the "
|
|
235
238
|
"range is correct");
|
|
236
239
|
|
|
@@ -239,10 +242,10 @@ protected:
|
|
|
239
242
|
|
|
240
243
|
static inline bool isValVarKinds(GNodeK n)
|
|
241
244
|
{
|
|
242
|
-
static_assert(
|
|
245
|
+
static_assert(AsmPCValNode - ValNode == 16,
|
|
243
246
|
"The number of ValVarKinds has changed, make sure the "
|
|
244
247
|
"range is correct");
|
|
245
|
-
return n <=
|
|
248
|
+
return n <= AsmPCValNode && n >= ValNode;
|
|
246
249
|
}
|
|
247
250
|
|
|
248
251
|
|
|
@@ -283,10 +283,7 @@ public:
|
|
|
283
283
|
//@}
|
|
284
284
|
|
|
285
285
|
/// Constructor
|
|
286
|
-
ValVar(NodeID i, const SVFType* svfType, const ICFGNode* node, PNODEK ty = ValNode)
|
|
287
|
-
: SVFVar(i, svfType, ty), icfgNode(node)
|
|
288
|
-
{
|
|
289
|
-
}
|
|
286
|
+
ValVar(NodeID i, const SVFType* svfType, const ICFGNode* node, PNODEK ty = ValNode);
|
|
290
287
|
/// Return name of a LLVM value
|
|
291
288
|
inline const std::string getValueName() const
|
|
292
289
|
{
|
|
@@ -2111,6 +2108,8 @@ public:
|
|
|
2111
2108
|
VarArgValPN(NodeID i, const FunObjVar* node, const SVFType* svfType, const ICFGNode* icn)
|
|
2112
2109
|
: ValVar(i, svfType, icn, VarargValNode), callGraphNode(node)
|
|
2113
2110
|
{
|
|
2111
|
+
assert((node->isDeclaration() || icn) &&
|
|
2112
|
+
"VarArgValPN of a defined function must have a valid ICFGNode");
|
|
2114
2113
|
}
|
|
2115
2114
|
|
|
2116
2115
|
virtual const FunObjVar* getFunction() const;
|
|
@@ -2176,6 +2175,133 @@ public:
|
|
|
2176
2175
|
virtual const std::string toString() const;
|
|
2177
2176
|
};
|
|
2178
2177
|
|
|
2178
|
+
/*
|
|
2179
|
+
* Represents an LLVM intrinsic call instruction (e.g. llvm.dbg.declare).
|
|
2180
|
+
* These are collected into valSyms but have no corresponding ICFGNode.
|
|
2181
|
+
*/
|
|
2182
|
+
class IntrinsicValVar: public ValVar
|
|
2183
|
+
{
|
|
2184
|
+
friend class GraphDBClient;
|
|
2185
|
+
|
|
2186
|
+
public:
|
|
2187
|
+
//@{ Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
2188
|
+
static inline bool classof(const IntrinsicValVar*)
|
|
2189
|
+
{
|
|
2190
|
+
return true;
|
|
2191
|
+
}
|
|
2192
|
+
static inline bool classof(const SVFVar* node)
|
|
2193
|
+
{
|
|
2194
|
+
return node->getNodeKind() == SVFVar::IntrinsicValNode;
|
|
2195
|
+
}
|
|
2196
|
+
static inline bool classof(const ValVar* node)
|
|
2197
|
+
{
|
|
2198
|
+
return node->getNodeKind() == SVFVar::IntrinsicValNode;
|
|
2199
|
+
}
|
|
2200
|
+
static inline bool classof(const GenericPAGNodeTy* node)
|
|
2201
|
+
{
|
|
2202
|
+
return node->getNodeKind() == SVFVar::IntrinsicValNode;
|
|
2203
|
+
}
|
|
2204
|
+
static inline bool classof(const SVFValue* node)
|
|
2205
|
+
{
|
|
2206
|
+
return node->getNodeKind() == SVFVar::IntrinsicValNode;
|
|
2207
|
+
}
|
|
2208
|
+
//@}
|
|
2209
|
+
|
|
2210
|
+
IntrinsicValVar(NodeID i, const SVFType* svfType)
|
|
2211
|
+
: ValVar(i, svfType, nullptr, IntrinsicValNode)
|
|
2212
|
+
{
|
|
2213
|
+
}
|
|
2214
|
+
|
|
2215
|
+
inline const std::string getValueName() const
|
|
2216
|
+
{
|
|
2217
|
+
return "intrinsicVal";
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2220
|
+
virtual const std::string toString() const;
|
|
2221
|
+
};
|
|
2222
|
+
|
|
2223
|
+
/*
|
|
2224
|
+
* Represents an LLVM BasicBlock (label operand of br/switch).
|
|
2225
|
+
* Collected into valSyms as a branch operand but has no ICFGNode.
|
|
2226
|
+
*/
|
|
2227
|
+
class BasicBlockValVar: public ValVar
|
|
2228
|
+
{
|
|
2229
|
+
friend class GraphDBClient;
|
|
2230
|
+
|
|
2231
|
+
public:
|
|
2232
|
+
static inline bool classof(const BasicBlockValVar*)
|
|
2233
|
+
{
|
|
2234
|
+
return true;
|
|
2235
|
+
}
|
|
2236
|
+
static inline bool classof(const SVFVar* node)
|
|
2237
|
+
{
|
|
2238
|
+
return node->getNodeKind() == SVFVar::BasicBlockValNode;
|
|
2239
|
+
}
|
|
2240
|
+
static inline bool classof(const ValVar* node)
|
|
2241
|
+
{
|
|
2242
|
+
return node->getNodeKind() == SVFVar::BasicBlockValNode;
|
|
2243
|
+
}
|
|
2244
|
+
static inline bool classof(const GenericPAGNodeTy* node)
|
|
2245
|
+
{
|
|
2246
|
+
return node->getNodeKind() == SVFVar::BasicBlockValNode;
|
|
2247
|
+
}
|
|
2248
|
+
static inline bool classof(const SVFValue* node)
|
|
2249
|
+
{
|
|
2250
|
+
return node->getNodeKind() == SVFVar::BasicBlockValNode;
|
|
2251
|
+
}
|
|
2252
|
+
|
|
2253
|
+
BasicBlockValVar(NodeID i, const SVFType* svfType)
|
|
2254
|
+
: ValVar(i, svfType, nullptr, BasicBlockValNode) {}
|
|
2255
|
+
|
|
2256
|
+
inline const std::string getValueName() const
|
|
2257
|
+
{
|
|
2258
|
+
return "basicBlockVal";
|
|
2259
|
+
}
|
|
2260
|
+
virtual const std::string toString() const;
|
|
2261
|
+
};
|
|
2262
|
+
|
|
2263
|
+
/*
|
|
2264
|
+
* Represents InlineAsm, DSOLocalEquivalent, and NoCFIValue.
|
|
2265
|
+
* These are non-instruction values related to inline assembly,
|
|
2266
|
+
* position-independent code (PIC), or control-flow integrity (CFI).
|
|
2267
|
+
* They have no corresponding ICFGNode.
|
|
2268
|
+
*/
|
|
2269
|
+
class AsmPCValVar: public ValVar
|
|
2270
|
+
{
|
|
2271
|
+
friend class GraphDBClient;
|
|
2272
|
+
|
|
2273
|
+
public:
|
|
2274
|
+
static inline bool classof(const AsmPCValVar*)
|
|
2275
|
+
{
|
|
2276
|
+
return true;
|
|
2277
|
+
}
|
|
2278
|
+
static inline bool classof(const SVFVar* node)
|
|
2279
|
+
{
|
|
2280
|
+
return node->getNodeKind() == SVFVar::AsmPCValNode;
|
|
2281
|
+
}
|
|
2282
|
+
static inline bool classof(const ValVar* node)
|
|
2283
|
+
{
|
|
2284
|
+
return node->getNodeKind() == SVFVar::AsmPCValNode;
|
|
2285
|
+
}
|
|
2286
|
+
static inline bool classof(const GenericPAGNodeTy* node)
|
|
2287
|
+
{
|
|
2288
|
+
return node->getNodeKind() == SVFVar::AsmPCValNode;
|
|
2289
|
+
}
|
|
2290
|
+
static inline bool classof(const SVFValue* node)
|
|
2291
|
+
{
|
|
2292
|
+
return node->getNodeKind() == SVFVar::AsmPCValNode;
|
|
2293
|
+
}
|
|
2294
|
+
|
|
2295
|
+
AsmPCValVar(NodeID i, const SVFType* svfType)
|
|
2296
|
+
: ValVar(i, svfType, nullptr, AsmPCValNode) {}
|
|
2297
|
+
|
|
2298
|
+
inline const std::string getValueName() const
|
|
2299
|
+
{
|
|
2300
|
+
return "asmPCVal";
|
|
2301
|
+
}
|
|
2302
|
+
virtual const std::string toString() const;
|
|
2303
|
+
};
|
|
2304
|
+
|
|
2179
2305
|
/*
|
|
2180
2306
|
* Dummy object variable
|
|
2181
2307
|
*/
|
|
Binary file
|
|
Binary file
|
package/SVF-osx/bin/ae
CHANGED
|
Binary file
|
package/SVF-osx/bin/cfl
CHANGED
|
Binary file
|
package/SVF-osx/bin/dvf
CHANGED
|
Binary file
|
package/SVF-osx/bin/mta
CHANGED
|
Binary file
|
package/SVF-osx/bin/saber
CHANGED
|
Binary file
|
package/SVF-osx/bin/svf-ex
CHANGED
|
Binary file
|
package/SVF-osx/bin/wpa
CHANGED
|
Binary file
|
|
@@ -597,13 +597,11 @@ protected:
|
|
|
597
597
|
/// do not set def here, this node is not a variable definition
|
|
598
598
|
}
|
|
599
599
|
/// Add a formal parameter VFG node
|
|
600
|
-
inline void addFormalParmVFGNode(const ValVar* fparm, const FunObjVar* fun,
|
|
600
|
+
inline void addFormalParmVFGNode(const ValVar* fparm, const FunObjVar* fun, const CallPE* callPE)
|
|
601
601
|
{
|
|
602
602
|
FormalParmVFGNode* sNode = new FormalParmVFGNode(totalVFGNode++,fparm,fun);
|
|
603
603
|
addVFGNode(sNode, pag->getICFG()->getFunEntryICFGNode(fun));
|
|
604
|
-
|
|
605
|
-
it!=eit; ++it)
|
|
606
|
-
sNode->addCallPE(*it);
|
|
604
|
+
sNode->setCallPE(callPE);
|
|
607
605
|
|
|
608
606
|
setDef(fparm,sNode);
|
|
609
607
|
SVFVarToFormalParmMap[fparm] = sNode;
|
|
@@ -1028,12 +1028,12 @@ class FormalParmVFGNode : public ArgumentVFGNode
|
|
|
1028
1028
|
{
|
|
1029
1029
|
private:
|
|
1030
1030
|
const FunObjVar* fun;
|
|
1031
|
-
|
|
1031
|
+
const CallPE* callPE;
|
|
1032
1032
|
|
|
1033
1033
|
public:
|
|
1034
1034
|
/// Constructor
|
|
1035
1035
|
FormalParmVFGNode(NodeID id, const ValVar* n, const FunObjVar* f):
|
|
1036
|
-
ArgumentVFGNode(id, n, FParm), fun(f)
|
|
1036
|
+
ArgumentVFGNode(id, n, FParm), fun(f), callPE(nullptr)
|
|
1037
1037
|
{
|
|
1038
1038
|
}
|
|
1039
1039
|
|
|
@@ -1048,20 +1048,15 @@ public:
|
|
|
1048
1048
|
{
|
|
1049
1049
|
return fun;
|
|
1050
1050
|
}
|
|
1051
|
-
///
|
|
1052
|
-
inline void
|
|
1051
|
+
/// Set the (single, phi-like) CallPE for this formal parameter
|
|
1052
|
+
inline void setCallPE(const CallPE* call)
|
|
1053
1053
|
{
|
|
1054
|
-
|
|
1054
|
+
callPE = call;
|
|
1055
1055
|
}
|
|
1056
|
-
///
|
|
1057
|
-
|
|
1058
|
-
inline CallPESet::const_iterator callPEBegin() const
|
|
1059
|
-
{
|
|
1060
|
-
return callPEs.begin();
|
|
1061
|
-
}
|
|
1062
|
-
inline CallPESet::const_iterator callPEEnd() const
|
|
1056
|
+
/// Return the CallPE (phi-like, merges all actual params)
|
|
1057
|
+
inline const CallPE* getCallPE() const
|
|
1063
1058
|
{
|
|
1064
|
-
return
|
|
1059
|
+
return callPE;
|
|
1065
1060
|
}
|
|
1066
1061
|
//@}
|
|
1067
1062
|
|
|
@@ -57,6 +57,7 @@ public:
|
|
|
57
57
|
typedef std::vector<const SVFStmt*> SVFStmtList;
|
|
58
58
|
typedef std::vector<const ValVar*> ValVarList;
|
|
59
59
|
typedef Map<const SVFVar*,PhiStmt*> PHINodeMap;
|
|
60
|
+
typedef Map<const SVFVar*,CallPE*> FParmToCallPEMap;
|
|
60
61
|
typedef Map<const FunObjVar*,ValVarList> FunToArgsListMap;
|
|
61
62
|
typedef Map<const CallICFGNode*,ValVarList> CSToArgsListMap;
|
|
62
63
|
typedef Map<const RetICFGNode*,const ValVar*> CSToRetMap;
|
|
@@ -84,6 +85,7 @@ private:
|
|
|
84
85
|
MemObjToFieldsMap memToFieldsMap; ///< Map a mem object id to all its fields
|
|
85
86
|
SVFStmtSet globSVFStmtSet; ///< Global PAGEdges without control flow information
|
|
86
87
|
PHINodeMap phiNodeMap; ///< A set of phi copy edges
|
|
88
|
+
FParmToCallPEMap fParmToCallPEMap; ///< Map a formal param to its CallPE
|
|
87
89
|
FunToArgsListMap funArgsListMap; ///< Map a function to a list of all its formal parameters
|
|
88
90
|
CSToArgsListMap callSiteArgsListMap; ///< Map a callsite to a list of all its actual parameters
|
|
89
91
|
CSToRetMap callSiteRetMap; ///< Map a callsite to its callsite returns PAGNodes
|
|
@@ -353,6 +355,12 @@ public:
|
|
|
353
355
|
{
|
|
354
356
|
return phiNodeMap.find(node) != phiNodeMap.end();
|
|
355
357
|
}
|
|
358
|
+
/// Get the CallPE for a formal parameter (phi-like, nullptr if not found)
|
|
359
|
+
inline CallPE* getCallPEForFormalParm(const SVFVar* param) const
|
|
360
|
+
{
|
|
361
|
+
auto it = fParmToCallPEMap.find(param);
|
|
362
|
+
return it != fParmToCallPEMap.end() ? it->second : nullptr;
|
|
363
|
+
}
|
|
356
364
|
|
|
357
365
|
/// Function has arguments list
|
|
358
366
|
inline bool hasFunArgsList(const FunObjVar* func) const
|
|
@@ -911,7 +919,7 @@ private:
|
|
|
911
919
|
/// Add Store edge
|
|
912
920
|
StoreStmt* addStoreStmt(NodeID src, NodeID dst, const ICFGNode* val);
|
|
913
921
|
void addStoreStmt(StoreStmt* edge, SVFVar* src, SVFVar* dst);
|
|
914
|
-
/// Add Call edge
|
|
922
|
+
/// Add Call edge (phi-like: merges actual params from all call sites into formal param)
|
|
915
923
|
CallPE* addCallPE(NodeID src, NodeID dst, const CallICFGNode* cs,
|
|
916
924
|
const FunEntryICFGNode* entry);
|
|
917
925
|
void addCallPE(CallPE* edge, SVFVar* src, SVFVar* dst);
|
|
@@ -335,10 +335,8 @@ public:
|
|
|
335
335
|
edge->getEdgeKind() == SVFStmt::Copy ||
|
|
336
336
|
edge->getEdgeKind() == SVFStmt::Store ||
|
|
337
337
|
edge->getEdgeKind() == SVFStmt::Load ||
|
|
338
|
-
edge->getEdgeKind() == SVFStmt::Call ||
|
|
339
338
|
edge->getEdgeKind() == SVFStmt::Ret ||
|
|
340
339
|
edge->getEdgeKind() == SVFStmt::Gep ||
|
|
341
|
-
edge->getEdgeKind() == SVFStmt::ThreadFork ||
|
|
342
340
|
edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
343
341
|
}
|
|
344
342
|
static inline bool classof(const GenericPAGEdgeTy* edge)
|
|
@@ -347,10 +345,8 @@ public:
|
|
|
347
345
|
edge->getEdgeKind() == SVFStmt::Copy ||
|
|
348
346
|
edge->getEdgeKind() == SVFStmt::Store ||
|
|
349
347
|
edge->getEdgeKind() == SVFStmt::Load ||
|
|
350
|
-
edge->getEdgeKind() == SVFStmt::Call ||
|
|
351
348
|
edge->getEdgeKind() == SVFStmt::Ret ||
|
|
352
349
|
edge->getEdgeKind() == SVFStmt::Gep ||
|
|
353
|
-
edge->getEdgeKind() == SVFStmt::ThreadFork ||
|
|
354
350
|
edge->getEdgeKind() == SVFStmt::ThreadJoin;
|
|
355
351
|
}
|
|
356
352
|
//@}
|
|
@@ -693,67 +689,6 @@ public:
|
|
|
693
689
|
};
|
|
694
690
|
|
|
695
691
|
|
|
696
|
-
/*!
|
|
697
|
-
* Call
|
|
698
|
-
*/
|
|
699
|
-
class CallPE: public AssignStmt
|
|
700
|
-
{
|
|
701
|
-
friend class GraphDBClient;
|
|
702
|
-
|
|
703
|
-
private:
|
|
704
|
-
CallPE(const CallPE&); ///< place holder
|
|
705
|
-
void operator=(const CallPE&); ///< place holder
|
|
706
|
-
|
|
707
|
-
const CallICFGNode* call; /// the callsite statement calling from
|
|
708
|
-
const FunEntryICFGNode* entry; /// the function exit statement calling to
|
|
709
|
-
|
|
710
|
-
public:
|
|
711
|
-
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
712
|
-
//@{
|
|
713
|
-
static inline bool classof(const CallPE*)
|
|
714
|
-
{
|
|
715
|
-
return true;
|
|
716
|
-
}
|
|
717
|
-
static inline bool classof(const SVFStmt* edge)
|
|
718
|
-
{
|
|
719
|
-
return edge->getEdgeKind() == SVFStmt::Call ||
|
|
720
|
-
edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
721
|
-
}
|
|
722
|
-
static inline bool classof(const GenericPAGEdgeTy* edge)
|
|
723
|
-
{
|
|
724
|
-
return edge->getEdgeKind() == SVFStmt::Call ||
|
|
725
|
-
edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
726
|
-
}
|
|
727
|
-
//@}
|
|
728
|
-
|
|
729
|
-
/// constructor
|
|
730
|
-
CallPE(SVFVar* s, SVFVar* d, const CallICFGNode* i,
|
|
731
|
-
const FunEntryICFGNode* e, GEdgeKind k = SVFStmt::Call);
|
|
732
|
-
|
|
733
|
-
/// Get method for the call instruction
|
|
734
|
-
//@{
|
|
735
|
-
inline const CallICFGNode* getCallInst() const
|
|
736
|
-
{
|
|
737
|
-
return call;
|
|
738
|
-
}
|
|
739
|
-
inline const CallICFGNode* getCallSite() const
|
|
740
|
-
{
|
|
741
|
-
return call;
|
|
742
|
-
}
|
|
743
|
-
inline const FunEntryICFGNode* getFunEntryICFGNode() const
|
|
744
|
-
{
|
|
745
|
-
return entry;
|
|
746
|
-
}
|
|
747
|
-
//@}
|
|
748
|
-
|
|
749
|
-
const ValVar* getRHSVar() const;
|
|
750
|
-
const ValVar* getLHSVar() const;
|
|
751
|
-
const ValVar* getSrcNode() const;
|
|
752
|
-
const ValVar* getDstNode() const;
|
|
753
|
-
|
|
754
|
-
virtual const std::string toString() const override;
|
|
755
|
-
};
|
|
756
|
-
|
|
757
692
|
/*!
|
|
758
693
|
* Return
|
|
759
694
|
*/
|
|
@@ -850,12 +785,14 @@ public:
|
|
|
850
785
|
static inline bool classof(const SVFStmt* node)
|
|
851
786
|
{
|
|
852
787
|
return node->getEdgeKind() == Phi || node->getEdgeKind() == Select ||
|
|
853
|
-
node->getEdgeKind() == BinaryOp || node->getEdgeKind() == Cmp
|
|
788
|
+
node->getEdgeKind() == BinaryOp || node->getEdgeKind() == Cmp ||
|
|
789
|
+
node->getEdgeKind() == Call || node->getEdgeKind() == ThreadFork;
|
|
854
790
|
}
|
|
855
791
|
static inline bool classof(const GenericPAGEdgeTy* node)
|
|
856
792
|
{
|
|
857
793
|
return node->getEdgeKind() == Phi || node->getEdgeKind() == Select ||
|
|
858
|
-
node->getEdgeKind() == BinaryOp || node->getEdgeKind() == Cmp
|
|
794
|
+
node->getEdgeKind() == BinaryOp || node->getEdgeKind() == Cmp ||
|
|
795
|
+
node->getEdgeKind() == Call || node->getEdgeKind() == ThreadFork;
|
|
859
796
|
}
|
|
860
797
|
//@}
|
|
861
798
|
/// Operands and result at a BinaryNode e.g., p = q + r, `p` is resVar and
|
|
@@ -891,6 +828,81 @@ public:
|
|
|
891
828
|
//@}
|
|
892
829
|
};
|
|
893
830
|
|
|
831
|
+
/*!
|
|
832
|
+
* Call
|
|
833
|
+
* CallPE is a phi-like statement at function entry that merges actual parameters
|
|
834
|
+
* from all call sites into the formal parameter.
|
|
835
|
+
* e.g., formal_param = CallPE(actual1@callsite1, actual2@callsite2, ...)
|
|
836
|
+
*/
|
|
837
|
+
class CallPE: public MultiOpndStmt
|
|
838
|
+
{
|
|
839
|
+
friend class GraphDBClient;
|
|
840
|
+
|
|
841
|
+
public:
|
|
842
|
+
typedef std::vector<const CallICFGNode*> CallICFGNodeVec;
|
|
843
|
+
|
|
844
|
+
private:
|
|
845
|
+
CallPE(const CallPE&); ///< place holder
|
|
846
|
+
void operator=(const CallPE&); ///< place holder
|
|
847
|
+
|
|
848
|
+
CallICFGNodeVec opCallICFGNodes; /// each operand's call site
|
|
849
|
+
const FunEntryICFGNode* entry; /// the function entry node
|
|
850
|
+
|
|
851
|
+
public:
|
|
852
|
+
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
853
|
+
//@{
|
|
854
|
+
static inline bool classof(const CallPE*)
|
|
855
|
+
{
|
|
856
|
+
return true;
|
|
857
|
+
}
|
|
858
|
+
static inline bool classof(const SVFStmt* edge)
|
|
859
|
+
{
|
|
860
|
+
return edge->getEdgeKind() == SVFStmt::Call ||
|
|
861
|
+
edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
862
|
+
}
|
|
863
|
+
static inline bool classof(const GenericPAGEdgeTy* edge)
|
|
864
|
+
{
|
|
865
|
+
return edge->getEdgeKind() == SVFStmt::Call ||
|
|
866
|
+
edge->getEdgeKind() == SVFStmt::ThreadFork;
|
|
867
|
+
}
|
|
868
|
+
//@}
|
|
869
|
+
|
|
870
|
+
/// constructor
|
|
871
|
+
CallPE(ValVar* res, const OPVars& opnds,
|
|
872
|
+
const CallICFGNodeVec& icfgNodes,
|
|
873
|
+
const FunEntryICFGNode* e,
|
|
874
|
+
GEdgeKind k = SVFStmt::Call);
|
|
875
|
+
|
|
876
|
+
/// Add an operand (actual param) from a call site
|
|
877
|
+
void addOpVar(ValVar* op, const CallICFGNode* call)
|
|
878
|
+
{
|
|
879
|
+
opVars.push_back(op);
|
|
880
|
+
opCallICFGNodes.push_back(call);
|
|
881
|
+
assert(opVars.size() == opCallICFGNodes.size() &&
|
|
882
|
+
"Numbers of operands and their CallICFGNodes are not consistent?");
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
/// Return the CallICFGNode of the i-th operand
|
|
886
|
+
inline const CallICFGNode* getOpCallICFGNode(u32_t op_idx) const
|
|
887
|
+
{
|
|
888
|
+
return opCallICFGNodes.at(op_idx);
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
/// Return all call site ICFGNodes
|
|
892
|
+
inline const CallICFGNodeVec& getOpCallICFGNodes() const
|
|
893
|
+
{
|
|
894
|
+
return opCallICFGNodes;
|
|
895
|
+
}
|
|
896
|
+
|
|
897
|
+
/// Return the function entry node
|
|
898
|
+
inline const FunEntryICFGNode* getFunEntryICFGNode() const
|
|
899
|
+
{
|
|
900
|
+
return entry;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
virtual const std::string toString() const override;
|
|
904
|
+
};
|
|
905
|
+
|
|
894
906
|
/*!
|
|
895
907
|
* Phi statement (e.g., p = phi(q,r) which receives values from variables q and r from different paths)
|
|
896
908
|
* it is typically at a joint point of the control-flow graph
|
|
@@ -1340,17 +1352,13 @@ public:
|
|
|
1340
1352
|
//@}
|
|
1341
1353
|
|
|
1342
1354
|
/// constructor
|
|
1343
|
-
TDForkPE(
|
|
1344
|
-
const
|
|
1345
|
-
|
|
1355
|
+
TDForkPE(ValVar* res, const OPVars& opnds,
|
|
1356
|
+
const CallICFGNodeVec& icfgNodes,
|
|
1357
|
+
const FunEntryICFGNode* e)
|
|
1358
|
+
: CallPE(res, opnds, icfgNodes, e, SVFStmt::ThreadFork)
|
|
1346
1359
|
{
|
|
1347
1360
|
}
|
|
1348
1361
|
|
|
1349
|
-
const ValVar* getRHSVar() const;
|
|
1350
|
-
const ValVar* getLHSVar() const;
|
|
1351
|
-
const ValVar* getSrcNode() const;
|
|
1352
|
-
const ValVar* getDstNode() const;
|
|
1353
|
-
|
|
1354
1362
|
virtual const std::string toString() const;
|
|
1355
1363
|
|
|
1356
1364
|
};
|
|
@@ -7,7 +7,7 @@ if(CMAKE_VERSION VERSION_LESS "3.0.0")
|
|
|
7
7
|
message(FATAL_ERROR "CMake >= 3.0.0 required")
|
|
8
8
|
endif()
|
|
9
9
|
cmake_policy(PUSH)
|
|
10
|
-
cmake_policy(VERSION 3.0.0...4.
|
|
10
|
+
cmake_policy(VERSION 3.0.0...4.1)
|
|
11
11
|
#----------------------------------------------------------------
|
|
12
12
|
# Generated CMake target import file.
|
|
13
13
|
#----------------------------------------------------------------
|
|
@@ -65,7 +65,7 @@ set_target_properties(SVF::SvfFlags PROPERTIES
|
|
|
65
65
|
INTERFACE_LINK_DIRECTORIES "${_IMPORT_PREFIX}/lib"
|
|
66
66
|
INTERFACE_LINK_LIBRARIES "z3::libz3"
|
|
67
67
|
INTERFACE_LINK_OPTIONS "\$<\$<NOT:\$<BOOL:ON>>:-fno-rtti>"
|
|
68
|
-
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "include
|
|
68
|
+
INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_IMPORT_PREFIX}/include;${_IMPORT_PREFIX}/include"
|
|
69
69
|
)
|
|
70
70
|
|
|
71
71
|
# Create imported target SVF::SvfCore
|
|
Binary file
|
|
Binary file
|