svf-tools 1.0.409 → 1.0.412
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/CMakeLists.txt +1 -1
- package/SVF-doxygen/html/html/AbstractPointsToDS_8h_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenHLCD_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenLCD_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/AndersenSFR_8h_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/Andersen_8h_source.html +3 -3
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +3 -3
- package/SVF-doxygen/html/html/CoreBitVector_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/DDAStat_8h_source.html +5 -5
- package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ExtAPI_8h_source.html +1 -1
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FSMPTA_8h_source.html +3 -2
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +2 -2
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +7 -6
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MHP_8cpp.html +2 -83
- package/SVF-doxygen/html/html/MHP_8cpp_source.html +42 -46
- package/SVF-doxygen/html/html/MHP_8h_source.html +26 -26
- package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTAResultValidator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +10 -10
- package/SVF-doxygen/html/html/NodeIDAllocator_8h_source.html +9 -9
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +8 -8
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +30 -31
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SVFGNode_8h_source.html +33 -34
- package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/SVFGStat_8h_source.html +8 -7
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SVFG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +2 -2
- package/SVF-doxygen/html/html/TCT_8cpp_source.html +14 -14
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +6 -5
- package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +214 -215
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +15 -16
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +180 -181
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +1 -4
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +226 -227
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +232 -233
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +222 -223
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +3 -6
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +222 -223
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +1 -4
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +152 -154
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +9 -12
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +221 -222
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +132 -133
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +28 -33
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +2 -4
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +10 -10
- package/SVF-doxygen/html/html/classSVF_1_1CoreBitVector.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat-members.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +34 -25
- package/SVF-doxygen/html/html/classSVF_1_1DummyVersionPropSVFGNode.html +16 -16
- package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +247 -248
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +208 -209
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +8 -11
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +238 -239
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +21 -24
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +275 -276
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +8 -10
- package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +31 -31
- package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +38 -38
- package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode-members.html +13 -14
- package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode.html +19 -43
- package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MHP.html +74 -74
- package/SVF-doxygen/html/html/classSVF_1_1MHPValidator.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MemObj-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat-members.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +15 -14
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +33 -33
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis-members.html +94 -95
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +73 -107
- package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +11 -13
- package/SVF-doxygen/html/html/classSVF_1_1SVFGStat-members.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SVFGStat.html +53 -52
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +15 -30
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +193 -194
- package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +0 -3
- package/SVF-doxygen/html/html/classSVF_1_1TCT.html +18 -18
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +184 -185
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -5
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +287 -288
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +8 -10
- package/SVF-doxygen/html/html/functions_0x7e.html +1 -1
- package/SVF-doxygen/html/html/functions_c.html +18 -21
- package/SVF-doxygen/html/html/functions_func_0x7e.html +1 -1
- package/SVF-doxygen/html/html/functions_func_c.html +12 -13
- package/SVF-doxygen/html/html/functions_func_p.html +9 -9
- package/SVF-doxygen/html/html/functions_l.html +3 -3
- package/SVF-doxygen/html/html/functions_m.html +4 -4
- package/SVF-doxygen/html/html/functions_o.html +4 -4
- package/SVF-doxygen/html/html/functions_p.html +12 -12
- package/SVF-doxygen/html/html/functions_r.html +5 -4
- package/SVF-doxygen/html/html/functions_s.html +3 -3
- package/SVF-doxygen/html/html/functions_t.html +5 -7
- package/SVF-doxygen/html/html/functions_v.html +6 -6
- package/SVF-doxygen/html/html/functions_vars_m.html +4 -4
- package/SVF-doxygen/html/html/functions_vars_r.html +1 -2
- package/SVF-doxygen/html/html/globals_func_g.html +0 -6
- package/SVF-doxygen/html/html/globals_g.html +2 -8
- package/SVF-doxygen/html/html/globals_s.html +4 -2
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +1 -2
- package/SVF-doxygen/html/html/search/all_10.js +7 -7
- package/SVF-doxygen/html/html/search/all_12.js +3 -3
- package/SVF-doxygen/html/html/search/all_13.js +7 -7
- package/SVF-doxygen/html/html/search/all_14.js +4 -4
- package/SVF-doxygen/html/html/search/all_16.js +3 -3
- package/SVF-doxygen/html/html/search/all_1b.js +1 -1
- package/SVF-doxygen/html/html/search/all_3.js +1 -1
- package/SVF-doxygen/html/html/search/all_7.js +0 -2
- package/SVF-doxygen/html/html/search/all_c.js +2 -2
- package/SVF-doxygen/html/html/search/all_d.js +4 -4
- package/SVF-doxygen/html/html/search/all_e.js +1 -1
- package/SVF-doxygen/html/html/search/all_f.js +3 -3
- package/SVF-doxygen/html/html/search/functions_10.js +1 -1
- package/SVF-doxygen/html/html/search/functions_16.js +1 -1
- package/SVF-doxygen/html/html/search/functions_2.js +1 -1
- package/SVF-doxygen/html/html/search/functions_6.js +0 -2
- package/SVF-doxygen/html/html/search/functions_e.js +6 -6
- package/SVF-doxygen/html/html/search/variables_12.js +1 -1
- package/SVF-doxygen/html/html/search/variables_14.js +3 -3
- package/SVF-doxygen/html/html/search/variables_d.js +4 -4
- package/SVF-doxygen/html/html/search/variables_e.js +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01TCT_01_5_01_4.html +14 -14
- package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1SVFGNodeLockSpan_01_4.html +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +4 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +2 -1
- package/include/DDA/DDAStat.h +4 -4
- package/include/Graphs/SVFGNode.h +2 -4
- package/include/Graphs/SVFGStat.h +8 -8
- package/include/MTA/FSMPTA.h +1 -0
- package/include/MTA/MTAResultValidator.h +1 -1
- package/include/MemoryModel/AbstractPointsToDS.h +6 -0
- package/include/MemoryModel/PointerAnalysis.h +0 -5
- package/include/MemoryModel/SymbolTableInfo.h +2 -2
- package/include/Util/IRAnnotator.h +2 -2
- package/include/WPA/Andersen.h +1 -1
- package/include/WPA/AndersenSFR.h +1 -1
- package/lib/CUDD/CMakeLists.txt +1 -1
- package/lib/DDA/DDAStat.cpp +2 -2
- package/lib/Graphs/SVFGStat.cpp +4 -4
- package/lib/MSSA/SVFGBuilder.cpp +0 -1
- package/lib/MTA/FSMPTA.cpp +2 -3
- package/lib/MTA/LockResultValidator.cpp +1 -1
- package/lib/MTA/MHP.cpp +0 -36
- package/lib/MTA/MTAResultValidator.cpp +3 -3
- package/lib/MTA/TCT.cpp +0 -1
- package/lib/MemoryModel/PointerAnalysis.cpp +1 -1
- package/lib/MemoryModel/PointerAnalysisImpl.cpp +0 -1
- package/lib/MemoryModel/SVFIR.cpp +15 -15
- package/lib/MemoryModel/SymbolTableInfo.cpp +1 -1
- package/lib/SVF-FE/LLVMUtil.cpp +1 -1
- package/lib/SVF-FE/SVFIRBuilder.cpp +5 -5
- package/lib/Util/CoreBitVector.cpp +1 -1
- package/lib/Util/ExtAPI.cpp +1 -0
- package/lib/Util/NodeIDAllocator.cpp +0 -1
- package/lib/WPA/AndersenSFR.cpp +2 -2
- package/lib/WPA/FlowSensitiveTBHC.cpp +1 -1
- package/lib/WPA/VersionedFlowSensitive.cpp +4 -4
- package/package.json +1 -1
- package/tools/Example/svf-ex.cpp +4 -3
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">FlowSensitiveTBHC.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="FlowSensitiveTBHC_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- FlowSensitiveTBHC.cpp -- flow-sensitive type filter ------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * FlowSensitiveTBHC.cpp</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Created on: Oct 08, 2019</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> */</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "<a class="code" href="DCHG_8h.html">SVF-FE/DCHG.h</a>"</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="CPPUtil_8h.html">SVF-FE/CPPUtil.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="FlowSensitiveTBHC_8h.html">WPA/FlowSensitiveTBHC.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="WPAStat_8h.html">WPA/WPAStat.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include "<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abb0d8712ec0f9d6ae4e4e0971eac07f4"> 20</a></span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abb0d8712ec0f9d6ae4e4e0971eac07f4">FlowSensitiveTBHC::FlowSensitiveTBHC</a>(<a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a>* _pag, <a class="code" href="classSVF_1_1PointerAnalysis.html#a0b182ac680cce0547dbe7714c870ca85">PTATY</a> type) : <a class="code" href="classSVF_1_1FlowSensitive.html">FlowSensitive</a>(_pag, type), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html">TypeBasedHeapCloning</a>(this)</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> {</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="comment">// Using `this` as the argument for TypeBasedHeapCloning is okay. As PointerAnalysis, it's</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <span class="comment">// already constructed. TypeBasedHeapCloning also doesn't use pta in the constructor so it</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="comment">// just needs to be allocated, which it is.</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a734e01c66832346c61d4cda38db84f4a">allReuse</a> = <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a>;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ac7ed9100533dc399c71cdf017bfa2462">storeReuse</a> = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a734e01c66832346c61d4cda38db84f4a">allReuse</a> || <a class="code" href="classSVF_1_1Options.html#a10cc9fa1d4e553865343d635cf84592e">Options::TBHCStoreReuse</a>;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> }</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abcab6281cced08d90c92d67d43a37c2c"> 29</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abcab6281cced08d90c92d67d43a37c2c">FlowSensitiveTBHC::analyze</a>()</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> {</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a267f7198600dde3054feb40def7a6681">FlowSensitive::analyze</a>();</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> }</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> </div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a4c5fb70aafc3a589b7b1e82ba8f61a6f"> 34</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a4c5fb70aafc3a589b7b1e82ba8f61a6f">FlowSensitiveTBHC::initialize</a>()</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> {</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a> = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">AndersenWaveDiff::createAndersenWaveDiff</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html#a240219c2dc4f5cc5f85445e18c79b83b">getPAG</a>());</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a> = <a class="code" href="classSVF_1_1FlowSensitive.html#a76f6f19ac2b58ab4a10a2d7e6e24e42a">memSSA</a>.<a class="code" href="classSVF_1_1SVFGBuilder.html#a54a713e3989597b11cee70864d0197bd">buildFullSVFG</a>(ander);</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <a class="code" href="classSVF_1_1WPASolver.html#aa04deb39cd024c051f30ac43d1d62b34">setGraph</a>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>);</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a88f9752372eabb71f47f13a89e4d6d9c">FlowSensitiveStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <a class="code" href="classSVF_1_1DCHGraph.html">DCHGraph</a> *<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a> = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1DCHGraph.html">DCHGraph</a>>(<a class="code" href="classSVF_1_1PointerAnalysis.html#ae2cc7cd0803dbd90639140e71b06b1b5">getCHGraph</a>());</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(dchg != <span class="keyword">nullptr</span> && <span class="stringliteral">"FSTBHC: DCHGraph required!"</span>);</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aaaf50870e50b45b44d4ecaaaab662770">TypeBasedHeapCloning::setDCHG</a>(dchg);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a0890235fa3725c23435ea3245c52c038">TypeBasedHeapCloning::setPAG</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>);</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="comment">// Populates loadGeps.</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a80052c89d1a9f54cfbf8f9790110899d">determineWhichGepsAreLoads</a>();</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> }</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> </div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a3564d6ad7e12e0a833b4cea203a809e4"> 52</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a3564d6ad7e12e0a833b4cea203a809e4">FlowSensitiveTBHC::finalize</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> {</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#afed358369102f01f6fe88b1433e704c3">FlowSensitive::finalize</a>();</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="comment">// ^ Will print call graph and alias stats.</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1PointerAnalysis.html#a3550ea3f087ec557a6fe076bc443b05d">print_stat</a>)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a1a7b51e7d959795c00383721b013834d">dumpStats</a>();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// getDFPTDataTy()->dumpPTData();</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae42ec334a7dfc96a5ead2d2845ca3b22">validateTBHCTests</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html#a7e8b3f6843e5ea75fd189162d2cd60a5">svfMod</a>);</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> }</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a81ce8b1e98db245d3f4ccf189ca11e47"> 64</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a81ce8b1e98db245d3f4ccf189ca11e47">FlowSensitiveTBHC::backPropagate</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> clone)</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *cloneObj = <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(clone);</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(cloneObj && <span class="stringliteral">"FSTBHC: clone does not exist in SVFIR?"</span>);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *originalObj = <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(clone));</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(cloneObj && <span class="stringliteral">"FSTBHC: original object does not exist in SVFIR?"</span>);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="comment">// Check the original object too because when reuse of a gep occurs, the new object</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="comment">// is an FI object.</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keywordflow">if</span> (SVFUtil::isa<CloneGepObjVar>(cloneObj) || SVFUtil::isa<GepObjVar>(originalObj))</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  {</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="comment">// Since getGepObjClones is updated, some GEP nodes need to be redone.</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &retrievers = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acd6ade2b73c19d1eb7faf0e457becba6">gepToSVFGRetrievers</a>[<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(clone)];</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> r : retrievers)</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  {</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(r);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  }</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  }</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<CloneFIObjVar>(cloneObj) || SVFUtil::isa<CloneDummyObjVar>(cloneObj))</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a5681d78630ca8770dd493ef3841ec683">getAllocationSite</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(clone)));</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  {</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"FSTBHC: unexpected object type?"</span>);</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  }</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a83a4defe2bcb1c99c66aea8c8325d5fd"> 91</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a83a4defe2bcb1c99c66aea8c8325d5fd">FlowSensitiveTBHC::propAlongIndirectEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* edge)</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>();</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dst = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="comment">// Get points-to targets may be used by next SVFG node.</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="comment">// Propagate points-to set for node used in dst.</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> & pts = edge-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="comment">// Since the base Andersen's analysis does NOT perform type-based heap cloning,</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="comment">// it uses only the base objects; we want to account for clones too.</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> edgePtsAndClones;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="comment">// TODO: the conditional bool may be unnecessary.</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="comment">// Adding all clones is redundant, and introduces too many calls to propVarPts...</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="comment">// This introduces performance and precision penalties.</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="comment">// We should filter out according to src.</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordtype">bool</span> isStore = <span class="keyword">false</span>;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> storePts;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a> *store = SVFUtil::dyn_cast<StoreSVFGNode>(src))</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(store);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  isStore = <span class="keyword">true</span>;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  storePts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(store->getPAGDstNodeID());</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  }</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(src-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  {</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">if</span> (!filterSet.test(o))</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  {</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  edgePtsAndClones.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> c : <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#af127bed600087b1ace26088a76ca8998">getClones</a>(o))</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (!isStore)</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">if</span> (!filterSet.test(c))</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  {</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  edgePtsAndClones.set(c);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  }</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (storePts.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(c) && !filterSet.test(c))</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  {</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  edgePtsAndClones.set(c);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  }</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  }</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a> *gep = SVFUtil::dyn_cast<GepObjVar>(<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(o)))</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="comment">// Want the geps which are at the same "level" as this one (same mem obj, same offset).</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &geps = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ad043ab95900849a5a894ca4bada4e032">getGepObjsFromMemObj</a>(gep->getMemObj(), gep->getConstantFieldIdx());</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> g : geps)</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  {</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *gepType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a219edef6c013a953ed12ee3c56bde6de">getType</a>(g);</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">if</span> (!isStore || gepType || <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#add00f1c20a524c0be903af679bd6f638">isBase</a>(tildet, gepType))</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  {</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">if</span> (!filterSet.test(g))</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  {</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  edgePtsAndClones.set(g);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  }</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  }</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  }</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  }</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : edgePtsAndClones)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#ae571767cc5936cf631a44976d8277e91">propVarPtsFromSrcToDst</a>(o, src, dst))</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#af90d2ccb01402c5ca9d7a059f345c816">isFIObjNode</a>(o))</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &allFields = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> f : allFields)</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  {</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#ae571767cc5936cf631a44976d8277e91">propVarPtsFromSrcToDst</a>(f, src, dst))</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  }</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  }</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> </div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> }</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> </div><div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a15b8610fd7456d158a9e640c69d401a0"> 184</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a15b8610fd7456d158a9e640c69d401a0">FlowSensitiveTBHC::propAlongDirectEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1DirectSVFGEdge.html">DirectSVFGEdge</a>* edge)</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> </div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>();</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dst = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// If this is an actual-param or formal-ret, top-level pointer's pts must be</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="comment">// propagated from src to dst.</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ActualParmVFGNode.html">ActualParmSVFGNode</a>* ap = SVFUtil::dyn_cast<ActualParmSVFGNode>(src))</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  {</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">if</span> (!ap->getParam()->isPointer()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  changed = <a class="code" href="classSVF_1_1FlowSensitive.html#a3574977acd161925cadcb05de6d3247d">propagateFromAPToFP</a>(ap, dst);</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  }</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FormalRetVFGNode.html">FormalRetSVFGNode</a>* fp = SVFUtil::dyn_cast<FormalRetSVFGNode>(src))</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordflow">if</span> (!fp->getRet()->isPointer()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  changed = <a class="code" href="classSVF_1_1FlowSensitive.html#a3abffe1434386b1ce349fbed0cfe0967">propagateFromFRToAR</a>(fp, dst);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  }</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="comment">// Direct SVFG edge links between def and use of a top-level pointer.</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="comment">// There's no points-to information propagated along direct edge.</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="comment">// Since the top-level pointer's value has been changed at src node,</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="comment">// return TRUE to put dst node into the work list.</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  }</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> </div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#ae086de68233375be42185f0af706687a">directPropaTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> </div><div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abce5580e93cba1e591a0bac4e9070816"> 217</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abce5580e93cba1e591a0bac4e9070816">FlowSensitiveTBHC::processAddr</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrVFGNode.html">AddrSVFGNode</a>* addr)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcID = addr-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstID = addr-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a38f3ed35185addf701d4401bfdd5f29b">addrTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> </div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordflow">if</span> (!addr-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordtype">bool</span> changed = <a class="code" href="classSVF_1_1FlowSensitive.html#abb37c5e4e6fa4742e8dbcf397aea086e">FlowSensitive::processAddr</a>(addr);</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> </div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> </div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *objType;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#ae6ea391ac44dffeb6899bb44323c5361">isHeapMemObj</a>(srcID))</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  objType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(srcID))</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="comment">// Probably constants that have been merged into one.</span></div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="comment">// We make it undefined even though it's technically a global</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="comment">// to keep in line with SVF's design.</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="comment">// This will end up splitting into one for each type of constant.</span></div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  objType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  }</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="comment">// Stack/global.</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  objType = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(addr);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ac51cd735739a2499196a87323172a6a6">setType</a>(srcID, objType);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a006243a1416f4950de254d0d62ba40b0">setAllocationSite</a>(srcID, addr-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> </div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="comment">// All the typed versions of srcID. This handles back-propagation.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &clones = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#af127bed600087b1ace26088a76ca8998">getClones</a>(srcID);</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> c : clones)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  changed = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#af68485a2208553579f9c2e4b2cb20cff">addPts</a>(dstID, c) || changed;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="comment">// No need for typing these are all clones; they are all typed.</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a38f3ed35185addf701d4401bfdd5f29b">addrTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> }</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abf96f7329d8c50dcd75da048548d2c85"> 269</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abf96f7329d8c50dcd75da048548d2c85">FlowSensitiveTBHC::processGep</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1GepVFGNode.html">GepSVFGNode</a>* gep)</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="comment">// Copy of that in FlowSensitive.cpp + some changes.</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> </div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> </div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(gep);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">if</span> (tildet != <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>)</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  {</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordtype">bool</span> reuse = <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a> || (<a class="code" href="classSVF_1_1Options.html#a10cc9fa1d4e553865343d635cf84592e">Options::TBHCStoreReuse</a> && !<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad5b294dacf51a89306df9a22c6799bad">gepIsLoad</a>(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>()));</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), q, tildet, reuse, <span class="keyword">true</span>);</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">if</span> (!gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>())</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  }</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& qPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> oq : qPts)</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  {</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordflow">if</span> (filterSet.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(oq)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a59a9c7b8a7ec392ac609f10c8dac8d7f">TypeBasedHeapCloning::isBlkObjOrConstantObj</a>(oq))</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(oq);</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  {</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepStmt.html">GepStmt</a>* gepStmt = SVFUtil::cast<GepStmt>(gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>());</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">if</span> (gepStmt-><a class="code" href="classSVF_1_1GepStmt.html#a0ddf180a0f7ba64fc8655687910e3788">isVariantFieldGep</a>())</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  {</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">setObjFieldInsensitive</a>(oq);</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  tmpDstPts.set(oq);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a219edef6c013a953ed12ee3c56bde6de">getType</a>(oq);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">if</span> (t && (t->getTag() == dwarf::DW_TAG_array_type || t->getTag() == dwarf::DW_TAG_pointer_type))</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  {</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> fieldClones = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aa175b5db473eb57c03b6f908791d1133">getGepObjClones</a>(oq, 1);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fc : fieldClones)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acd6ade2b73c19d1eb7faf0e457becba6">gepToSVFGRetrievers</a>[<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(fc)].set(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  tmpDstPts.set(fc);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  }</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  {</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a219edef6c013a953ed12ee3c56bde6de">getType</a>(oq);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> </div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="comment">// Drop down to field insensitive.</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">if</span> (baseType == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  {</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">setObjFieldInsensitive</a>(oq);</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fiObj = oq;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  tmpDstPts.set(fiObj);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">DCHGraph::isAgg</a>(baseType) && baseType->getTag() != dwarf::DW_TAG_array_type</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  && gepStmt-><a class="code" href="classSVF_1_1GepStmt.html#a959a9c95d25f90fd7acc8e6e36056b56">getConstantFieldIdx</a>() >= <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a>-><a class="code" href="classSVF_1_1DCHGraph.html#a0788694fbff155949fc4f4d6487c223e">getNumFields</a>(baseType))</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  {</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="comment">// If the field offset is too high for this object, it is killed. It seems that a</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="comment">// clone was made on this GEP but this is not the base (e.g. base->f1->f2), and SVF</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="comment">// expects to operate on the base (hence the large offset). The base will have been</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="comment">// cloned at another GEP and back-propagated, thus it'll reach here safe and sound.</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="comment">// We ignore arrays/pointers because those are array accesses/pointer arithmetic we</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="comment">// assume are correct.</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="comment">// Obviously, non-aggregates cannot have their fields taken so they are spurious.</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  filterSet.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(oq);</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  {</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="comment">// Operate on the field and all its clones.</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> fieldClones = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aa175b5db473eb57c03b6f908791d1133">getGepObjClones</a>(oq, gepStmt-><a class="code" href="classSVF_1_1GepStmt.html#a959a9c95d25f90fd7acc8e6e36056b56">getConstantFieldIdx</a>());</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fc : fieldClones)</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acd6ade2b73c19d1eb7faf0e457becba6">gepToSVFGRetrievers</a>[<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(fc)].set(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  tmpDstPts.set(fc);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  }</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  }</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  }</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> </div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a282126e5b67ed4e19aa40c81180b8290">gepTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  changed = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#ae7073c07bfd7912f888d54d4652c7cc2">unionPts</a>(gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), tmpDstPts) || changed;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> }</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> </div><div class="line"><a name="l00364"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a42c8023e0e60e8701ec197b3d775b423"> 364</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a42c8023e0e60e8701ec197b3d775b423">FlowSensitiveTBHC::processLoad</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadVFGNode.html">LoadSVFGNode</a>* load)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> {</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> </div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(load);</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="keywordflow">if</span> (tildet != <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>)</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  {</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(load-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>(), tildet, <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a>);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  }</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> </div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="comment">// We want to perform the initialisation for non-pointer nodes but not process the load.</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">if</span> (!load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>())</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  {</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  }</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> </div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar = load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& srcPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>());</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(load-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// unionPtsFromIn is going to call getOriginalObj on ptd anyway.</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// This results in fewer loop iterations. o_t, o_s --> o.</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> srcOriginalObjs;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : srcPts)</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  {</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="keywordflow">if</span> (filterSet.test(s)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(s) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(s)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  srcOriginalObjs.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(s));</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  }</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> </div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd : srcOriginalObjs)</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  {</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// filterSet tests happened while building srcOriginalObjs.</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae">unionPtsFromIn</a>(load, ptd, dstVar))</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span> </div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#af90d2ccb01402c5ca9d7a059f345c816">isFIObjNode</a>(ptd))</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  {</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &allFields = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(ptd);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> f : allFields)</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae">unionPtsFromIn</a>(load, f, dstVar))</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  }</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  }</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> </div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#aab4f70210eb1e6447a24697d3b459067">loadTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span> }</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> </div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ac937e0e388071bbf94a477e1880663eb"> 419</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ac937e0e388071bbf94a477e1880663eb">FlowSensitiveTBHC::processStore</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a>* store)</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> {</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(store);</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">if</span> (tildet != <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>)</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  {</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), tildet, <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a> || <a class="code" href="classSVF_1_1Options.html#a10cc9fa1d4e553865343d635cf84592e">Options::TBHCStoreReuse</a>);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  }</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span> </div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="comment">// Like processLoad: we want to perform initialisation for non-pointers but not the store.</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">if</span> (!store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>())</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  {</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="comment">// Pass through and return because there may be some pointer nodes</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="comment">// relying on this node's parents.</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  changed = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a7e4ae809b40d55448de0103746254158">updateAllDFOutFromIn</a>(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), 0, <span class="keyword">false</span>);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  }</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span> </div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> & dstPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> </div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordflow">if</span> (dstPts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span> </div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>()).<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>() == <span class="keyword">false</span>)</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  {</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd : dstPts)</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  {</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">if</span> (filterSet.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(ptd)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(ptd) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(ptd))</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> </div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#adee98278cf3944e0b2b22e34aaecc4c5">unionPtsFromTop</a>(store, store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>(), ptd))</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  }</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  }</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span> </div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a82b76087363b26fbe749653935569de7">storeTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span> </div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordtype">double</span> updateStart = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="comment">// also merge the DFInSet to DFOutSet.</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span> <span class="comment"></span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> singleton;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="keywordtype">bool</span> isSU = <a class="code" href="classSVF_1_1FlowSensitive.html#a42a7e39e0e15576742f8ba7c32579ea2">isStrongUpdate</a>(store, singleton);</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">if</span> (isSU)</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.set(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a8ebe4342c1496b906ee1b6450558c3e8">strongUpdateOutFromIn</a>(store, singleton))</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  }</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  {</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.reset(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#ab492c283e2264b4cbd4c192e805b7750">weakUpdateOutFromIn</a>(store))</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  }</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="keywordtype">double</span> updateEnd = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#af5a94d14096ae2bbc47b3b3b9f723226">updateTime</a> += (updateEnd - updateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> </div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> </div><div class="line"><a name="l00494"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a0eb8335dd45b35b20d34c981b86b059c"> 494</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a0eb8335dd45b35b20d34c981b86b059c">FlowSensitiveTBHC::processPhi</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PHIVFGNode.html">PHISVFGNode</a>* phi)</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span> {</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordflow">if</span> (!phi-><a class="code" href="classSVF_1_1PHIVFGNode.html#a103e55e670ce614cabc13b8dc5b17b91">isPTANode</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1FlowSensitive.html#aa36fd1387e948e83107431179d819067">FlowSensitive::processPhi</a>(phi);</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> </div><div class="line"><a name="l00503"></a><span class="lineno"><a class="line" href="FlowSensitiveTBHC_8cpp.html#af72d866f4ffed004e104b686d4f94cb3"> 503</a></span> <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="FlowSensitiveTBHC_8cpp.html#af72d866f4ffed004e104b686d4f94cb3">getVTInitType</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyVFGNode.html">CopySVFGNode</a> *copy, <a class="code" href="classSVF_1_1DCHGraph.html">DCHGraph</a> *<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a>)</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span> (copy-><a class="code" href="classSVF_1_1StmtVFGNode.html#aae94dd9031a6662d509627e602aef532">getInst</a>() == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = copy-><a class="code" href="classSVF_1_1StmtVFGNode.html#aae94dd9031a6662d509627e602aef532">getInst</a>();</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span> </div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad3d3cec1813411f039211c86236f7adb">MDNode</a> *mdNode = inst->getMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#a02b3f4190d325c921922c25e319dc8d9">cppUtil::ctir::vtInitMDName</a>);</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordflow">if</span> (mdNode == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span> </div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *type = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a>>(mdNode);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(type != <span class="keyword">nullptr</span> && <span class="stringliteral">"TBHC: bad ctir.vt.init metadata"</span>);</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">return</span> dchg-><a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span> }</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span> </div><div class="line"><a name="l00516"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ab6525ac133151692176a03227f81bcac"> 516</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ab6525ac133151692176a03227f81bcac">FlowSensitiveTBHC::processCopy</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyVFGNode.html">CopySVFGNode</a>* copy)</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span> {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *vtInitType = <a class="code" href="FlowSensitiveTBHC_8cpp.html#af72d866f4ffed004e104b686d4f94cb3">getVTInitType</a>(copy, <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a>);</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">if</span> (vtInitType != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  {</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="comment">// Setting the virtual table pointer.</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(copy-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), copy-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>(), vtInitType, <span class="keyword">true</span>);</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  }</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> </div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1FlowSensitive.html#aa401cc90de4e1c6842f08a43a28c5aa1">FlowSensitive::processCopy</a>(copy) || changed;</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> }</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> </div><div class="line"><a name="l00529"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a"> 529</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">FlowSensitiveTBHC::getAllFieldsObjVars</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span>)</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> {</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#afe416f9ec57923f34ef1db3890a3f9e1">getGepObjs</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span> }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span> </div><div class="line"><a name="l00534"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#acb11d6879836e27195c85ca882df6d17"> 534</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acb11d6879836e27195c85ca882df6d17">FlowSensitiveTBHC::updateInFromIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span> {</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="comment">// IN sets are only based on the original object.</span></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a88cf9cd48ee5c1b8b3c71b379f23ab6b">updateDFInFromIn</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> }</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> </div><div class="line"><a name="l00541"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ab9615acdb43219c39f40e886f5baf803"> 541</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ab9615acdb43219c39f40e886f5baf803">FlowSensitiveTBHC::updateInFromOut</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span> {</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="comment">// OUT/IN sets only have original objects.</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a2ec4fb73d87f10c86fac34b3500532b3">updateDFInFromOut</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> }</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00548"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae"> 548</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae">FlowSensitiveTBHC::unionPtsFromIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* stmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> {</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="comment">// IN sets only have original objects.</span></div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#aaa6f67ff5daf7d71a3ad62316a7dd872">updateTLVPts</a>(stmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar), dstVar);</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> }</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> </div><div class="line"><a name="l00554"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#adee98278cf3944e0b2b22e34aaecc4c5"> 554</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#adee98278cf3944e0b2b22e34aaecc4c5">FlowSensitiveTBHC::unionPtsFromTop</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* stmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> {</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="comment">// OUT sets only have original objects.</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a09bc4b7eef592af2c2c84b60029b5b52">updateATVPts</a>(srcVar, stmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> </div><div class="line"><a name="l00560"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#aab08c9a0527138599e58e72f69071ecb"> 560</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#aab08c9a0527138599e58e72f69071ecb">FlowSensitiveTBHC::propDFInToIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> {</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="comment">// IN sets are only based on the original object.</span></div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a506a2be8f909663d59245254bddea00b">updateAllDFInFromIn</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> }</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> </div><div class="line"><a name="l00567"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abf5cca7e8332930c8f6adbfdb6f72629"> 567</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abf5cca7e8332930c8f6adbfdb6f72629">FlowSensitiveTBHC::propDFOutToIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> {</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="comment">// OUT/IN sets only have original objects.</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a96a5d7e867095b3c215c73599fd31c19">updateAllDFInFromOut</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span> }</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span> </div><div class="line"><a name="l00574"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a80052c89d1a9f54cfbf8f9790110899d"> 574</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a80052c89d1a9f54cfbf8f9790110899d">FlowSensitiveTBHC::determineWhichGepsAreLoads</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> {</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> nI = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); nI != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++nI)</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  {</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *svfgNode = nI->second;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a> *gep = SVFUtil::dyn_cast<GepSVFGNode>(svfgNode))</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  {</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="comment">// Only care about ctir nodes - they have the reuse problem.</span></div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(gep))</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  {</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordtype">bool</span> isLoad = <span class="keyword">true</span>;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : gep->getOutEdges())</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  {</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *dst = e->getDstNode();</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="comment">// Loop on itself - don't care.</span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">if</span> (gep == dst) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<LoadSVFGNode>(dst))</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  isLoad = <span class="keyword">false</span>;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  }</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">if</span> (isLoad)</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  {</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a5c96229c2da784a3db98ecbdd3137434">loadGeps</a>.set(gep->getId());</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  }</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  }</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  }</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> }</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> </div><div class="line"><a name="l00608"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ad5b294dacf51a89306df9a22c6799bad"> 608</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad5b294dacf51a89306df9a22c6799bad">FlowSensitiveTBHC::gepIsLoad</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> gep)</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span> {</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="comment">// Handles when gep is not even a GEP; loadGeps only contains GEPs.</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a5c96229c2da784a3db98ecbdd3137434">loadGeps</a>.test(gep);</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> </div><div class="line"><a name="l00614"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a2c47ba37bd250be455a21d1f0049d556"> 614</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad3d3cec1813411f039211c86236f7adb">MDNode</a> *<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a2c47ba37bd250be455a21d1f0049d556">FlowSensitiveTBHC::getRawCTirMetadata</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s)</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> {</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a> *stmt = SVFUtil::dyn_cast<StmtSVFGNode>(s))</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  {</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *v = stmt->getInst() ? stmt->getInst() : stmt->getPAGEdge()->getValue();</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">if</span> (v != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a21d2fd8bbef0c6f6ddddb5387569a7fa">TypeBasedHeapCloning::getRawCTirMetadata</a>(v);</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> }</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> </div><div class="line"><a name="l00628"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7"> 628</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">FlowSensitiveTBHC::getTypeFromCTirMetadata</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s)</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> {</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a> *stmt = SVFUtil::dyn_cast<StmtSVFGNode>(s))</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *v = stmt->getInst();</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">if</span> (v != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  {</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ac4565775cced4444ba007e310c4a02d8">TypeBasedHeapCloning::getTypeFromCTirMetadata</a>(v);</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  }</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  }</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> </div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> }</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> </div><div class="line"><a name="l00642"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a3af0297eb75ac4009433be44bb286d30"> 642</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a3af0297eb75ac4009433be44bb286d30">FlowSensitiveTBHC::expandFIObjs</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& pts, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& expandedPts)</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> {</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  expandedPts = pts;</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  expandedPts |= <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordflow">while</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a> *gepObj = SVFUtil::dyn_cast<GepObjVar>(<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(o)))</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  {</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  expandedPts |= <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  o = gepObj->getBaseNode();</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  }</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span> }</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span> </div><div class="line"><a name="l00656"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abe784dfae06a7c1943b8f0a18bd79f14"> 656</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abe784dfae06a7c1943b8f0a18bd79f14">FlowSensitiveTBHC::countAliases</a>(<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set</a><std::pair<NodeID, NodeID>> cmp, <span class="keywordtype">unsigned</span> *mayAliases, <span class="keywordtype">unsigned</span> *noAliases)</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span> {</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<std::pair<NodeID, NodeID></a>, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>> filteredPts;</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordflow">for</span> (std::pair<NodeID, NodeID> locP : cmp)</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  {</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(locP.first);</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &pts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(locP.second);</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &ptsFiltered = filteredPts[locP];</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> </div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  {</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordflow">if</span> (filterSet.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  ptsFiltered.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  }</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  }</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keywordflow">for</span> (std::pair<NodeID, NodeID> locPA : cmp)</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  {</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &aPts = filteredPts[locPA];</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keywordflow">for</span> (std::pair<NodeID, NodeID> locPB : cmp)</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  {</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordflow">if</span> (locPB == locPA) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &bPts = filteredPts[locPB];</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span> </div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordflow">switch</span> (<a class="code" href="classSVF_1_1BVDataPTAImpl.html#ad06fbd9a51499c668662b533eeb2e4ac">alias</a>(aPts, bPts))</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  {</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">case</span> <a class="code" href="namespaceSVF.html#a61c01e2e687ab3a001fb806737583943afdd83ddff93d38902f07775cd36df239">AliasResult::NoAlias</a>:</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  ++(*noAliases);</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">case</span> <a class="code" href="namespaceSVF.html#a61c01e2e687ab3a001fb806737583943aef15fd8989d8dd9576b3fbb2aabc118f">AliasResult::MayAlias</a>:</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  ++(*mayAliases);</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="stringliteral">"Not May/NoAlias?"</span>);</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  }</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  }</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span> </div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span> }</div><div class="ttc" id="FlowSensitiveTBHC_8h_html"><div class="ttname"><a href="FlowSensitiveTBHC_8h.html">FlowSensitiveTBHC.h</a></div></div>
|
|
69
|
+
<a href="FlowSensitiveTBHC_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- FlowSensitiveTBHC.cpp -- flow-sensitive type filter ------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * FlowSensitiveTBHC.cpp</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Created on: Oct 08, 2019</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> */</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "<a class="code" href="DCHG_8h.html">SVF-FE/DCHG.h</a>"</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="CPPUtil_8h.html">SVF-FE/CPPUtil.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="FlowSensitiveTBHC_8h.html">WPA/FlowSensitiveTBHC.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="WPAStat_8h.html">WPA/WPAStat.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include "<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abb0d8712ec0f9d6ae4e4e0971eac07f4"> 20</a></span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abb0d8712ec0f9d6ae4e4e0971eac07f4">FlowSensitiveTBHC::FlowSensitiveTBHC</a>(<a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a>* _pag, <a class="code" href="classSVF_1_1PointerAnalysis.html#a0b182ac680cce0547dbe7714c870ca85">PTATY</a> type) : <a class="code" href="classSVF_1_1FlowSensitive.html">FlowSensitive</a>(_pag, type), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html">TypeBasedHeapCloning</a>(this)</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> {</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span>  <span class="comment">// Using `this` as the argument for TypeBasedHeapCloning is okay. As PointerAnalysis, it's</span></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <span class="comment">// already constructed. TypeBasedHeapCloning also doesn't use pta in the constructor so it</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="comment">// just needs to be allocated, which it is.</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a734e01c66832346c61d4cda38db84f4a">allReuse</a> = <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a>;</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ac7ed9100533dc399c71cdf017bfa2462">storeReuse</a> = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a734e01c66832346c61d4cda38db84f4a">allReuse</a> || <a class="code" href="classSVF_1_1Options.html#a10cc9fa1d4e553865343d635cf84592e">Options::TBHCStoreReuse</a>;</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> }</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> </div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abcab6281cced08d90c92d67d43a37c2c"> 29</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abcab6281cced08d90c92d67d43a37c2c">FlowSensitiveTBHC::analyze</a>()</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> {</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a267f7198600dde3054feb40def7a6681">FlowSensitive::analyze</a>();</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> }</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> </div><div class="line"><a name="l00034"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a4c5fb70aafc3a589b7b1e82ba8f61a6f"> 34</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a4c5fb70aafc3a589b7b1e82ba8f61a6f">FlowSensitiveTBHC::initialize</a>()</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> {</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a> = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">AndersenWaveDiff::createAndersenWaveDiff</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html#a240219c2dc4f5cc5f85445e18c79b83b">getPAG</a>());</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a> = <a class="code" href="classSVF_1_1FlowSensitive.html#a76f6f19ac2b58ab4a10a2d7e6e24e42a">memSSA</a>.<a class="code" href="classSVF_1_1SVFGBuilder.html#a54a713e3989597b11cee70864d0197bd">buildFullSVFG</a>(ander);</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <a class="code" href="classSVF_1_1WPASolver.html#aa04deb39cd024c051f30ac43d1d62b34">setGraph</a>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>);</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a88f9752372eabb71f47f13a89e4d6d9c">FlowSensitiveStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <a class="code" href="classSVF_1_1DCHGraph.html">DCHGraph</a> *<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a> = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1DCHGraph.html">DCHGraph</a>>(<a class="code" href="classSVF_1_1PointerAnalysis.html#ae2cc7cd0803dbd90639140e71b06b1b5">getCHGraph</a>());</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(dchg != <span class="keyword">nullptr</span> && <span class="stringliteral">"FSTBHC: DCHGraph required!"</span>);</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aaaf50870e50b45b44d4ecaaaab662770">TypeBasedHeapCloning::setDCHG</a>(dchg);</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a0890235fa3725c23435ea3245c52c038">TypeBasedHeapCloning::setPAG</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>);</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <span class="comment">// Populates loadGeps.</span></div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a80052c89d1a9f54cfbf8f9790110899d">determineWhichGepsAreLoads</a>();</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> }</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span> </div><div class="line"><a name="l00052"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a3564d6ad7e12e0a833b4cea203a809e4"> 52</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a3564d6ad7e12e0a833b4cea203a809e4">FlowSensitiveTBHC::finalize</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> {</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#afed358369102f01f6fe88b1433e704c3">FlowSensitive::finalize</a>();</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <span class="comment">// ^ Will print call graph and alias stats.</span></div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span> </div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1PointerAnalysis.html#a3550ea3f087ec557a6fe076bc443b05d">print_stat</a>)</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a1a7b51e7d959795c00383721b013834d">dumpStats</a>();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// getDFPTDataTy()->dumpPTData();</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae42ec334a7dfc96a5ead2d2845ca3b22">validateTBHCTests</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html#a7e8b3f6843e5ea75fd189162d2cd60a5">svfMod</a>);</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span> }</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span> </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a81ce8b1e98db245d3f4ccf189ca11e47"> 64</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a81ce8b1e98db245d3f4ccf189ca11e47">FlowSensitiveTBHC::backPropagate</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> clone)</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> {</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *cloneObj = <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(clone);</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(cloneObj && <span class="stringliteral">"FSTBHC: clone does not exist in SVFIR?"</span>);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *originalObj = <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(clone));</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(cloneObj && <span class="stringliteral">"FSTBHC: original object does not exist in SVFIR?"</span>);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="comment">// Check the original object too because when reuse of a gep occurs, the new object</span></div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  <span class="comment">// is an FI object.</span></div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keywordflow">if</span> (SVFUtil::isa<CloneGepObjVar>(cloneObj) || SVFUtil::isa<GepObjVar>(originalObj))</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  {</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="comment">// Since getGepObjClones is updated, some GEP nodes need to be redone.</span></div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &retrievers = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acd6ade2b73c19d1eb7faf0e457becba6">gepToSVFGRetrievers</a>[<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(clone)];</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> r : retrievers)</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  {</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(r);</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  }</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  }</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<CloneFIObjVar>(cloneObj) || SVFUtil::isa<CloneDummyObjVar>(cloneObj))</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a5681d78630ca8770dd493ef3841ec683">getAllocationSite</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(clone)));</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  {</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"FSTBHC: unexpected object type?"</span>);</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  }</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> </div><div class="line"><a name="l00091"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a83a4defe2bcb1c99c66aea8c8325d5fd"> 91</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a83a4defe2bcb1c99c66aea8c8325d5fd">FlowSensitiveTBHC::propAlongIndirectEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* edge)</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span> {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>();</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dst = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span> </div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <span class="comment">// Get points-to targets may be used by next SVFG node.</span></div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="comment">// Propagate points-to set for node used in dst.</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> & pts = edge-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="comment">// Since the base Andersen's analysis does NOT perform type-based heap cloning,</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="comment">// it uses only the base objects; we want to account for clones too.</span></div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> edgePtsAndClones;</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="comment">// TODO: the conditional bool may be unnecessary.</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="comment">// Adding all clones is redundant, and introduces too many calls to propVarPts...</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <span class="comment">// This introduces performance and precision penalties.</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  <span class="comment">// We should filter out according to src.</span></div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordtype">bool</span> isStore = <span class="keyword">false</span>;</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> storePts;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a> *store = SVFUtil::dyn_cast<StoreSVFGNode>(src))</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(store);</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  isStore = <span class="keyword">true</span>;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  storePts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(store->getPAGDstNodeID());</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  }</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span> </div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(src-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  {</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">if</span> (!filterSet.test(o))</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  {</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  edgePtsAndClones.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  }</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> c : <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#af127bed600087b1ace26088a76ca8998">getClones</a>(o))</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  {</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (!isStore)</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <span class="keywordflow">if</span> (!filterSet.test(c))</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  {</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  edgePtsAndClones.set(c);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  }</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  {</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <span class="keywordflow">if</span> (storePts.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(c) && !filterSet.test(c))</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  {</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  edgePtsAndClones.set(c);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  }</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  }</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>  }</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a> *gep = SVFUtil::dyn_cast<GepObjVar>(<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(o)))</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="comment">// Want the geps which are at the same "level" as this one (same mem obj, same offset).</span></div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &geps = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ad043ab95900849a5a894ca4bada4e032">getGepObjsFromMemObj</a>(gep->getMemObj(), gep->getConstantFieldIdx());</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> g : geps)</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  {</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *gepType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a219edef6c013a953ed12ee3c56bde6de">getType</a>(g);</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keywordflow">if</span> (!isStore || gepType || <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#add00f1c20a524c0be903af679bd6f638">isBase</a>(tildet, gepType))</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  {</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <span class="keywordflow">if</span> (!filterSet.test(g))</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  {</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  edgePtsAndClones.set(g);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  }</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  }</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  }</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  }</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : edgePtsAndClones)</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  {</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#ae571767cc5936cf631a44976d8277e91">propVarPtsFromSrcToDst</a>(o, src, dst))</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> </div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#af90d2ccb01402c5ca9d7a059f345c816">isFIObjNode</a>(o))</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &allFields = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> f : allFields)</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  {</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#ae571767cc5936cf631a44976d8277e91">propVarPtsFromSrcToDst</a>(f, src, dst))</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  }</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  }</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> </div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> }</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span> </div><div class="line"><a name="l00184"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a15b8610fd7456d158a9e640c69d401a0"> 184</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a15b8610fd7456d158a9e640c69d401a0">FlowSensitiveTBHC::propAlongDirectEdge</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1DirectSVFGEdge.html">DirectSVFGEdge</a>* edge)</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span> {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span> </div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* src = edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>();</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dst = edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>();</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// If this is an actual-param or formal-ret, top-level pointer's pts must be</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="comment">// propagated from src to dst.</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ActualParmVFGNode.html">ActualParmSVFGNode</a>* ap = SVFUtil::dyn_cast<ActualParmSVFGNode>(src))</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  {</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">if</span> (!ap->getParam()->isPointer()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  changed = <a class="code" href="classSVF_1_1FlowSensitive.html#a3574977acd161925cadcb05de6d3247d">propagateFromAPToFP</a>(ap, dst);</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  }</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FormalRetVFGNode.html">FormalRetSVFGNode</a>* fp = SVFUtil::dyn_cast<FormalRetSVFGNode>(src))</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  {</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordflow">if</span> (!fp->getRet()->isPointer()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  changed = <a class="code" href="classSVF_1_1FlowSensitive.html#a3abffe1434386b1ce349fbed0cfe0967">propagateFromFRToAR</a>(fp, dst);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  }</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="comment">// Direct SVFG edge links between def and use of a top-level pointer.</span></div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="comment">// There's no points-to information propagated along direct edge.</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="comment">// Since the top-level pointer's value has been changed at src node,</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="comment">// return TRUE to put dst node into the work list.</span></div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  }</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span> </div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#ae086de68233375be42185f0af706687a">directPropaTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> }</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span> </div><div class="line"><a name="l00217"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abce5580e93cba1e591a0bac4e9070816"> 217</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abce5580e93cba1e591a0bac4e9070816">FlowSensitiveTBHC::processAddr</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrVFGNode.html">AddrSVFGNode</a>* addr)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span> {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span> </div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcID = addr-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstID = addr-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> </div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a38f3ed35185addf701d4401bfdd5f29b">addrTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> </div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordflow">if</span> (!addr-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordtype">bool</span> changed = <a class="code" href="classSVF_1_1FlowSensitive.html#abb37c5e4e6fa4742e8dbcf397aea086e">FlowSensitive::processAddr</a>(addr);</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span> </div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> </div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *objType;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#ae6ea391ac44dffeb6899bb44323c5361">isHeapMemObj</a>(srcID))</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  {</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  objType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(srcID))</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  {</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="comment">// Probably constants that have been merged into one.</span></div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="comment">// We make it undefined even though it's technically a global</span></div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="comment">// to keep in line with SVF's design.</span></div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="comment">// This will end up splitting into one for each type of constant.</span></div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  objType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  }</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <span class="comment">// Stack/global.</span></div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  objType = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(addr);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ac51cd735739a2499196a87323172a6a6">setType</a>(srcID, objType);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a006243a1416f4950de254d0d62ba40b0">setAllocationSite</a>(srcID, addr-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> </div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>  <span class="comment">// All the typed versions of srcID. This handles back-propagation.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &clones = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#af127bed600087b1ace26088a76ca8998">getClones</a>(srcID);</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> c : clones)</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  changed = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#af68485a2208553579f9c2e4b2cb20cff">addPts</a>(dstID, c) || changed;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="comment">// No need for typing these are all clones; they are all typed.</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a38f3ed35185addf701d4401bfdd5f29b">addrTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> }</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abf96f7329d8c50dcd75da048548d2c85"> 269</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abf96f7329d8c50dcd75da048548d2c85">FlowSensitiveTBHC::processGep</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1GepVFGNode.html">GepSVFGNode</a>* gep)</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="comment">// Copy of that in FlowSensitive.cpp + some changes.</span></div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span> </div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> </div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(gep);</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">if</span> (tildet != <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>)</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  {</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordtype">bool</span> reuse = <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a> || (<a class="code" href="classSVF_1_1Options.html#a10cc9fa1d4e553865343d635cf84592e">Options::TBHCStoreReuse</a> && !<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad5b294dacf51a89306df9a22c6799bad">gepIsLoad</a>(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>()));</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), q, tildet, reuse, <span class="keyword">true</span>);</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">if</span> (!gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>())</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  }</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& qPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> oq : qPts)</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  {</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordflow">if</span> (filterSet.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(oq)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span> </div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a59a9c7b8a7ec392ac609f10c8dac8d7f">TypeBasedHeapCloning::isBlkObjOrConstantObj</a>(oq))</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  {</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(oq);</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  {</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepStmt.html">GepStmt</a>* gepStmt = SVFUtil::cast<GepStmt>(gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>());</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keywordflow">if</span> (gepStmt-><a class="code" href="classSVF_1_1GepStmt.html#a0ddf180a0f7ba64fc8655687910e3788">isVariantFieldGep</a>())</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  {</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">setObjFieldInsensitive</a>(oq);</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  tmpDstPts.set(oq);</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *t = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a219edef6c013a953ed12ee3c56bde6de">getType</a>(oq);</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">if</span> (t && (t->getTag() == dwarf::DW_TAG_array_type || t->getTag() == dwarf::DW_TAG_pointer_type))</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  {</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> fieldClones = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aa175b5db473eb57c03b6f908791d1133">getGepObjClones</a>(oq, 1);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fc : fieldClones)</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acd6ade2b73c19d1eb7faf0e457becba6">gepToSVFGRetrievers</a>[<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(fc)].set(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  tmpDstPts.set(fc);</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  }</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  {</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *baseType = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a219edef6c013a953ed12ee3c56bde6de">getType</a>(oq);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> </div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="comment">// Drop down to field insensitive.</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">if</span> (baseType == <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  {</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">setObjFieldInsensitive</a>(oq);</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fiObj = oq;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  tmpDstPts.set(fiObj);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  }</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1DCHGraph.html#a9d2be5aec5216cbc1d1709b41f79c44b">DCHGraph::isAgg</a>(baseType) && baseType->getTag() != dwarf::DW_TAG_array_type</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  && ((<a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a>)gepStmt-><a class="code" href="classSVF_1_1GepStmt.html#a959a9c95d25f90fd7acc8e6e36056b56">getConstantFieldIdx</a>() >= <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a>-><a class="code" href="classSVF_1_1DCHGraph.html#a0788694fbff155949fc4f4d6487c223e">getNumFields</a>(baseType)))</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  {</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="comment">// If the field offset is too high for this object, it is killed. It seems that a</span></div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="comment">// clone was made on this GEP but this is not the base (e.g. base->f1->f2), and SVF</span></div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="comment">// expects to operate on the base (hence the large offset). The base will have been</span></div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="comment">// cloned at another GEP and back-propagated, thus it'll reach here safe and sound.</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="comment">// We ignore arrays/pointers because those are array accesses/pointer arithmetic we</span></div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="comment">// assume are correct.</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="comment">// Obviously, non-aggregates cannot have their fields taken so they are spurious.</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  filterSet.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(oq);</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  {</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  <span class="comment">// Operate on the field and all its clones.</span></div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> fieldClones = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aa175b5db473eb57c03b6f908791d1133">getGepObjClones</a>(oq, gepStmt-><a class="code" href="classSVF_1_1GepStmt.html#a959a9c95d25f90fd7acc8e6e36056b56">getConstantFieldIdx</a>());</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fc : fieldClones)</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acd6ade2b73c19d1eb7faf0e457becba6">gepToSVFGRetrievers</a>[<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(fc)].set(gep-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  tmpDstPts.set(fc);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  }</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  }</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  }</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  }</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  }</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> </div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a282126e5b67ed4e19aa40c81180b8290">gepTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  changed = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#ae7073c07bfd7912f888d54d4652c7cc2">unionPts</a>(gep-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), tmpDstPts) || changed;</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span> }</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span> </div><div class="line"><a name="l00364"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a42c8023e0e60e8701ec197b3d775b423"> 364</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a42c8023e0e60e8701ec197b3d775b423">FlowSensitiveTBHC::processLoad</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadVFGNode.html">LoadSVFGNode</a>* load)</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span> {</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span> </div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(load);</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="keywordflow">if</span> (tildet != <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>)</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  {</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(load-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>(), tildet, <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a>);</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  }</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span> </div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="comment">// We want to perform the initialisation for non-pointer nodes but not process the load.</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  <span class="keywordflow">if</span> (!load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>())</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  {</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  }</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> </div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar = load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& srcPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>());</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(load-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="comment">// unionPtsFromIn is going to call getOriginalObj on ptd anyway.</span></div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <span class="comment">// This results in fewer loop iterations. o_t, o_s --> o.</span></div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> srcOriginalObjs;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : srcPts)</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  {</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="keywordflow">if</span> (filterSet.test(s)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(s) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(s)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  srcOriginalObjs.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(s));</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  }</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span> </div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd : srcOriginalObjs)</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  {</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// filterSet tests happened while building srcOriginalObjs.</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae">unionPtsFromIn</a>(load, ptd, dstVar))</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span> </div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#af90d2ccb01402c5ca9d7a059f345c816">isFIObjNode</a>(ptd))</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  {</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &allFields = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(ptd);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> f : allFields)</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  {</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae">unionPtsFromIn</a>(load, f, dstVar))</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  }</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  }</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  }</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span> </div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#aab4f70210eb1e6447a24697d3b459067">loadTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span> }</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> </div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ac937e0e388071bbf94a477e1880663eb"> 419</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ac937e0e388071bbf94a477e1880663eb">FlowSensitiveTBHC::processStore</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a>* store)</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span> {</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <span class="keywordtype">double</span> start = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *tildet = <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(store);</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <span class="keywordflow">if</span> (tildet != <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">undefType</a>)</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  {</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), tildet, <a class="code" href="classSVF_1_1Options.html#a930ed87e35ba7502f9d00be6f17f902f">Options::TBHCAllReuse</a> || <a class="code" href="classSVF_1_1Options.html#a10cc9fa1d4e553865343d635cf84592e">Options::TBHCStoreReuse</a>);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  }</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span> </div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="comment">// Like processLoad: we want to perform initialisation for non-pointers but not the store.</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">if</span> (!store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a4dd7615f42971da9b6ec1dc04f0ec4e6">getPAGEdge</a>()-><a class="code" href="classSVF_1_1SVFStmt.html#a0b6c03af568b70903da6b200ac86c951">isPTAEdge</a>())</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  {</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="comment">// Pass through and return because there may be some pointer nodes</span></div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="comment">// relying on this node's parents.</span></div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  changed = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a7e4ae809b40d55448de0103746254158">updateAllDFOutFromIn</a>(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), 0, <span class="keyword">false</span>);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  }</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span> </div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> & dstPts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span> </div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordflow">if</span> (dstPts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span> </div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>()).<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>() == <span class="keyword">false</span>)</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  {</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd : dstPts)</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  {</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <span class="keywordflow">if</span> (filterSet.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(ptd)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span> </div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">isConstantObj</a>(ptd) || <a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1SVFIR.html#a980e54129ece0757d7f0373f37428507">isNonPointerObj</a>(ptd))</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span> </div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#adee98278cf3944e0b2b22e34aaecc4c5">unionPtsFromTop</a>(store, store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>(), ptd))</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  }</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  }</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span> </div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keywordtype">double</span> end = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a82b76087363b26fbe749653935569de7">storeTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span> </div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordtype">double</span> updateStart = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <span class="comment">// also merge the DFInSet to DFOutSet.</span></div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span> <span class="comment"></span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> singleton;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="keywordtype">bool</span> isSU = <a class="code" href="classSVF_1_1FlowSensitive.html#a42a7e39e0e15576742f8ba7c32579ea2">isStrongUpdate</a>(store, singleton);</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <span class="keywordflow">if</span> (isSU)</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  {</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.set(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a8ebe4342c1496b906ee1b6450558c3e8">strongUpdateOutFromIn</a>(store, singleton))</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  }</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  {</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.reset(store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#ab492c283e2264b4cbd4c192e805b7750">weakUpdateOutFromIn</a>(store))</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  }</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="keywordtype">double</span> updateEnd = <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>();</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#af5a94d14096ae2bbc47b3b3b9f723226">updateTime</a> += (updateEnd - updateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> </div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> }</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> </div><div class="line"><a name="l00494"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a0eb8335dd45b35b20d34c981b86b059c"> 494</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a0eb8335dd45b35b20d34c981b86b059c">FlowSensitiveTBHC::processPhi</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PHIVFGNode.html">PHISVFGNode</a>* phi)</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span> {</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <span class="keywordflow">if</span> (!phi-><a class="code" href="classSVF_1_1PHIVFGNode.html#a103e55e670ce614cabc13b8dc5b17b91">isPTANode</a>()) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1FlowSensitive.html#aa36fd1387e948e83107431179d819067">FlowSensitive::processPhi</a>(phi);</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> </div><div class="line"><a name="l00503"></a><span class="lineno"><a class="line" href="FlowSensitiveTBHC_8cpp.html#af72d866f4ffed004e104b686d4f94cb3"> 503</a></span> <span class="keyword">static</span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="FlowSensitiveTBHC_8cpp.html#af72d866f4ffed004e104b686d4f94cb3">getVTInitType</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyVFGNode.html">CopySVFGNode</a> *copy, <a class="code" href="classSVF_1_1DCHGraph.html">DCHGraph</a> *<a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a>)</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> {</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span> (copy-><a class="code" href="classSVF_1_1StmtVFGNode.html#aae94dd9031a6662d509627e602aef532">getInst</a>() == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = copy-><a class="code" href="classSVF_1_1StmtVFGNode.html#aae94dd9031a6662d509627e602aef532">getInst</a>();</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span> </div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad3d3cec1813411f039211c86236f7adb">MDNode</a> *mdNode = inst->getMetadata(<a class="code" href="namespaceSVF_1_1cppUtil_1_1ctir.html#a02b3f4190d325c921922c25e319dc8d9">cppUtil::ctir::vtInitMDName</a>);</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordflow">if</span> (mdNode == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span> </div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *type = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a>>(mdNode);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(type != <span class="keyword">nullptr</span> && <span class="stringliteral">"TBHC: bad ctir.vt.init metadata"</span>);</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">return</span> dchg-><a class="code" href="classSVF_1_1DCHGraph.html#a079feacdcc3783f4a9108a3b2d2aed2c">getCanonicalType</a>(type);</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span> }</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span> </div><div class="line"><a name="l00516"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ab6525ac133151692176a03227f81bcac"> 516</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ab6525ac133151692176a03227f81bcac">FlowSensitiveTBHC::processCopy</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CopyVFGNode.html">CopySVFGNode</a>* copy)</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span> {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *vtInitType = <a class="code" href="FlowSensitiveTBHC_8cpp.html#af72d866f4ffed004e104b686d4f94cb3">getVTInitType</a>(copy, <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a465e67781977e83526df7e36d576e539">dchg</a>);</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keywordflow">if</span> (vtInitType != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  {</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="comment">// Setting the virtual table pointer.</span></div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  changed = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a34064efe336ada815b31050f683c7ce1">init</a>(copy-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), copy-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>(), vtInitType, <span class="keyword">true</span>);</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  }</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> </div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1FlowSensitive.html#aa401cc90de4e1c6842f08a43a28c5aa1">FlowSensitive::processCopy</a>(copy) || changed;</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> }</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> </div><div class="line"><a name="l00529"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a"> 529</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">FlowSensitiveTBHC::getAllFieldsObjVars</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span>)</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> {</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#afe416f9ec57923f34ef1db3890a3f9e1">getGepObjs</a>(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span> }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span> </div><div class="line"><a name="l00534"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#acb11d6879836e27195c85ca882df6d17"> 534</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#acb11d6879836e27195c85ca882df6d17">FlowSensitiveTBHC::updateInFromIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span> {</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="comment">// IN sets are only based on the original object.</span></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a88cf9cd48ee5c1b8b3c71b379f23ab6b">updateDFInFromIn</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span> }</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span> </div><div class="line"><a name="l00541"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ab9615acdb43219c39f40e886f5baf803"> 541</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ab9615acdb43219c39f40e886f5baf803">FlowSensitiveTBHC::updateInFromOut</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span> {</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  <span class="comment">// OUT/IN sets only have original objects.</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a2ec4fb73d87f10c86fac34b3500532b3">updateDFInFromOut</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> }</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00548"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae"> 548</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad53c6aebdcfa9fa334ccff4c68efa8ae">FlowSensitiveTBHC::unionPtsFromIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* stmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span> {</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="comment">// IN sets only have original objects.</span></div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#aaa6f67ff5daf7d71a3ad62316a7dd872">updateTLVPts</a>(stmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar), dstVar);</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> }</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> </div><div class="line"><a name="l00554"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#adee98278cf3944e0b2b22e34aaecc4c5"> 554</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#adee98278cf3944e0b2b22e34aaecc4c5">FlowSensitiveTBHC::unionPtsFromTop</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* stmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> {</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="comment">// OUT sets only have original objects.</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a09bc4b7eef592af2c2c84b60029b5b52">updateATVPts</a>(srcVar, stmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> </div><div class="line"><a name="l00560"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#aab08c9a0527138599e58e72f69071ecb"> 560</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#aab08c9a0527138599e58e72f69071ecb">FlowSensitiveTBHC::propDFInToIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> {</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="comment">// IN sets are only based on the original object.</span></div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a506a2be8f909663d59245254bddea00b">updateAllDFInFromIn</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> }</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> </div><div class="line"><a name="l00567"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abf5cca7e8332930c8f6adbfdb6f72629"> 567</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abf5cca7e8332930c8f6adbfdb6f72629">FlowSensitiveTBHC::propDFOutToIn</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcVar, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstStmt, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstVar)</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> {</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="comment">// OUT/IN sets only have original objects.</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">getDFPTDataTy</a>()-><a class="code" href="classSVF_1_1DFPTData.html#a96a5d7e867095b3c215c73599fd31c19">updateAllDFInFromOut</a>(srcStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(srcVar),</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  dstStmt-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#aeea7089c6f54b44f0509d41686b649f6">getOriginalObj</a>(dstVar));</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span> }</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span> </div><div class="line"><a name="l00574"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a80052c89d1a9f54cfbf8f9790110899d"> 574</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a80052c89d1a9f54cfbf8f9790110899d">FlowSensitiveTBHC::determineWhichGepsAreLoads</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> {</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> nI = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); nI != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++nI)</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  {</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *svfgNode = nI->second;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a> *gep = SVFUtil::dyn_cast<GepSVFGNode>(svfgNode))</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  {</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  <span class="comment">// Only care about ctir nodes - they have the reuse problem.</span></div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">getTypeFromCTirMetadata</a>(gep))</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  {</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  <span class="keywordtype">bool</span> isLoad = <span class="keyword">true</span>;</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : gep->getOutEdges())</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  {</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *dst = e->getDstNode();</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> </div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="comment">// Loop on itself - don't care.</span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">if</span> (gep == dst) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<LoadSVFGNode>(dst))</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  isLoad = <span class="keyword">false</span>;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  }</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  <span class="keywordflow">if</span> (isLoad)</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  {</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a5c96229c2da784a3db98ecbdd3137434">loadGeps</a>.set(gep->getId());</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  }</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  }</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  }</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  }</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> }</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> </div><div class="line"><a name="l00608"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#ad5b294dacf51a89306df9a22c6799bad"> 608</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#ad5b294dacf51a89306df9a22c6799bad">FlowSensitiveTBHC::gepIsLoad</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> gep)</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span> {</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="comment">// Handles when gep is not even a GEP; loadGeps only contains GEPs.</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a5c96229c2da784a3db98ecbdd3137434">loadGeps</a>.test(gep);</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> </div><div class="line"><a name="l00614"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a2c47ba37bd250be455a21d1f0049d556"> 614</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad3d3cec1813411f039211c86236f7adb">MDNode</a> *<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a2c47ba37bd250be455a21d1f0049d556">FlowSensitiveTBHC::getRawCTirMetadata</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s)</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> {</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a> *stmt = SVFUtil::dyn_cast<StmtSVFGNode>(s))</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>  {</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *v = stmt->getInst() ? stmt->getInst() : stmt->getPAGEdge()->getValue();</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <span class="keywordflow">if</span> (v != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  {</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#a21d2fd8bbef0c6f6ddddb5387569a7fa">TypeBasedHeapCloning::getRawCTirMetadata</a>(v);</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> </div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> }</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> </div><div class="line"><a name="l00628"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7"> 628</a></span> <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">DIType</a> *<a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">FlowSensitiveTBHC::getTypeFromCTirMetadata</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s)</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> {</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a> *stmt = SVFUtil::dyn_cast<StmtSVFGNode>(s))</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *v = stmt->getInst();</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">if</span> (v != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  {</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ac4565775cced4444ba007e310c4a02d8">TypeBasedHeapCloning::getTypeFromCTirMetadata</a>(v);</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  }</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  }</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> </div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <span class="keywordflow">return</span> <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> }</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> </div><div class="line"><a name="l00642"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#a3af0297eb75ac4009433be44bb286d30"> 642</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a3af0297eb75ac4009433be44bb286d30">FlowSensitiveTBHC::expandFIObjs</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& pts, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& expandedPts)</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> {</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  expandedPts = pts;</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  expandedPts |= <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <span class="keywordflow">while</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1GepObjVar.html">GepObjVar</a> *gepObj = SVFUtil::dyn_cast<GepObjVar>(<a class="code" href="classSVF_1_1PointerAnalysis.html#adc7f5c71efb9cd1bec4f5ca9127654c3">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(o)))</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  {</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  expandedPts |= <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#a56dc95bb4b6d48f82c87c6280237990a">getAllFieldsObjVars</a>(o);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  o = gepObj->getBaseNode();</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  }</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  }</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span> }</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span> </div><div class="line"><a name="l00656"></a><span class="lineno"><a class="line" href="classSVF_1_1FlowSensitiveTBHC.html#abe784dfae06a7c1943b8f0a18bd79f14"> 656</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitiveTBHC.html#abe784dfae06a7c1943b8f0a18bd79f14">FlowSensitiveTBHC::countAliases</a>(<a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set</a><std::pair<NodeID, NodeID>> cmp, <span class="keywordtype">unsigned</span> *mayAliases, <span class="keywordtype">unsigned</span> *noAliases)</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span> {</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<std::pair<NodeID, NodeID></a>, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>> filteredPts;</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  <span class="keywordflow">for</span> (std::pair<NodeID, NodeID> locP : cmp)</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  {</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &filterSet = <a class="code" href="classSVF_1_1TypeBasedHeapCloning.html#ae520e0551e63223a908f92a6b9667356">getFilterSet</a>(locP.first);</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &pts = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(locP.second);</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &ptsFiltered = filteredPts[locP];</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> </div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  {</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordflow">if</span> (filterSet.<a class="code" href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">test</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  ptsFiltered.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  }</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  }</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span> </div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keywordflow">for</span> (std::pair<NodeID, NodeID> locPA : cmp)</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  {</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &aPts = filteredPts[locPA];</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <span class="keywordflow">for</span> (std::pair<NodeID, NodeID> locPB : cmp)</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  {</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordflow">if</span> (locPB == locPA) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &bPts = filteredPts[locPB];</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span> </div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordflow">switch</span> (<a class="code" href="classSVF_1_1BVDataPTAImpl.html#ad06fbd9a51499c668662b533eeb2e4ac">alias</a>(aPts, bPts))</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  {</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <span class="keywordflow">case</span> <a class="code" href="namespaceSVF.html#a61c01e2e687ab3a001fb806737583943afdd83ddff93d38902f07775cd36df239">AliasResult::NoAlias</a>:</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  ++(*noAliases);</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">case</span> <a class="code" href="namespaceSVF.html#a61c01e2e687ab3a001fb806737583943aef15fd8989d8dd9576b3fbb2aabc118f">AliasResult::MayAlias</a>:</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  ++(*mayAliases);</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keywordflow">default</span>:</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="stringliteral">"Not May/NoAlias?"</span>);</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  }</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  }</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span> </div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span> }</div><div class="ttc" id="FlowSensitiveTBHC_8h_html"><div class="ttname"><a href="FlowSensitiveTBHC_8h.html">FlowSensitiveTBHC.h</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1FlowSensitiveTBHC_html_a3564d6ad7e12e0a833b4cea203a809e4"><div class="ttname"><a href="classSVF_1_1FlowSensitiveTBHC.html#a3564d6ad7e12e0a833b4cea203a809e4">SVF::FlowSensitiveTBHC::finalize</a></div><div class="ttdeci">virtual void finalize() override</div><div class="ttdoc">Finalize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitiveTBHC_8cpp_source.html#l00052">FlowSensitiveTBHC.cpp:52</a></div></div>
|
|
71
71
|
<div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1DCHGraph_html_a0788694fbff155949fc4f4d6487c223e"><div class="ttname"><a href="classSVF_1_1DCHGraph.html#a0788694fbff155949fc4f4d6487c223e">SVF::DCHGraph::getNumFields</a></div><div class="ttdeci">unsigned getNumFields(const DIType *base)</div><div class="ttdef"><b>Definition:</b> <a href="DCHG_8h_source.html#l00335">DCHG.h:335</a></div></div>
|
|
@@ -119,6 +119,7 @@ $(function() {
|
|
|
119
119
|
<div class="ttc" id="classSVF_1_1FlowSensitiveTBHC_html_a3af0297eb75ac4009433be44bb286d30"><div class="ttname"><a href="classSVF_1_1FlowSensitiveTBHC.html#a3af0297eb75ac4009433be44bb286d30">SVF::FlowSensitiveTBHC::expandFIObjs</a></div><div class="ttdeci">virtual void expandFIObjs(const PointsTo &pts, PointsTo &expandedPts) override</div><div class="ttdoc">Expand FI objects. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitiveTBHC_8cpp_source.html#l00642">FlowSensitiveTBHC.cpp:642</a></div></div>
|
|
120
120
|
<div class="ttc" id="classSVF_1_1SVFIR_html_a5d15e4b09784f438568ebe61f8aa5156"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a5d15e4b09784f438568ebe61f8aa5156">SVF::SVFIR::isConstantObj</a></div><div class="ttdeci">bool isConstantObj(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00395">SVFIR.h:395</a></div></div>
|
|
121
121
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a88f9752372eabb71f47f13a89e4d6d9c"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a88f9752372eabb71f47f13a89e4d6d9c">SVF::FlowSensitive::FlowSensitiveStat</a></div><div class="ttdeci">friend class FlowSensitiveStat</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00051">FlowSensitive.h:51</a></div></div>
|
|
122
|
+
<div class="ttc" id="namespaceSVF_html_ad42bff8d0a7d60a085aa32d10f4955af"><div class="ttname"><a href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">SVF::u32_t</a></div><div class="ttdeci">unsigned u32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00077">SVFBasicTypes.h:77</a></div></div>
|
|
122
123
|
<div class="ttc" id="classSVF_1_1PointsTo_html_af61271fefa574c39f405fdfee59a8b3f"><div class="ttname"><a href="classSVF_1_1PointsTo.html#af61271fefa574c39f405fdfee59a8b3f">SVF::PointsTo::test</a></div><div class="ttdeci">bool test(u32_t n) const</div><div class="ttdoc">Returns true if n is in this set. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00125">PointsTo.cpp:125</a></div></div>
|
|
123
124
|
<div class="ttc" id="classSVF_1_1TypeBasedHeapCloning_html_a6363466e64eee4405806568d26206d2e"><div class="ttname"><a href="classSVF_1_1TypeBasedHeapCloning.html#a6363466e64eee4405806568d26206d2e">SVF::TypeBasedHeapCloning::undefType</a></div><div class="ttdeci">static const DIType * undefType</div><div class="ttdoc">The undefined type (•); void. </div><div class="ttdef"><b>Definition:</b> <a href="TypeBasedHeapCloning_8h_source.html#l00027">TypeBasedHeapCloning.h:27</a></div></div>
|
|
124
125
|
<div class="ttc" id="classSVF_1_1DirectSVFGEdge_html"><div class="ttname"><a href="classSVF_1_1DirectSVFGEdge.html">SVF::DirectSVFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00141">VFGEdge.h:141</a></div></div>
|
|
@@ -149,7 +150,7 @@ $(function() {
|
|
|
149
150
|
<div class="ttc" id="classSVF_1_1FlowSensitiveTBHC_html_abcab6281cced08d90c92d67d43a37c2c"><div class="ttname"><a href="classSVF_1_1FlowSensitiveTBHC.html#abcab6281cced08d90c92d67d43a37c2c">SVF::FlowSensitiveTBHC::analyze</a></div><div class="ttdeci">virtual void analyze() override</div><div class="ttdoc">Flow sensitive analysis with FSTBHC. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitiveTBHC_8cpp_source.html#l00029">FlowSensitiveTBHC.cpp:29</a></div></div>
|
|
150
151
|
<div class="ttc" id="namespaceSVF_html_a7875172ff434b2210eea7cecfbbd959e"><div class="ttname"><a href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">SVF::Instruction</a></div><div class="ttdeci">llvm::Instruction Instruction</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00077">BasicTypes.h:77</a></div></div>
|
|
151
152
|
<div class="ttc" id="classSVF_1_1FlowSensitiveTBHC_html_a045ffbf7eea276d154be2cf883ea71f7"><div class="ttname"><a href="classSVF_1_1FlowSensitiveTBHC.html#a045ffbf7eea276d154be2cf883ea71f7">SVF::FlowSensitiveTBHC::getTypeFromCTirMetadata</a></div><div class="ttdeci">const DIType * getTypeFromCTirMetadata(const SVFGNode *)</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitiveTBHC_8cpp_source.html#l00628">FlowSensitiveTBHC.cpp:628</a></div></div>
|
|
152
|
-
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_ac5683fe2e24b393ccc5cb6d8bc92cf2b"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">SVF::PointerAnalysis::setObjFieldInsensitive</a></div><div class="ttdeci">void setObjFieldInsensitive(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#
|
|
153
|
+
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_ac5683fe2e24b393ccc5cb6d8bc92cf2b"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#ac5683fe2e24b393ccc5cb6d8bc92cf2b">SVF::PointerAnalysis::setObjFieldInsensitive</a></div><div class="ttdeci">void setObjFieldInsensitive(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00357">PointerAnalysis.h:357</a></div></div>
|
|
153
154
|
<div class="ttc" id="classSVF_1_1PointsTo_html_ac4688413177b49b37dbbfd3ed188d59b"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">SVF::PointsTo::empty</a></div><div class="ttdeci">bool empty(void) const</div><div class="ttdoc">Returns true if set is empty. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00094">PointsTo.cpp:94</a></div></div>
|
|
154
155
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a240219c2dc4f5cc5f85445e18c79b83b"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a240219c2dc4f5cc5f85445e18c79b83b">SVF::PointerAnalysis::getPAG</a></div><div class="ttdeci">SVFIR * getPAG() const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00205">PointerAnalysis.h:205</a></div></div>
|
|
155
156
|
<div class="ttc" id="classSVF_1_1TypeBasedHeapCloning_html_aaaf50870e50b45b44d4ecaaaab662770"><div class="ttname"><a href="classSVF_1_1TypeBasedHeapCloning.html#aaaf50870e50b45b44d4ecaaaab662770">SVF::TypeBasedHeapCloning::setDCHG</a></div><div class="ttdeci">void setDCHG(DCHGraph *dchg)</div><div class="ttdoc">DCHG must be set by extending class once the DCHG is available. </div><div class="ttdef"><b>Definition:</b> <a href="TypeBasedHeapCloning_8cpp_source.html#l00026">TypeBasedHeapCloning.cpp:26</a></div></div>
|
|
@@ -158,7 +159,7 @@ $(function() {
|
|
|
158
159
|
<div class="ttc" id="classSVF_1_1TypeBasedHeapCloning_html_ae42ec334a7dfc96a5ead2d2845ca3b22"><div class="ttname"><a href="classSVF_1_1TypeBasedHeapCloning.html#ae42ec334a7dfc96a5ead2d2845ca3b22">SVF::TypeBasedHeapCloning::validateTBHCTests</a></div><div class="ttdeci">void validateTBHCTests(SVFModule *svfMod)</div><div class="ttdef"><b>Definition:</b> <a href="TypeBasedHeapCloning_8cpp_source.html#l00562">TypeBasedHeapCloning.cpp:562</a></div></div>
|
|
159
160
|
<div class="ttc" id="classSVF_1_1StmtVFGNode_html_a791a01f5d3528f8a8bf19369b5c61c37"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">SVF::StmtVFGNode::getPAGSrcNodeID</a></div><div class="ttdeci">NodeID getPAGSrcNodeID() const</div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00138">VFGNode.h:138</a></div></div>
|
|
160
161
|
<div class="ttc" id="classSVF_1_1FlowSensitiveTBHC_html_abce5580e93cba1e591a0bac4e9070816"><div class="ttname"><a href="classSVF_1_1FlowSensitiveTBHC.html#abce5580e93cba1e591a0bac4e9070816">SVF::FlowSensitiveTBHC::processAddr</a></div><div class="ttdeci">virtual bool processAddr(const AddrSVFGNode *addr) override</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitiveTBHC_8cpp_source.html#l00217">FlowSensitiveTBHC.cpp:217</a></div></div>
|
|
161
|
-
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_ae2cc7cd0803dbd90639140e71b06b1b5"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#ae2cc7cd0803dbd90639140e71b06b1b5">SVF::PointerAnalysis::getCHGraph</a></div><div class="ttdeci">CommonCHGraph * getCHGraph() const</div><div class="ttdoc">get CHGraph </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#
|
|
162
|
+
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_ae2cc7cd0803dbd90639140e71b06b1b5"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#ae2cc7cd0803dbd90639140e71b06b1b5">SVF::PointerAnalysis::getCHGraph</a></div><div class="ttdeci">CommonCHGraph * getCHGraph() const</div><div class="ttdoc">get CHGraph </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00439">PointerAnalysis.h:439</a></div></div>
|
|
162
163
|
<div class="ttc" id="namespaceSVF_html_a61c01e2e687ab3a001fb806737583943aef15fd8989d8dd9576b3fbb2aabc118f"><div class="ttname"><a href="namespaceSVF.html#a61c01e2e687ab3a001fb806737583943aef15fd8989d8dd9576b3fbb2aabc118f">SVF::MayAlias</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00195">SVFBasicTypes.h:195</a></div></div>
|
|
163
164
|
<div class="ttc" id="classSVF_1_1GepObjVar_html"><div class="ttname"><a href="classSVF_1_1GepObjVar.html">SVF::GepObjVar</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00442">SVFVariables.h:442</a></div></div>
|
|
164
165
|
<div class="ttc" id="PointsTo_8h_html"><div class="ttname"><a href="PointsTo_8h.html">PointsTo.h</a></div></div>
|
|
@@ -181,7 +182,7 @@ $(function() {
|
|
|
181
182
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_ae086de68233375be42185f0af706687a"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#ae086de68233375be42185f0af706687a">SVF::FlowSensitive::directPropaTime</a></div><div class="ttdeci">double directPropaTime</div><div class="ttdoc">time of points-to propagation of address-taken objects </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00309">FlowSensitive.h:309</a></div></div>
|
|
182
183
|
<div class="ttc" id="classSVF_1_1TypeBasedHeapCloning_html_a219edef6c013a953ed12ee3c56bde6de"><div class="ttname"><a href="classSVF_1_1TypeBasedHeapCloning.html#a219edef6c013a953ed12ee3c56bde6de">SVF::TypeBasedHeapCloning::getType</a></div><div class="ttdeci">const DIType * getType(NodeID o) const</div><div class="ttdoc">Returns the type (from objToType) of o. Asserts existence. </div><div class="ttdef"><b>Definition:</b> <a href="TypeBasedHeapCloning_8cpp_source.html#l00058">TypeBasedHeapCloning.cpp:58</a></div></div>
|
|
183
184
|
<div class="ttc" id="classSVF_1_1GepStmt_html_a0ddf180a0f7ba64fc8655687910e3788"><div class="ttname"><a href="classSVF_1_1GepStmt.html#a0ddf180a0f7ba64fc8655687910e3788">SVF::GepStmt::isVariantFieldGep</a></div><div class="ttdeci">bool isVariantFieldGep() const</div><div class="ttdoc">Gep statement with a variant field index (pointer arithmetic) for struct field access. </div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00459">SVFStatements.h:459</a></div></div>
|
|
184
|
-
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_ae6ea391ac44dffeb6899bb44323c5361"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#ae6ea391ac44dffeb6899bb44323c5361">SVF::PointerAnalysis::isHeapMemObj</a></div><div class="ttdeci">bool isHeapMemObj(NodeID id) const</div><div class="ttdoc">Whether this object is heap or array. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#
|
|
185
|
+
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_ae6ea391ac44dffeb6899bb44323c5361"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#ae6ea391ac44dffeb6899bb44323c5361">SVF::PointerAnalysis::isHeapMemObj</a></div><div class="ttdeci">bool isHeapMemObj(NodeID id) const</div><div class="ttdoc">Whether this object is heap or array. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00320">PointerAnalysis.h:320</a></div></div>
|
|
185
186
|
<div class="ttc" id="classSVF_1_1TypeBasedHeapCloning_html_a006243a1416f4950de254d0d62ba40b0"><div class="ttname"><a href="classSVF_1_1TypeBasedHeapCloning.html#a006243a1416f4950de254d0d62ba40b0">SVF::TypeBasedHeapCloning::setAllocationSite</a></div><div class="ttdeci">void setAllocationSite(NodeID o, NodeID site)</div><div class="ttdoc">Sets the allocation site (in objToAllocation) of o. </div><div class="ttdef"><b>Definition:</b> <a href="TypeBasedHeapCloning_8cpp_source.html#l00064">TypeBasedHeapCloning.cpp:64</a></div></div>
|
|
186
187
|
<div class="ttc" id="classSVF_1_1AndersenWaveDiff_html_a48ff6fc4badc79ad3204ae9bd95cc540"><div class="ttname"><a href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">SVF::AndersenWaveDiff::createAndersenWaveDiff</a></div><div class="ttdeci">static AndersenWaveDiff * createAndersenWaveDiff(SVFIR *_pag)</div><div class="ttdoc">Create an singleton instance directly instead of invoking llvm pass manager. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00430">Andersen.h:430</a></div></div>
|
|
187
188
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_aa36fd1387e948e83107431179d819067"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aa36fd1387e948e83107431179d819067">SVF::FlowSensitive::processPhi</a></div><div class="ttdeci">virtual bool processPhi(const PHISVFGNode *phi)</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00445">FlowSensitive.cpp:445</a></div></div>
|
|
@@ -194,7 +195,7 @@ $(function() {
|
|
|
194
195
|
<div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="ContextDDA_8h_source.html#l00016">ContextDDA.h:16</a></div></div>
|
|
195
196
|
<div class="ttc" id="classSVF_1_1PHIVFGNode_html_a103e55e670ce614cabc13b8dc5b17b91"><div class="ttname"><a href="classSVF_1_1PHIVFGNode.html#a103e55e670ce614cabc13b8dc5b17b91">SVF::PHIVFGNode::isPTANode</a></div><div class="ttdeci">bool isPTANode() const</div><div class="ttdoc">Whether this phi node is of pointer type (used for pointer analysis). </div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00638">VFGNode.h:638</a></div></div>
|
|
196
197
|
<div class="ttc" id="classSVF_1_1FlowSensitiveTBHC_html_a2c47ba37bd250be455a21d1f0049d556"><div class="ttname"><a href="classSVF_1_1FlowSensitiveTBHC.html#a2c47ba37bd250be455a21d1f0049d556">SVF::FlowSensitiveTBHC::getRawCTirMetadata</a></div><div class="ttdeci">static const MDNode * getRawCTirMetadata(const SVFGNode *)</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitiveTBHC_8cpp_source.html#l00614">FlowSensitiveTBHC.cpp:614</a></div></div>
|
|
197
|
-
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_af90d2ccb01402c5ca9d7a059f345c816"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#af90d2ccb01402c5ca9d7a059f345c816">SVF::PointerAnalysis::isFIObjNode</a></div><div class="ttdeci">bool isFIObjNode(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#
|
|
198
|
+
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_af90d2ccb01402c5ca9d7a059f345c816"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#af90d2ccb01402c5ca9d7a059f345c816">SVF::PointerAnalysis::isFIObjNode</a></div><div class="ttdeci">bool isFIObjNode(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00337">PointerAnalysis.h:337</a></div></div>
|
|
198
199
|
<div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00165">GenericGraph.h:165</a></div></div>
|
|
199
200
|
<div class="ttc" id="namespaceSVF_html_a740396763e377643790c8b803ab3e4ea"><div class="ttname"><a href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">SVF::NodeBS</a></div><div class="ttdeci">llvm::SparseBitVector NodeBS</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00088">SVFBasicTypes.h:88</a></div></div>
|
|
200
201
|
<div class="ttc" id="classSVF_1_1TypeBasedHeapCloning_html_af127bed600087b1ace26088a76ca8998"><div class="ttname"><a href="classSVF_1_1TypeBasedHeapCloning.html#af127bed600087b1ace26088a76ca8998">SVF::TypeBasedHeapCloning::getClones</a></div><div class="ttdeci">const NodeBS & getClones(NodeID o)</div><div class="ttdoc">Returns all the clones of o. </div><div class="ttdef"><b>Definition:</b> <a href="TypeBasedHeapCloning_8cpp_source.html#l00091">TypeBasedHeapCloning.cpp:91</a></div></div>
|
|
@@ -232,7 +233,7 @@ $(function() {
|
|
|
232
233
|
<div class="ttc" id="classSVF_1_1TypeBasedHeapCloning_html"><div class="ttname"><a href="classSVF_1_1TypeBasedHeapCloning.html">SVF::TypeBasedHeapCloning</a></div><div class="ttdef"><b>Definition:</b> <a href="TypeBasedHeapCloning_8h_source.html#l00021">TypeBasedHeapCloning.h:21</a></div></div>
|
|
233
234
|
<div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_a642613e98982259183d3f34a97f05502"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#a642613e98982259183d3f34a97f05502">SVF::BVDataPTAImpl::getDFPTDataTy</a></div><div class="ttdeci">DFPTDataTy * getDFPTDataTy() const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00185">PointerAnalysisImpl.h:185</a></div></div>
|
|
234
235
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_af5a94d14096ae2bbc47b3b3b9f723226"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#af5a94d14096ae2bbc47b3b3b9f723226">SVF::FlowSensitive::updateTime</a></div><div class="ttdeci">double updateTime</div><div class="ttdoc">time of strong/weak updates. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00311">FlowSensitive.h:311</a></div></div>
|
|
235
|
-
<div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_ad06fbd9a51499c668662b533eeb2e4ac"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#ad06fbd9a51499c668662b533eeb2e4ac">SVF::BVDataPTAImpl::alias</a></div><div class="ttdeci">virtual AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB)</div><div class="ttdoc">Interface expose to users of our pointer analysis, given Location infos. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8cpp_source.html#
|
|
236
|
+
<div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_ad06fbd9a51499c668662b533eeb2e4ac"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#ad06fbd9a51499c668662b533eeb2e4ac">SVF::BVDataPTAImpl::alias</a></div><div class="ttdeci">virtual AliasResult alias(const MemoryLocation &LocA, const MemoryLocation &LocB)</div><div class="ttdoc">Interface expose to users of our pointer analysis, given Location infos. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8cpp_source.html#l00451">PointerAnalysisImpl.cpp:451</a></div></div>
|
|
236
237
|
<div class="ttc" id="namespaceSVF_html_ad127b0ad478640ede3d426e3a58d2632"><div class="ttname"><a href="namespaceSVF.html#ad127b0ad478640ede3d426e3a58d2632">SVF::DIType</a></div><div class="ttdeci">llvm::DIType DIType</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00207">BasicTypes.h:207</a></div></div>
|
|
237
238
|
<div class="ttc" id="namespaceSVF_html_a61c01e2e687ab3a001fb806737583943afdd83ddff93d38902f07775cd36df239"><div class="ttname"><a href="namespaceSVF.html#a61c01e2e687ab3a001fb806737583943afdd83ddff93d38902f07775cd36df239">SVF::NoAlias</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00197">SVFBasicTypes.h:197</a></div></div>
|
|
238
239
|
<div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html_a30aca718d25924f1babdf348bb0ace71"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">SVF::IndirectSVFGEdge::getPointsTo</a></div><div class="ttdeci">const NodeBS & getPointsTo() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00061">SVFGEdge.h:61</a></div></div>
|