svf-lib 1.0.2511 → 1.0.2513
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/dvf +0 -0
- package/SVF-linux-x86_64/bin/mta +0 -0
- package/SVF-linux-x86_64/bin/saber +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/AE/Core/AbstractState.h +1 -1
- package/SVF-linux-x86_64/include/DDA/DDAVFSolver.h +4 -4
- package/SVF-linux-x86_64/include/Graphs/SVFG.h +16 -16
- package/SVF-linux-x86_64/include/Graphs/SVFGOPT.h +6 -6
- package/SVF-linux-x86_64/include/Graphs/VFG.h +39 -36
- package/SVF-linux-x86_64/include/Graphs/VFGNode.h +117 -37
- package/SVF-linux-x86_64/include/MemoryModel/AccessPath.h +5 -4
- package/SVF-linux-x86_64/include/SABER/SaberSVFGBuilder.h +1 -1
- package/SVF-linux-x86_64/include/SVFIR/SVFIR.h +24 -14
- package/SVF-linux-x86_64/include/SVFIR/SVFStatements.h +65 -33
- 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/svf-ex +0 -0
- package/SVF-osx/include/AE/Core/AbstractState.h +1 -1
- package/SVF-osx/include/DDA/DDAVFSolver.h +4 -4
- package/SVF-osx/include/Graphs/SVFG.h +16 -16
- package/SVF-osx/include/Graphs/SVFGOPT.h +6 -6
- package/SVF-osx/include/Graphs/VFG.h +39 -36
- package/SVF-osx/include/Graphs/VFGNode.h +117 -37
- package/SVF-osx/include/MemoryModel/AccessPath.h +5 -4
- package/SVF-osx/include/SABER/SaberSVFGBuilder.h +1 -1
- package/SVF-osx/include/SVFIR/SVFIR.h +24 -14
- package/SVF-osx/include/SVFIR/SVFStatements.h +65 -33
- 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
|
@@ -209,6 +209,22 @@ public:
|
|
|
209
209
|
LoadVFGNode(NodeID id, const LoadStmt* edge): StmtVFGNode(id, edge,Load)
|
|
210
210
|
{
|
|
211
211
|
|
|
212
|
+
}
|
|
213
|
+
inline const ValVar* getSrcNode() const
|
|
214
|
+
{
|
|
215
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getSrcNode());
|
|
216
|
+
}
|
|
217
|
+
inline const ValVar* getDstNode() const
|
|
218
|
+
{
|
|
219
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getDstNode());
|
|
220
|
+
}
|
|
221
|
+
inline const ValVar* getRHSVar() const
|
|
222
|
+
{
|
|
223
|
+
return getSrcNode();
|
|
224
|
+
}
|
|
225
|
+
inline const ValVar* getLHSVar() const
|
|
226
|
+
{
|
|
227
|
+
return getDstNode();
|
|
212
228
|
}
|
|
213
229
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
214
230
|
//@{
|
|
@@ -254,6 +270,22 @@ public:
|
|
|
254
270
|
StoreVFGNode(NodeID id,const StoreStmt* edge): StmtVFGNode(id,edge,Store)
|
|
255
271
|
{
|
|
256
272
|
|
|
273
|
+
}
|
|
274
|
+
inline const ValVar* getSrcNode() const
|
|
275
|
+
{
|
|
276
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getSrcNode());
|
|
277
|
+
}
|
|
278
|
+
inline const ValVar* getDstNode() const
|
|
279
|
+
{
|
|
280
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getDstNode());
|
|
281
|
+
}
|
|
282
|
+
inline const ValVar* getRHSVar() const
|
|
283
|
+
{
|
|
284
|
+
return getSrcNode();
|
|
285
|
+
}
|
|
286
|
+
inline const ValVar* getLHSVar() const
|
|
287
|
+
{
|
|
288
|
+
return getDstNode();
|
|
257
289
|
}
|
|
258
290
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
259
291
|
//@{
|
|
@@ -299,6 +331,22 @@ public:
|
|
|
299
331
|
CopyVFGNode(NodeID id,const CopyStmt* copy): StmtVFGNode(id,copy,Copy)
|
|
300
332
|
{
|
|
301
333
|
|
|
334
|
+
}
|
|
335
|
+
inline const ValVar* getSrcNode() const
|
|
336
|
+
{
|
|
337
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getSrcNode());
|
|
338
|
+
}
|
|
339
|
+
inline const ValVar* getDstNode() const
|
|
340
|
+
{
|
|
341
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getDstNode());
|
|
342
|
+
}
|
|
343
|
+
inline const ValVar* getRHSVar() const
|
|
344
|
+
{
|
|
345
|
+
return getSrcNode();
|
|
346
|
+
}
|
|
347
|
+
inline const ValVar* getLHSVar() const
|
|
348
|
+
{
|
|
349
|
+
return getDstNode();
|
|
302
350
|
}
|
|
303
351
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
304
352
|
//@{
|
|
@@ -337,9 +385,9 @@ public:
|
|
|
337
385
|
class CmpVFGNode: public VFGNode
|
|
338
386
|
{
|
|
339
387
|
public:
|
|
340
|
-
typedef Map<u32_t,const
|
|
388
|
+
typedef Map<u32_t,const ValVar*> OPVers;
|
|
341
389
|
protected:
|
|
342
|
-
const
|
|
390
|
+
const ValVar* res;
|
|
343
391
|
OPVers opVers;
|
|
344
392
|
|
|
345
393
|
private:
|
|
@@ -349,7 +397,7 @@ private:
|
|
|
349
397
|
|
|
350
398
|
public:
|
|
351
399
|
/// Constructor
|
|
352
|
-
CmpVFGNode(NodeID id,const
|
|
400
|
+
CmpVFGNode(NodeID id,const ValVar* r): VFGNode(id,Cmp), res(r) { }
|
|
353
401
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
354
402
|
//@{
|
|
355
403
|
static inline bool classof(const CmpVFGNode *)
|
|
@@ -371,17 +419,17 @@ public:
|
|
|
371
419
|
//@}
|
|
372
420
|
/// Operands at a BinaryNode
|
|
373
421
|
//@{
|
|
374
|
-
inline const
|
|
422
|
+
inline const ValVar* getOpVer(u32_t pos) const
|
|
375
423
|
{
|
|
376
424
|
OPVers::const_iterator it = opVers.find(pos);
|
|
377
425
|
assert(it!=opVers.end() && "version is nullptr, did not rename?");
|
|
378
426
|
return it->second;
|
|
379
427
|
}
|
|
380
|
-
inline void setOpVer(u32_t pos, const
|
|
428
|
+
inline void setOpVer(u32_t pos, const ValVar* node)
|
|
381
429
|
{
|
|
382
430
|
opVers[pos] = node;
|
|
383
431
|
}
|
|
384
|
-
inline const
|
|
432
|
+
inline const ValVar* getRes() const
|
|
385
433
|
{
|
|
386
434
|
return res;
|
|
387
435
|
}
|
|
@@ -414,9 +462,9 @@ public:
|
|
|
414
462
|
class BinaryOPVFGNode: public VFGNode
|
|
415
463
|
{
|
|
416
464
|
public:
|
|
417
|
-
typedef Map<u32_t,const
|
|
465
|
+
typedef Map<u32_t,const ValVar*> OPVers;
|
|
418
466
|
protected:
|
|
419
|
-
const
|
|
467
|
+
const ValVar* res;
|
|
420
468
|
OPVers opVers;
|
|
421
469
|
|
|
422
470
|
private:
|
|
@@ -426,7 +474,7 @@ private:
|
|
|
426
474
|
|
|
427
475
|
public:
|
|
428
476
|
/// Constructor
|
|
429
|
-
BinaryOPVFGNode(NodeID id,const
|
|
477
|
+
BinaryOPVFGNode(NodeID id,const ValVar* r): VFGNode(id,BinaryOp), res(r) { }
|
|
430
478
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
431
479
|
//@{
|
|
432
480
|
static inline bool classof(const BinaryOPVFGNode *)
|
|
@@ -448,17 +496,17 @@ public:
|
|
|
448
496
|
//@}
|
|
449
497
|
/// Operands at a BinaryNode
|
|
450
498
|
//@{
|
|
451
|
-
inline const
|
|
499
|
+
inline const ValVar* getOpVer(u32_t pos) const
|
|
452
500
|
{
|
|
453
501
|
OPVers::const_iterator it = opVers.find(pos);
|
|
454
502
|
assert(it!=opVers.end() && "version is nullptr, did not rename?");
|
|
455
503
|
return it->second;
|
|
456
504
|
}
|
|
457
|
-
inline void setOpVer(u32_t pos, const
|
|
505
|
+
inline void setOpVer(u32_t pos, const ValVar* node)
|
|
458
506
|
{
|
|
459
507
|
opVers[pos] = node;
|
|
460
508
|
}
|
|
461
|
-
inline const
|
|
509
|
+
inline const ValVar* getRes() const
|
|
462
510
|
{
|
|
463
511
|
return res;
|
|
464
512
|
}
|
|
@@ -488,9 +536,9 @@ public:
|
|
|
488
536
|
class UnaryOPVFGNode: public VFGNode
|
|
489
537
|
{
|
|
490
538
|
public:
|
|
491
|
-
typedef Map<u32_t,const
|
|
539
|
+
typedef Map<u32_t,const ValVar*> OPVers;
|
|
492
540
|
protected:
|
|
493
|
-
const
|
|
541
|
+
const ValVar* res;
|
|
494
542
|
OPVers opVers;
|
|
495
543
|
|
|
496
544
|
private:
|
|
@@ -500,7 +548,7 @@ private:
|
|
|
500
548
|
|
|
501
549
|
public:
|
|
502
550
|
/// Constructor
|
|
503
|
-
UnaryOPVFGNode(NodeID id, const
|
|
551
|
+
UnaryOPVFGNode(NodeID id, const ValVar *r) : VFGNode(id, UnaryOp), res(r) { }
|
|
504
552
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
505
553
|
//@{
|
|
506
554
|
static inline bool classof(const UnaryOPVFGNode *)
|
|
@@ -522,21 +570,21 @@ public:
|
|
|
522
570
|
//@}
|
|
523
571
|
/// Operands at a UnaryNode
|
|
524
572
|
//@{
|
|
525
|
-
inline const
|
|
573
|
+
inline const ValVar* getOpVer(u32_t pos) const
|
|
526
574
|
{
|
|
527
575
|
OPVers::const_iterator it = opVers.find(pos);
|
|
528
576
|
assert(it!=opVers.end() && "version is nullptr, did not rename?");
|
|
529
577
|
return it->second;
|
|
530
578
|
}
|
|
531
|
-
inline void setOpVer(u32_t pos, const
|
|
579
|
+
inline void setOpVer(u32_t pos, const ValVar* node)
|
|
532
580
|
{
|
|
533
581
|
opVers[pos] = node;
|
|
534
582
|
}
|
|
535
|
-
inline const
|
|
583
|
+
inline const ValVar* getRes() const
|
|
536
584
|
{
|
|
537
585
|
return res;
|
|
538
586
|
}
|
|
539
|
-
inline const
|
|
587
|
+
inline const ValVar* getOpVar() const
|
|
540
588
|
{
|
|
541
589
|
assert(getOpVerNum()==1 && "UnaryNode can only have one operand!");
|
|
542
590
|
return getOpVer(0);
|
|
@@ -634,6 +682,22 @@ public:
|
|
|
634
682
|
GepVFGNode(NodeID id,const GepStmt* edge): StmtVFGNode(id,edge,Gep)
|
|
635
683
|
{
|
|
636
684
|
|
|
685
|
+
}
|
|
686
|
+
inline const ValVar* getSrcNode() const
|
|
687
|
+
{
|
|
688
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getSrcNode());
|
|
689
|
+
}
|
|
690
|
+
inline const ValVar* getDstNode() const
|
|
691
|
+
{
|
|
692
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getDstNode());
|
|
693
|
+
}
|
|
694
|
+
inline const ValVar* getRHSVar() const
|
|
695
|
+
{
|
|
696
|
+
return getSrcNode();
|
|
697
|
+
}
|
|
698
|
+
inline const ValVar* getLHSVar() const
|
|
699
|
+
{
|
|
700
|
+
return getDstNode();
|
|
637
701
|
}
|
|
638
702
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
639
703
|
//@{
|
|
@@ -671,14 +735,14 @@ class PHIVFGNode : public VFGNode
|
|
|
671
735
|
{
|
|
672
736
|
|
|
673
737
|
public:
|
|
674
|
-
typedef Map<u32_t,const
|
|
738
|
+
typedef Map<u32_t,const ValVar*> OPVers;
|
|
675
739
|
protected:
|
|
676
|
-
const
|
|
740
|
+
const ValVar* res;
|
|
677
741
|
OPVers opVers;
|
|
678
742
|
|
|
679
743
|
public:
|
|
680
744
|
/// Constructor
|
|
681
|
-
PHIVFGNode(NodeID id, const
|
|
745
|
+
PHIVFGNode(NodeID id, const ValVar* r,VFGNodeK k = TPhi);
|
|
682
746
|
|
|
683
747
|
/// Whether this phi node is of pointer type (used for pointer analysis).
|
|
684
748
|
inline bool isPTANode() const
|
|
@@ -688,17 +752,17 @@ public:
|
|
|
688
752
|
|
|
689
753
|
/// Operands at a llvm PHINode
|
|
690
754
|
//@{
|
|
691
|
-
inline const
|
|
755
|
+
inline const ValVar* getOpVer(u32_t pos) const
|
|
692
756
|
{
|
|
693
757
|
OPVers::const_iterator it = opVers.find(pos);
|
|
694
758
|
assert(it!=opVers.end() && "version is nullptr, did not rename?");
|
|
695
759
|
return it->second;
|
|
696
760
|
}
|
|
697
|
-
inline void setOpVer(u32_t pos, const
|
|
761
|
+
inline void setOpVer(u32_t pos, const ValVar* node)
|
|
698
762
|
{
|
|
699
763
|
opVers[pos] = node;
|
|
700
764
|
}
|
|
701
|
-
inline const
|
|
765
|
+
inline const ValVar* getRes() const
|
|
702
766
|
{
|
|
703
767
|
return res;
|
|
704
768
|
}
|
|
@@ -756,7 +820,7 @@ private:
|
|
|
756
820
|
OPIncomingBBs opIncomingBBs;
|
|
757
821
|
public:
|
|
758
822
|
/// Constructor
|
|
759
|
-
IntraPHIVFGNode(NodeID id, const
|
|
823
|
+
IntraPHIVFGNode(NodeID id, const ValVar* r): PHIVFGNode(id, r, TIntraPhi)
|
|
760
824
|
{
|
|
761
825
|
}
|
|
762
826
|
|
|
@@ -766,7 +830,7 @@ public:
|
|
|
766
830
|
assert(it!=opIncomingBBs.end() && "version is nullptr, did not rename?");
|
|
767
831
|
return it->second;
|
|
768
832
|
}
|
|
769
|
-
inline void setOpVerAndBB(u32_t pos, const
|
|
833
|
+
inline void setOpVerAndBB(u32_t pos, const ValVar* node, const ICFGNode* bb)
|
|
770
834
|
{
|
|
771
835
|
opVers[pos] = node;
|
|
772
836
|
opIncomingBBs[pos] = bb;
|
|
@@ -812,6 +876,22 @@ public:
|
|
|
812
876
|
AddrVFGNode(NodeID id, const AddrStmt* edge): StmtVFGNode(id, edge,Addr)
|
|
813
877
|
{
|
|
814
878
|
|
|
879
|
+
}
|
|
880
|
+
inline const ObjVar* getSrcNode() const
|
|
881
|
+
{
|
|
882
|
+
return SVFUtil::cast<ObjVar>(StmtVFGNode::getSrcNode());
|
|
883
|
+
}
|
|
884
|
+
inline const ValVar* getDstNode() const
|
|
885
|
+
{
|
|
886
|
+
return SVFUtil::cast<ValVar>(StmtVFGNode::getDstNode());
|
|
887
|
+
}
|
|
888
|
+
inline const ValVar* getLHSVar() const
|
|
889
|
+
{
|
|
890
|
+
return getDstNode();
|
|
891
|
+
}
|
|
892
|
+
inline const ObjVar* getRHSVar() const
|
|
893
|
+
{
|
|
894
|
+
return getSrcNode();
|
|
815
895
|
}
|
|
816
896
|
/// Methods for support type inquiry through isa, cast, and dyn_cast:
|
|
817
897
|
//@{
|
|
@@ -847,11 +927,11 @@ class ArgumentVFGNode : public VFGNode
|
|
|
847
927
|
{
|
|
848
928
|
|
|
849
929
|
protected:
|
|
850
|
-
const
|
|
930
|
+
const ValVar* param;
|
|
851
931
|
|
|
852
932
|
public:
|
|
853
933
|
/// Constructor
|
|
854
|
-
ArgumentVFGNode(NodeID id, const
|
|
934
|
+
ArgumentVFGNode(NodeID id, const ValVar* p, VFGNodeK k): VFGNode(id,k), param(p)
|
|
855
935
|
{
|
|
856
936
|
}
|
|
857
937
|
|
|
@@ -894,7 +974,7 @@ private:
|
|
|
894
974
|
const CallICFGNode* cs;
|
|
895
975
|
public:
|
|
896
976
|
/// Constructor
|
|
897
|
-
ActualParmVFGNode(NodeID id, const
|
|
977
|
+
ActualParmVFGNode(NodeID id, const ValVar* n, const CallICFGNode* c) :
|
|
898
978
|
ArgumentVFGNode(id, n, AParm), cs(c)
|
|
899
979
|
{
|
|
900
980
|
}
|
|
@@ -906,7 +986,7 @@ public:
|
|
|
906
986
|
}
|
|
907
987
|
|
|
908
988
|
/// Return parameter
|
|
909
|
-
inline const
|
|
989
|
+
inline const ValVar* getParam() const
|
|
910
990
|
{
|
|
911
991
|
return param;
|
|
912
992
|
}
|
|
@@ -952,13 +1032,13 @@ private:
|
|
|
952
1032
|
|
|
953
1033
|
public:
|
|
954
1034
|
/// Constructor
|
|
955
|
-
FormalParmVFGNode(NodeID id, const
|
|
1035
|
+
FormalParmVFGNode(NodeID id, const ValVar* n, const FunObjVar* f):
|
|
956
1036
|
ArgumentVFGNode(id, n, FParm), fun(f)
|
|
957
1037
|
{
|
|
958
1038
|
}
|
|
959
1039
|
|
|
960
1040
|
/// Return parameter
|
|
961
|
-
inline const
|
|
1041
|
+
inline const ValVar* getParam() const
|
|
962
1042
|
{
|
|
963
1043
|
return param;
|
|
964
1044
|
}
|
|
@@ -1028,7 +1108,7 @@ private:
|
|
|
1028
1108
|
|
|
1029
1109
|
public:
|
|
1030
1110
|
/// Constructor
|
|
1031
|
-
ActualRetVFGNode(NodeID id, const
|
|
1111
|
+
ActualRetVFGNode(NodeID id, const ValVar* n, const CallICFGNode* c) :
|
|
1032
1112
|
ArgumentVFGNode(id, n, ARet), cs(c)
|
|
1033
1113
|
{
|
|
1034
1114
|
}
|
|
@@ -1043,7 +1123,7 @@ public:
|
|
|
1043
1123
|
return cs->getCaller();
|
|
1044
1124
|
}
|
|
1045
1125
|
/// Receive parameter at callsite
|
|
1046
|
-
inline const
|
|
1126
|
+
inline const ValVar* getRev() const
|
|
1047
1127
|
{
|
|
1048
1128
|
return param;
|
|
1049
1129
|
}
|
|
@@ -1091,10 +1171,10 @@ private:
|
|
|
1091
1171
|
|
|
1092
1172
|
public:
|
|
1093
1173
|
/// Constructor
|
|
1094
|
-
FormalRetVFGNode(NodeID id, const
|
|
1174
|
+
FormalRetVFGNode(NodeID id, const ValVar* n, const FunObjVar* f);
|
|
1095
1175
|
|
|
1096
1176
|
/// Return value at callee
|
|
1097
|
-
inline const
|
|
1177
|
+
inline const ValVar* getRet() const
|
|
1098
1178
|
{
|
|
1099
1179
|
return param;
|
|
1100
1180
|
}
|
|
@@ -41,6 +41,7 @@ namespace SVF
|
|
|
41
41
|
{
|
|
42
42
|
|
|
43
43
|
class SVFVar;
|
|
44
|
+
class ValVar;
|
|
44
45
|
|
|
45
46
|
|
|
46
47
|
/*
|
|
@@ -58,7 +59,7 @@ public:
|
|
|
58
59
|
NonOverlap, Overlap, Subset, Superset, Same
|
|
59
60
|
};
|
|
60
61
|
|
|
61
|
-
typedef std::pair<const
|
|
62
|
+
typedef std::pair<const ValVar*, const SVFType*> IdxOperandPair;
|
|
62
63
|
typedef std::vector<IdxOperandPair> IdxOperandPairs;
|
|
63
64
|
|
|
64
65
|
/// Constructor
|
|
@@ -144,7 +145,7 @@ public:
|
|
|
144
145
|
u32_t getElementNum(const SVFType* type) const;
|
|
145
146
|
|
|
146
147
|
|
|
147
|
-
bool addOffsetVarAndGepTypePair(const
|
|
148
|
+
bool addOffsetVarAndGepTypePair(const ValVar* var, const SVFType* gepIterType);
|
|
148
149
|
|
|
149
150
|
/// Return TRUE if this is a constant location set.
|
|
150
151
|
bool isConstantOffset() const;
|
|
@@ -156,13 +157,13 @@ public:
|
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
/// Return byte offset from the beginning of the structure to the field where it is located for struct type
|
|
159
|
-
u32_t getStructFieldOffset(const
|
|
160
|
+
u32_t getStructFieldOffset(const ValVar* idxOperandVar, const SVFStructType* idxOperandType) const;
|
|
160
161
|
|
|
161
162
|
/// Dump location set
|
|
162
163
|
std::string dump() const;
|
|
163
164
|
|
|
164
165
|
protected:
|
|
165
|
-
inline void addIdxOperandPair(std::pair<const
|
|
166
|
+
inline void addIdxOperandPair(std::pair<const ValVar*, const SVFType*> pair)
|
|
166
167
|
{
|
|
167
168
|
idxOperandPairs.push_back(pair);
|
|
168
169
|
}
|
|
@@ -60,7 +60,7 @@ public:
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
/// Add ActualParmVFGNode
|
|
63
|
-
inline void addActualParmVFGNode(const
|
|
63
|
+
inline void addActualParmVFGNode(const ValVar* svfVar, const CallICFGNode* cs)
|
|
64
64
|
{
|
|
65
65
|
svfg->addActualParmVFGNode(svfVar, cs);
|
|
66
66
|
}
|
|
@@ -55,12 +55,12 @@ public:
|
|
|
55
55
|
typedef Map<NodeID,CallSiteSet> FunPtrToCallSitesMap;
|
|
56
56
|
typedef Map<NodeID,NodeBS> MemObjToFieldsMap;
|
|
57
57
|
typedef std::vector<const SVFStmt*> SVFStmtList;
|
|
58
|
-
typedef std::vector<const
|
|
58
|
+
typedef std::vector<const ValVar*> ValVarList;
|
|
59
59
|
typedef Map<const SVFVar*,PhiStmt*> PHINodeMap;
|
|
60
|
-
typedef Map<const FunObjVar*,
|
|
61
|
-
typedef Map<const CallICFGNode*,
|
|
62
|
-
typedef Map<const RetICFGNode*,const
|
|
63
|
-
typedef Map<const FunObjVar*,const
|
|
60
|
+
typedef Map<const FunObjVar*,ValVarList> FunToArgsListMap;
|
|
61
|
+
typedef Map<const CallICFGNode*,ValVarList> CSToArgsListMap;
|
|
62
|
+
typedef Map<const RetICFGNode*,const ValVar*> CSToRetMap;
|
|
63
|
+
typedef Map<const FunObjVar*,const ValVar*> FunToRetMap;
|
|
64
64
|
typedef Map<const FunObjVar*,SVFStmtSet> FunToPAGEdgeSetMap;
|
|
65
65
|
typedef Map<const ICFGNode*,SVFStmtList> ICFGNode2SVFStmtsMap;
|
|
66
66
|
typedef Map<NodeID, NodeID> NodeToNodeMap;
|
|
@@ -132,6 +132,16 @@ public:
|
|
|
132
132
|
{
|
|
133
133
|
return getGNode(id);
|
|
134
134
|
}
|
|
135
|
+
inline const ValVar* getValVar(NodeID id) const
|
|
136
|
+
{
|
|
137
|
+
if(const SVFVar* var = getSVFVar(id))
|
|
138
|
+
return SVFUtil::dyn_cast<ValVar>(var);
|
|
139
|
+
else
|
|
140
|
+
{
|
|
141
|
+
assert(false && "the Node is not a ValVar");
|
|
142
|
+
return nullptr;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
135
145
|
inline const ObjVar* getObjVar(NodeID id) const
|
|
136
146
|
{
|
|
137
147
|
if(const SVFVar* var = getSVFVar(id))
|
|
@@ -355,7 +365,7 @@ public:
|
|
|
355
365
|
return funArgsListMap;
|
|
356
366
|
}
|
|
357
367
|
/// Get function arguments list
|
|
358
|
-
inline const
|
|
368
|
+
inline const ValVarList& getFunArgsList(const FunObjVar* func) const
|
|
359
369
|
{
|
|
360
370
|
FunToArgsListMap::const_iterator it = funArgsListMap.find(func);
|
|
361
371
|
assert(it != funArgsListMap.end() && "this function doesn't have arguments");
|
|
@@ -372,7 +382,7 @@ public:
|
|
|
372
382
|
return callSiteArgsListMap;
|
|
373
383
|
}
|
|
374
384
|
/// Get callsite argument list
|
|
375
|
-
inline const
|
|
385
|
+
inline const ValVarList& getCallSiteArgsList(const CallICFGNode* cs) const
|
|
376
386
|
{
|
|
377
387
|
CSToArgsListMap::const_iterator it = callSiteArgsListMap.find(cs);
|
|
378
388
|
assert(it != callSiteArgsListMap.end() && "this call site doesn't have arguments");
|
|
@@ -384,7 +394,7 @@ public:
|
|
|
384
394
|
return callSiteRetMap;
|
|
385
395
|
}
|
|
386
396
|
/// Get callsite return
|
|
387
|
-
inline const
|
|
397
|
+
inline const ValVar* getCallSiteRet(const RetICFGNode* cs) const
|
|
388
398
|
{
|
|
389
399
|
CSToRetMap::const_iterator it = callSiteRetMap.find(cs);
|
|
390
400
|
assert(it != callSiteRetMap.end() && "this call site doesn't have return");
|
|
@@ -400,7 +410,7 @@ public:
|
|
|
400
410
|
return funRetMap;
|
|
401
411
|
}
|
|
402
412
|
/// Get function return list
|
|
403
|
-
inline const
|
|
413
|
+
inline const ValVar* getFunRet(const FunObjVar* func) const
|
|
404
414
|
{
|
|
405
415
|
FunToRetMap::const_iterator it = funRetMap.find(func);
|
|
406
416
|
assert(it != funRetMap.end() && "this function doesn't have return");
|
|
@@ -595,25 +605,25 @@ private:
|
|
|
595
605
|
/// Get/set method for function/callsite arguments and returns
|
|
596
606
|
//@{
|
|
597
607
|
/// Add function arguments
|
|
598
|
-
inline void addFunArgs(const FunObjVar* fun, const
|
|
608
|
+
inline void addFunArgs(const FunObjVar* fun, const ValVar* arg)
|
|
599
609
|
{
|
|
600
610
|
FunEntryICFGNode* funEntryBlockNode = icfg->getFunEntryICFGNode(fun);
|
|
601
611
|
addFunArgs(funEntryBlockNode, fun, arg);
|
|
602
612
|
}
|
|
603
613
|
|
|
604
|
-
inline void addFunArgs(FunEntryICFGNode* funEntryBlockNode, const FunObjVar* fun, const
|
|
614
|
+
inline void addFunArgs(FunEntryICFGNode* funEntryBlockNode, const FunObjVar* fun, const ValVar* arg)
|
|
605
615
|
{
|
|
606
616
|
funEntryBlockNode->addFormalParms(arg);
|
|
607
617
|
funArgsListMap[fun].push_back(arg);
|
|
608
618
|
}
|
|
609
619
|
/// Add function returns
|
|
610
|
-
inline void addFunRet(const FunObjVar* fun, const
|
|
620
|
+
inline void addFunRet(const FunObjVar* fun, const ValVar* ret)
|
|
611
621
|
{
|
|
612
622
|
FunExitICFGNode* funExitBlockNode = icfg->getFunExitICFGNode(fun);
|
|
613
623
|
addFunRet(funExitBlockNode, fun, ret);
|
|
614
624
|
}
|
|
615
625
|
|
|
616
|
-
inline void addFunRet(FunExitICFGNode* funExitBlockNode, const FunObjVar* fun, const
|
|
626
|
+
inline void addFunRet(FunExitICFGNode* funExitBlockNode, const FunObjVar* fun, const ValVar* ret)
|
|
617
627
|
{
|
|
618
628
|
funExitBlockNode->addFormalRet(ret);
|
|
619
629
|
funRetMap[fun] = ret;
|
|
@@ -625,7 +635,7 @@ private:
|
|
|
625
635
|
callSiteArgsListMap[callBlockNode].push_back(arg);
|
|
626
636
|
}
|
|
627
637
|
/// Add callsite returns
|
|
628
|
-
inline void addCallSiteRets(RetICFGNode* retBlockNode,const
|
|
638
|
+
inline void addCallSiteRets(RetICFGNode* retBlockNode,const ValVar* arg)
|
|
629
639
|
{
|
|
630
640
|
retBlockNode->addActualRet(arg);
|
|
631
641
|
callSiteRetMap[retBlockNode]= arg;
|