svf-tools 1.0.703 → 1.0.704
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/SVFIR/{SVFIRRW.h → SVFFileSystem.h} +43 -12
- package/svf/include/SVFIR/SVFModule.h +0 -4
- package/svf/include/SVFIR/SVFType.h +0 -8
- package/svf/include/SVFIR/SVFValue.h +0 -34
- package/svf/include/Util/NodeIDAllocator.h +3 -0
- package/svf/lib/SVFIR/{SVFIRRW.cpp → SVFFileSystem.cpp} +54 -8
- package/svf/lib/SVFIR/SVFModule.cpp +0 -7
- package/svf-llvm/lib/LLVMModule.cpp +0 -1
- package/svf-llvm/lib/SVFIRBuilder.cpp +1 -1
- package/svf-llvm/tools/LLVM2SVF/llvm2svf.cpp +1 -1
- package/svf-llvm/tools/WPA/wpa.cpp +1 -1
- package/svf/include/SVFIR/SVFModuleRW.h +0 -197
- package/svf/lib/SVFIR/SVFModuleRW.cpp +0 -1206
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "svf-tools",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.704",
|
|
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": {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
//===-
|
|
1
|
+
//===- SVFFileSystem.h -- SVF IR Reader and Writer ------------------------===//
|
|
2
2
|
//
|
|
3
3
|
// SVF - Static Value-Flow Analysis Framework
|
|
4
4
|
// SVF: Static Value-Flow Analysis
|
|
@@ -21,8 +21,8 @@
|
|
|
21
21
|
//
|
|
22
22
|
//===----------------------------------------------------------------------===//
|
|
23
23
|
|
|
24
|
-
#ifndef
|
|
25
|
-
#define
|
|
24
|
+
#ifndef INCLUDE_SVFFILESYSTEM_H_
|
|
25
|
+
#define INCLUDE_SVFFILESYSTEM_H_
|
|
26
26
|
|
|
27
27
|
#include "Graphs/GenericGraph.h"
|
|
28
28
|
#include "Util/SVFUtil.h"
|
|
@@ -99,6 +99,7 @@ namespace SVF
|
|
|
99
99
|
{
|
|
100
100
|
/// @brief Forward declarations.
|
|
101
101
|
///@{
|
|
102
|
+
class NodeIDAllocator;
|
|
102
103
|
// Classes created upon SVFMoudle construction
|
|
103
104
|
class SVFType;
|
|
104
105
|
class SVFPointerType;
|
|
@@ -404,6 +405,7 @@ private:
|
|
|
404
405
|
|
|
405
406
|
const char* numToStr(size_t n);
|
|
406
407
|
|
|
408
|
+
cJSON* toJson(const NodeIDAllocator* nodeIDAllocator);
|
|
407
409
|
cJSON* toJson(const SymbolTableInfo* symTable);
|
|
408
410
|
cJSON* toJson(const SVFModule* module);
|
|
409
411
|
cJSON* toJson(const SVFType* type);
|
|
@@ -582,6 +584,14 @@ private:
|
|
|
582
584
|
return root;
|
|
583
585
|
}
|
|
584
586
|
|
|
587
|
+
/** The following 2 functions are intended to convert SparseBitVectors
|
|
588
|
+
* to JSON. But they're buggy. Commentting them out would enable the
|
|
589
|
+
* toJson(T) where is_iterable_v<T> is true. But that implementation is less
|
|
590
|
+
* space-efficient if the bitvector contains many elements.
|
|
591
|
+
* It is observed that upon construction, SVF IR bitvectors contain at most
|
|
592
|
+
* 1 element. In that case, we can just use the toJson(T) for iterable T
|
|
593
|
+
* without much space overhead.
|
|
594
|
+
|
|
585
595
|
template <unsigned ElementSize>
|
|
586
596
|
cJSON* toJson(const SparseBitVectorElement<ElementSize>& element)
|
|
587
597
|
{
|
|
@@ -598,6 +608,7 @@ private:
|
|
|
598
608
|
{
|
|
599
609
|
return toJson(bv.Elements);
|
|
600
610
|
}
|
|
611
|
+
*/
|
|
601
612
|
|
|
602
613
|
template <typename T, typename U> cJSON* toJson(const std::pair<T, U>& pair)
|
|
603
614
|
{
|
|
@@ -652,7 +663,7 @@ template <typename T, typename = void> struct KindBaseHelper
|
|
|
652
663
|
using type = B; \
|
|
653
664
|
static inline s64_t getKind(T* p) \
|
|
654
665
|
{ \
|
|
655
|
-
return p->KindGetter();
|
|
666
|
+
return {p->KindGetter()}; \
|
|
656
667
|
} \
|
|
657
668
|
}
|
|
658
669
|
KIND_BASE(SVFType, getKind);
|
|
@@ -797,6 +808,14 @@ public:
|
|
|
797
808
|
{
|
|
798
809
|
return ptrPool.size();
|
|
799
810
|
}
|
|
811
|
+
|
|
812
|
+
template <typename Set> void saveToSet(Set& set) const
|
|
813
|
+
{
|
|
814
|
+
for (T* obj : ptrPool)
|
|
815
|
+
{
|
|
816
|
+
set.insert(obj);
|
|
817
|
+
}
|
|
818
|
+
}
|
|
800
819
|
};
|
|
801
820
|
|
|
802
821
|
template <typename NodeTy, typename EdgeTy> class GenericGraphReader
|
|
@@ -949,6 +968,9 @@ public:
|
|
|
949
968
|
|
|
950
969
|
class SVFModuleReader
|
|
951
970
|
{
|
|
971
|
+
friend class SVFIRReader;
|
|
972
|
+
|
|
973
|
+
private:
|
|
952
974
|
const cJSON* svfModuleFieldJson = nullptr;
|
|
953
975
|
ReaderPtrPool<SVFType> svfTypePool;
|
|
954
976
|
ReaderPtrPool<StInfo> stInfoPool;
|
|
@@ -1063,11 +1085,12 @@ private:
|
|
|
1063
1085
|
SVFIR* read(const cJSON* root);
|
|
1064
1086
|
const cJSON* createObjs(const cJSON* root);
|
|
1065
1087
|
|
|
1066
|
-
void readJson(
|
|
1067
|
-
void readJson(
|
|
1068
|
-
void readJson(
|
|
1069
|
-
void readJson(
|
|
1070
|
-
void readJson(
|
|
1088
|
+
void readJson(const cJSON* obj, NodeIDAllocator* idAllocator);
|
|
1089
|
+
void readJson(SymbolTableInfo* symTabInfo);
|
|
1090
|
+
void readJson(IRGraph* graph); // IRGraph Graph
|
|
1091
|
+
void readJson(ICFG* icfg); // ICFG Graph
|
|
1092
|
+
void readJson(CHGraph* graph); // CHGraph Graph
|
|
1093
|
+
void readJson(SVFModule* module);
|
|
1071
1094
|
|
|
1072
1095
|
void readJson(const cJSON* obj, SVFType*& type);
|
|
1073
1096
|
void readJson(const cJSON* obj, StInfo*& stInfo);
|
|
@@ -1077,7 +1100,6 @@ private:
|
|
|
1077
1100
|
void readJson(const cJSON* obj, SVFStmt*& stmt); // IRGraph Edge
|
|
1078
1101
|
void readJson(const cJSON* obj, ICFGNode*& node); // ICFG Node
|
|
1079
1102
|
void readJson(const cJSON* obj, ICFGEdge*& edge); // ICFG Edge
|
|
1080
|
-
// void readJson(const cJSON* obj, CHGraph*& graph); // CHGraph Graph
|
|
1081
1103
|
void readJson(const cJSON* obj, CHNode*& node); // CHGraph Node
|
|
1082
1104
|
void readJson(const cJSON* obj, CHEdge*& edge); // CHGraph Edge
|
|
1083
1105
|
void readJson(const cJSON* obj, CallSite& cs); // CHGraph's csToClassMap
|
|
@@ -1093,15 +1115,24 @@ private:
|
|
|
1093
1115
|
template <unsigned ElementSize>
|
|
1094
1116
|
inline void readJson(const cJSON* obj, SparseBitVector<ElementSize>& bv)
|
|
1095
1117
|
{
|
|
1096
|
-
|
|
1118
|
+
ABORT_IFNOT(jsonIsArray(obj), "SparseBitVector should be an array");
|
|
1119
|
+
jsonForEach(nObj, obj)
|
|
1120
|
+
{
|
|
1121
|
+
unsigned n;
|
|
1122
|
+
readJson(nObj, n);
|
|
1123
|
+
bv.set(n);
|
|
1124
|
+
}
|
|
1097
1125
|
}
|
|
1098
1126
|
|
|
1127
|
+
/* See comment of toJson(SparseBitVectorElement) for reason of commenting
|
|
1128
|
+
it out.
|
|
1099
1129
|
template <unsigned ElementSize>
|
|
1100
1130
|
inline void readJson(const cJSON* obj,
|
|
1101
1131
|
SparseBitVectorElement<ElementSize>& element)
|
|
1102
1132
|
{
|
|
1103
1133
|
readJson(obj, element.Bits);
|
|
1104
1134
|
}
|
|
1135
|
+
*/
|
|
1105
1136
|
|
|
1106
1137
|
/// @brief Read a pointer of some child class of
|
|
1107
1138
|
/// SVFType/SVFValue/SVFVar/SVFStmt/ICFGNode/ICFGEdge/CHNode/CHEdge
|
|
@@ -1299,4 +1330,4 @@ private:
|
|
|
1299
1330
|
|
|
1300
1331
|
} // namespace SVF
|
|
1301
1332
|
|
|
1302
|
-
#endif // !
|
|
1333
|
+
#endif // !INCLUDE_SVFFILESYSTEM_H_
|
|
@@ -40,8 +40,6 @@ namespace SVF
|
|
|
40
40
|
|
|
41
41
|
class SVFModule
|
|
42
42
|
{
|
|
43
|
-
friend class SVFModuleWrite;
|
|
44
|
-
friend class SVFModuleRead;
|
|
45
43
|
friend class SVFIRWriter;
|
|
46
44
|
friend class SVFIRReader;
|
|
47
45
|
|
|
@@ -79,8 +77,6 @@ public:
|
|
|
79
77
|
|
|
80
78
|
~SVFModule();
|
|
81
79
|
|
|
82
|
-
void writeToJson(const std::string& filePath);
|
|
83
|
-
|
|
84
80
|
static inline void setPagFromTXT(const std::string& txt)
|
|
85
81
|
{
|
|
86
82
|
pagReadFromTxt = txt;
|
|
@@ -130,8 +130,6 @@ typedef Set<VersionedVar> VersionedVarSet;
|
|
|
130
130
|
*/
|
|
131
131
|
class StInfo
|
|
132
132
|
{
|
|
133
|
-
friend class SVFModuleWrite;
|
|
134
|
-
friend class SVFModuleRead;
|
|
135
133
|
friend class SVFIRWriter;
|
|
136
134
|
friend class SVFIRReader;
|
|
137
135
|
|
|
@@ -242,8 +240,6 @@ public:
|
|
|
242
240
|
|
|
243
241
|
class SVFType
|
|
244
242
|
{
|
|
245
|
-
friend class SVFModuleWrite;
|
|
246
|
-
friend class SVFModuleRead;
|
|
247
243
|
friend class SVFIRWriter;
|
|
248
244
|
friend class SVFIRReader;
|
|
249
245
|
|
|
@@ -329,8 +325,6 @@ public:
|
|
|
329
325
|
|
|
330
326
|
class SVFPointerType : public SVFType
|
|
331
327
|
{
|
|
332
|
-
friend class SVFModuleWrite;
|
|
333
|
-
friend class SVFModuleRead;
|
|
334
328
|
friend class SVFIRWriter;
|
|
335
329
|
friend class SVFIRReader;
|
|
336
330
|
|
|
@@ -364,8 +358,6 @@ public:
|
|
|
364
358
|
|
|
365
359
|
class SVFFunctionType : public SVFType
|
|
366
360
|
{
|
|
367
|
-
friend class SVFModuleWrite;
|
|
368
|
-
friend class SVFModuleRead;
|
|
369
361
|
friend class SVFIRWriter;
|
|
370
362
|
friend class SVFIRReader;
|
|
371
363
|
|
|
@@ -49,8 +49,6 @@ class SVFType;
|
|
|
49
49
|
|
|
50
50
|
class SVFLoopAndDomInfo
|
|
51
51
|
{
|
|
52
|
-
friend class SVFModuleWrite;
|
|
53
|
-
friend class SVFModuleRead;
|
|
54
52
|
friend class SVFIRWriter;
|
|
55
53
|
friend class SVFIRReader;
|
|
56
54
|
public:
|
|
@@ -151,8 +149,6 @@ public:
|
|
|
151
149
|
|
|
152
150
|
class SVFValue
|
|
153
151
|
{
|
|
154
|
-
friend class SVFModuleWrite;
|
|
155
|
-
friend class SVFModuleRead;
|
|
156
152
|
friend class SVFIRWriter;
|
|
157
153
|
friend class SVFIRReader;
|
|
158
154
|
friend class LLVMModuleSet;
|
|
@@ -268,8 +264,6 @@ public:
|
|
|
268
264
|
class SVFFunction : public SVFValue
|
|
269
265
|
{
|
|
270
266
|
friend class LLVMModuleSet;
|
|
271
|
-
friend class SVFModuleWrite;
|
|
272
|
-
friend class SVFModuleRead;
|
|
273
267
|
friend class SVFIRWriter;
|
|
274
268
|
friend class SVFIRReader;
|
|
275
269
|
|
|
@@ -486,8 +480,6 @@ public:
|
|
|
486
480
|
class SVFBasicBlock : public SVFValue
|
|
487
481
|
{
|
|
488
482
|
friend class LLVMModuleSet;
|
|
489
|
-
friend class SVFModuleWrite;
|
|
490
|
-
friend class SVFModuleRead;
|
|
491
483
|
friend class SVFIRWriter;
|
|
492
484
|
friend class SVFIRReader;
|
|
493
485
|
|
|
@@ -588,8 +580,6 @@ public:
|
|
|
588
580
|
|
|
589
581
|
class SVFInstruction : public SVFValue
|
|
590
582
|
{
|
|
591
|
-
friend class SVFModuleWrite;
|
|
592
|
-
friend class SVFModuleRead;
|
|
593
583
|
friend class SVFIRWriter;
|
|
594
584
|
friend class SVFIRReader;
|
|
595
585
|
public:
|
|
@@ -657,8 +647,6 @@ public:
|
|
|
657
647
|
|
|
658
648
|
class SVFCallInst : public SVFInstruction
|
|
659
649
|
{
|
|
660
|
-
friend class SVFModuleWrite;
|
|
661
|
-
friend class SVFModuleRead;
|
|
662
650
|
friend class SVFIRWriter;
|
|
663
651
|
friend class SVFIRReader;
|
|
664
652
|
friend class LLVMModuleSet;
|
|
@@ -733,8 +721,6 @@ public:
|
|
|
733
721
|
|
|
734
722
|
class SVFVirtualCallInst : public SVFCallInst
|
|
735
723
|
{
|
|
736
|
-
friend class SVFModuleWrite;
|
|
737
|
-
friend class SVFModuleRead;
|
|
738
724
|
friend class SVFIRWriter;
|
|
739
725
|
friend class SVFIRReader;
|
|
740
726
|
friend class LLVMModuleSet;
|
|
@@ -793,8 +779,6 @@ public:
|
|
|
793
779
|
|
|
794
780
|
class SVFConstant : public SVFValue
|
|
795
781
|
{
|
|
796
|
-
friend class SVFModuleWrite;
|
|
797
|
-
friend class SVFModuleRead;
|
|
798
782
|
friend class SVFIRWriter;
|
|
799
783
|
friend class SVFIRReader;
|
|
800
784
|
public:
|
|
@@ -817,8 +801,6 @@ public:
|
|
|
817
801
|
|
|
818
802
|
class SVFGlobalValue : public SVFConstant
|
|
819
803
|
{
|
|
820
|
-
friend class SVFModuleWrite;
|
|
821
|
-
friend class SVFModuleRead;
|
|
822
804
|
friend class SVFIRWriter;
|
|
823
805
|
friend class SVFIRReader;
|
|
824
806
|
friend class LLVMModuleSet;
|
|
@@ -857,8 +839,6 @@ public:
|
|
|
857
839
|
|
|
858
840
|
class SVFArgument : public SVFValue
|
|
859
841
|
{
|
|
860
|
-
friend class SVFModuleWrite;
|
|
861
|
-
friend class SVFModuleRead;
|
|
862
842
|
friend class SVFIRWriter;
|
|
863
843
|
friend class SVFIRReader;
|
|
864
844
|
private:
|
|
@@ -898,8 +878,6 @@ public:
|
|
|
898
878
|
|
|
899
879
|
class SVFConstantData : public SVFConstant
|
|
900
880
|
{
|
|
901
|
-
friend class SVFModuleWrite;
|
|
902
|
-
friend class SVFModuleRead;
|
|
903
881
|
friend class SVFIRWriter;
|
|
904
882
|
friend class SVFIRReader;
|
|
905
883
|
public:
|
|
@@ -929,8 +907,6 @@ public:
|
|
|
929
907
|
|
|
930
908
|
class SVFConstantInt : public SVFConstantData
|
|
931
909
|
{
|
|
932
|
-
friend class SVFModuleWrite;
|
|
933
|
-
friend class SVFModuleRead;
|
|
934
910
|
friend class SVFIRWriter;
|
|
935
911
|
friend class SVFIRReader;
|
|
936
912
|
private:
|
|
@@ -965,8 +941,6 @@ public:
|
|
|
965
941
|
|
|
966
942
|
class SVFConstantFP : public SVFConstantData
|
|
967
943
|
{
|
|
968
|
-
friend class SVFModuleWrite;
|
|
969
|
-
friend class SVFModuleRead;
|
|
970
944
|
friend class SVFIRWriter;
|
|
971
945
|
friend class SVFIRReader;
|
|
972
946
|
private:
|
|
@@ -994,8 +968,6 @@ public:
|
|
|
994
968
|
|
|
995
969
|
class SVFConstantNullPtr : public SVFConstantData
|
|
996
970
|
{
|
|
997
|
-
friend class SVFModuleWrite;
|
|
998
|
-
friend class SVFModuleRead;
|
|
999
971
|
friend class SVFIRWriter;
|
|
1000
972
|
friend class SVFIRReader;
|
|
1001
973
|
|
|
@@ -1017,8 +989,6 @@ public:
|
|
|
1017
989
|
|
|
1018
990
|
class SVFBlackHoleValue : public SVFConstantData
|
|
1019
991
|
{
|
|
1020
|
-
friend class SVFModuleWrite;
|
|
1021
|
-
friend class SVFModuleRead;
|
|
1022
992
|
friend class SVFIRWriter;
|
|
1023
993
|
friend class SVFIRReader;
|
|
1024
994
|
|
|
@@ -1040,8 +1010,6 @@ public:
|
|
|
1040
1010
|
|
|
1041
1011
|
class SVFOtherValue : public SVFValue
|
|
1042
1012
|
{
|
|
1043
|
-
friend class SVFModuleWrite;
|
|
1044
|
-
friend class SVFModuleRead;
|
|
1045
1013
|
friend class SVFIRWriter;
|
|
1046
1014
|
friend class SVFIRReader;
|
|
1047
1015
|
public:
|
|
@@ -1061,8 +1029,6 @@ public:
|
|
|
1061
1029
|
*/
|
|
1062
1030
|
class SVFMetadataAsValue : public SVFOtherValue
|
|
1063
1031
|
{
|
|
1064
|
-
friend class SVFModuleWrite;
|
|
1065
|
-
friend class SVFModuleRead;
|
|
1066
1032
|
friend class SVFIRWriter;
|
|
1067
1033
|
friend class SVFIRReader;
|
|
1068
1034
|
public:
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#include "SVFIR/
|
|
1
|
+
#include "SVFIR/SVFFileSystem.h"
|
|
2
2
|
#include "Graphs/CHG.h"
|
|
3
3
|
#include "SVFIR/SVFIR.h"
|
|
4
4
|
#include "Util/CommandLine.h"
|
|
@@ -1022,6 +1022,8 @@ SVFIRWriter::autoCStr SVFIRWriter::generateJsonString()
|
|
|
1022
1022
|
SVFIRWriter::autoJSON SVFIRWriter::generateJson()
|
|
1023
1023
|
{
|
|
1024
1024
|
const IRGraph* const irGraph = svfIR;
|
|
1025
|
+
NodeIDAllocator* nodeIDAllocator = NodeIDAllocator::allocator;
|
|
1026
|
+
assert(nodeIDAllocator && "NodeIDAllocator is not initialized?");
|
|
1025
1027
|
|
|
1026
1028
|
cJSON* root = jsonCreateObject();
|
|
1027
1029
|
#define F(field) JSON_WRITE_FIELD(root, svfIR, field)
|
|
@@ -1033,6 +1035,7 @@ SVFIRWriter::autoJSON SVFIRWriter::generateJson()
|
|
|
1033
1035
|
F(icfgNode2SVFStmtsMap);
|
|
1034
1036
|
F(icfgNode2PTASVFStmtsMap);
|
|
1035
1037
|
F(GepValObjMap);
|
|
1038
|
+
F(typeLocSetsMap);
|
|
1036
1039
|
F(GepObjVarMap);
|
|
1037
1040
|
F(memToFieldsMap);
|
|
1038
1041
|
F(globSVFStmtSet);
|
|
@@ -1045,6 +1048,7 @@ SVFIRWriter::autoJSON SVFIRWriter::generateJson()
|
|
|
1045
1048
|
F(funPtrToCallSitesMap);
|
|
1046
1049
|
F(candidatePointers);
|
|
1047
1050
|
F(callSiteSet);
|
|
1051
|
+
jsonAddJsonableToObject(root, FIELD_NAME_ITEM(nodeIDAllocator));
|
|
1048
1052
|
#undef F
|
|
1049
1053
|
|
|
1050
1054
|
return {root, cJSON_Delete};
|
|
@@ -1237,6 +1241,19 @@ cJSON* SVFIRWriter::toJson(const LocationSet& ls)
|
|
|
1237
1241
|
return root;
|
|
1238
1242
|
}
|
|
1239
1243
|
|
|
1244
|
+
cJSON* SVFIRWriter::toJson(const NodeIDAllocator* nodeIDAllocator)
|
|
1245
|
+
{
|
|
1246
|
+
ENSURE_NOT_VISITED(nodeIDAllocator);
|
|
1247
|
+
|
|
1248
|
+
cJSON* root = jsonCreateObject();
|
|
1249
|
+
JSON_WRITE_FIELD(root, nodeIDAllocator, strategy);
|
|
1250
|
+
JSON_WRITE_FIELD(root, nodeIDAllocator, numObjects);
|
|
1251
|
+
JSON_WRITE_FIELD(root, nodeIDAllocator, numValues);
|
|
1252
|
+
JSON_WRITE_FIELD(root, nodeIDAllocator, numSymbols);
|
|
1253
|
+
JSON_WRITE_FIELD(root, nodeIDAllocator, numNodes);
|
|
1254
|
+
return root;
|
|
1255
|
+
}
|
|
1256
|
+
|
|
1240
1257
|
cJSON* SVFIRWriter::toJson(const SymbolTableInfo* symTable)
|
|
1241
1258
|
{
|
|
1242
1259
|
ENSURE_NOT_VISITED(symTable);
|
|
@@ -1323,14 +1340,15 @@ SVFIR* SVFIRReader::read(const cJSON* root)
|
|
|
1323
1340
|
auto svfModule = new SVFModule();
|
|
1324
1341
|
auto icfg = new ICFG();
|
|
1325
1342
|
auto chgraph = new CHGraph(svfModule);
|
|
1326
|
-
auto
|
|
1343
|
+
auto symInfo = SymbolTableInfo::SymbolInfo();
|
|
1344
|
+
symInfo->mod = svfModule;
|
|
1327
1345
|
|
|
1328
1346
|
svfIR->svfModule = svfModule;
|
|
1329
1347
|
svfIR->icfg = icfg;
|
|
1330
1348
|
svfIR->chgraph = chgraph;
|
|
1331
1349
|
|
|
1332
1350
|
#define F(field) JSON_READ_FIELD_FWD(svfirField, svfIR, field)
|
|
1333
|
-
readJson(
|
|
1351
|
+
readJson(symInfo);
|
|
1334
1352
|
readJson(irGraph);
|
|
1335
1353
|
readJson(icfg);
|
|
1336
1354
|
readJson(chgraph);
|
|
@@ -1339,6 +1357,7 @@ SVFIR* SVFIRReader::read(const cJSON* root)
|
|
|
1339
1357
|
F(icfgNode2SVFStmtsMap);
|
|
1340
1358
|
F(icfgNode2PTASVFStmtsMap);
|
|
1341
1359
|
F(GepValObjMap);
|
|
1360
|
+
F(typeLocSetsMap);
|
|
1342
1361
|
F(GepObjVarMap);
|
|
1343
1362
|
F(memToFieldsMap);
|
|
1344
1363
|
F(globSVFStmtSet);
|
|
@@ -1352,6 +1371,9 @@ SVFIR* SVFIRReader::read(const cJSON* root)
|
|
|
1352
1371
|
F(candidatePointers);
|
|
1353
1372
|
F(callSiteSet);
|
|
1354
1373
|
#undef F
|
|
1374
|
+
assert(!NodeIDAllocator::allocator && "NodeIDAllocator should be NULL");
|
|
1375
|
+
auto nodeIDAllocator = NodeIDAllocator::get();
|
|
1376
|
+
JSON_READ_OBJ_FWD(svfirField, nodeIDAllocator);
|
|
1355
1377
|
|
|
1356
1378
|
return svfIR;
|
|
1357
1379
|
}
|
|
@@ -1636,7 +1658,26 @@ SVFStmt* SVFIRReader::createPAGEdge(GEdgeKind kind)
|
|
|
1636
1658
|
}
|
|
1637
1659
|
}
|
|
1638
1660
|
|
|
1639
|
-
void SVFIRReader::readJson(
|
|
1661
|
+
void SVFIRReader::readJson(const cJSON* obj, NodeIDAllocator* idAllocator)
|
|
1662
|
+
{
|
|
1663
|
+
assert(idAllocator && "idAllocator should be nonempty");
|
|
1664
|
+
|
|
1665
|
+
ABORT_IFNOT(jsonIsObject(obj), "Expect object for " << JSON_KEY(obj));
|
|
1666
|
+
obj = obj->child;
|
|
1667
|
+
|
|
1668
|
+
JSON_DEF_READ_FWD(obj, int, strategy);
|
|
1669
|
+
static_assert(sizeof(idAllocator->strategy) == sizeof(strategy),
|
|
1670
|
+
"idAllocator->strategy should be represented by int");
|
|
1671
|
+
idAllocator->strategy = static_cast<NodeIDAllocator::Strategy>(strategy);
|
|
1672
|
+
JSON_READ_FIELD_FWD(obj, idAllocator, numObjects);
|
|
1673
|
+
JSON_READ_FIELD_FWD(obj, idAllocator, numValues);
|
|
1674
|
+
JSON_READ_FIELD_FWD(obj, idAllocator, numSymbols);
|
|
1675
|
+
JSON_READ_FIELD_FWD(obj, idAllocator, numNodes);
|
|
1676
|
+
|
|
1677
|
+
ABORT_IFNOT(!obj, "Extra field " << JSON_KEY(obj) << " in NodeIDAllocator");
|
|
1678
|
+
}
|
|
1679
|
+
|
|
1680
|
+
void SVFIRReader::readJson(SymbolTableInfo* symTabInfo)
|
|
1640
1681
|
{
|
|
1641
1682
|
const cJSON* obj = symTableReader.getFieldJson();
|
|
1642
1683
|
#define F(field) JSON_READ_FIELD_FWD(obj, symTabInfo, field)
|
|
@@ -1654,7 +1695,7 @@ void SVFIRReader::readJson(SymbolTableInfo*& symTabInfo)
|
|
|
1654
1695
|
ABORT_IFNOT(!obj, "Extra field " << JSON_KEY(obj) << " in SymbolTableInfo");
|
|
1655
1696
|
}
|
|
1656
1697
|
|
|
1657
|
-
void SVFIRReader::readJson(IRGraph
|
|
1698
|
+
void SVFIRReader::readJson(IRGraph* graph)
|
|
1658
1699
|
{
|
|
1659
1700
|
assert(SymbolTableInfo::symInfo && "SymbolTableInfo should be nonempty");
|
|
1660
1701
|
assert(graph->symInfo == SymbolTableInfo::SymbolInfo() && "symInfo differ");
|
|
@@ -1679,7 +1720,7 @@ void SVFIRReader::readJson(IRGraph*& graph)
|
|
|
1679
1720
|
ABORT_IFNOT(nullit->second.empty(), "valueToEdgeMap[NULL] should be empty");
|
|
1680
1721
|
}
|
|
1681
1722
|
|
|
1682
|
-
void SVFIRReader::readJson(ICFG
|
|
1723
|
+
void SVFIRReader::readJson(ICFG* icfg)
|
|
1683
1724
|
{
|
|
1684
1725
|
icfgReader.saveToGenericGraph(icfg);
|
|
1685
1726
|
const cJSON* obj = icfgReader.getFieldJson();
|
|
@@ -1695,7 +1736,7 @@ void SVFIRReader::readJson(ICFG*& icfg)
|
|
|
1695
1736
|
#undef F
|
|
1696
1737
|
}
|
|
1697
1738
|
|
|
1698
|
-
void SVFIRReader::readJson(CHGraph
|
|
1739
|
+
void SVFIRReader::readJson(CHGraph* graph)
|
|
1699
1740
|
{
|
|
1700
1741
|
chGraphReader.saveToGenericGraph(graph);
|
|
1701
1742
|
const cJSON* obj = chGraphReader.getFieldJson();
|
|
@@ -1714,9 +1755,14 @@ void SVFIRReader::readJson(CHGraph*& graph)
|
|
|
1714
1755
|
#undef F
|
|
1715
1756
|
}
|
|
1716
1757
|
|
|
1717
|
-
void SVFIRReader::readJson(SVFModule
|
|
1758
|
+
void SVFIRReader::readJson(SVFModule* module)
|
|
1718
1759
|
{
|
|
1719
1760
|
const cJSON* obj = svfModuleReader.getFieldJson();
|
|
1761
|
+
auto symInfo = SymbolTableInfo::symInfo;
|
|
1762
|
+
assert(symInfo && "SymbolTableInfo should be non-NULL");
|
|
1763
|
+
svfModuleReader.svfTypePool.saveToSet(symInfo->svfTypes);
|
|
1764
|
+
svfModuleReader.stInfoPool.saveToSet(symInfo->stInfos);
|
|
1765
|
+
|
|
1720
1766
|
#define F(field) JSON_READ_FIELD_FWD(obj, module, field)
|
|
1721
1767
|
F(pagReadFromTxt);
|
|
1722
1768
|
F(moduleIdentifier);
|
|
@@ -22,7 +22,6 @@
|
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
#include "SVFIR/SVFModule.h"
|
|
25
|
-
#include "SVFIR/SVFModuleRW.h"
|
|
26
25
|
#include "SVFIR/SymbolTableInfo.h"
|
|
27
26
|
#include "Util/SVFUtil.h"
|
|
28
27
|
#include "Util/SVFStat.h"
|
|
@@ -54,9 +53,3 @@ const SVFFunction* SVFModule::getSVFFunction(const std::string& name)
|
|
|
54
53
|
}
|
|
55
54
|
return nullptr;
|
|
56
55
|
}
|
|
57
|
-
|
|
58
|
-
void SVFModule::writeToJson(const std::string& filePath)
|
|
59
|
-
{
|
|
60
|
-
if (!filePath.empty())
|
|
61
|
-
SVFModuleWrite(this, filePath);
|
|
62
|
-
}
|