svf-tools 1.0.812 → 1.0.813
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-doxygen/html/ConsExeState_8cpp_source.html +21 -21
- package/SVF-doxygen/html/ConsExeState_8h_source.html +384 -385
- package/SVF-doxygen/html/ExeState_8cpp_source.html +24 -24
- package/SVF-doxygen/html/ExeState_8h_source.html +227 -217
- package/SVF-doxygen/html/IntervalExeState_8cpp_source.html +8 -8
- package/SVF-doxygen/html/IntervalExeState_8h_source.html +412 -408
- package/SVF-doxygen/html/RelationSolver_8cpp_source.html +3 -3
- package/SVF-doxygen/html/SVFIR2ConsExeState_8cpp_source.html +43 -43
- package/SVF-doxygen/html/SVFIR2ConsExeState_8h_source.html +18 -18
- package/SVF-doxygen/html/SVFIR2ItvExeState_8cpp_source.html +250 -262
- package/SVF-doxygen/html/SVFIR2ItvExeState_8h_source.html +103 -101
- package/SVF-doxygen/html/SymState_8h_source.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1ConsExeState-members.html +74 -74
- package/SVF-doxygen/html/classSVF_1_1ConsExeState.html +412 -394
- package/SVF-doxygen/html/classSVF_1_1ExeState-members.html +34 -34
- package/SVF-doxygen/html/classSVF_1_1ExeState.html +287 -272
- package/SVF-doxygen/html/classSVF_1_1IntervalExeState-members.html +78 -78
- package/SVF-doxygen/html/classSVF_1_1IntervalExeState.html +445 -434
- package/SVF-doxygen/html/classSVF_1_1RelationSolver.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1SVFIR2ConsExeState-members.html +28 -28
- package/SVF-doxygen/html/classSVF_1_1SVFIR2ConsExeState.html +77 -77
- package/SVF-doxygen/html/classSVF_1_1SVFIR2ItvExeState-members.html +40 -40
- package/SVF-doxygen/html/classSVF_1_1SVFIR2ItvExeState.html +372 -372
- package/SVF-doxygen/html/classSVF_1_1SymState.html +2 -2
- package/SVF-doxygen/html/functions.html +6 -6
- package/SVF-doxygen/html/functions_a.html +13 -8
- package/SVF-doxygen/html/functions_b.html +3 -3
- package/SVF-doxygen/html/functions_e.html +2 -2
- package/SVF-doxygen/html/functions_func_e.html +2 -2
- package/SVF-doxygen/html/functions_func_g.html +32 -35
- package/SVF-doxygen/html/functions_func_i.html +11 -21
- package/SVF-doxygen/html/functions_func_l.html +6 -6
- package/SVF-doxygen/html/functions_func_n.html +3 -3
- package/SVF-doxygen/html/functions_func_p.html +2 -2
- package/SVF-doxygen/html/functions_func_s.html +7 -7
- package/SVF-doxygen/html/functions_func_w.html +3 -3
- package/SVF-doxygen/html/functions_g.html +27 -30
- package/SVF-doxygen/html/functions_i.html +13 -23
- package/SVF-doxygen/html/functions_l.html +8 -8
- package/SVF-doxygen/html/functions_n.html +7 -7
- package/SVF-doxygen/html/functions_o.html +4 -4
- package/SVF-doxygen/html/functions_p.html +9 -9
- package/SVF-doxygen/html/functions_r.html +1 -1
- package/SVF-doxygen/html/functions_s.html +19 -17
- package/SVF-doxygen/html/functions_t.html +7 -7
- package/SVF-doxygen/html/functions_type.html +5 -0
- package/SVF-doxygen/html/functions_type_v.html +3 -8
- package/SVF-doxygen/html/functions_v.html +13 -16
- package/SVF-doxygen/html/functions_vars.html +6 -6
- package/SVF-doxygen/html/functions_vars_g.html +2 -2
- package/SVF-doxygen/html/functions_w.html +3 -3
- package/SVF-doxygen/html/search/all_0.js +4 -4
- package/SVF-doxygen/html/search/all_1.js +210 -209
- package/SVF-doxygen/html/search/all_10.js +324 -324
- package/SVF-doxygen/html/search/all_11.js +222 -222
- package/SVF-doxygen/html/search/all_12.js +544 -544
- package/SVF-doxygen/html/search/all_13.js +191 -191
- package/SVF-doxygen/html/search/all_14.js +67 -67
- package/SVF-doxygen/html/search/all_15.js +167 -169
- package/SVF-doxygen/html/search/all_16.js +63 -63
- package/SVF-doxygen/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/search/all_18.js +1 -1
- package/SVF-doxygen/html/search/all_19.js +11 -11
- package/SVF-doxygen/html/search/all_1a.js +172 -172
- package/SVF-doxygen/html/search/all_2.js +169 -169
- package/SVF-doxygen/html/search/all_3.js +642 -642
- package/SVF-doxygen/html/search/all_4.js +233 -233
- package/SVF-doxygen/html/search/all_5.js +119 -119
- package/SVF-doxygen/html/search/all_6.js +225 -225
- package/SVF-doxygen/html/search/all_7.js +946 -947
- package/SVF-doxygen/html/search/all_9.js +481 -486
- package/SVF-doxygen/html/search/all_a.js +46 -46
- package/SVF-doxygen/html/search/all_b.js +26 -26
- package/SVF-doxygen/html/search/all_c.js +116 -116
- package/SVF-doxygen/html/search/all_d.js +196 -196
- package/SVF-doxygen/html/search/all_e.js +207 -207
- package/SVF-doxygen/html/search/all_f.js +115 -115
- package/SVF-doxygen/html/search/classes_0.js +26 -26
- package/SVF-doxygen/html/search/classes_1.js +9 -9
- package/SVF-doxygen/html/search/classes_10.js +73 -73
- package/SVF-doxygen/html/search/classes_11.js +15 -15
- package/SVF-doxygen/html/search/classes_12.js +2 -2
- package/SVF-doxygen/html/search/classes_13.js +10 -10
- package/SVF-doxygen/html/search/classes_14.js +14 -14
- package/SVF-doxygen/html/search/classes_15.js +1 -1
- package/SVF-doxygen/html/search/classes_2.js +80 -80
- package/SVF-doxygen/html/search/classes_3.js +37 -37
- package/SVF-doxygen/html/search/classes_4.js +9 -9
- package/SVF-doxygen/html/search/classes_5.js +28 -28
- package/SVF-doxygen/html/search/classes_6.js +104 -104
- package/SVF-doxygen/html/search/classes_7.js +33 -33
- package/SVF-doxygen/html/search/classes_8.js +56 -56
- package/SVF-doxygen/html/search/classes_9.js +1 -1
- package/SVF-doxygen/html/search/classes_a.js +12 -12
- package/SVF-doxygen/html/search/classes_b.js +29 -29
- package/SVF-doxygen/html/search/classes_c.js +6 -6
- package/SVF-doxygen/html/search/classes_d.js +18 -18
- package/SVF-doxygen/html/search/classes_e.js +36 -36
- package/SVF-doxygen/html/search/classes_f.js +25 -25
- package/SVF-doxygen/html/search/defines_0.js +3 -3
- package/SVF-doxygen/html/search/defines_1.js +2 -2
- package/SVF-doxygen/html/search/defines_2.js +30 -30
- package/SVF-doxygen/html/search/defines_3.js +21 -21
- package/SVF-doxygen/html/search/defines_4.js +2 -2
- package/SVF-doxygen/html/search/defines_5.js +4 -4
- package/SVF-doxygen/html/search/defines_6.js +2 -2
- package/SVF-doxygen/html/search/defines_7.js +5 -5
- package/SVF-doxygen/html/search/defines_8.js +11 -11
- package/SVF-doxygen/html/search/defines_9.js +9 -9
- package/SVF-doxygen/html/search/defines_a.js +2 -2
- package/SVF-doxygen/html/search/defines_b.js +1 -1
- package/SVF-doxygen/html/search/defines_c.js +3 -3
- package/SVF-doxygen/html/search/defines_d.js +2 -2
- package/SVF-doxygen/html/search/defines_e.js +7 -7
- package/SVF-doxygen/html/search/defines_f.js +3 -3
- package/SVF-doxygen/html/search/enums_0.js +3 -3
- package/SVF-doxygen/html/search/enums_1.js +2 -2
- package/SVF-doxygen/html/search/enums_10.js +1 -1
- package/SVF-doxygen/html/search/enums_11.js +1 -1
- package/SVF-doxygen/html/search/enums_2.js +8 -8
- package/SVF-doxygen/html/search/enums_3.js +1 -1
- package/SVF-doxygen/html/search/enums_4.js +3 -3
- package/SVF-doxygen/html/search/enums_5.js +1 -1
- package/SVF-doxygen/html/search/enums_6.js +2 -2
- package/SVF-doxygen/html/search/enums_7.js +2 -2
- package/SVF-doxygen/html/search/enums_8.js +4 -4
- package/SVF-doxygen/html/search/enums_9.js +1 -1
- package/SVF-doxygen/html/search/enums_a.js +1 -1
- package/SVF-doxygen/html/search/enums_b.js +7 -7
- package/SVF-doxygen/html/search/enums_c.js +1 -1
- package/SVF-doxygen/html/search/enums_d.js +4 -4
- package/SVF-doxygen/html/search/enums_e.js +2 -2
- package/SVF-doxygen/html/search/enums_f.js +4 -4
- package/SVF-doxygen/html/search/enumvalues_0.js +14 -14
- package/SVF-doxygen/html/search/enumvalues_1.js +14 -14
- package/SVF-doxygen/html/search/enumvalues_10.js +35 -35
- package/SVF-doxygen/html/search/enumvalues_11.js +3 -3
- package/SVF-doxygen/html/search/enumvalues_12.js +10 -10
- package/SVF-doxygen/html/search/enumvalues_13.js +1 -1
- package/SVF-doxygen/html/search/enumvalues_14.js +1 -1
- package/SVF-doxygen/html/search/enumvalues_15.js +3 -3
- package/SVF-doxygen/html/search/enumvalues_2.js +36 -36
- package/SVF-doxygen/html/search/enumvalues_3.js +13 -13
- package/SVF-doxygen/html/search/enumvalues_4.js +2 -2
- package/SVF-doxygen/html/search/enumvalues_5.js +47 -47
- package/SVF-doxygen/html/search/enumvalues_6.js +6 -6
- package/SVF-doxygen/html/search/enumvalues_7.js +9 -9
- package/SVF-doxygen/html/search/enumvalues_8.js +23 -23
- package/SVF-doxygen/html/search/enumvalues_9.js +6 -6
- package/SVF-doxygen/html/search/enumvalues_a.js +15 -15
- package/SVF-doxygen/html/search/enumvalues_b.js +11 -11
- package/SVF-doxygen/html/search/enumvalues_c.js +5 -5
- package/SVF-doxygen/html/search/enumvalues_d.js +18 -18
- package/SVF-doxygen/html/search/enumvalues_e.js +9 -9
- package/SVF-doxygen/html/search/enumvalues_f.js +45 -45
- package/SVF-doxygen/html/search/files_0.js +13 -13
- package/SVF-doxygen/html/search/files_1.js +7 -7
- package/SVF-doxygen/html/search/files_10.js +8 -8
- package/SVF-doxygen/html/search/files_11.js +8 -8
- package/SVF-doxygen/html/search/files_12.js +2 -2
- package/SVF-doxygen/html/search/files_2.js +55 -55
- package/SVF-doxygen/html/search/files_3.js +14 -14
- package/SVF-doxygen/html/search/files_4.js +5 -5
- package/SVF-doxygen/html/search/files_5.js +13 -13
- package/SVF-doxygen/html/search/files_6.js +9 -9
- package/SVF-doxygen/html/search/files_7.js +14 -14
- package/SVF-doxygen/html/search/files_8.js +13 -13
- package/SVF-doxygen/html/search/files_9.js +18 -18
- package/SVF-doxygen/html/search/files_a.js +3 -3
- package/SVF-doxygen/html/search/files_b.js +2 -2
- package/SVF-doxygen/html/search/files_c.js +20 -20
- package/SVF-doxygen/html/search/files_d.js +4 -4
- package/SVF-doxygen/html/search/files_e.js +62 -62
- package/SVF-doxygen/html/search/files_f.js +8 -8
- package/SVF-doxygen/html/search/functions_0.js +12 -12
- package/SVF-doxygen/html/search/functions_1.js +360 -360
- package/SVF-doxygen/html/search/functions_10.js +140 -140
- package/SVF-doxygen/html/search/functions_11.js +138 -138
- package/SVF-doxygen/html/search/functions_12.js +279 -279
- package/SVF-doxygen/html/search/functions_13.js +59 -59
- package/SVF-doxygen/html/search/functions_14.js +39 -39
- package/SVF-doxygen/html/search/functions_15.js +71 -71
- package/SVF-doxygen/html/search/functions_16.js +32 -32
- package/SVF-doxygen/html/search/functions_17.js +3 -3
- package/SVF-doxygen/html/search/functions_18.js +172 -172
- package/SVF-doxygen/html/search/functions_2.js +87 -87
- package/SVF-doxygen/html/search/functions_3.js +257 -257
- package/SVF-doxygen/html/search/functions_4.js +75 -75
- package/SVF-doxygen/html/search/functions_5.js +53 -53
- package/SVF-doxygen/html/search/functions_6.js +59 -59
- package/SVF-doxygen/html/search/functions_7.js +852 -853
- package/SVF-doxygen/html/search/functions_8.js +149 -149
- package/SVF-doxygen/html/search/functions_9.js +423 -428
- package/SVF-doxygen/html/search/functions_a.js +30 -30
- package/SVF-doxygen/html/search/functions_b.js +2 -2
- package/SVF-doxygen/html/search/functions_c.js +26 -26
- package/SVF-doxygen/html/search/functions_d.js +77 -77
- package/SVF-doxygen/html/search/functions_e.js +35 -35
- package/SVF-doxygen/html/search/functions_f.js +56 -56
- package/SVF-doxygen/html/search/namespaces_0.js +1 -1
- package/SVF-doxygen/html/search/namespaces_1.js +7 -7
- package/SVF-doxygen/html/search/related_0.js +2 -2
- package/SVF-doxygen/html/search/related_1.js +2 -2
- package/SVF-doxygen/html/search/related_2.js +2 -2
- package/SVF-doxygen/html/search/related_3.js +2 -2
- package/SVF-doxygen/html/search/related_4.js +2 -2
- package/SVF-doxygen/html/search/related_5.js +1 -1
- package/SVF-doxygen/html/search/related_6.js +2 -2
- package/SVF-doxygen/html/search/related_7.js +4 -4
- package/SVF-doxygen/html/search/related_8.js +2 -2
- package/SVF-doxygen/html/search/related_9.js +4 -4
- package/SVF-doxygen/html/search/related_a.js +19 -19
- package/SVF-doxygen/html/search/related_b.js +4 -4
- package/SVF-doxygen/html/search/related_c.js +1 -1
- package/SVF-doxygen/html/search/related_d.js +12 -12
- package/SVF-doxygen/html/search/related_e.js +2 -2
- package/SVF-doxygen/html/search/related_f.js +2 -2
- package/SVF-doxygen/html/search/typedefs_0.js +19 -18
- package/SVF-doxygen/html/search/typedefs_1.js +26 -26
- package/SVF-doxygen/html/search/typedefs_10.js +61 -61
- package/SVF-doxygen/html/search/typedefs_11.js +13 -13
- package/SVF-doxygen/html/search/typedefs_12.js +11 -11
- package/SVF-doxygen/html/search/typedefs_13.js +33 -34
- package/SVF-doxygen/html/search/typedefs_14.js +8 -8
- package/SVF-doxygen/html/search/typedefs_2.js +129 -129
- package/SVF-doxygen/html/search/typedefs_3.js +39 -39
- package/SVF-doxygen/html/search/typedefs_4.js +17 -17
- package/SVF-doxygen/html/search/typedefs_5.js +41 -41
- package/SVF-doxygen/html/search/typedefs_6.js +55 -55
- package/SVF-doxygen/html/search/typedefs_7.js +44 -44
- package/SVF-doxygen/html/search/typedefs_8.js +1 -1
- package/SVF-doxygen/html/search/typedefs_9.js +6 -6
- package/SVF-doxygen/html/search/typedefs_a.js +29 -29
- package/SVF-doxygen/html/search/typedefs_b.js +29 -29
- package/SVF-doxygen/html/search/typedefs_c.js +41 -41
- package/SVF-doxygen/html/search/typedefs_d.js +14 -14
- package/SVF-doxygen/html/search/typedefs_e.js +52 -52
- package/SVF-doxygen/html/search/typedefs_f.js +14 -14
- package/SVF-doxygen/html/search/variables_0.js +151 -151
- package/SVF-doxygen/html/search/variables_1.js +75 -75
- package/SVF-doxygen/html/search/variables_10.js +97 -97
- package/SVF-doxygen/html/search/variables_11.js +44 -44
- package/SVF-doxygen/html/search/variables_12.js +92 -92
- package/SVF-doxygen/html/search/variables_13.js +75 -75
- package/SVF-doxygen/html/search/variables_14.js +14 -14
- package/SVF-doxygen/html/search/variables_15.js +48 -48
- package/SVF-doxygen/html/search/variables_16.js +9 -9
- package/SVF-doxygen/html/search/variables_17.js +1 -1
- package/SVF-doxygen/html/search/variables_18.js +2 -2
- package/SVF-doxygen/html/search/variables_2.js +38 -38
- package/SVF-doxygen/html/search/variables_3.js +142 -142
- package/SVF-doxygen/html/search/variables_4.js +55 -55
- package/SVF-doxygen/html/search/variables_5.js +37 -37
- package/SVF-doxygen/html/search/variables_6.js +66 -66
- package/SVF-doxygen/html/search/variables_7.js +33 -33
- package/SVF-doxygen/html/search/variables_8.js +7 -7
- package/SVF-doxygen/html/search/variables_9.js +78 -78
- package/SVF-doxygen/html/search/variables_a.js +4 -4
- package/SVF-doxygen/html/search/variables_b.js +10 -10
- package/SVF-doxygen/html/search/variables_c.js +45 -45
- package/SVF-doxygen/html/search/variables_d.js +56 -56
- package/SVF-doxygen/html/search/variables_e.js +123 -123
- package/SVF-doxygen/html/search/variables_f.js +29 -29
- package/SVF-doxygen/html/structstd_1_1hash_3_01SVF_1_1ConsExeState_01_4.html +5 -5
- package/SVF-doxygen/html/structstd_1_1hash_3_01SVF_1_1ExeState_01_4.html +5 -5
- package/SVF-doxygen/html/structstd_1_1hash_3_01SVF_1_1IntervalExeState_01_4.html +5 -5
- package/SVF-doxygen/html/svf-ex_8cpp.html +7 -7
- package/SVF-doxygen/html/svf-ex_8cpp_source.html +7 -7
- package/package.json +1 -1
- package/svf/include/AbstractExecution/ConsExeState.h +99 -96
- package/svf/include/AbstractExecution/ExeState.h +66 -53
- package/svf/include/AbstractExecution/IntervalExeState.h +66 -61
- package/svf/include/AbstractExecution/SVFIR2ConsExeState.h +7 -7
- package/svf/include/AbstractExecution/SVFIR2ItvExeState.h +20 -14
- package/svf/lib/AbstractExecution/ConsExeState.cpp +13 -13
- package/svf/lib/AbstractExecution/ExeState.cpp +19 -19
- package/svf/lib/AbstractExecution/IntervalExeState.cpp +4 -4
- package/svf/lib/AbstractExecution/SVFIR2ConsExeState.cpp +36 -36
- package/svf/lib/AbstractExecution/SVFIR2ItvExeState.cpp +80 -92
|
@@ -49,9 +49,9 @@ class ExeState
|
|
|
49
49
|
|
|
50
50
|
public:
|
|
51
51
|
|
|
52
|
-
typedef AddressValue
|
|
53
|
-
typedef Map<u32_t,
|
|
54
|
-
/// Execution state
|
|
52
|
+
typedef AddressValue Addrs;
|
|
53
|
+
typedef Map<u32_t, Addrs> VarToAddrs;
|
|
54
|
+
/// Execution state type
|
|
55
55
|
enum ExeState_TYPE
|
|
56
56
|
{
|
|
57
57
|
IntervalK, SingleValueK
|
|
@@ -64,18 +64,18 @@ public:
|
|
|
64
64
|
|
|
65
65
|
virtual ~ExeState() = default;
|
|
66
66
|
|
|
67
|
-
ExeState(const ExeState &rhs) :
|
|
68
|
-
|
|
67
|
+
ExeState(const ExeState &rhs) : _varToAddrs(rhs._varToAddrs),
|
|
68
|
+
_locToAddrs(rhs._locToAddrs) {}
|
|
69
69
|
|
|
70
|
-
ExeState(ExeState &&rhs) noexcept:
|
|
71
|
-
|
|
70
|
+
ExeState(ExeState &&rhs) noexcept: _varToAddrs(std::move(rhs._varToAddrs)),
|
|
71
|
+
_locToAddrs(std::move(rhs._locToAddrs)) {}
|
|
72
72
|
|
|
73
73
|
ExeState &operator=(const ExeState &rhs)
|
|
74
74
|
{
|
|
75
75
|
if(*this != rhs)
|
|
76
76
|
{
|
|
77
|
-
|
|
78
|
-
|
|
77
|
+
_varToAddrs = rhs._varToAddrs;
|
|
78
|
+
_locToAddrs = rhs._locToAddrs;
|
|
79
79
|
}
|
|
80
80
|
return *this;
|
|
81
81
|
}
|
|
@@ -84,24 +84,49 @@ public:
|
|
|
84
84
|
{
|
|
85
85
|
if (this != &rhs)
|
|
86
86
|
{
|
|
87
|
-
|
|
88
|
-
|
|
87
|
+
_varToAddrs = std::move(rhs._varToAddrs);
|
|
88
|
+
_locToAddrs = std::move(rhs._locToAddrs);
|
|
89
89
|
}
|
|
90
90
|
return *this;
|
|
91
91
|
}
|
|
92
92
|
|
|
93
|
-
virtual bool operator==(const ExeState &rhs) const;
|
|
94
93
|
|
|
95
|
-
|
|
94
|
+
protected:
|
|
95
|
+
VarToAddrs _varToAddrs{{0, getVirtualMemAddress(0)}}; ///< Map a variable (symbol) to its memory addresses
|
|
96
|
+
VarToAddrs _locToAddrs; ///< Map a memory address to its stored memory addresses
|
|
97
|
+
|
|
98
|
+
public:
|
|
99
|
+
|
|
100
|
+
/// get memory addresses of variable
|
|
101
|
+
virtual Addrs &getAddrs(u32_t id)
|
|
96
102
|
{
|
|
97
|
-
return
|
|
103
|
+
return _varToAddrs[id];
|
|
98
104
|
}
|
|
99
105
|
|
|
100
|
-
|
|
106
|
+
/// whether the variable is in varToAddrs table
|
|
107
|
+
inline virtual bool inVarToAddrsTable(u32_t id) const
|
|
101
108
|
{
|
|
102
|
-
return
|
|
109
|
+
return _varToAddrs.find(id) != _varToAddrs.end();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/// whether the memory address stores memory addresses
|
|
113
|
+
inline virtual bool inLocToAddrsTable(u32_t id) const
|
|
114
|
+
{
|
|
115
|
+
return _locToAddrs.find(id) != _locToAddrs.end();
|
|
103
116
|
}
|
|
104
117
|
|
|
118
|
+
|
|
119
|
+
inline virtual const VarToAddrs &getVarToAddrs() const
|
|
120
|
+
{
|
|
121
|
+
return _varToAddrs;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
inline virtual const VarToAddrs &getLocToAddrs() const
|
|
125
|
+
{
|
|
126
|
+
return _locToAddrs;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
public:
|
|
105
130
|
/// Make all value join with the other
|
|
106
131
|
bool joinWith(const ExeState &other);
|
|
107
132
|
|
|
@@ -123,44 +148,22 @@ public:
|
|
|
123
148
|
return _kind;
|
|
124
149
|
}
|
|
125
150
|
|
|
126
|
-
inline virtual const VarToVAddrs &getVarToVAddrs() const
|
|
127
|
-
{
|
|
128
|
-
return _varToVAddrs;
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
inline virtual const VarToVAddrs &getLocToVAddrs() const
|
|
132
|
-
{
|
|
133
|
-
return _locToVAddrs;
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
inline virtual bool inVarToAddrsTable(u32_t id) const
|
|
137
|
-
{
|
|
138
|
-
return _varToVAddrs.find(id) != _varToVAddrs.end();
|
|
139
|
-
}
|
|
140
151
|
|
|
141
|
-
inline virtual bool inLocToAddrsTable(u32_t id) const
|
|
142
|
-
{
|
|
143
|
-
return _locToVAddrs.find(id) != _locToVAddrs.end();
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
virtual VAddrs &getVAddrs(u32_t id)
|
|
147
|
-
{
|
|
148
|
-
return _varToVAddrs[id];
|
|
149
|
-
}
|
|
150
152
|
|
|
151
|
-
|
|
153
|
+
public:
|
|
154
|
+
inline virtual void storeAddrs(u32_t addr, const Addrs &vaddrs)
|
|
152
155
|
{
|
|
153
156
|
assert(isVirtualMemAddress(addr) && "not virtual address?");
|
|
154
157
|
if(isNullPtr(addr)) return;
|
|
155
158
|
u32_t objId = getInternalID(addr);
|
|
156
|
-
|
|
159
|
+
_locToAddrs[objId] = vaddrs;
|
|
157
160
|
}
|
|
158
161
|
|
|
159
|
-
inline virtual
|
|
162
|
+
inline virtual Addrs &loadAddrs(u32_t addr)
|
|
160
163
|
{
|
|
161
164
|
assert(isVirtualMemAddress(addr) && "not virtual address?");
|
|
162
165
|
u32_t objId = getInternalID(addr);
|
|
163
|
-
return
|
|
166
|
+
return _locToAddrs[objId];
|
|
164
167
|
}
|
|
165
168
|
|
|
166
169
|
inline bool isNullPtr(u32_t addr)
|
|
@@ -168,13 +171,23 @@ public:
|
|
|
168
171
|
return getInternalID(addr) == 0;
|
|
169
172
|
}
|
|
170
173
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
+
public:
|
|
175
|
+
|
|
176
|
+
virtual bool operator==(const ExeState &rhs) const;
|
|
177
|
+
|
|
178
|
+
inline virtual bool operator!=(const ExeState &rhs) const
|
|
179
|
+
{
|
|
180
|
+
return !(*this == rhs);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
bool equals(const ExeState *other) const
|
|
184
|
+
{
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
174
187
|
|
|
175
188
|
protected:
|
|
176
189
|
|
|
177
|
-
static bool
|
|
190
|
+
static bool eqVarToAddrs(const VarToAddrs &lhs, const VarToAddrs &rhs)
|
|
178
191
|
{
|
|
179
192
|
if (lhs.size() != rhs.size()) return false;
|
|
180
193
|
for (const auto &item: lhs)
|
|
@@ -195,14 +208,14 @@ public:
|
|
|
195
208
|
virtual std::string varToAddrs(u32_t varId) const
|
|
196
209
|
{
|
|
197
210
|
std::stringstream exprName;
|
|
198
|
-
auto it =
|
|
199
|
-
if (it ==
|
|
211
|
+
auto it = _varToAddrs.find(varId);
|
|
212
|
+
if (it == _varToAddrs.end())
|
|
200
213
|
{
|
|
201
214
|
exprName << "Var not in varToAddrs!\n";
|
|
202
215
|
}
|
|
203
216
|
else
|
|
204
217
|
{
|
|
205
|
-
const
|
|
218
|
+
const Addrs &vaddrs = it->second;
|
|
206
219
|
if (vaddrs.size() == 1)
|
|
207
220
|
{
|
|
208
221
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -223,14 +236,14 @@ public:
|
|
|
223
236
|
virtual std::string locToAddrs(u32_t objId) const
|
|
224
237
|
{
|
|
225
238
|
std::stringstream exprName;
|
|
226
|
-
auto it =
|
|
227
|
-
if (it ==
|
|
239
|
+
auto it = _locToAddrs.find(objId);
|
|
240
|
+
if (it == _locToAddrs.end())
|
|
228
241
|
{
|
|
229
242
|
exprName << "Var not in varToAddrs!\n";
|
|
230
243
|
}
|
|
231
244
|
else
|
|
232
245
|
{
|
|
233
|
-
const
|
|
246
|
+
const Addrs &vaddrs = it->second;
|
|
234
247
|
if (vaddrs.size() == 1)
|
|
235
248
|
{
|
|
236
249
|
exprName << "addr: {" << std::dec << getInternalID(*vaddrs.begin()) << "}\n";
|
|
@@ -63,18 +63,10 @@ public:
|
|
|
63
63
|
|
|
64
64
|
static IntervalExeState globalES;
|
|
65
65
|
|
|
66
|
-
protected:
|
|
67
|
-
/// key: nodeID value: Domain Value
|
|
68
|
-
VarToValMap _varToItvVal;
|
|
69
|
-
/// key: nodeID value: Domain Value
|
|
70
|
-
LocToValMap _locToItvVal;
|
|
71
|
-
|
|
72
|
-
|
|
73
66
|
public:
|
|
74
|
-
/// default constructor
|
|
67
|
+
/// default constructor
|
|
75
68
|
IntervalExeState() : ExeState(ExeState::IntervalK) {}
|
|
76
69
|
|
|
77
|
-
/// set path constraints, val2val and loc2val map
|
|
78
70
|
IntervalExeState(VarToValMap &_varToValMap, LocToValMap &_locToValMap) : ExeState(ExeState::IntervalK),
|
|
79
71
|
_varToItvVal(_varToValMap),
|
|
80
72
|
_locToItvVal(_locToValMap) {}
|
|
@@ -86,7 +78,9 @@ public:
|
|
|
86
78
|
|
|
87
79
|
}
|
|
88
80
|
|
|
89
|
-
|
|
81
|
+
virtual ~IntervalExeState() = default;
|
|
82
|
+
|
|
83
|
+
|
|
90
84
|
IntervalExeState &operator=(const IntervalExeState &rhs)
|
|
91
85
|
{
|
|
92
86
|
if (rhs != *this)
|
|
@@ -151,54 +145,63 @@ public:
|
|
|
151
145
|
return inv;
|
|
152
146
|
}
|
|
153
147
|
|
|
154
|
-
|
|
148
|
+
protected:
|
|
149
|
+
|
|
150
|
+
VarToValMap _varToItvVal; ///< Map a variable (symbol) to its interval value
|
|
151
|
+
LocToValMap _locToItvVal; ///< Map a memory address to its stored interval value
|
|
152
|
+
|
|
153
|
+
public:
|
|
154
|
+
|
|
155
|
+
/// get memory addresses of variable
|
|
156
|
+
Addrs &getAddrs(u32_t id) override
|
|
155
157
|
{
|
|
156
|
-
auto it =
|
|
157
|
-
if (it !=
|
|
158
|
+
auto it = _varToAddrs.find(id);
|
|
159
|
+
if (it != _varToAddrs.end())
|
|
158
160
|
return it->second;
|
|
159
161
|
else
|
|
160
|
-
return globalES.
|
|
162
|
+
return globalES._varToAddrs[id];
|
|
161
163
|
}
|
|
162
164
|
|
|
163
|
-
|
|
165
|
+
/// get interval value of variable
|
|
166
|
+
inline IntervalValue &operator[](u32_t varId)
|
|
164
167
|
{
|
|
165
|
-
|
|
166
|
-
|
|
168
|
+
auto localIt = _varToItvVal.find(varId);
|
|
169
|
+
if(localIt != _varToItvVal.end())
|
|
170
|
+
return localIt->second;
|
|
171
|
+
else
|
|
172
|
+
{
|
|
173
|
+
return globalES._varToItvVal[varId];
|
|
174
|
+
}
|
|
167
175
|
}
|
|
168
176
|
|
|
177
|
+
/// whether the variable is in varToAddrs table
|
|
169
178
|
inline bool inVarToAddrsTable(u32_t id) const override
|
|
170
179
|
{
|
|
171
|
-
return
|
|
172
|
-
globalES.
|
|
180
|
+
return _varToAddrs.find(id) != _varToAddrs.end() ||
|
|
181
|
+
globalES._varToAddrs.find(id) != globalES._varToAddrs.end();
|
|
173
182
|
}
|
|
174
183
|
|
|
175
|
-
|
|
184
|
+
/// whether the variable is in varToVal table
|
|
185
|
+
inline bool inVarToValTable(u32_t id) const
|
|
176
186
|
{
|
|
177
|
-
return
|
|
178
|
-
globalES.
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
inline bool inLocalLocToIValTable(u32_t id) const
|
|
182
|
-
{
|
|
183
|
-
return _locToItvVal.find(id) != _locToItvVal.end();
|
|
187
|
+
return _varToItvVal.find(id) != _varToItvVal.end() ||
|
|
188
|
+
globalES._varToItvVal.find(id) != globalES._varToItvVal.end();
|
|
184
189
|
}
|
|
185
190
|
|
|
191
|
+
/// whether the memory address stores memory addresses
|
|
186
192
|
inline bool inLocToAddrsTable(u32_t id) const override
|
|
187
193
|
{
|
|
188
|
-
return
|
|
189
|
-
globalES.
|
|
194
|
+
return _locToAddrs.find(id) != _locToAddrs.end() ||
|
|
195
|
+
globalES._locToAddrs.find(id) != globalES._locToAddrs.end();
|
|
190
196
|
}
|
|
191
197
|
|
|
192
|
-
|
|
198
|
+
/// whether the memory address stores interval value
|
|
199
|
+
inline bool inLocToValTable(u32_t id) const
|
|
193
200
|
{
|
|
194
|
-
return
|
|
201
|
+
return _locToItvVal.find(id) != _locToItvVal.end() ||
|
|
202
|
+
globalES._locToItvVal.find(id) != globalES._locToItvVal.end();
|
|
195
203
|
}
|
|
196
204
|
|
|
197
|
-
bool equals(const IntervalExeState &other) const;
|
|
198
|
-
|
|
199
|
-
virtual ~IntervalExeState() = default;
|
|
200
|
-
|
|
201
|
-
|
|
202
205
|
/// get var2val map
|
|
203
206
|
const VarToValMap &getVarToVal() const
|
|
204
207
|
{
|
|
@@ -211,18 +214,18 @@ public:
|
|
|
211
214
|
return _locToItvVal;
|
|
212
215
|
}
|
|
213
216
|
|
|
214
|
-
|
|
215
|
-
inline IntervalValue &operator[](u32_t varId)
|
|
217
|
+
inline bool inLocalLocToValTable(u32_t id) const
|
|
216
218
|
{
|
|
217
|
-
|
|
218
|
-
if(localIt != _varToItvVal.end())
|
|
219
|
-
return localIt->second;
|
|
220
|
-
else
|
|
221
|
-
{
|
|
222
|
-
return globalES._varToItvVal[varId];
|
|
223
|
-
}
|
|
219
|
+
return _locToItvVal.find(id) != _locToItvVal.end();
|
|
224
220
|
}
|
|
225
221
|
|
|
222
|
+
inline bool inLocalLocToAddrsTable(u32_t id) const
|
|
223
|
+
{
|
|
224
|
+
return _locToAddrs.find(id) != _locToAddrs.end();
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
public:
|
|
228
|
+
|
|
226
229
|
inline void cpyItvToLocal(u32_t varId)
|
|
227
230
|
{
|
|
228
231
|
auto localIt = _varToItvVal.find(varId);
|
|
@@ -319,24 +322,24 @@ public:
|
|
|
319
322
|
}
|
|
320
323
|
}
|
|
321
324
|
|
|
322
|
-
inline
|
|
325
|
+
inline Addrs &loadAddrs(u32_t addr) override
|
|
323
326
|
{
|
|
324
327
|
assert(isVirtualMemAddress(addr) && "not virtual address?");
|
|
325
328
|
u32_t objId = getInternalID(addr);
|
|
326
|
-
auto it =
|
|
327
|
-
if(it !=
|
|
329
|
+
auto it = _locToAddrs.find(objId);
|
|
330
|
+
if(it != _locToAddrs.end())
|
|
328
331
|
return it->second;
|
|
329
332
|
else
|
|
330
333
|
{
|
|
331
|
-
auto globIt = globalES.
|
|
332
|
-
if(globIt != globalES.
|
|
334
|
+
auto globIt = globalES._locToAddrs.find(objId);
|
|
335
|
+
if(globIt != globalES._locToAddrs.end())
|
|
333
336
|
return globIt->second;
|
|
334
337
|
else
|
|
335
|
-
return
|
|
338
|
+
return _locToAddrs[objId];
|
|
336
339
|
}
|
|
337
340
|
}
|
|
338
341
|
|
|
339
|
-
inline IntervalValue&
|
|
342
|
+
inline IntervalValue& getLocToVal(u32_t id)
|
|
340
343
|
{
|
|
341
344
|
auto it = _locToItvVal.find(id);
|
|
342
345
|
if(it != _locToItvVal.end())
|
|
@@ -351,18 +354,18 @@ public:
|
|
|
351
354
|
}
|
|
352
355
|
}
|
|
353
356
|
|
|
354
|
-
inline
|
|
357
|
+
inline Addrs& getLocAddrs(u32_t id)
|
|
355
358
|
{
|
|
356
|
-
auto it =
|
|
357
|
-
if(it !=
|
|
359
|
+
auto it = _locToAddrs.find(id);
|
|
360
|
+
if(it != _locToAddrs.end())
|
|
358
361
|
return it->second;
|
|
359
362
|
else
|
|
360
363
|
{
|
|
361
|
-
auto globIt = globalES.
|
|
362
|
-
if(globIt != globalES.
|
|
364
|
+
auto globIt = globalES._locToAddrs.find(id);
|
|
365
|
+
if(globIt != globalES._locToAddrs.end())
|
|
363
366
|
return globIt->second;
|
|
364
367
|
else
|
|
365
|
-
return
|
|
368
|
+
return _locToAddrs[id];
|
|
366
369
|
}
|
|
367
370
|
}
|
|
368
371
|
|
|
@@ -374,6 +377,8 @@ public:
|
|
|
374
377
|
return "";
|
|
375
378
|
}
|
|
376
379
|
|
|
380
|
+
bool equals(const IntervalExeState &other) const;
|
|
381
|
+
|
|
377
382
|
static bool eqVarToValMap(const VarToValMap &lhs, const VarToValMap &rhs)
|
|
378
383
|
{
|
|
379
384
|
if (lhs.size() != rhs.size()) return false;
|
|
@@ -446,15 +451,15 @@ public:
|
|
|
446
451
|
{
|
|
447
452
|
_locToItvVal.clear();
|
|
448
453
|
_varToItvVal.clear();
|
|
449
|
-
|
|
450
|
-
|
|
454
|
+
_locToAddrs.clear();
|
|
455
|
+
_varToAddrs.clear();
|
|
451
456
|
}
|
|
452
457
|
|
|
453
458
|
|
|
454
459
|
private:
|
|
455
460
|
void printTable(const VarToValMap &table, std::ostream &oss) const;
|
|
456
461
|
|
|
457
|
-
void printTable(const
|
|
462
|
+
void printTable(const VarToAddrs &table, std::ostream &oss) const;
|
|
458
463
|
};
|
|
459
464
|
}
|
|
460
465
|
|
|
@@ -35,7 +35,7 @@ namespace SVF
|
|
|
35
35
|
class SVFIR2ConsExeState
|
|
36
36
|
{
|
|
37
37
|
public:
|
|
38
|
-
typedef ExeState::
|
|
38
|
+
typedef ExeState::Addrs Addrs;
|
|
39
39
|
|
|
40
40
|
SVFIR2ConsExeState() = default;
|
|
41
41
|
|
|
@@ -89,7 +89,7 @@ public:
|
|
|
89
89
|
//%}
|
|
90
90
|
|
|
91
91
|
/// Return the expr of gep object given a base and offset
|
|
92
|
-
|
|
92
|
+
Addrs getGepObjAddress(u32_t base, s32_t offset);
|
|
93
93
|
|
|
94
94
|
/// Return the offset expression of a GepStmt
|
|
95
95
|
std::pair<s32_t, s32_t> getGepOffset(const GepStmt *gep);
|
|
@@ -123,17 +123,17 @@ public:
|
|
|
123
123
|
|
|
124
124
|
inline bool inVarToValTable(u32_t id) const
|
|
125
125
|
{
|
|
126
|
-
return _es->
|
|
126
|
+
return _es->inVarToValTable(id);
|
|
127
127
|
}
|
|
128
128
|
|
|
129
|
-
inline bool
|
|
129
|
+
inline bool inVarToAddrsTable(u32_t id) const
|
|
130
130
|
{
|
|
131
|
-
return _es->
|
|
131
|
+
return _es->inVarToAddrsTable(id);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
|
-
inline bool
|
|
134
|
+
inline bool inLocToValTable(u32_t id) const
|
|
135
135
|
{
|
|
136
|
-
return _es->
|
|
136
|
+
return _es->inLocToValTable(id);
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
inline bool inLocToAddrsTable(u32_t id) const
|
|
@@ -41,8 +41,8 @@ namespace SVF
|
|
|
41
41
|
class SVFIR2ItvExeState
|
|
42
42
|
{
|
|
43
43
|
public:
|
|
44
|
-
typedef ExeState::
|
|
45
|
-
static
|
|
44
|
+
typedef ExeState::Addrs Addrs;
|
|
45
|
+
static Addrs globalNulladdrs;
|
|
46
46
|
public:
|
|
47
47
|
SVFIR2ItvExeState(SVFIR *ir) : _svfir(ir) {}
|
|
48
48
|
|
|
@@ -66,12 +66,12 @@ public:
|
|
|
66
66
|
return _relEs;
|
|
67
67
|
}
|
|
68
68
|
|
|
69
|
-
void
|
|
69
|
+
void widenAddrs(IntervalExeState &lhs, const IntervalExeState &rhs);
|
|
70
70
|
|
|
71
|
-
void
|
|
71
|
+
void narrowAddrs(IntervalExeState &lhs, const IntervalExeState &rhs);
|
|
72
72
|
|
|
73
73
|
/// Return the field address given a pointer points to a struct object and an offset
|
|
74
|
-
|
|
74
|
+
Addrs getGepObjAddress(u32_t pointer, APOffset offset);
|
|
75
75
|
|
|
76
76
|
/// Return the value range of Integer SVF Type, e.g. unsigned i8 Type->[0, 255], signed i8 Type->[-128, 127]
|
|
77
77
|
IntervalValue getRangeLimitFromType(const SVFType* type);
|
|
@@ -103,29 +103,35 @@ public:
|
|
|
103
103
|
/// Init SVFVar
|
|
104
104
|
void initSVFVar(u32_t varId);
|
|
105
105
|
|
|
106
|
-
inline
|
|
106
|
+
inline Addrs &getAddrs(u32_t id)
|
|
107
107
|
{
|
|
108
108
|
if (inVarToAddrsTable(id))
|
|
109
|
-
return _es.
|
|
109
|
+
return _es.getAddrs(id);
|
|
110
110
|
else
|
|
111
|
-
return
|
|
111
|
+
return globalNulladdrs;
|
|
112
112
|
}
|
|
113
113
|
|
|
114
|
-
inline bool inVarToIValTable(u32_t id) const
|
|
115
|
-
{
|
|
116
|
-
return _es.inVarToIValTable(id);
|
|
117
|
-
}
|
|
118
114
|
|
|
119
|
-
|
|
115
|
+
/// whether the variable is in varToVal table
|
|
116
|
+
inline bool inVarToValTable(u32_t id) const
|
|
120
117
|
{
|
|
121
|
-
return _es.
|
|
118
|
+
return _es.inVarToValTable(id);
|
|
122
119
|
}
|
|
123
120
|
|
|
121
|
+
/// whether the variable is in varToAddrs table
|
|
124
122
|
inline bool inVarToAddrsTable(u32_t id) const
|
|
125
123
|
{
|
|
126
124
|
return _es.inVarToAddrsTable(id);
|
|
127
125
|
}
|
|
128
126
|
|
|
127
|
+
|
|
128
|
+
/// whether the memory address stores a interval value
|
|
129
|
+
inline bool inLocToValTable(u32_t id) const
|
|
130
|
+
{
|
|
131
|
+
return _es.inLocToValTable(id);
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/// whether the memory address stores memory addresses
|
|
129
135
|
inline bool inLocToAddrsTable(u32_t id) const
|
|
130
136
|
{
|
|
131
137
|
return _es.inLocToAddrsTable(id);
|
|
@@ -129,7 +129,7 @@ void ConsExeState::buildGlobES(ConsExeState &globES, Set<u32_t> &vars)
|
|
|
129
129
|
SingleAbsValue &expr = globES[varId];
|
|
130
130
|
if (expr.is_numeral() && isVirtualMemAddress(expr.get_numeral_int()))
|
|
131
131
|
{
|
|
132
|
-
if (globES.
|
|
132
|
+
if (globES.inLocalLocToValTable(expr))
|
|
133
133
|
{
|
|
134
134
|
store(expr, globES.load(expr));
|
|
135
135
|
}
|
|
@@ -236,13 +236,13 @@ void ConsExeState::applySummary(const ConsExeState &summary)
|
|
|
236
236
|
{
|
|
237
237
|
_locToVal[item.first] = item.second;
|
|
238
238
|
}
|
|
239
|
-
for (const auto &item: summary.
|
|
239
|
+
for (const auto &item: summary._varToAddrs)
|
|
240
240
|
{
|
|
241
|
-
|
|
241
|
+
_varToAddrs[item.first] = item.second;
|
|
242
242
|
}
|
|
243
|
-
for (const auto &item: summary.
|
|
243
|
+
for (const auto &item: summary._locToAddrs)
|
|
244
244
|
{
|
|
245
|
-
|
|
245
|
+
_locToAddrs[item.first] = item.second;
|
|
246
246
|
}
|
|
247
247
|
}
|
|
248
248
|
|
|
@@ -445,18 +445,18 @@ std::string ConsExeState::toString() const
|
|
|
445
445
|
|
|
446
446
|
bool ConsExeState::applySelect(u32_t res, u32_t cond, u32_t top, u32_t fop)
|
|
447
447
|
{
|
|
448
|
-
if (
|
|
448
|
+
if (inVarToValTable(top) && inVarToValTable(fop) && inVarToValTable(cond))
|
|
449
449
|
{
|
|
450
450
|
SingleAbsValue &tExpr = (*this)[top], &fExpr = (*this)[fop], &condExpr = (*this)[cond];
|
|
451
451
|
|
|
452
452
|
return assign((*this)[res], ite(condExpr == 1, tExpr, fExpr));
|
|
453
453
|
}
|
|
454
|
-
else if (inVarToAddrsTable(top) && inVarToAddrsTable(fop) &&
|
|
454
|
+
else if (inVarToAddrsTable(top) && inVarToAddrsTable(fop) && inVarToValTable(cond))
|
|
455
455
|
{
|
|
456
456
|
SingleAbsValue &condExpr = (*this)[cond];
|
|
457
457
|
if (condExpr.is_numeral())
|
|
458
458
|
{
|
|
459
|
-
|
|
459
|
+
getAddrs(res) = condExpr.is_zero() ? getAddrs(fop) : getAddrs(top);
|
|
460
460
|
}
|
|
461
461
|
}
|
|
462
462
|
return false;
|
|
@@ -467,10 +467,10 @@ bool ConsExeState::applyPhi(u32_t res, std::vector<u32_t> &ops)
|
|
|
467
467
|
for (u32_t i = 0; i < ops.size(); i++)
|
|
468
468
|
{
|
|
469
469
|
NodeID curId = ops[i];
|
|
470
|
-
if (
|
|
470
|
+
if (inVarToValTable(curId))
|
|
471
471
|
{
|
|
472
472
|
const SingleAbsValue &cur = (*this)[curId];
|
|
473
|
-
if (!
|
|
473
|
+
if (!inVarToValTable(res))
|
|
474
474
|
{
|
|
475
475
|
(*this)[res] = cur;
|
|
476
476
|
}
|
|
@@ -481,14 +481,14 @@ bool ConsExeState::applyPhi(u32_t res, std::vector<u32_t> &ops)
|
|
|
481
481
|
}
|
|
482
482
|
else if (inVarToAddrsTable(curId))
|
|
483
483
|
{
|
|
484
|
-
const
|
|
484
|
+
const Addrs &cur = getAddrs(curId);
|
|
485
485
|
if (!inVarToAddrsTable(res))
|
|
486
486
|
{
|
|
487
|
-
|
|
487
|
+
getAddrs(res) = cur;
|
|
488
488
|
}
|
|
489
489
|
else
|
|
490
490
|
{
|
|
491
|
-
|
|
491
|
+
getAddrs(res).join_with(cur);
|
|
492
492
|
}
|
|
493
493
|
}
|
|
494
494
|
}
|