svf-tools 1.0.289 → 1.0.293
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/README.md +1 -0
- package/SVF-doxygen/html/html/AndersenHCD_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/AndersenHLCD_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/AndersenLCD_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/AndersenSFR_8h_source.html +2 -2
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/AndersenWaveDiffWithType_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/AndersenWaveDiff_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +45 -29
- package/SVF-doxygen/html/html/Andersen_8h_source.html +50 -50
- package/SVF-doxygen/html/html/BasicTypes_8h_source.html +2 -2
- package/SVF-doxygen/html/html/ConditionalPT_8h_source.html +9 -9
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +2 -2
- package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/FileChecker_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +22 -22
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +52 -32
- package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +58 -55
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MutablePointsToDS_8h_source.html +2 -2
- package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +64 -11
- package/SVF-doxygen/html/html/NodeIDAllocator_8h.html +5 -1
- package/SVF-doxygen/html/html/NodeIDAllocator_8h_source.html +52 -15
- package/SVF-doxygen/html/html/PAG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PersistentPointsToDS_8h_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +1 -1
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +1 -1
- package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +34 -33
- package/SVF-doxygen/html/html/PointsTo_8h_source.html +32 -32
- package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +4 -12
- package/SVF-doxygen/html/html/ProgSlice_8h_source.html +33 -35
- package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +31 -36
- package/SVF-doxygen/html/html/SVFG_8h_source.html +19 -19
- package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +15 -7
- package/SVF-doxygen/html/html/SVFUtil_8h.html +3 -0
- package/SVF-doxygen/html/html/SVFUtil_8h_source.html +10 -8
- package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SymbolTableInfo_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 +17 -11
- package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +51 -43
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8h_source.html +34 -33
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/annotated.html +2 -1
- package/SVF-doxygen/html/html/classSVF_1_1AddrPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +213 -212
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +124 -72
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +223 -222
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +36 -34
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +232 -231
- package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +21 -19
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +220 -219
- package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +38 -36
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +221 -220
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +11 -9
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +232 -231
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +6 -4
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +220 -219
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +21 -19
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiffWithType-members.html +227 -226
- package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiffWithType.html +26 -24
- package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +2 -3
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -4
- package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CmpPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -4
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CopyPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FIObjPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +110 -107
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +12 -4
- package/SVF-doxygen/html/html/classSVF_1_1FileChecker.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +109 -106
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +286 -157
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +30 -30
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +121 -118
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +36 -28
- package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1GepObjPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1GepValPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraBlockNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LoadPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1MutablePTData.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator-members.html +11 -10
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator.html +74 -34
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer-members.html +109 -0
- package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +1188 -0
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ObjPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +3 -4
- package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +77 -66
- package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator.html +32 -26
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice-members.html +36 -37
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +121 -153
- package/SVF-doxygen/html/html/classSVF_1_1RetBlockNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +49 -49
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1SaberAnnotator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode.html +8 -9
- package/SVF-doxygen/html/html/classSVF_1_1StorePE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VFGNode.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ValPN.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepPE.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +132 -129
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +171 -116
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +37 -37
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +5 -5
- package/SVF-doxygen/html/html/classes.html +62 -62
- package/SVF-doxygen/html/html/functions_b.html +10 -5
- package/SVF-doxygen/html/html/functions_c.html +36 -22
- package/SVF-doxygen/html/html/functions_d.html +12 -0
- package/SVF-doxygen/html/html/functions_e.html +9 -3
- package/SVF-doxygen/html/html/functions_f.html +21 -18
- package/SVF-doxygen/html/html/functions_func_c.html +19 -10
- package/SVF-doxygen/html/html/functions_func_d.html +3 -0
- package/SVF-doxygen/html/html/functions_func_e.html +3 -0
- package/SVF-doxygen/html/html/functions_func_g.html +16 -10
- package/SVF-doxygen/html/html/functions_func_p.html +6 -2
- package/SVF-doxygen/html/html/functions_func_r.html +7 -1
- package/SVF-doxygen/html/html/functions_func_t.html +3 -0
- package/SVF-doxygen/html/html/functions_g.html +15 -9
- package/SVF-doxygen/html/html/functions_l.html +10 -7
- package/SVF-doxygen/html/html/functions_n.html +21 -3
- package/SVF-doxygen/html/html/functions_o.html +16 -8
- package/SVF-doxygen/html/html/functions_p.html +23 -17
- package/SVF-doxygen/html/html/functions_r.html +13 -6
- package/SVF-doxygen/html/html/functions_s.html +9 -9
- package/SVF-doxygen/html/html/functions_t.html +18 -9
- package/SVF-doxygen/html/html/functions_type_d.html +3 -0
- package/SVF-doxygen/html/html/functions_v.html +3 -3
- package/SVF-doxygen/html/html/functions_vars_b.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_c.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_d.html +6 -0
- package/SVF-doxygen/html/html/functions_vars_e.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_f.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_l.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_n.html +18 -0
- package/SVF-doxygen/html/html/functions_vars_o.html +6 -0
- package/SVF-doxygen/html/html/functions_vars_r.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_t.html +6 -0
- package/SVF-doxygen/html/html/functions_w.html +8 -6
- package/SVF-doxygen/html/html/globals_f.html +3 -3
- package/SVF-doxygen/html/html/hierarchy.html +413 -412
- package/SVF-doxygen/html/html/menudata.js +2 -0
- package/SVF-doxygen/html/html/namespaceSVF.html +8 -8
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +47 -16
- package/SVF-doxygen/html/html/namespacemembers_func.html +17 -10
- package/SVF-doxygen/html/html/namespacemembers_h.html +76 -0
- package/SVF-doxygen/html/html/search/all_10.js +9 -8
- package/SVF-doxygen/html/html/search/all_12.js +5 -2
- package/SVF-doxygen/html/html/search/all_13.js +7 -7
- package/SVF-doxygen/html/html/search/all_14.js +8 -5
- package/SVF-doxygen/html/html/search/all_15.js +1 -1
- package/SVF-doxygen/html/html/search/all_16.js +1 -1
- package/SVF-doxygen/html/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/html/search/all_2.js +1 -0
- package/SVF-doxygen/html/html/search/all_3.js +4 -0
- package/SVF-doxygen/html/html/search/all_4.js +4 -0
- package/SVF-doxygen/html/html/search/all_5.js +2 -0
- package/SVF-doxygen/html/html/search/all_6.js +4 -3
- package/SVF-doxygen/html/html/search/all_7.js +4 -2
- package/SVF-doxygen/html/html/search/all_8.js +1 -0
- package/SVF-doxygen/html/html/search/all_c.js +4 -3
- package/SVF-doxygen/html/html/search/all_d.js +1 -1
- package/SVF-doxygen/html/html/search/all_e.js +9 -4
- package/SVF-doxygen/html/html/search/all_f.js +4 -2
- package/SVF-doxygen/html/html/search/classes_2.js +1 -0
- package/SVF-doxygen/html/html/search/functions_10.js +1 -1
- package/SVF-doxygen/html/html/search/functions_11.js +1 -0
- package/SVF-doxygen/html/html/search/functions_2.js +2 -0
- package/SVF-doxygen/html/html/search/functions_3.js +1 -0
- package/SVF-doxygen/html/html/search/functions_4.js +1 -0
- package/SVF-doxygen/html/html/search/functions_6.js +4 -2
- package/SVF-doxygen/html/html/search/functions_7.js +1 -0
- package/SVF-doxygen/html/html/search/functions_e.js +3 -2
- package/SVF-doxygen/html/html/search/functions_f.js +2 -0
- package/SVF-doxygen/html/html/search/typedefs_3.js +1 -0
- package/SVF-doxygen/html/html/search/variables_12.js +1 -0
- package/SVF-doxygen/html/html/search/variables_14.js +3 -1
- package/SVF-doxygen/html/html/search/variables_15.js +1 -1
- package/SVF-doxygen/html/html/search/variables_2.js +1 -0
- package/SVF-doxygen/html/html/search/variables_3.js +1 -0
- package/SVF-doxygen/html/html/search/variables_4.js +2 -0
- package/SVF-doxygen/html/html/search/variables_5.js +1 -0
- package/SVF-doxygen/html/html/search/variables_6.js +1 -0
- package/SVF-doxygen/html/html/search/variables_c.js +1 -0
- package/SVF-doxygen/html/html/search/variables_d.js +1 -1
- package/SVF-doxygen/html/html/search/variables_e.js +7 -2
- package/SVF-doxygen/html/html/search/variables_f.js +2 -0
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +20 -20
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4.html +18 -18
- package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1PointsTo_01_4.html +1 -1
- package/include/SABER/ProgSlice.h +0 -3
- package/include/Util/NodeIDAllocator.h +94 -0
- package/include/Util/SVFUtil.h +3 -0
- package/include/WPA/Andersen.h +4 -0
- package/include/WPA/FlowSensitive.h +9 -0
- package/include/WPA/VersionedFlowSensitive.h +3 -0
- package/lib/Graphs/SVFG.cpp +0 -20
- package/lib/Graphs/VFG.cpp +18 -0
- package/lib/MemoryModel/PointsTo.cpp +76 -19
- package/lib/SABER/ProgSlice.cpp +0 -37
- package/lib/SABER/SaberAnnotator.cpp +1 -1
- package/lib/Util/NodeIDAllocator.cpp +548 -1
- package/lib/Util/SVFUtil.cpp +19 -0
- package/lib/WPA/Andersen.cpp +34 -0
- package/lib/WPA/FlowSensitive.cpp +70 -0
- package/lib/WPA/VersionedFlowSensitive.cpp +20 -0
- package/package.json +1 -1
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">VersionedFlowSensitive.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="VersionedFlowSensitive_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">//===- VersionedFlowSensitive.cpp -- Versioned flow-sensitive pointer analysis------------//</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"> * VersionedFlowSensitive.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: Jun 26, 2020</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="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "<a class="code" href="VersionedFlowSensitive_8h.html">WPA/VersionedFlowSensitive.h</a>"</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</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">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">VersionedFlowSensitive::invalidVersion</a> = 0;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html">VersionedFlowSensitive</a> *<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a53b8a881400d7b353133c68295812efb">VersionedFlowSensitive::vfspta</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa"> 21</a></span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">VersionedFlowSensitive::atKey</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> var, <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> version)</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(version != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <span class="stringliteral">"VersionedFlowSensitive::atKey: trying to use an invalid version!"</span>);</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keywordflow">return</span> std::make_pair(var, version);</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> }</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#af52cafc2bb393823f51ca89a0abacec4"> 27</a></span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af52cafc2bb393823f51ca89a0abacec4">VersionedFlowSensitive::VersionedFlowSensitive</a>(<a class="code" href="classSVF_1_1PAG.html">PAG</a> *_pag, <a class="code" href="classSVF_1_1PointerAnalysis.html#a0b182ac680cce0547dbe7714c870ca85">PTATY</a> type)</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  : <a class="code" href="classSVF_1_1FlowSensitive.html">FlowSensitive</a>(_pag, type)</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">numPrelabeledNodes</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9235db71172dcdf277050f6ca5f344c6">numPrelabelVersions</a> = 0;</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a80535bb813f8bf240a0b54ac6ad4b257">relianceTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a77a5dd9578def9a8e2b48e8b90d9b996">prelabelingTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">meldLabelingTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8871031546861343c05346ae1a4550cd">meldMappingTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> = 0.0;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="comment">// We'll grab vPtD in initialize.</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"> 34</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a> = { 0, <span class="keyword">nullptr</span>, <span class="keyword">false</span> };</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a> = { 0, <span class="keyword">nullptr</span>, <span class="keyword">false</span> };</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> }</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a81d3528fd082018e4345f0b026bf3584"> 38</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a81d3528fd082018e4345f0b026bf3584">VersionedFlowSensitive::initialize</a>()</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> {</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">FlowSensitive::initialize</a>();</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="comment">// Overwrite the stat FlowSensitive::initialize gave us.</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="keyword">delete</span> <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaee58f266762146e9fdc08ecfc326b29">VersionedFlowSensitiveStat</a>(<span class="keyword">this</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_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a> = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a4859864a4c72d5e04c10305e4579e8ee">getVersionedPTDataTy</a>();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda">prelabel</a>();</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a">meldLabel</a>();</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8e836aaeab108002205d2a7631e8559f">mapMeldVersions</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>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a25d9b2fb94c17edca9ccff220c0247b8">determineReliance</a>();</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ad955fda89f4f749151a1bd14562b03f6"> 54</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad955fda89f4f749151a1bd14562b03f6">VersionedFlowSensitive::finalize</a>()</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#afed358369102f01f6fe88b1433e704c3">FlowSensitive::finalize</a>();</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="comment">// vPtD->dumpPTData();</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="comment">// dumpReliances();</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// dumpLocVersionMaps();</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> </div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda"> 62</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda">VersionedFlowSensitive::prelabel</a>(<span class="keywordtype">void</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"> 64</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it->first;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *ln = it->second;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a> *stn = SVFUtil::dyn_cast<StoreSVFGNode>(ln))</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="comment">// l: *p = q.</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="comment">// If p points to o (Andersen's), l yields a new version for o.</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> p = stn->getPAGDstNodeID();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &myl = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">meldYield</a>[l];</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> o : <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-><a class="code" href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">getPts</a>(p))</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>  myl[o] = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84">newMeldVersion</a>(o);</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>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(l);</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>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-><a class="code" href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">getPts</a>(p).<a class="code" href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">count</a>() != 0) ++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">numPrelabeledNodes</a>;</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> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">delta</a>(l))</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>  <span class="comment">// The outgoing edges are not only what will later be propagated. SVFGOPT may</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="comment">// move around nodes such that there can be an MRSVFGNode with no incoming or</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="comment">// outgoing edges which will be added at runtime. In essence, we can no</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="comment">// longer rely on the outgoing edges of a delta node when SVFGOPT is enabled.</span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a> *mr = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a>>(ln);</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">if</span> (mr != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  {</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &mcl = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>[l];</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : mr-><a class="code" href="classSVF_1_1MRSVFGNode.html#a28fe266d0e4618aa4448aa218495a332">getPointsTo</a>())</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  {</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  mcl[o] = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84">newMeldVersion</a>(o);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="comment">// Push into worklist because its consume == its yield.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(l);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">if</span> (mr-><a class="code" href="classSVF_1_1MRSVFGNode.html#a28fe266d0e4618aa4448aa218495a332">getPointsTo</a>().count() != 0) ++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">numPrelabeledNodes</a>;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  }</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  }</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> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a77a5dd9578def9a8e2b48e8b90d9b996">prelabelingTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a"> 111</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a">VersionedFlowSensitive::meldLabel</a>(<span class="keywordtype">void</span>) {</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">while</span> (!<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>()) {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *ln = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(l);</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> </div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">// Propagate l's y to lp's c for all l --o--> lp.</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : ln-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>()) {</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>>(e);</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">if</span> (!ie) <span class="keywordflow">continue</span>;</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>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> lp = ie-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getId();</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// Delta nodes had c set already and they are permanent.</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">delta</a>(lp)) <span class="keywordflow">continue</span>;</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>  <span class="keywordtype">bool</span> lpIsStore = SVFUtil::isa<StoreSVFGNode>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(lp));</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="comment">// Consume and yield are the same at non-stores, so ignore any self-loop</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="comment">// at a non-store.</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (l == lp && !lpIsStore) <span class="keywordflow">continue</span>;</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="comment">// At stores yield != consume, otherwise they are the same (so just use meldConsume).</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &myl = SVFUtil::isa<StoreSVFGNode>(ln) ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">meldYield</a>[l] : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>[l];</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &mclp = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>[lp];</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordtype">bool</span> yieldChanged = <span class="keyword">false</span>;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ie-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>()) {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  ObjToMeldVersionMap::const_iterator myloIt = myl.find(o);</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">if</span> (myloIt == myl.end()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="comment">// Yield == consume for non-stores, so when consume is updated, so is yield.</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="comment">// For stores, yield was already set, and it's static.</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  yieldChanged = (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1da960df51570b59161e380949d910c4">meld</a>(mclp[o], myloIt->second) && !lpIsStore) || yieldChanged;</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>  <span class="keywordflow">if</span> (yieldChanged) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(lp);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</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> </div><div class="line"><a name="l00149"></a><span class="lineno"> 149</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">meldLabelingTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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> </div><div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a1da960df51570b59161e380949d910c4"> 153</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1da960df51570b59161e380949d910c4">VersionedFlowSensitive::meld</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv2)</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="comment">// Meld operator is union of bit vectors.</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordflow">return</span> mv1 |= mv2;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> }</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> </div><div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a8e836aaeab108002205d2a7631e8559f"> 159</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8e836aaeab108002205d2a7631e8559f">VersionedFlowSensitive::mapMeldVersions</a>(<span class="keywordtype">void</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>  <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>(<span class="keyword">true</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>  <span class="comment">// We want to uniquely map MeldVersions (SparseBitVectors) to a Version (unsigned integer).</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="comment">// mvv keeps track, and curVersion is used to generate new Versions.</span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<MeldVersion, Version></a> mvv;</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> curVersion = 1;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="comment">// meldConsume -> consume.</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">for</span> (LocMeldVersionMap::value_type &lomv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>)</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = lomv.first;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordtype">bool</span> lIsStore = SVFUtil::isa<StoreSVFGNode>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(l));</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">for</span> (ObjToMeldVersionMap::value_type &omv : lomv.second)</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>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = omv.first;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv = omv.second;</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>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<MeldVersion, Version>::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="comment">// If a mapping for foudnVersion exists, use it, otherwise create a new Version (++),</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="comment">// keep track of it ([mv]), and use that.</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.end() ? mvv[mv] = ++curVersion : foundVersion->second;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">setConsume</a>(l, o, v);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="comment">// At non-stores, consume == yield.</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="comment">// Unlike meldYield, we use yield for all yields, not just where consume != yield.</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="comment">// This affords simplicity later. meldYield is expensive to explicitly represent</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="comment">// always, unlike yield.</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">if</span> (!lIsStore) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">setYield</a>(l, o, v);</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>  }</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// meldYield -> yield.</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordflow">for</span> (LocMeldVersionMap::value_type &lomv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">meldYield</a>)</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  {</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = lomv.first;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">for</span> (ObjToMeldVersionMap::value_type &omv : lomv.second)</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  {</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = omv.first;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv = omv.second;</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>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<MeldVersion, Version>::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.end() ? mvv[mv] = ++curVersion : foundVersion->second;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">setYield</a>(l, o, v);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</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> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="comment">// No longer necessary.</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  meldConsume.clear();</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  meldYield.clear();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div><div class="line"><a name="l00210"></a><span class="lineno"> 210</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8871031546861343c05346ae1a4550cd">meldMappingTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> }</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> </div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271"> 214</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">VersionedFlowSensitive::delta</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l)<span class="keyword"> const</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> <span class="keyword"></span>{</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="comment">// Whether a node is a delta node or not. Decent boon to performance.</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keyword">static</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, bool></a> deltaCache;</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>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, bool>::const_iterator</a> isDeltaIt = deltaCache.find(l);</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">if</span> (isDeltaIt != deltaCache.end()) <span class="keywordflow">return</span> isDeltaIt->second;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> </div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(l);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="comment">// Cases:</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="comment">// * Function entry: can get new incoming indirect edges through ind. callsites.</span></div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="comment">// * Callsite returns: can get new incoming indirect edges if the callsite is indirect.</span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="comment">// * Otherwise: static.</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordtype">bool</span> isDelta = <span class="keyword">false</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#ae2cff3c963136f474fac0a66aa8cff7b">isFunEntrySVFGNode</a>(s))</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  {</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <a class="code" href="classSVF_1_1PTACallGraphEdge.html#aca11d1b778309a72e9d345bd02324459">PTACallGraphEdge::CallInstSet</a> callsites;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-><a class="code" href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">getPTACallGraph</a>()-><a class="code" href="classSVF_1_1PTACallGraph.html#a9a4b0c6672288b9201ab254b4c49548d">getIndCallSitesInvokingCallee</a>(fn, callsites);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  isDelta = !callsites.empty();</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a> *cbn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#ac75b83bdf3bcfecaae579716ab33dd61">isCallSiteRetSVFGNode</a>(s))</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  isDelta = cbn->isIndirectCall();</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</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>  deltaCache[l] = isDelta;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">return</span> isDelta;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> }</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> </div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> </div><div class="line"><a name="l00245"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84"> 245</a></span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">VersionedFlowSensitive::MeldVersion</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84">VersionedFlowSensitive::newMeldVersion</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> {</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  ++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9235db71172dcdf277050f6ca5f344c6">numPrelabelVersions</a>;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> nv;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  nv.set(++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a32b9ff0e47ef632626f1b647c38c26f9">meldVersions</a>[o]);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordflow">return</span> nv;</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> </div><div class="line"><a name="l00253"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a25d9b2fb94c17edca9ccff220c0247b8"> 253</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a25d9b2fb94c17edca9ccff220c0247b8">VersionedFlowSensitive::determineReliance</a>(<span class="keywordtype">void</span>)</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">// Use a set-based version to build, then we'll move things to vectors.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, Map<Version, Set<Version></a>>> setVersionReliance;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div><div class="line"><a name="l00258"></a><span class="lineno"> 258</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it->first;</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *ln = it->second;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : ln-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>>(e);</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">if</span> (!ie) <span class="keywordflow">continue</span>;</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>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ie-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>())</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="comment">// Given l --o--> lp, c(o) at lp relies on y(o) at l.</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> lp = ie-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getId();</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span> </div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span> (y == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> cp = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(lp, o);</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">if</span> (cp == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">if</span> (cp != y) setVersionReliance[o][y].insert(cp);</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>  }</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="comment">// When an object/version points-to set changes, these nodes need to know.</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(ln) || SVFUtil::isa<StoreSVFGNode>(ln))</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  {</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keyword">const</span> LocVersionMap::const_iterator lovmIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.find(l);</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">if</span> (lovmIt != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.end())</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>  <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &ov : lovmIt->second)</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  {</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ov.first;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = ov.second;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][v].set(l);</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>  }</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>  }</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>  <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair<<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<Version></a>>> &ovvs : setVersionReliance)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovvs.first;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, std::vector<Version></a>> &osRelying = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o];</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair<<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<Version></a>> &vvs : ovvs.second)</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  {</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vvs.first;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<Version></a> &vs = vvs.second;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  osRelying[v] = std::vector<Version>(vs.begin(), vs.end());</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  }</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="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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a80535bb813f8bf240a0b54ac6ad4b257">relianceTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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> </div><div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56"> 314</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">VersionedFlowSensitive::propagateVersion</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v)</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>  <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="l00317"></a><span class="lineno"> 317</span> </div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, std::vector<Version></a>>::iterator relyingVersions = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o].find(v);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">if</span> (relyingVersions != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o].end())</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  {</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> r : relyingVersions->second)</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, v, r, <span class="keyword">false</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>  }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> </div><div class="line"><a name="l00327"></a><span class="lineno"> 327</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="l00328"></a><span class="lineno"> 328</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ad1aa83a71379164d3b7ccf6b61639cb1"> 331</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">VersionedFlowSensitive::propagateVersion</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> vp, <span class="keywordtype">bool</span> time<span class="comment">/*=true*/</span>)</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordtype">double</span> start = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> </div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> srcVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, v);</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> dstVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, vp);</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(dstVar, srcVar))</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  {</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="comment">// o:vp has changed.</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="comment">// Add the dummy propagation node to tell the solver to propagate it later.</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  VarToPropNodeMap::const_iterator dvpIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.find(dstVar);</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">if</span> (dvpIt == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.end())</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>  dvp = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a8dd513e8e5343beeb5d117c1ff4e45ea">addDummyVersionPropSVFGNode</a>(o, vp);</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>[dstVar] = dvp;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  } <span class="keywordflow">else</span> dvp = dvpIt->second;</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="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(dvp != <span class="keyword">nullptr</span> && <span class="stringliteral">"VFS::propagateVersion: propagation dummy node not found?"</span>);</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dvp-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</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>  <span class="comment">// Notify nodes which rely on o:vp that it changed.</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][vp]) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</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>  <span class="keywordtype">double</span> end = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">if</span> (time) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a8cad0df2ae7df81dc2a966e694a0f7a2"> 360</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8cad0df2ae7df81dc2a966e694a0f7a2">VersionedFlowSensitive::processNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n)</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> {</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* sn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(n);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="comment">// Handle DummyVersPropSVFGNode here so we don't have to override the long</span></div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="comment">// processSVFGNode. We also don't call propagate based on its result.</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = SVFUtil::dyn_cast<DummyVersionPropSVFGNode>(sn))</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(dvp->getObject(), dvp->getVersion());</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  }</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a979f89495966d71f9b470d832384ebd6">processSVFGNode</a>(sn))</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  {</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <a class="code" href="classSVF_1_1WPASolver.html#a541ef7fda44ce79086c30b07a5f6126c">propagate</a>(&sn);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  }</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a18f24fe34af677e2a8c78ee89b89be1c"> 375</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18f24fe34af677e2a8c78ee89b89be1c">VersionedFlowSensitive::updateConnectedNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a69289c48fa91f850da90de080b9d26e5">SVFGEdgeSetTy</a>& newEdges)</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : newEdges)</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  {</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *dstNode = e->getDstNode();</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = e->getSrcNode()-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = dstNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</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>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">delta</a>(dst) && <span class="stringliteral">"VFS::updateConnectedNodes: new edges should be to delta nodes!"</span>);</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PHISVFGNode>(dstNode)</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  || SVFUtil::isa<FormalParmSVFGNode>(dstNode)</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  || SVFUtil::isa<ActualRetSVFGNode>(dstNode))</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  {</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dst);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  }</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>>(e);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(ie != <span class="keyword">nullptr</span> && <span class="stringliteral">"VFS::updateConnectedNodes: given direct edge?"</span>);</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &ept = ie-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// For every o, such that src --o--> dst, we need to set up reliance (and propagate).</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ept)</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  {</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> srcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(src, o);</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">if</span> (srcY == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> dstC = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(dst, o);</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordflow">if</span> (dstC == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> </div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  std::vector<Version> &versionsRelyingOnSrcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o][srcY];</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">if</span> (std::find(versionsRelyingOnSrcY.begin(), versionsRelyingOnSrcY.end(), dstC) == versionsRelyingOnSrcY.end())</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>  versionsRelyingOnSrcY.push_back(dstC);</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, srcY, dstC);</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> }</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span> </div><div class="line"><a name="l00416"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a1d1f71c41cc3e81e636b58f4436e6d9b"> 416</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1d1f71c41cc3e81e636b58f4436e6d9b">VersionedFlowSensitive::processLoad</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadVFGNode.html">LoadSVFGNode</a>* load)</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>  <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="l00419"></a><span class="lineno"> 419</span> </div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span> </div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="comment">// l: p = *q</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = load-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> p = load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : qpt)</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="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a5382518f3bc9c3bbb3148b9499ae5ae2">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a2bd0a705705138be2bbc7e0b6ef3bf0f">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span> </div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(l, o);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  {</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  }</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>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a0f71e4cd0948b294c7d33a690bde7dbe">isFieldInsensitive</a>(o))</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& fields = <a class="code" href="classSVF_1_1PointerAnalysis.html#aeec490de5955497af1a2a9cd429f0d5d">getAllFieldsObjNode</a>(o);</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> of : fields)</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  {</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(l, of);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(of, c)))</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  }</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>  }</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span> </div><div class="line"><a name="l00454"></a><span class="lineno"> 454</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="l00455"></a><span class="lineno"> 455</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="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">return</span> changed;</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> </div><div class="line"><a name="l00459"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#aa96f517740420665168e9b0c7d2347f1"> 459</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aa96f517740420665168e9b0c7d2347f1">VersionedFlowSensitive::processStore</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a>* store)</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> p = store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &ppt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(p);</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> </div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">if</span> (ppt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>()) <span class="keywordflow">return</span> <span class="keyword">false</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>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> </div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="comment">// l: *p = q</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> </div><div class="line"><a name="l00472"></a><span class="lineno"> 472</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="l00473"></a><span class="lineno"> 473</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="comment">// The version for these objects would be y_l(o).</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> changedObjects;</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span> </div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keywordflow">if</span> (!qpt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  {</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ppt)</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  {</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a5382518f3bc9c3bbb3148b9499ae5ae2">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a2bd0a705705138be2bbc7e0b6ef3bf0f">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span> </div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), q))</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</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>  changedObjects.set(o);</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  }</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  }</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> </div><div class="line"><a name="l00492"></a><span class="lineno"> 492</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="l00493"></a><span class="lineno"> 493</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="l00494"></a><span class="lineno"> 494</span> </div><div class="line"><a name="l00495"></a><span class="lineno"> 495</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="l00496"></a><span class="lineno"> 496</span> </div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> singleton = 0;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</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="l00499"></a><span class="lineno"> 499</span>  <span class="keywordflow">if</span> (isSU) <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.set(l);</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">else</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.reset(l);</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span> </div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="comment">// For all objects, perform pts(o:y) = pts(o:y) U pts(o:c) at loc,</span></div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="comment">// except when a strong update is taking place.</span></div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keyword">const</span> LocVersionMap::const_iterator lovmIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.find(l);</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span> (lovmIt != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.end())</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &oc : lovmIt->second)</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = oc.first;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = oc.second;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="comment">// Strong-updated; don't propagate.</span></div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">if</span> (isSU && o == singleton) <span class="keywordflow">continue</span>;</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</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>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  changedObjects.set(o);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</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>  }</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span> </div><div class="line"><a name="l00524"></a><span class="lineno"> 524</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="l00525"></a><span class="lineno"> 525</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="l00526"></a><span class="lineno"> 526</span> </div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="comment">// Changed objects need to be propagated. Time here should be inconsequential</span></div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="comment">// *except* for time taken for propagateVersion, which will time itself.</span></div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <span class="keywordflow">if</span> (!changedObjects.empty())</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">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : changedObjects)</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>  <span class="comment">// Definitely has a yielded version (came from prelabelling) as these are</span></div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="comment">// the changed objects which must've been pointed to in Andersen's too.</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, y);</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="comment">// Some o/v pairs changed: statements need to know.</span></div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][y]) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  }</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="keywordflow">return</span> changed;</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> }</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div><div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e"> 546</a></span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">VersionedFlowSensitive::getVersion</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html">VersionCache</a> &cache, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0ea2cc21f9de287746ca2216b08e22b4">LocVersionMap</a> &lvm)</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> {</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">if</span> (cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> && l == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a>)</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>  ObjToVersionMap::const_iterator foundVersion = cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->find(o);</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">return</span> foundVersion == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->end() ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> : foundVersion->second;</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"> 554</span>  <span class="comment">// Not const because the cache isn't as it is shared with setVersion.</span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  LocVersionMap::iterator foundObjToVersionMap = lvm.find(l);</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="comment">// If there are no obj -> version maps at l, then obviously there is no version for o.</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">if</span> (foundObjToVersionMap == lvm.end()) <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>;</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>  <span class="comment">// We can cache lvm[l].</span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a> = l;</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a> = &foundObjToVersionMap->second;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">true</span>;</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  ObjToVersionMap::const_iterator foundVersion = cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->find(o);</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  <span class="keywordflow">return</span> foundVersion == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->end() ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> : foundVersion->second;</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> }</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> </div><div class="line"><a name="l00568"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9"> 568</a></span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">VersionedFlowSensitive::getConsume</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o)</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</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_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span> }</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span> </div><div class="line"><a name="l00573"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255"> 573</a></span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">VersionedFlowSensitive::getYield</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o)</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> }</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span> </div><div class="line"><a name="l00578"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e"> 578</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">VersionedFlowSensitive::setVersion</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v, <a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html">VersionCache</a> &cache, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0ea2cc21f9de287746ca2216b08e22b4">LocVersionMap</a> &lvm)</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> {</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <span class="keywordflow">if</span> (cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> && l == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a>)</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  {</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  (*cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>)[o] = v;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  }</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="comment">// This can invalidate the cache but we're updating it in the next statement anyway.</span></div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">ObjToVersionMap</a> &ovm = lvm[l];</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">// We can cache lvm[l].</span></div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a> = l;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a> = &ovm;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">true</span>;</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>  ovm[o] = v;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741"> 597</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">VersionedFlowSensitive::setConsume</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v)</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>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</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> </div><div class="line"><a name="l00602"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806"> 602</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">VersionedFlowSensitive::setYield</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v)</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>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a13f00fd438df4feed73f43d6a0d55e0d"> 607</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a13f00fd438df4feed73f43d6a0d55e0d">VersionedFlowSensitive::invalidateYieldCache</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> {</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a>.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> }</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> </div><div class="line"><a name="l00612"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ab89fb73e63f7766cbaf7735921b0cf4b"> 612</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab89fb73e63f7766cbaf7735921b0cf4b">VersionedFlowSensitive::invalidateConsumeCache</a>(<span class="keywordtype">void</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"> 614</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a>.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">false</span>;</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> </div><div class="line"><a name="l00617"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a9d5990a41e90558595d0ad0defceb4e8"> 617</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9d5990a41e90558595d0ad0defceb4e8">VersionedFlowSensitive::dumpReliances</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="keyword"></span>{</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"# Version reliances\n"</span>;</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector<Version>>>::value_type &ovrv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>)</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span>  {</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovrv.first;</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Object "</span> << o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector<Version>>::value_type vrv : ovrv.second)</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  {</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vrv.first;</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Version "</span> << v << <span class="stringliteral">" is a reliance for: "</span>;</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span> </div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> rv : vrv.second)</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="keywordflow">if</span> (!first)</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  {</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  }</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>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << rv;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</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>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  }</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> </div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"# Statement reliances\n"</span>;</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, NodeBS></a>>::value_type &ovss : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>)</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  {</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovss.first;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Object "</span> << o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span> </div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, NodeBS>::value_type</a> &vss : ovss.second)</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>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vss.first;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Version "</span> << v << <span class="stringliteral">" is a reliance for statements: "</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"> 656</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &ss = vss.second;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : ss)</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  {</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  {</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  }</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>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << s;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  }</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span> </div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"\n"</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> }</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span> </div><div class="line"><a name="l00674"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a032acdcd8b84523a7ac2f0e46d21c62f"> 674</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a032acdcd8b84523a7ac2f0e46d21c62f">VersionedFlowSensitive::dumpLocVersionMaps</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span> <span class="keyword"></span>{</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"# LocVersion Maps\n"</span>;</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  {</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> loc = it->first;</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <span class="keywordtype">bool</span> locPrinted = <span class="keyword">false</span>;</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0ea2cc21f9de287746ca2216b08e22b4">LocVersionMap</a> *lvm : { &<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>, &<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a> })</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  {</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="keywordflow">if</span> (lvm->find(loc) == lvm->end() || lvm->at(loc).empty()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordflow">if</span> (!locPrinted)</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  {</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" "</span> << <span class="stringliteral">"SVFG node "</span> << loc << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  locPrinted = <span class="keyword">true</span>;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span> </div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" "</span> << (lvm == &<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a> ? <span class="stringliteral">"Consume "</span> : <span class="stringliteral">"Yield "</span>) << <span class="stringliteral">": "</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>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &ov : lvm->at(loc))</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  {</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ov.first;</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = ov.second;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << (first ? <span class="stringliteral">""</span> : <span class="stringliteral">", "</span>) << <span class="stringliteral">"<"</span> << o << <span class="stringliteral">", "</span> << v << <span class="stringliteral">">"</span>;</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  }</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span> </div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  }</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span> </div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span> }</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span> </div><div class="line"><a name="l00707"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a7565989371100f84ae5f9e2efa655fcb"> 707</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7565989371100f84ae5f9e2efa655fcb">VersionedFlowSensitive::dumpMeldVersion</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &v)</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span> {</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"[ "</span>;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> e : v)</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  {</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  {</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  }</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span> </div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << e;</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  }</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span> </div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" ]"</span>;</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span> }</div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
|
|
69
|
+
<a href="VersionedFlowSensitive_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">//===- VersionedFlowSensitive.cpp -- Versioned flow-sensitive pointer analysis------------//</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"> * VersionedFlowSensitive.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: Jun 26, 2020</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="Andersen_8h.html">WPA/Andersen.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "<a class="code" href="VersionedFlowSensitive_8h.html">WPA/VersionedFlowSensitive.h</a>"</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</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">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">VersionedFlowSensitive::invalidVersion</a> = 0;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html">VersionedFlowSensitive</a> *<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a53b8a881400d7b353133c68295812efb">VersionedFlowSensitive::vfspta</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa"> 21</a></span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">VersionedFlowSensitive::atKey</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> var, <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> version)</div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> {</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(version != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <span class="stringliteral">"VersionedFlowSensitive::atKey: trying to use an invalid version!"</span>);</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  <span class="keywordflow">return</span> std::make_pair(var, version);</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> }</div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> </div><div class="line"><a name="l00027"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#af52cafc2bb393823f51ca89a0abacec4"> 27</a></span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af52cafc2bb393823f51ca89a0abacec4">VersionedFlowSensitive::VersionedFlowSensitive</a>(<a class="code" href="classSVF_1_1PAG.html">PAG</a> *_pag, <a class="code" href="classSVF_1_1PointerAnalysis.html#a0b182ac680cce0547dbe7714c870ca85">PTATY</a> type)</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  : <a class="code" href="classSVF_1_1FlowSensitive.html">FlowSensitive</a>(_pag, type)</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">numPrelabeledNodes</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9235db71172dcdf277050f6ca5f344c6">numPrelabelVersions</a> = 0;</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a80535bb813f8bf240a0b54ac6ad4b257">relianceTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a77a5dd9578def9a8e2b48e8b90d9b996">prelabelingTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">meldLabelingTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8871031546861343c05346ae1a4550cd">meldMappingTime</a> = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> = 0.0;</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <span class="comment">// We'll grab vPtD in initialize.</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"> 34</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a> = { 0, <span class="keyword">nullptr</span>, <span class="keyword">false</span> };</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a> = { 0, <span class="keyword">nullptr</span>, <span class="keyword">false</span> };</div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> }</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> </div><div class="line"><a name="l00038"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a81d3528fd082018e4345f0b026bf3584"> 38</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a81d3528fd082018e4345f0b026bf3584">VersionedFlowSensitive::initialize</a>()</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> {</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">FlowSensitive::initialize</a>();</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  <span class="comment">// Overwrite the stat FlowSensitive::initialize gave us.</span></div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  <span class="keyword">delete</span> <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a> = <span class="keyword">new</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaee58f266762146e9fdc08ecfc326b29">VersionedFlowSensitiveStat</a>(<span class="keyword">this</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_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a> = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a4859864a4c72d5e04c10305e4579e8ee">getVersionedPTDataTy</a>();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda">prelabel</a>();</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a">meldLabel</a>();</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8e836aaeab108002205d2a7631e8559f">mapMeldVersions</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>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a25d9b2fb94c17edca9ccff220c0247b8">determineReliance</a>();</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ad955fda89f4f749151a1bd14562b03f6"> 54</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad955fda89f4f749151a1bd14562b03f6">VersionedFlowSensitive::finalize</a>()</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#afed358369102f01f6fe88b1433e704c3">FlowSensitive::finalize</a>();</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="comment">// vPtD->dumpPTData();</span></div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <span class="comment">// dumpReliances();</span></div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// dumpLocVersionMaps();</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> </div><div class="line"><a name="l00062"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda"> 62</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda">VersionedFlowSensitive::prelabel</a>(<span class="keywordtype">void</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"> 64</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  {</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it->first;</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *ln = it->second;</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span> </div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a> *stn = SVFUtil::dyn_cast<StoreSVFGNode>(ln))</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="comment">// l: *p = q.</span></div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="comment">// If p points to o (Andersen's), l yields a new version for o.</span></div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> p = stn->getPAGDstNodeID();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &myl = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">meldYield</a>[l];</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> o : <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-><a class="code" href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">getPts</a>(p))</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>  myl[o] = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84">newMeldVersion</a>(o);</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>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(l);</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>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-><a class="code" href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">getPts</a>(p).<a class="code" href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">count</a>() != 0) ++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">numPrelabeledNodes</a>;</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> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">delta</a>(l))</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>  <span class="comment">// The outgoing edges are not only what will later be propagated. SVFGOPT may</span></div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  <span class="comment">// move around nodes such that there can be an MRSVFGNode with no incoming or</span></div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <span class="comment">// outgoing edges which will be added at runtime. In essence, we can no</span></div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="comment">// longer rely on the outgoing edges of a delta node when SVFGOPT is enabled.</span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a> *mr = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a>>(ln);</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  <span class="keywordflow">if</span> (mr != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  {</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &mcl = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>[l];</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : mr-><a class="code" href="classSVF_1_1MRSVFGNode.html#a28fe266d0e4618aa4448aa218495a332">getPointsTo</a>())</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  {</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  mcl[o] = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84">newMeldVersion</a>(o);</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <span class="comment">// Push into worklist because its consume == its yield.</span></div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(l);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">if</span> (mr-><a class="code" href="classSVF_1_1MRSVFGNode.html#a28fe266d0e4618aa4448aa218495a332">getPointsTo</a>().count() != 0) ++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">numPrelabeledNodes</a>;</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  }</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  }</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> </div><div class="line"><a name="l00107"></a><span class="lineno"> 107</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a77a5dd9578def9a8e2b48e8b90d9b996">prelabelingTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> }</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span> </div><div class="line"><a name="l00111"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a"> 111</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a">VersionedFlowSensitive::meldLabel</a>(<span class="keywordtype">void</span>) {</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">while</span> (!<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>()) {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *ln = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(l);</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span> </div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">// Propagate l's y to lp's c for all l --o--> lp.</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : ln-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>()) {</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>>(e);</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  <span class="keywordflow">if</span> (!ie) <span class="keywordflow">continue</span>;</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>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> lp = ie-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getId();</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <span class="comment">// Delta nodes had c set already and they are permanent.</span></div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">delta</a>(lp)) <span class="keywordflow">continue</span>;</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>  <span class="keywordtype">bool</span> lpIsStore = SVFUtil::isa<StoreSVFGNode>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(lp));</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="comment">// Consume and yield are the same at non-stores, so ignore any self-loop</span></div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="comment">// at a non-store.</span></div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (l == lp && !lpIsStore) <span class="keywordflow">continue</span>;</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="comment">// At stores yield != consume, otherwise they are the same (so just use meldConsume).</span></div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &myl = SVFUtil::isa<StoreSVFGNode>(ln) ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">meldYield</a>[l] : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>[l];</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">ObjToMeldVersionMap</a> &mclp = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>[lp];</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordtype">bool</span> yieldChanged = <span class="keyword">false</span>;</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ie-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>()) {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  ObjToMeldVersionMap::const_iterator myloIt = myl.find(o);</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="keywordflow">if</span> (myloIt == myl.end()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span> </div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  <span class="comment">// Yield == consume for non-stores, so when consume is updated, so is yield.</span></div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="comment">// For stores, yield was already set, and it's static.</span></div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  yieldChanged = (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1da960df51570b59161e380949d910c4">meld</a>(mclp[o], myloIt->second) && !lpIsStore) || yieldChanged;</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>  <span class="keywordflow">if</span> (yieldChanged) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">vWorklist</a>.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(lp);</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  }</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> </div><div class="line"><a name="l00149"></a><span class="lineno"> 149</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">meldLabelingTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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> </div><div class="line"><a name="l00153"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a1da960df51570b59161e380949d910c4"> 153</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1da960df51570b59161e380949d910c4">VersionedFlowSensitive::meld</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv2)</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="comment">// Meld operator is union of bit vectors.</span></div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  <span class="keywordflow">return</span> mv1 |= mv2;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span> }</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> </div><div class="line"><a name="l00159"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a8e836aaeab108002205d2a7631e8559f"> 159</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8e836aaeab108002205d2a7631e8559f">VersionedFlowSensitive::mapMeldVersions</a>(<span class="keywordtype">void</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>  <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>(<span class="keyword">true</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>  <span class="comment">// We want to uniquely map MeldVersions (SparseBitVectors) to a Version (unsigned integer).</span></div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="comment">// mvv keeps track, and curVersion is used to generate new Versions.</span></div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<MeldVersion, Version></a> mvv;</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> curVersion = 1;</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="comment">// meldConsume -> consume.</span></div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  <span class="keywordflow">for</span> (LocMeldVersionMap::value_type &lomv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">meldConsume</a>)</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  {</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = lomv.first;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordtype">bool</span> lIsStore = SVFUtil::isa<StoreSVFGNode>(<a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(l));</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keywordflow">for</span> (ObjToMeldVersionMap::value_type &omv : lomv.second)</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>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = omv.first;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv = omv.second;</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>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<MeldVersion, Version>::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  <span class="comment">// If a mapping for foudnVersion exists, use it, otherwise create a new Version (++),</span></div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="comment">// keep track of it ([mv]), and use that.</span></div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.end() ? mvv[mv] = ++curVersion : foundVersion->second;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">setConsume</a>(l, o, v);</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="comment">// At non-stores, consume == yield.</span></div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="comment">// Unlike meldYield, we use yield for all yields, not just where consume != yield.</span></div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="comment">// This affords simplicity later. meldYield is expensive to explicitly represent</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="comment">// always, unlike yield.</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">if</span> (!lIsStore) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">setYield</a>(l, o, v);</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>  }</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="comment">// meldYield -> yield.</span></div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  <span class="keywordflow">for</span> (LocMeldVersionMap::value_type &lomv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">meldYield</a>)</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  {</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = lomv.first;</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">for</span> (ObjToMeldVersionMap::value_type &omv : lomv.second)</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  {</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = omv.first;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &mv = omv.second;</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>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<MeldVersion, Version>::const_iterator</a> foundVersion = mvv.find(mv);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = foundVersion == mvv.end() ? mvv[mv] = ++curVersion : foundVersion->second;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">setYield</a>(l, o, v);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</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> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="comment">// No longer necessary.</span></div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  meldConsume.clear();</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  meldYield.clear();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span> </div><div class="line"><a name="l00210"></a><span class="lineno"> 210</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8871031546861343c05346ae1a4550cd">meldMappingTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span> }</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span> </div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271"> 214</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">VersionedFlowSensitive::delta</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l)<span class="keyword"> const</span></div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> <span class="keyword"></span>{</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="comment">// Whether a node is a delta node or not. Decent boon to performance.</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keyword">static</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, bool></a> deltaCache;</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>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, bool>::const_iterator</a> isDeltaIt = deltaCache.find(l);</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">if</span> (isDeltaIt != deltaCache.end()) <span class="keywordflow">return</span> isDeltaIt->second;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span> </div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *s = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(l);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="comment">// Cases:</span></div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  <span class="comment">// * Function entry: can get new incoming indirect edges through ind. callsites.</span></div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="comment">// * Callsite returns: can get new incoming indirect edges if the callsite is indirect.</span></div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="comment">// * Otherwise: static.</span></div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  <span class="keywordtype">bool</span> isDelta = <span class="keyword">false</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a> *fn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#ae2cff3c963136f474fac0a66aa8cff7b">isFunEntrySVFGNode</a>(s))</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  {</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <a class="code" href="classSVF_1_1PTACallGraphEdge.html#aca11d1b778309a72e9d345bd02324459">PTACallGraphEdge::CallInstSet</a> callsites;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>-><a class="code" href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">getPTACallGraph</a>()-><a class="code" href="classSVF_1_1PTACallGraph.html#a9a4b0c6672288b9201ab254b4c49548d">getIndCallSitesInvokingCallee</a>(fn, callsites);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  isDelta = !callsites.empty();</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a> *cbn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#ac75b83bdf3bcfecaae579716ab33dd61">isCallSiteRetSVFGNode</a>(s))</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  {</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  isDelta = cbn->isIndirectCall();</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  }</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>  deltaCache[l] = isDelta;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">return</span> isDelta;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span> }</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> </div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> </div><div class="line"><a name="l00245"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84"> 245</a></span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">VersionedFlowSensitive::MeldVersion</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84">VersionedFlowSensitive::newMeldVersion</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o)</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span> {</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  ++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9235db71172dcdf277050f6ca5f344c6">numPrelabelVersions</a>;</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> nv;</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  nv.set(++<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a32b9ff0e47ef632626f1b647c38c26f9">meldVersions</a>[o]);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordflow">return</span> nv;</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> </div><div class="line"><a name="l00253"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a25d9b2fb94c17edca9ccff220c0247b8"> 253</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a25d9b2fb94c17edca9ccff220c0247b8">VersionedFlowSensitive::determineReliance</a>(<span class="keywordtype">void</span>)</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">// Use a set-based version to build, then we'll move things to vectors.</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, Map<Version, Set<Version></a>>> setVersionReliance;</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div><div class="line"><a name="l00258"></a><span class="lineno"> 258</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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = it->first;</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *ln = it->second;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : ln-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>())</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  {</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>>(e);</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <span class="keywordflow">if</span> (!ie) <span class="keywordflow">continue</span>;</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>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ie-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>())</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  {</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="comment">// Given l --o--> lp, c(o) at lp relies on y(o) at l.</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> lp = ie-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getId();</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span> </div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span> (y == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> cp = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(lp, o);</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">if</span> (cp == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">if</span> (cp != y) setVersionReliance[o][y].insert(cp);</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>  }</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> </div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  <span class="comment">// When an object/version points-to set changes, these nodes need to know.</span></div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(ln) || SVFUtil::isa<StoreSVFGNode>(ln))</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  {</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <span class="keyword">const</span> LocVersionMap::const_iterator lovmIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.find(l);</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <span class="keywordflow">if</span> (lovmIt != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.end())</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>  <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &ov : lovmIt->second)</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  {</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ov.first;</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = ov.second;</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][v].set(l);</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>  }</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>  }</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>  <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair<<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<Version></a>>> &ovvs : setVersionReliance)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovvs.first;</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, std::vector<Version></a>> &osRelying = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o];</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> std::pair<<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<Version></a>> &vvs : ovvs.second)</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  {</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vvs.first;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<Version></a> &vs = vvs.second;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  osRelying[v] = std::vector<Version>(vs.begin(), vs.end());</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  }</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="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>(<span class="keyword">true</span>);</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a80535bb813f8bf240a0b54ac6ad4b257">relianceTime</a> = (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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> </div><div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56"> 314</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">VersionedFlowSensitive::propagateVersion</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v)</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>  <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="l00317"></a><span class="lineno"> 317</span> </div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, std::vector<Version></a>>::iterator relyingVersions = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o].find(v);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">if</span> (relyingVersions != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o].end())</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  {</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> r : relyingVersions->second)</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, v, r, <span class="keyword">false</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>  }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> </div><div class="line"><a name="l00327"></a><span class="lineno"> 327</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="l00328"></a><span class="lineno"> 328</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ad1aa83a71379164d3b7ccf6b61639cb1"> 331</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">VersionedFlowSensitive::propagateVersion</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> vp, <span class="keywordtype">bool</span> time<span class="comment">/*=true*/</span>)</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> {</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordtype">double</span> start = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span> </div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> srcVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, v);</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">VersionedVar</a> dstVar = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, vp);</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(dstVar, srcVar))</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  {</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="comment">// o:vp has changed.</span></div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="comment">// Add the dummy propagation node to tell the solver to propagate it later.</span></div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  VarToPropNodeMap::const_iterator dvpIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.find(dstVar);</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  <span class="keywordflow">if</span> (dvpIt == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>.end())</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>  dvp = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a8dd513e8e5343beeb5d117c1ff4e45ea">addDummyVersionPropSVFGNode</a>(o, vp);</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">versionedVarToPropNode</a>[dstVar] = dvp;</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  } <span class="keywordflow">else</span> dvp = dvpIt->second;</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="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(dvp != <span class="keyword">nullptr</span> && <span class="stringliteral">"VFS::propagateVersion: propagation dummy node not found?"</span>);</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dvp-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</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>  <span class="comment">// Notify nodes which rely on o:vp that it changed.</span></div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][vp]) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</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>  <span class="keywordtype">double</span> end = time ? <a class="code" href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">stat</a>-><a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">getClk</a>() : 0.0;</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">if</span> (time) <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">versionPropTime</a> += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span> }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span> </div><div class="line"><a name="l00360"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a8cad0df2ae7df81dc2a966e694a0f7a2"> 360</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a8cad0df2ae7df81dc2a966e694a0f7a2">VersionedFlowSensitive::processNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n)</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span> {</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* sn = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">getSVFGNode</a>(n);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="comment">// Handle DummyVersPropSVFGNode here so we don't have to override the long</span></div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="comment">// processSVFGNode. We also don't call propagate based on its result.</span></div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1DummyVersionPropSVFGNode.html">DummyVersionPropSVFGNode</a> *dvp = SVFUtil::dyn_cast<DummyVersionPropSVFGNode>(sn))</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  {</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(dvp->getObject(), dvp->getVersion());</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  }</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FlowSensitive.html#a979f89495966d71f9b470d832384ebd6">processSVFGNode</a>(sn))</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  {</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <a class="code" href="classSVF_1_1WPASolver.html#a541ef7fda44ce79086c30b07a5f6126c">propagate</a>(&sn);</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span>  }</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a18f24fe34af677e2a8c78ee89b89be1c"> 375</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a18f24fe34af677e2a8c78ee89b89be1c">VersionedFlowSensitive::updateConnectedNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a69289c48fa91f850da90de080b9d26e5">SVFGEdgeSetTy</a>& newEdges)</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a> *e : newEdges)</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  {</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a> *dstNode = e->getDstNode();</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = e->getSrcNode()-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = dstNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</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>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">delta</a>(dst) && <span class="stringliteral">"VFS::updateConnectedNodes: new edges should be to delta nodes!"</span>);</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span> </div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PHISVFGNode>(dstNode)</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  || SVFUtil::isa<FormalParmSVFGNode>(dstNode)</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  || SVFUtil::isa<ActualRetSVFGNode>(dstNode))</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  {</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(dst);</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  }</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a> *ie = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>>(e);</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(ie != <span class="keyword">nullptr</span> && <span class="stringliteral">"VFS::updateConnectedNodes: given direct edge?"</span>);</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span> </div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &ept = ie-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// For every o, such that src --o--> dst, we need to set up reliance (and propagate).</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ept)</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  {</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> srcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(src, o);</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">if</span> (srcY == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> dstC = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(dst, o);</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  <span class="keywordflow">if</span> (dstC == <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> </div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  std::vector<Version> &versionsRelyingOnSrcY = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>[o][srcY];</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">if</span> (std::find(versionsRelyingOnSrcY.begin(), versionsRelyingOnSrcY.end(), dstC) == versionsRelyingOnSrcY.end())</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>  versionsRelyingOnSrcY.push_back(dstC);</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, srcY, dstC);</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> }</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span> </div><div class="line"><a name="l00416"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a1d1f71c41cc3e81e636b58f4436e6d9b"> 416</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1d1f71c41cc3e81e636b58f4436e6d9b">VersionedFlowSensitive::processLoad</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1LoadVFGNode.html">LoadSVFGNode</a>* load)</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>  <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="l00419"></a><span class="lineno"> 419</span> </div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span> </div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <span class="comment">// l: p = *q</span></div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = load-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> p = load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = load-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : qpt)</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="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a5382518f3bc9c3bbb3148b9499ae5ae2">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a2bd0a705705138be2bbc7e0b6ef3bf0f">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span> </div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(l, o);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  {</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  }</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>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a0f71e4cd0948b294c7d33a690bde7dbe">isFieldInsensitive</a>(o))</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  {</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>& fields = <a class="code" href="classSVF_1_1PointerAnalysis.html#aeec490de5955497af1a2a9cd429f0d5d">getAllFieldsObjNode</a>(o);</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> of : fields)</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  {</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">getConsume</a>(l, of);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordflow">if</span> (c != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(p, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(of, c)))</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  }</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>  }</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span> </div><div class="line"><a name="l00454"></a><span class="lineno"> 454</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="l00455"></a><span class="lineno"> 455</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="l00456"></a><span class="lineno"> 456</span>  <span class="keywordflow">return</span> changed;</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> </div><div class="line"><a name="l00459"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#aa96f517740420665168e9b0c7d2347f1"> 459</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aa96f517740420665168e9b0c7d2347f1">VersionedFlowSensitive::processStore</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StoreVFGNode.html">StoreSVFGNode</a>* store)</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span> {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> p = store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>();</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &ppt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(p);</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> </div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">if</span> (ppt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>()) <span class="keywordflow">return</span> <span class="keyword">false</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>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> q = store-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>();</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> &qpt = <a class="code" href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">getPts</a>(q);</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span> </div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l = store-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="comment">// l: *p = q</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> </div><div class="line"><a name="l00472"></a><span class="lineno"> 472</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="l00473"></a><span class="lineno"> 473</span>  <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="comment">// The version for these objects would be y_l(o).</span></div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> changedObjects;</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span> </div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <span class="keywordflow">if</span> (!qpt.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  {</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : ppt)</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  {</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a5382518f3bc9c3bbb3148b9499ae5ae2">isConstantObj</a>(o) || <a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a2bd0a705705138be2bbc7e0b6ef3bf0f">isNonPointerObj</a>(o)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span> </div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), q))</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</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>  changedObjects.set(o);</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  }</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  }</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> </div><div class="line"><a name="l00492"></a><span class="lineno"> 492</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="l00493"></a><span class="lineno"> 493</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="l00494"></a><span class="lineno"> 494</span> </div><div class="line"><a name="l00495"></a><span class="lineno"> 495</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="l00496"></a><span class="lineno"> 496</span> </div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> singleton = 0;</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</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="l00499"></a><span class="lineno"> 499</span>  <span class="keywordflow">if</span> (isSU) <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.set(l);</div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="keywordflow">else</span> <a class="code" href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">svfgHasSU</a>.reset(l);</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span> </div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>  <span class="comment">// For all objects, perform pts(o:y) = pts(o:y) U pts(o:c) at loc,</span></div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="comment">// except when a strong update is taking place.</span></div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keyword">const</span> LocVersionMap::const_iterator lovmIt = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.find(l);</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keywordflow">if</span> (lovmIt != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>.end())</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &oc : lovmIt->second)</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = oc.first;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> c = oc.second;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="comment">// Strong-updated; don't propagate.</span></div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  <span class="keywordflow">if</span> (isSU && o == singleton) <span class="keywordflow">continue</span>;</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keywordflow">if</span> (y != <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> && <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">vPtD</a>-><a class="code" href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">unionPts</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, y), <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">atKey</a>(o, c)))</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>  changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  changedObjects.set(o);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</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>  }</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span> </div><div class="line"><a name="l00524"></a><span class="lineno"> 524</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="l00525"></a><span class="lineno"> 525</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="l00526"></a><span class="lineno"> 526</span> </div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="comment">// Changed objects need to be propagated. Time here should be inconsequential</span></div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  <span class="comment">// *except* for time taken for propagateVersion, which will time itself.</span></div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <span class="keywordflow">if</span> (!changedObjects.empty())</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">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : changedObjects)</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>  <span class="comment">// Definitely has a yielded version (came from prelabelling) as these are</span></div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="comment">// the changed objects which must've been pointed to in Andersen's too.</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> y = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">getYield</a>(l, o);</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">propagateVersion</a>(o, y);</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="comment">// Some o/v pairs changed: statements need to know.</span></div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[o][y]) <a class="code" href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">pushIntoWorklist</a>(s);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  }</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  }</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="keywordflow">return</span> changed;</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> }</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div><div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#aedd12e894fb2c17d2201f4049e5f3793"> 546</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aedd12e894fb2c17d2201f4049e5f3793">VersionedFlowSensitive::cluster</a>(<span class="keywordtype">void</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"> 548</span>  std::vector<std::pair<unsigned, unsigned>> keys;</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">PAG::iterator</a> pit = <a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); pit != <a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++pit)</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  {</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordtype">unsigned</span> occ = 1;</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  <span class="keywordtype">unsigned</span> v = pit->first;</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#af34d8a738db4f40addc1de930e79654f">Options::PredictPtOcc</a> && <a class="code" href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">pag</a>-><a class="code" href="classSVF_1_1PAG.html#a2b288fce8efa1b0b1b620efec2c96eb6">getObject</a>(v) != <span class="keyword">nullptr</span>) occ = <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>[v].size() + 1;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(occ != 0);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  keys.push_back(std::make_pair(v, occ));</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  }</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> </div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  std::make_shared<std::vector<NodeID>>(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(<a class="code" href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">ander</a>, keys, <a class="code" href="classSVF_1_1FlowSensitive.html#adba7ffe68ae7edce9b3aa896f978da6b">candidateMappings</a>, <span class="stringliteral">"aux-ander"</span>));</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>  std::make_shared<std::vector<NodeID>>(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> </div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span> }</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> </div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e"> 566</a></span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">VersionedFlowSensitive::getVersion</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html">VersionCache</a> &cache, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0ea2cc21f9de287746ca2216b08e22b4">LocVersionMap</a> &lvm)</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> {</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordflow">if</span> (cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> && l == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a>)</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  {</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  ObjToVersionMap::const_iterator foundVersion = cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->find(o);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">return</span> foundVersion == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->end() ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> : foundVersion->second;</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"> 574</span>  <span class="comment">// Not const because the cache isn't as it is shared with setVersion.</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  LocVersionMap::iterator foundObjToVersionMap = lvm.find(l);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <span class="comment">// If there are no obj -> version maps at l, then obviously there is no version for o.</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keywordflow">if</span> (foundObjToVersionMap == lvm.end()) <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a>;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span> </div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  <span class="comment">// We can cache lvm[l].</span></div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a> = l;</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a> = &foundObjToVersionMap->second;</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">true</span>;</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>  ObjToVersionMap::const_iterator foundVersion = cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->find(o);</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  <span class="keywordflow">return</span> foundVersion == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>->end() ? <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">invalidVersion</a> : foundVersion->second;</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> </div><div class="line"><a name="l00588"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9"> 588</a></span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">VersionedFlowSensitive::getConsume</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o)</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span> {</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</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> </div><div class="line"><a name="l00593"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255"> 593</a></span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">VersionedFlowSensitive::getYield</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o)</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span> {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordflow">return</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">getVersion</a>(l, o, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e"> 598</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">VersionedFlowSensitive::setVersion</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v, <a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html">VersionCache</a> &cache, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0ea2cc21f9de287746ca2216b08e22b4">LocVersionMap</a> &lvm)</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span> {</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="keywordflow">if</span> (cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> && l == cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a>)</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  {</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  (*cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a>)[o] = v;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  <span class="keywordflow">return</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>  <span class="comment">// This can invalidate the cache but we're updating it in the next statement anyway.</span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">ObjToVersionMap</a> &ovm = lvm[l];</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> </div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="comment">// We can cache lvm[l].</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">l</a> = l;</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">ovm</a> = &ovm;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  cache.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">true</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"> 614</span>  ovm[o] = v;</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> </div><div class="line"><a name="l00617"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741"> 617</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">VersionedFlowSensitive::setConsume</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v)</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> {</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>);</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> </div><div class="line"><a name="l00622"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806"> 622</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">VersionedFlowSensitive::setYield</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> l, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v)</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>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">setVersion</a>(l, o, v, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a>, <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a>);</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a13f00fd438df4feed73f43d6a0d55e0d"> 627</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a13f00fd438df4feed73f43d6a0d55e0d">VersionedFlowSensitive::invalidateYieldCache</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span> {</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">yieldCache</a>.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> }</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> </div><div class="line"><a name="l00632"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#ab89fb73e63f7766cbaf7735921b0cf4b"> 632</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ab89fb73e63f7766cbaf7735921b0cf4b">VersionedFlowSensitive::invalidateConsumeCache</a>(<span class="keywordtype">void</span>)</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span> {</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">consumeCache</a>.<a class="code" href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">valid</a> = <span class="keyword">false</span>;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span> }</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span> </div><div class="line"><a name="l00637"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a9d5990a41e90558595d0ad0defceb4e8"> 637</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a9d5990a41e90558595d0ad0defceb4e8">VersionedFlowSensitive::dumpReliances</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="keyword"></span>{</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"# Version reliances\n"</span>;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector<Version>>>::value_type &ovrv : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">versionReliance</a>)</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>  {</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovrv.first;</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Object "</span> << o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a>, std::vector<Version>>::value_type vrv : ovrv.second)</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>  {</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vrv.first;</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Version "</span> << v << <span class="stringliteral">" is a reliance for: "</span>;</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> </div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> rv : vrv.second)</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  {</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordflow">if</span> (!first)</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>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">", "</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"> 656</span> </div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << rv;</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>  }</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>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  }</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  }</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>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"# Statement reliances\n"</span>;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map</a><<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, NodeBS></a>>::value_type &ovss : <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">stmtReliance</a>)</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  {</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ovss.first;</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Object "</span> << o << <span class="stringliteral">"\n"</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>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<Version, NodeBS>::value_type</a> &vss : ovss.second)</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  {</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = vss.first;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" Version "</span> << v << <span class="stringliteral">" is a reliance for statements: "</span>;</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span> </div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &ss = vss.second;</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> s : ss)</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">if</span> (!first)</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>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  }</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> </div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << s;</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  }</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span> </div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"\n"</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"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a032acdcd8b84523a7ac2f0e46d21c62f"> 694</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a032acdcd8b84523a7ac2f0e46d21c62f">VersionedFlowSensitive::dumpLocVersionMaps</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span> <span class="keyword"></span>{</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"# LocVersion Maps\n"</span>;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFG::iterator</a> it = <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != <a class="code" href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">svfg</a>-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  {</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> loc = it->first;</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keywordtype">bool</span> locPrinted = <span class="keyword">false</span>;</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a0ea2cc21f9de287746ca2216b08e22b4">LocVersionMap</a> *lvm : { &<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a>, &<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">yield</a> })</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  {</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keywordflow">if</span> (lvm->find(loc) == lvm->end() || lvm->at(loc).empty()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>  <span class="keywordflow">if</span> (!locPrinted)</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  {</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" "</span> << <span class="stringliteral">"SVFG node "</span> << loc << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  locPrinted = <span class="keyword">true</span>;</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  }</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span> </div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" "</span> << (lvm == &<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">consume</a> ? <span class="stringliteral">"Consume "</span> : <span class="stringliteral">"Yield "</span>) << <span class="stringliteral">": "</span>;</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span> </div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keywordflow">for</span> (<span class="keyword">const</span> ObjToVersionMap::value_type &ov : lvm->at(loc))</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  {</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o = ov.first;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">Version</a> v = ov.second;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << (first ? <span class="stringliteral">""</span> : <span class="stringliteral">", "</span>) << <span class="stringliteral">"<"</span> << o << <span class="stringliteral">", "</span> << v << <span class="stringliteral">">"</span>;</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  }</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span> </div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  }</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  }</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span> </div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span> }</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span> </div><div class="line"><a name="l00727"></a><span class="lineno"><a class="line" href="classSVF_1_1VersionedFlowSensitive.html#a7565989371100f84ae5f9e2efa655fcb"> 727</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1VersionedFlowSensitive.html#a7565989371100f84ae5f9e2efa655fcb">VersionedFlowSensitive::dumpMeldVersion</a>(<a class="code" href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">MeldVersion</a> &v)</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span> {</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">"[ "</span>;</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  <span class="keywordtype">bool</span> first = <span class="keyword">true</span>;</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="keywordflow">for</span> (<span class="keywordtype">unsigned</span> e : v)</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  {</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  <span class="keywordflow">if</span> (!first)</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  {</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">", "</span>;</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  }</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span> </div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << e;</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  first = <span class="keyword">false</span>;</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  }</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span> </div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVFUtil::outs</a>() << <span class="stringliteral">" ]"</span>;</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span> }</div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
|
|
71
71
|
<div class="ttc" id="classSVF_1_1WPASolver_html_a541ef7fda44ce79086c30b07a5f6126c"><div class="ttname"><a href="classSVF_1_1WPASolver.html#a541ef7fda44ce79086c30b07a5f6126c">SVF::WPASolver::propagate</a></div><div class="ttdeci">virtual void propagate(GNODE *v)</div><div class="ttdef"><b>Definition:</b> <a href="WPASolver_8h_source.html#l00134">WPASolver.h:134</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aaff594c78d93f7ad632d344e5c1c7f6a"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aaff594c78d93f7ad632d344e5c1c7f6a">SVF::VersionedFlowSensitive::meldLabel</a></div><div class="ttdeci">void meldLabel(void)</div><div class="ttdoc">Meld label the prelabeled SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00111">VersionedFlowSensitive.cpp:111</a></div></div>
|
|
@@ -75,52 +75,56 @@ $(function() {
|
|
|
75
75
|
<div class="ttc" id="classSVF_1_1WPASolver_html_a4af1c3e72f5af96c4facff672108da58"><div class="ttname"><a href="classSVF_1_1WPASolver.html#a4af1c3e72f5af96c4facff672108da58">SVF::WPASolver::pushIntoWorklist</a></div><div class="ttdeci">virtual void pushIntoWorklist(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="WPASolver_8h_source.html#l00163">WPASolver.h:163</a></div></div>
|
|
76
76
|
<div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_a4859864a4c72d5e04c10305e4579e8ee"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#a4859864a4c72d5e04c10305e4579e8ee">SVF::BVDataPTAImpl::getVersionedPTDataTy</a></div><div class="ttdeci">VersionedPTDataTy * getVersionedPTDataTy() const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00202">PointerAnalysisImpl.h:202</a></div></div>
|
|
77
77
|
<div class="ttc" id="classSVF_1_1Andersen_html_a187285a5bdf9422d9188b2b11b667639"><div class="ttname"><a href="classSVF_1_1Andersen.html#a187285a5bdf9422d9188b2b11b667639">SVF::Andersen::getPts</a></div><div class="ttdeci">virtual const PointsTo & getPts(NodeID id)</div><div class="ttdoc">Operation of points-to set. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00222">Andersen.h:222</a></div></div>
|
|
78
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9235db71172dcdf277050f6ca5f344c6"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9235db71172dcdf277050f6ca5f344c6">SVF::VersionedFlowSensitive::numPrelabelVersions</a></div><div class="ttdeci">Size_t numPrelabelVersions</div><div class="ttdoc">Number of versions created during prelabeling. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
78
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9235db71172dcdf277050f6ca5f344c6"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9235db71172dcdf277050f6ca5f344c6">SVF::VersionedFlowSensitive::numPrelabelVersions</a></div><div class="ttdeci">Size_t numPrelabelVersions</div><div class="ttdoc">Number of versions created during prelabeling. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00235">VersionedFlowSensitive.h:235</a></div></div>
|
|
79
79
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_aae032e5f5d53b131d0112dc8faa464a9"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aae032e5f5d53b131d0112dc8faa464a9">SVF::FlowSensitive::svfg</a></div><div class="ttdeci">SVFG * svfg</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00250">FlowSensitive.h:250</a></div></div>
|
|
80
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a53b8a881400d7b353133c68295812efb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a53b8a881400d7b353133c68295812efb">SVF::VersionedFlowSensitive::vfspta</a></div><div class="ttdeci">static VersionedFlowSensitive * vfspta</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
80
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a53b8a881400d7b353133c68295812efb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a53b8a881400d7b353133c68295812efb">SVF::VersionedFlowSensitive::vfspta</a></div><div class="ttdeci">static VersionedFlowSensitive * vfspta</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00244">VersionedFlowSensitive.h:244</a></div></div>
|
|
81
81
|
<div class="ttc" id="classSVF_1_1StmtVFGNode_html_a04986961ad507be9fcf141ab51787da8"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">SVF::StmtVFGNode::getPAGDstNodeID</a></div><div class="ttdeci">NodeID getPAGDstNodeID() const</div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00144">VFGNode.h:144</a></div></div>
|
|
82
82
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html">SVF::FlowSensitive</a></div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00049">FlowSensitive.h:49</a></div></div>
|
|
83
83
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7a98162b69de90f80ce853a6ff43af56"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7a98162b69de90f80ce853a6ff43af56">SVF::VersionedFlowSensitive::propagateVersion</a></div><div class="ttdeci">void propagateVersion(NodeID o, Version v)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00314">VersionedFlowSensitive.cpp:314</a></div></div>
|
|
84
|
-
<div class="ttc" id="classSVF_1_1FlowSensitive_html_aab4f70210eb1e6447a24697d3b459067"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aab4f70210eb1e6447a24697d3b459067">SVF::FlowSensitive::loadTime</a></div><div class="ttdeci">double loadTime</div><div class="ttdoc">time of load edges </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#
|
|
84
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_aab4f70210eb1e6447a24697d3b459067"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#aab4f70210eb1e6447a24697d3b459067">SVF::FlowSensitive::loadTime</a></div><div class="ttdeci">double loadTime</div><div class="ttdoc">time of load edges </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00315">FlowSensitive.h:315</a></div></div>
|
|
85
85
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a59f3dd74ed8c3e2fc48b9353ba2452aa"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a59f3dd74ed8c3e2fc48b9353ba2452aa">SVF::VersionedFlowSensitive::atKey</a></div><div class="ttdeci">static VersionedVar atKey(NodeID, Version)</div><div class="ttdoc">Return key into vPtD for address-taken var of a specific version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00021">VersionedFlowSensitive.cpp:21</a></div></div>
|
|
86
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_adfefc0dfa4e7fb4d20fafeaf96a5fa67"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">SVF::VersionedFlowSensitive::vWorklist</a></div><div class="ttdeci">FIFOWorkList< NodeID > vWorklist</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
86
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_adfefc0dfa4e7fb4d20fafeaf96a5fa67"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#adfefc0dfa4e7fb4d20fafeaf96a5fa67">SVF::VersionedFlowSensitive::vWorklist</a></div><div class="ttdeci">FIFOWorkList< NodeID > vWorklist</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00227">VersionedFlowSensitive.h:227</a></div></div>
|
|
87
87
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a18f24fe34af677e2a8c78ee89b89be1c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a18f24fe34af677e2a8c78ee89b89be1c">SVF::VersionedFlowSensitive::updateConnectedNodes</a></div><div class="ttdeci">virtual void updateConnectedNodes(const SVFGEdgeSetTy &newEdges) override</div><div class="ttdoc">Update nodes connected during updating call graph. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00375">VersionedFlowSensitive.cpp:375</a></div></div>
|
|
88
88
|
<div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00018">MTAResultValidator.h:18</a></div></div>
|
|
89
89
|
<div class="ttc" id="classSVF_1_1SVFG_html_a8dd513e8e5343beeb5d117c1ff4e45ea"><div class="ttname"><a href="classSVF_1_1SVFG.html#a8dd513e8e5343beeb5d117c1ff4e45ea">SVF::SVFG::addDummyVersionPropSVFGNode</a></div><div class="ttdeci">const DummyVersionPropSVFGNode * addDummyVersionPropSVFGNode(const NodeID object, const NodeID version)</div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8h_source.html#l00261">SVFG.h:261</a></div></div>
|
|
90
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a4a594c8d6ccaa27b5328c6388fdb258d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">SVF::VersionedFlowSensitive::meldLabelingTime</a></div><div class="ttdeci">double meldLabelingTime</div><div class="ttdoc">Time to meld label SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
91
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ac33c7cef2d1d143950820ea48e97e806"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">SVF::VersionedFlowSensitive::setYield</a></div><div class="ttdeci">void setYield(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the yielded version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
90
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a4a594c8d6ccaa27b5328c6388fdb258d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a4a594c8d6ccaa27b5328c6388fdb258d">SVF::VersionedFlowSensitive::meldLabelingTime</a></div><div class="ttdeci">double meldLabelingTime</div><div class="ttdoc">Time to meld label SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00239">VersionedFlowSensitive.h:239</a></div></div>
|
|
91
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ac33c7cef2d1d143950820ea48e97e806"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ac33c7cef2d1d143950820ea48e97e806">SVF::VersionedFlowSensitive::setYield</a></div><div class="ttdeci">void setYield(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the yielded version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00622">VersionedFlowSensitive.cpp:622</a></div></div>
|
|
92
92
|
<div class="ttc" id="util_8h_html_a07d17d6d5d1074c0969bc5d3c3d1d84a"><div class="ttname"><a href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a></div><div class="ttdeci">#define assert(ex)</div><div class="ttdef"><b>Definition:</b> <a href="util_8h_source.html#l00141">util.h:141</a></div></div>
|
|
93
93
|
<div class="ttc" id="classSVF_1_1PAG_html_a2bd0a705705138be2bbc7e0b6ef3bf0f"><div class="ttname"><a href="classSVF_1_1PAG.html#a2bd0a705705138be2bbc7e0b6ef3bf0f">SVF::PAG::isNonPointerObj</a></div><div class="ttdeci">bool isNonPointerObj(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="PAG_8h_source.html#l00672">PAG.h:672</a></div></div>
|
|
94
|
-
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a42a7e39e0e15576742f8ba7c32579ea2"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a42a7e39e0e15576742f8ba7c32579ea2">SVF::FlowSensitive::isStrongUpdate</a></div><div class="ttdeci">bool isStrongUpdate(const SVFGNode *node, NodeID &singleton)</div><div class="ttdoc">Return TRUE if this is a strong update STORE statement. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#
|
|
94
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a42a7e39e0e15576742f8ba7c32579ea2"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a42a7e39e0e15576742f8ba7c32579ea2">SVF::FlowSensitive::isStrongUpdate</a></div><div class="ttdeci">bool isStrongUpdate(const SVFGNode *node, NodeID &singleton)</div><div class="ttdoc">Return TRUE if this is a strong update STORE statement. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00626">FlowSensitive.cpp:626</a></div></div>
|
|
95
95
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_a7056704c224dfb4b57287fe90c004aa8"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">SVF::FIFOWorkList::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00146">WorkList.h:146</a></div></div>
|
|
96
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a13f00fd438df4feed73f43d6a0d55e0d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a13f00fd438df4feed73f43d6a0d55e0d">SVF::VersionedFlowSensitive::invalidateYieldCache</a></div><div class="ttdeci">void invalidateYieldCache(void)</div><div class="ttdoc">Invalidates yieldCache. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
96
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a13f00fd438df4feed73f43d6a0d55e0d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a13f00fd438df4feed73f43d6a0d55e0d">SVF::VersionedFlowSensitive::invalidateYieldCache</a></div><div class="ttdeci">void invalidateYieldCache(void)</div><div class="ttdoc">Invalidates yieldCache. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00627">VersionedFlowSensitive.cpp:627</a></div></div>
|
|
97
97
|
<div class="ttc" id="classSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00233">BasicTypes.h:233</a></div></div>
|
|
98
98
|
<div class="ttc" id="structSVF_1_1VersionedFlowSensitive_1_1VersionCache_html_a6cda550f5fe99fe2407ac9bf73d59319"><div class="ttname"><a href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#a6cda550f5fe99fe2407ac9bf73d59319">SVF::VersionedFlowSensitive::VersionCache::ovm</a></div><div class="ttdeci">ObjToVersionMap * ovm</div><div class="ttdoc">Nested map, i.e. consume[l] or yield[l]. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00052">VersionedFlowSensitive.h:52</a></div></div>
|
|
99
99
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6e36886fac2c276047def0a5acb85c0e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6e36886fac2c276047def0a5acb85c0e">SVF::VersionedFlowSensitive::ObjToMeldVersionMap</a></div><div class="ttdeci">Map< NodeID, MeldVersion > ObjToMeldVersionMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00037">VersionedFlowSensitive.h:37</a></div></div>
|
|
100
100
|
<div class="ttc" id="classSVF_1_1SVFG_html_a7ace06b6c893b31f7dec2abe54e33e11"><div class="ttname"><a href="classSVF_1_1SVFG.html#a7ace06b6c893b31f7dec2abe54e33e11">SVF::SVFG::getSVFGNode</a></div><div class="ttdeci">SVFGNode * getSVFGNode(NodeID id) const</div><div class="ttdoc">Get a SVFG node. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8h_source.html#l00150">SVFG.h:150</a></div></div>
|
|
101
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a03f5f16377daa0258166a73de3e21f07"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">SVF::VersionedFlowSensitive::vPtD</a></div><div class="ttdeci">BVDataPTAImpl::VersionedPTDataTy * vPtD</div><div class="ttdoc">Points-to DS for working with versions. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
101
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a03f5f16377daa0258166a73de3e21f07"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a03f5f16377daa0258166a73de3e21f07">SVF::VersionedFlowSensitive::vPtD</a></div><div class="ttdeci">BVDataPTAImpl::VersionedPTDataTy * vPtD</div><div class="ttdoc">Points-to DS for working with versions. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00230">VersionedFlowSensitive.h:230</a></div></div>
|
|
102
102
|
<div class="ttc" id="classSVF_1_1PAG_html"><div class="ttname"><a href="classSVF_1_1PAG.html">SVF::PAG</a></div><div class="ttdef"><b>Definition:</b> <a href="PAG_8h_source.html#l00047">PAG.h:47</a></div></div>
|
|
103
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ab0f18ae2d9c1b3b8f1d103f16df6877e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">SVF::VersionedFlowSensitive::setVersion</a></div><div class="ttdeci">void setVersion(const NodeID l, const NodeID o, const Version v, VersionCache &cache, LocVersionMap &lvm)</div><div class="ttdoc">Shared code for setConsume and setYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
104
|
-
<div class="ttc" id="
|
|
105
|
-
<div class="ttc" id="
|
|
103
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ab0f18ae2d9c1b3b8f1d103f16df6877e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ab0f18ae2d9c1b3b8f1d103f16df6877e">SVF::VersionedFlowSensitive::setVersion</a></div><div class="ttdeci">void setVersion(const NodeID l, const NodeID o, const Version v, VersionCache &cache, LocVersionMap &lvm)</div><div class="ttdoc">Shared code for setConsume and setYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00598">VersionedFlowSensitive.cpp:598</a></div></div>
|
|
104
|
+
<div class="ttc" id="classSVF_1_1PAG_html_a2b288fce8efa1b0b1b620efec2c96eb6"><div class="ttname"><a href="classSVF_1_1PAG.html#a2b288fce8efa1b0b1b620efec2c96eb6">SVF::PAG::getObject</a></div><div class="ttdeci">const MemObj * getObject(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="PAG_8h_source.html#l00589">PAG.h:589</a></div></div>
|
|
105
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_afed358369102f01f6fe88b1433e704c3"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#afed358369102f01f6fe88b1433e704c3">SVF::FlowSensitive::finalize</a></div><div class="ttdeci">virtual void finalize()</div><div class="ttdoc">Finalize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00133">FlowSensitive.cpp:133</a></div></div>
|
|
106
|
+
<div class="ttc" id="classSVF_1_1Options_html_af34d8a738db4f40addc1de930e79654f"><div class="ttname"><a href="classSVF_1_1Options.html#af34d8a738db4f40addc1de930e79654f">SVF::Options::PredictPtOcc</a></div><div class="ttdeci">static const llvm::cl::opt< bool > PredictPtOcc</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00062">Options.h:62</a></div></div>
|
|
107
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a9d5990a41e90558595d0ad0defceb4e8"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a9d5990a41e90558595d0ad0defceb4e8">SVF::VersionedFlowSensitive::dumpReliances</a></div><div class="ttdeci">void dumpReliances(void) const</div><div class="ttdoc">Dumps versionReliance and stmtReliance. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00637">VersionedFlowSensitive.cpp:637</a></div></div>
|
|
106
108
|
<div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00101">SVFBasicTypes.h:101</a></div></div>
|
|
107
109
|
<div class="ttc" id="namespaceSVF_html_a9ec7a8dc63411ee3724a25a59191be0c"><div class="ttname"><a href="namespaceSVF.html#a9ec7a8dc63411ee3724a25a59191be0c">SVF::Version</a></div><div class="ttdeci">unsigned Version</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00085">SVFBasicTypes.h:85</a></div></div>
|
|
108
110
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ad955fda89f4f749151a1bd14562b03f6"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ad955fda89f4f749151a1bd14562b03f6">SVF::VersionedFlowSensitive::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="VersionedFlowSensitive_8cpp_source.html#l00054">VersionedFlowSensitive.cpp:54</a></div></div>
|
|
109
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a86f03759d0c9e739d70d537ab02d7082"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">SVF::VersionedFlowSensitive::yieldCache</a></div><div class="ttdeci">VersionCache yieldCache</div><div class="ttdoc">Cache for the nested map in yield. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
111
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a86f03759d0c9e739d70d537ab02d7082"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a86f03759d0c9e739d70d537ab02d7082">SVF::VersionedFlowSensitive::yieldCache</a></div><div class="ttdeci">VersionCache yieldCache</div><div class="ttdoc">Cache for the nested map in yield. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00214">VersionedFlowSensitive.h:214</a></div></div>
|
|
110
112
|
<div class="ttc" id="classSVF_1_1VFGEdge_html"><div class="ttname"><a href="classSVF_1_1VFGEdge.html">SVF::VFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00044">VFGEdge.h:44</a></div></div>
|
|
111
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af0859eb2a5b46c45aa4314e6e54f4438"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">SVF::VersionedFlowSensitive::stmtReliance</a></div><div class="ttdeci">Map< NodeID, Map< Version, NodeBS > > stmtReliance</div><div class="ttdoc">o x version -> statement nodes which rely on that o/version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
112
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7565989371100f84ae5f9e2efa655fcb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7565989371100f84ae5f9e2efa655fcb">SVF::VersionedFlowSensitive::dumpMeldVersion</a></div><div class="ttdeci">static void dumpMeldVersion(MeldVersion &v)</div><div class="ttdoc">Dumps a MeldVersion to stdout. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
113
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af0859eb2a5b46c45aa4314e6e54f4438"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af0859eb2a5b46c45aa4314e6e54f4438">SVF::VersionedFlowSensitive::stmtReliance</a></div><div class="ttdeci">Map< NodeID, Map< Version, NodeBS > > stmtReliance</div><div class="ttdoc">o x version -> statement nodes which rely on that o/version. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00219">VersionedFlowSensitive.h:219</a></div></div>
|
|
114
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7565989371100f84ae5f9e2efa655fcb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7565989371100f84ae5f9e2efa655fcb">SVF::VersionedFlowSensitive::dumpMeldVersion</a></div><div class="ttdeci">static void dumpMeldVersion(MeldVersion &v)</div><div class="ttdoc">Dumps a MeldVersion to stdout. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00727">VersionedFlowSensitive.cpp:727</a></div></div>
|
|
113
115
|
<div class="ttc" id="classSVF_1_1MRSVFGNode_html"><div class="ttname"><a href="classSVF_1_1MRSVFGNode.html">SVF::MRSVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGNode_8h_source.html#l00042">SVFGNode.h:42</a></div></div>
|
|
114
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a1dc6e3d4931b53e7e426c0f76d06aeb3"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">SVF::VersionedFlowSensitive::versionReliance</a></div><div class="ttdeci">VersionRelianceMap versionReliance</div><div class="ttdoc">o -> (version -> versions which rely on it). </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
116
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a1dc6e3d4931b53e7e426c0f76d06aeb3"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a1dc6e3d4931b53e7e426c0f76d06aeb3">SVF::VersionedFlowSensitive::versionReliance</a></div><div class="ttdeci">VersionRelianceMap versionReliance</div><div class="ttdoc">o -> (version -> versions which rely on it). </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00217">VersionedFlowSensitive.h:217</a></div></div>
|
|
115
117
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_ad6243c1317503bed39411dab47c83da7"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">SVF::FlowSensitive::initialize</a></div><div class="ttdeci">virtual void initialize()</div><div class="ttdoc">Initialize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00048">FlowSensitive.cpp:48</a></div></div>
|
|
116
118
|
<div class="ttc" id="classSVF_1_1PAG_html_a5382518f3bc9c3bbb3148b9499ae5ae2"><div class="ttname"><a href="classSVF_1_1PAG.html#a5382518f3bc9c3bbb3148b9499ae5ae2">SVF::PAG::isConstantObj</a></div><div class="ttdeci">bool isConstantObj(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="PAG_8h_source.html#l00666">PAG.h:666</a></div></div>
|
|
117
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af15bb6be283fee2fcc4b1fb7d8190451"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">SVF::VersionedFlowSensitive::versionPropTime</a></div><div class="ttdeci">double versionPropTime</div><div class="ttdoc">Time to propagate versions to versions which rely on them. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
119
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af15bb6be283fee2fcc4b1fb7d8190451"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af15bb6be283fee2fcc4b1fb7d8190451">SVF::VersionedFlowSensitive::versionPropTime</a></div><div class="ttdeci">double versionPropTime</div><div class="ttdoc">Time to propagate versions to versions which rely on them. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00241">VersionedFlowSensitive.h:241</a></div></div>
|
|
118
120
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a4bef15157423cef48dc7333a803cd27d"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">SVF::GenericGraph::end</a></div><div class="ttdeci">iterator end()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00369">GenericGraph.h:369</a></div></div>
|
|
121
|
+
<div class="ttc" id="classSVF_1_1PointsTo_html_a849f670b38cb6f65fc23707a212591c7"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">SVF::PointsTo::MappingPtr</a></div><div class="ttdeci">std::shared_ptr< std::vector< NodeID > > MappingPtr</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00041">PointsTo.h:41</a></div></div>
|
|
119
122
|
<div class="ttc" id="structSVF_1_1VersionedFlowSensitive_1_1VersionCache_html_abbc4b4beea4318f9ccb81dbdeed239b7"><div class="ttname"><a href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#abbc4b4beea4318f9ccb81dbdeed239b7">SVF::VersionedFlowSensitive::VersionCache::l</a></div><div class="ttdeci">NodeID l</div><div class="ttdoc">SVFG node ID. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00050">VersionedFlowSensitive.h:50</a></div></div>
|
|
120
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ad8a7b01257f4b425007f3e0054dc6ae9"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">SVF::VersionedFlowSensitive::getConsume</a></div><div class="ttdeci">Version getConsume(const NodeID l, const NodeID o)</div><div class="ttdoc">Returns the consumed version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
123
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ad8a7b01257f4b425007f3e0054dc6ae9"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ad8a7b01257f4b425007f3e0054dc6ae9">SVF::VersionedFlowSensitive::getConsume</a></div><div class="ttdeci">Version getConsume(const NodeID l, const NodeID o)</div><div class="ttdoc">Returns the consumed version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00588">VersionedFlowSensitive.cpp:588</a></div></div>
|
|
121
124
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a7c9b7e5fe37ae31ba84d167945ca57df"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a7c9b7e5fe37ae31ba84d167945ca57df">SVF::PointerAnalysis::getPTACallGraph</a></div><div class="ttdeci">PTACallGraph * getPTACallGraph() const</div><div class="ttdoc">Return call graph. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00178">PointerAnalysis.h:178</a></div></div>
|
|
122
125
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_ac213302cf5c7cdf3b66f7b18649d0fbc"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVF::GenericGraph::iterator</a></div><div class="ttdeci">IDToNodeMapTy::iterator iterator</div><div class="ttdoc">Node Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00337">GenericGraph.h:337</a></div></div>
|
|
123
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a80535bb813f8bf240a0b54ac6ad4b257"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a80535bb813f8bf240a0b54ac6ad4b257">SVF::VersionedFlowSensitive::relianceTime</a></div><div class="ttdeci">double relianceTime</div><div class="ttdoc">Time to determine version and statement reliance. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
126
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a80535bb813f8bf240a0b54ac6ad4b257"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a80535bb813f8bf240a0b54ac6ad4b257">SVF::VersionedFlowSensitive::relianceTime</a></div><div class="ttdeci">double relianceTime</div><div class="ttdoc">Time to determine version and statement reliance. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00237">VersionedFlowSensitive.h:237</a></div></div>
|
|
127
|
+
<div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a33d502a0bd49307cd824e34b73157b9b"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">SVF::NodeIDAllocator::Clusterer::cluster</a></div><div class="ttdeci">static std::vector< NodeID > cluster(BVDataPTAImpl *pta, const std::vector< std::pair< NodeID, unsigned >> keys, std::vector< std::pair< hclust_fast_methods, std::vector< NodeID >>> &candidates, std::string evalSubtitle="")</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00174">NodeIDAllocator.cpp:174</a></div></div>
|
|
124
128
|
<div class="ttc" id="classSVF_1_1GenericEdge_html_aeaa31a2c8479e831b36ce2e2582ceb86"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">SVF::GenericEdge::getDstNode</a></div><div class="ttdeci">NodeType * getDstNode() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00089">GenericGraph.h:89</a></div></div>
|
|
125
129
|
<div class="ttc" id="namespaceSVF_html_af739db846e47ba6b2fd15eaad31ab7fb"><div class="ttname"><a href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">SVF::Set</a></div><div class="ttdeci">std::unordered_set< Key, Hash, KeyEqual, Allocator > Set</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00096">SVFBasicTypes.h:96</a></div></div>
|
|
126
130
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aa96f517740420665168e9b0c7d2347f1"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aa96f517740420665168e9b0c7d2347f1">SVF::VersionedFlowSensitive::processStore</a></div><div class="ttdeci">virtual bool processStore(const StoreSVFGNode *store) override</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00459">VersionedFlowSensitive.cpp:459</a></div></div>
|
|
@@ -128,41 +132,43 @@ $(function() {
|
|
|
128
132
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af9a43f48b7d99cc6694f3ae3248fd8e0"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af9a43f48b7d99cc6694f3ae3248fd8e0">SVF::VersionedFlowSensitive::ObjToVersionMap</a></div><div class="ttdeci">Map< NodeID, Version > ObjToVersionMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00036">VersionedFlowSensitive.h:36</a></div></div>
|
|
129
133
|
<div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_aee289e298e421448caaa604b7eb34fcb"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#aee289e298e421448caaa604b7eb34fcb">SVF::BVDataPTAImpl::getPts</a></div><div class="ttdeci">virtual const PointsTo & getPts(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00098">PointerAnalysisImpl.h:98</a></div></div>
|
|
130
134
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a25d9b2fb94c17edca9ccff220c0247b8"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a25d9b2fb94c17edca9ccff220c0247b8">SVF::VersionedFlowSensitive::determineReliance</a></div><div class="ttdeci">void determineReliance(void)</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00253">VersionedFlowSensitive.cpp:253</a></div></div>
|
|
131
|
-
<div class="ttc" id="classSVF_1_1PointsTo_html_a879783ba6629e500af9aa7dfcda2563d"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">SVF::PointsTo::count</a></div><div class="ttdeci">u32_t count(void) const</div><div class="ttdoc">Returns number of elements. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#
|
|
135
|
+
<div class="ttc" id="classSVF_1_1PointsTo_html_a879783ba6629e500af9aa7dfcda2563d"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">SVF::PointsTo::count</a></div><div class="ttdeci">u32_t count(void) const</div><div class="ttdoc">Returns number of elements. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00106">PointsTo.cpp:106</a></div></div>
|
|
132
136
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a81d3528fd082018e4345f0b026bf3584"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a81d3528fd082018e4345f0b026bf3584">SVF::VersionedFlowSensitive::initialize</a></div><div class="ttdeci">virtual void initialize() override</div><div class="ttdoc">Initialize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00038">VersionedFlowSensitive.cpp:38</a></div></div>
|
|
133
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a32b9ff0e47ef632626f1b647c38c26f9"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a32b9ff0e47ef632626f1b647c38c26f9">SVF::VersionedFlowSensitive::meldVersions</a></div><div class="ttdeci">Map< NodeID, unsigned > meldVersions</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
137
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a32b9ff0e47ef632626f1b647c38c26f9"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a32b9ff0e47ef632626f1b647c38c26f9">SVF::VersionedFlowSensitive::meldVersions</a></div><div class="ttdeci">Map< NodeID, unsigned > meldVersions</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00199">VersionedFlowSensitive.h:199</a></div></div>
|
|
134
138
|
<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>
|
|
135
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ab89fb73e63f7766cbaf7735921b0cf4b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ab89fb73e63f7766cbaf7735921b0cf4b">SVF::VersionedFlowSensitive::invalidateConsumeCache</a></div><div class="ttdeci">void invalidateConsumeCache(void)</div><div class="ttdoc">Invalidates consumeCache. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
139
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ab89fb73e63f7766cbaf7735921b0cf4b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ab89fb73e63f7766cbaf7735921b0cf4b">SVF::VersionedFlowSensitive::invalidateConsumeCache</a></div><div class="ttdeci">void invalidateConsumeCache(void)</div><div class="ttdoc">Invalidates consumeCache. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00632">VersionedFlowSensitive.cpp:632</a></div></div>
|
|
136
140
|
<div class="ttc" id="classSVF_1_1GenericNode_html_a2d9cd758d6f8c5189d9b90b74f43e009"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">SVF::GenericNode::getOutEdges</a></div><div class="ttdeci">const GEdgeSetTy & getOutEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00177">GenericGraph.h:177</a></div></div>
|
|
137
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6da3d01bd4f8b58c3dac952bba4ee958"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">SVF::VersionedFlowSensitive::consumeCache</a></div><div class="ttdeci">VersionCache consumeCache</div><div class="ttdoc">Cache for the nested map in consume. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
141
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6da3d01bd4f8b58c3dac952bba4ee958"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6da3d01bd4f8b58c3dac952bba4ee958">SVF::VersionedFlowSensitive::consumeCache</a></div><div class="ttdeci">VersionCache consumeCache</div><div class="ttdoc">Cache for the nested map in consume. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00212">VersionedFlowSensitive.h:212</a></div></div>
|
|
138
142
|
<div class="ttc" id="classSVF_1_1PTACallGraph_html_a9a4b0c6672288b9201ab254b4c49548d"><div class="ttname"><a href="classSVF_1_1PTACallGraph.html#a9a4b0c6672288b9201ab254b4c49548d">SVF::PTACallGraph::getIndCallSitesInvokingCallee</a></div><div class="ttdeci">void getIndCallSitesInvokingCallee(const SVFFunction *callee, PTACallGraphEdge::CallInstSet &csSet)</div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8cpp_source.html#l00246">PTACallGraph.cpp:246</a></div></div>
|
|
139
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
143
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a2e4e6a84cbfd553ad9cca8fdf9fd4a8d"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a2e4e6a84cbfd553ad9cca8fdf9fd4a8d">SVF::VersionedFlowSensitive::consume</a></div><div class="ttdeci">LocVersionMap consume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00205">VersionedFlowSensitive.h:205</a></div></div>
|
|
140
144
|
<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#l00139">VFGNode.h:139</a></div></div>
|
|
141
145
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a8e836aaeab108002205d2a7631e8559f"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a8e836aaeab108002205d2a7631e8559f">SVF::VersionedFlowSensitive::mapMeldVersions</a></div><div class="ttdeci">void mapMeldVersions()</div><div class="ttdoc">Moves meldConsume/Yield to consume/yield. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00159">VersionedFlowSensitive.cpp:159</a></div></div>
|
|
142
146
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a7d86bc18060c0114a783aa1c3a7e9dda"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a7d86bc18060c0114a783aa1c3a7e9dda">SVF::VersionedFlowSensitive::prelabel</a></div><div class="ttdeci">void prelabel(void)</div><div class="ttdoc">Prelabel the SVFG: set y(o) for stores and c(o) for delta nodes to a new version. ...</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00062">VersionedFlowSensitive.cpp:62</a></div></div>
|
|
143
147
|
<div class="ttc" id="PointsTo_8h_html"><div class="ttname"><a href="PointsTo_8h.html">PointsTo.h</a></div></div>
|
|
144
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af14a4cbc0b990389d31b2f88f50ad8eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">SVF::VersionedFlowSensitive::versionedVarToPropNode</a></div><div class="ttdeci">VarToPropNodeMap versionedVarToPropNode</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
148
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af14a4cbc0b990389d31b2f88f50ad8eb"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af14a4cbc0b990389d31b2f88f50ad8eb">SVF::VersionedFlowSensitive::versionedVarToPropNode</a></div><div class="ttdeci">VarToPropNodeMap versionedVarToPropNode</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00223">VersionedFlowSensitive.h:223</a></div></div>
|
|
145
149
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a5ec3d9bf1fc81346c9df29638daedc0f"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a5ec3d9bf1fc81346c9df29638daedc0f">SVF::PointerAnalysis::stat</a></div><div class="ttdeci">PTAStat * stat</div><div class="ttdoc">Statistics. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00155">PointerAnalysis.h:155</a></div></div>
|
|
146
150
|
<div class="ttc" id="classSVF_1_1LoadVFGNode_html"><div class="ttname"><a href="classSVF_1_1LoadVFGNode.html">SVF::LoadVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00197">VFGNode.h:197</a></div></div>
|
|
147
|
-
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a43e8ca2e69e6e8643c9abd1fa231d305"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">SVF::FlowSensitive::svfgHasSU</a></div><div class="ttdeci">NodeBS svfgHasSU</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#
|
|
148
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_afb0396e095bd461f146b4c5ce957b89e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">SVF::VersionedFlowSensitive::meldYield</a></div><div class="ttdeci">LocMeldVersionMap meldYield</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
151
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a43e8ca2e69e6e8643c9abd1fa231d305"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a43e8ca2e69e6e8643c9abd1fa231d305">SVF::FlowSensitive::svfgHasSU</a></div><div class="ttdeci">NodeBS svfgHasSU</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00320">FlowSensitive.h:320</a></div></div>
|
|
152
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_afb0396e095bd461f146b4c5ce957b89e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#afb0396e095bd461f146b4c5ce957b89e">SVF::VersionedFlowSensitive::meldYield</a></div><div class="ttdeci">LocMeldVersionMap meldYield</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00196">VersionedFlowSensitive.h:196</a></div></div>
|
|
149
153
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a3d44a343a2e3f5d276fd1b069c92e112"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a3d44a343a2e3f5d276fd1b069c92e112">SVF::VersionedFlowSensitive::invalidVersion</a></div><div class="ttdeci">static const Version invalidVersion</div><div class="ttdoc">If this version appears, there has been an error. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00058">VersionedFlowSensitive.h:58</a></div></div>
|
|
154
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_adba7ffe68ae7edce9b3aa896f978da6b"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#adba7ffe68ae7edce9b3aa896f978da6b">SVF::FlowSensitive::candidateMappings</a></div><div class="ttdeci">std::vector< std::pair< hclust_fast_methods, std::vector< NodeID > > > candidateMappings</div><div class="ttdoc">Save candidate mappings for evaluation&#39;s sake. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00287">FlowSensitive.h:287</a></div></div>
|
|
150
155
|
<div class="ttc" id="classSVF_1_1MRSVFGNode_html_a28fe266d0e4618aa4448aa218495a332"><div class="ttname"><a href="classSVF_1_1MRSVFGNode.html#a28fe266d0e4618aa4448aa218495a332">SVF::MRSVFGNode::getPointsTo</a></div><div class="ttdeci">const NodeBS & getPointsTo() const</div><div class="ttdoc">Return points-to of the MR. </div><div class="ttdef"><b>Definition:</b> <a href="SVFGNode_8h_source.html#l00052">SVFGNode.h:52</a></div></div>
|
|
151
156
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aaee58f266762146e9fdc08ecfc326b29"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aaee58f266762146e9fdc08ecfc326b29">SVF::VersionedFlowSensitive::VersionedFlowSensitiveStat</a></div><div class="ttdeci">friend class VersionedFlowSensitiveStat</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00030">VersionedFlowSensitive.h:30</a></div></div>
|
|
152
|
-
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a979f89495966d71f9b470d832384ebd6"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a979f89495966d71f9b470d832384ebd6">SVF::FlowSensitive::processSVFGNode</a></div><div class="ttdeci">bool processSVFGNode(SVFGNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#
|
|
157
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a979f89495966d71f9b470d832384ebd6"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a979f89495966d71f9b470d832384ebd6">SVF::FlowSensitive::processSVFGNode</a></div><div class="ttdeci">bool processSVFGNode(SVFGNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00203">FlowSensitive.cpp:203</a></div></div>
|
|
153
158
|
<div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00171">SVFBasicTypes.h:171</a></div></div>
|
|
154
159
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a85ab6b592fefc45a0674d3295e01638f"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVF::SVFUtil::outs</a></div><div class="ttdeci">raw_ostream & outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
|
|
155
160
|
<div class="ttc" id="Options_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
|
|
156
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a08fbc3ede8007689dcde37d56003650e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">SVF::VersionedFlowSensitive::getVersion</a></div><div class="ttdeci">Version getVersion(const NodeID l, const NodeID o, VersionCache &cache, LocVersionMap &lvm)</div><div class="ttdoc">Shared code for getConsume and getYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
157
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a032acdcd8b84523a7ac2f0e46d21c62f"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a032acdcd8b84523a7ac2f0e46d21c62f">SVF::VersionedFlowSensitive::dumpLocVersionMaps</a></div><div class="ttdeci">void dumpLocVersionMaps(void) const</div><div class="ttdoc">Dumps maps consume and yield. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
161
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a08fbc3ede8007689dcde37d56003650e"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a08fbc3ede8007689dcde37d56003650e">SVF::VersionedFlowSensitive::getVersion</a></div><div class="ttdeci">Version getVersion(const NodeID l, const NodeID o, VersionCache &cache, LocVersionMap &lvm)</div><div class="ttdoc">Shared code for getConsume and getYield. They wrap this function. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00566">VersionedFlowSensitive.cpp:566</a></div></div>
|
|
162
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a032acdcd8b84523a7ac2f0e46d21c62f"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a032acdcd8b84523a7ac2f0e46d21c62f">SVF::VersionedFlowSensitive::dumpLocVersionMaps</a></div><div class="ttdeci">void dumpLocVersionMaps(void) const</div><div class="ttdoc">Dumps maps consume and yield. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00694">VersionedFlowSensitive.cpp:694</a></div></div>
|
|
158
163
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a0ea2cc21f9de287746ca2216b08e22b4"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a0ea2cc21f9de287746ca2216b08e22b4">SVF::VersionedFlowSensitive::LocVersionMap</a></div><div class="ttdeci">Map< NodeID, ObjToVersionMap > LocVersionMap</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00040">VersionedFlowSensitive.h:40</a></div></div>
|
|
159
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aabc0a5a7a31b8d880e019773ba960741"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">SVF::VersionedFlowSensitive::setConsume</a></div><div class="ttdeci">void setConsume(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the consumed version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
164
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aabc0a5a7a31b8d880e019773ba960741"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aabc0a5a7a31b8d880e019773ba960741">SVF::VersionedFlowSensitive::setConsume</a></div><div class="ttdeci">void setConsume(const NodeID l, const NodeID o, const Version v)</div><div class="ttdoc">Sets the consumed version of o at l to v. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00617">VersionedFlowSensitive.cpp:617</a></div></div>
|
|
160
165
|
<div class="ttc" id="VersionedFlowSensitive_8h_html"><div class="ttname"><a href="VersionedFlowSensitive_8h.html">VersionedFlowSensitive.h</a></div></div>
|
|
161
166
|
<div class="ttc" id="classSVF_1_1VersionedPTData_html_a8b9d50b5ad1c779b2ff231f07f3002ea"><div class="ttname"><a href="classSVF_1_1VersionedPTData.html#a8b9d50b5ad1c779b2ff231f07f3002ea">SVF::VersionedPTData::unionPts</a></div><div class="ttdeci">virtual bool unionPts(const VersionedKey &dstVar, const VersionedKey &srcVar)=0</div></div>
|
|
162
167
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_af52cafc2bb393823f51ca89a0abacec4"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#af52cafc2bb393823f51ca89a0abacec4">SVF::VersionedFlowSensitive::VersionedFlowSensitive</a></div><div class="ttdeci">VersionedFlowSensitive(PAG *_pag, PTATY type=VFS_WPA)</div><div class="ttdoc">Constructor. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00027">VersionedFlowSensitive.cpp:27</a></div></div>
|
|
163
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a77a5dd9578def9a8e2b48e8b90d9b996"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a77a5dd9578def9a8e2b48e8b90d9b996">SVF::VersionedFlowSensitive::prelabelingTime</a></div><div class="ttdeci">double prelabelingTime</div><div class="ttdoc">Time to prelabel SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
168
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a77a5dd9578def9a8e2b48e8b90d9b996"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a77a5dd9578def9a8e2b48e8b90d9b996">SVF::VersionedFlowSensitive::prelabelingTime</a></div><div class="ttdeci">double prelabelingTime</div><div class="ttdoc">Time to prelabel SVFG. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00238">VersionedFlowSensitive.h:238</a></div></div>
|
|
164
169
|
<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>
|
|
165
170
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_acf23b9ce8d07431adf1799dc64c68271"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#acf23b9ce8d07431adf1799dc64c68271">SVF::VersionedFlowSensitive::delta</a></div><div class="ttdeci">virtual bool delta(NodeID l) const</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00214">VersionedFlowSensitive.cpp:214</a></div></div>
|
|
171
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_aedd12e894fb2c17d2201f4049e5f3793"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#aedd12e894fb2c17d2201f4049e5f3793">SVF::VersionedFlowSensitive::cluster</a></div><div class="ttdeci">virtual void cluster(void) override</div><div class="ttdoc">Override since we want to assign different weights based on versioning. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00546">VersionedFlowSensitive.cpp:546</a></div></div>
|
|
166
172
|
<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#l00164">GenericGraph.h:164</a></div></div>
|
|
167
173
|
<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#l00087">SVFBasicTypes.h:87</a></div></div>
|
|
168
174
|
<div class="ttc" id="namespaceSVF_html_a32489632f53dce062ca2e8bff42c65cf"><div class="ttname"><a href="namespaceSVF.html#a32489632f53dce062ca2e8bff42c65cf">SVF::VersionedVar</a></div><div class="ttdeci">std::pair< NodeID, Version > VersionedVar</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00114">SVFBasicTypes.h:114</a></div></div>
|
|
@@ -170,15 +176,15 @@ $(function() {
|
|
|
170
176
|
<div class="ttc" id="structSVF_1_1VersionedFlowSensitive_1_1VersionCache_html_aa530b30b6b65bb2ba5cbc0922e8d0654"><div class="ttname"><a href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html#aa530b30b6b65bb2ba5cbc0922e8d0654">SVF::VersionedFlowSensitive::VersionCache::valid</a></div><div class="ttdeci">bool valid</div><div class="ttdoc">Whether l and ovm can be accessed. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00054">VersionedFlowSensitive.h:54</a></div></div>
|
|
171
177
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00343">Casting.h:343</a></div></div>
|
|
172
178
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a69289c48fa91f850da90de080b9d26e5"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a69289c48fa91f850da90de080b9d26e5">SVF::FlowSensitive::SVFGEdgeSetTy</a></div><div class="ttdeci">SVFG::SVFGEdgeSetTy SVFGEdgeSetTy</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00053">FlowSensitive.h:53</a></div></div>
|
|
173
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a593177519a6bfab63dbb12dbc1ffbc20"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">SVF::VersionedFlowSensitive::numPrelabeledNodes</a></div><div class="ttdeci">Size_t numPrelabeledNodes</div><div class="ttdoc">Additional statistics. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
174
|
-
<div class="ttc" id="classSVF_1_1SVFG_html_ac75b83bdf3bcfecaae579716ab33dd61"><div class="ttname"><a href="classSVF_1_1SVFG.html#ac75b83bdf3bcfecaae579716ab33dd61">SVF::SVFG::isCallSiteRetSVFGNode</a></div><div class="ttdeci">const CallBlockNode * isCallSiteRetSVFGNode(const SVFGNode *node) const</div><div class="ttdoc">Whether a node is callsite return SVFGNode. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8cpp_source.html#
|
|
175
|
-
<div class="ttc" id="classSVF_1_1SVFG_html_ae2cff3c963136f474fac0a66aa8cff7b"><div class="ttname"><a href="classSVF_1_1SVFG.html#ae2cff3c963136f474fac0a66aa8cff7b">SVF::SVFG::isFunEntrySVFGNode</a></div><div class="ttdeci">const SVFFunction * isFunEntrySVFGNode(const SVFGNode *node) const</div><div class="ttdoc">Whether a node is function entry SVFGNode. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8cpp_source.html#
|
|
176
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a8871031546861343c05346ae1a4550cd"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a8871031546861343c05346ae1a4550cd">SVF::VersionedFlowSensitive::meldMappingTime</a></div><div class="ttdeci">double meldMappingTime</div><div class="ttdoc">Time to map MeldVersions to Versions. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
179
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a593177519a6bfab63dbb12dbc1ffbc20"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a593177519a6bfab63dbb12dbc1ffbc20">SVF::VersionedFlowSensitive::numPrelabeledNodes</a></div><div class="ttdeci">Size_t numPrelabeledNodes</div><div class="ttdoc">Additional statistics. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00234">VersionedFlowSensitive.h:234</a></div></div>
|
|
180
|
+
<div class="ttc" id="classSVF_1_1SVFG_html_ac75b83bdf3bcfecaae579716ab33dd61"><div class="ttname"><a href="classSVF_1_1SVFG.html#ac75b83bdf3bcfecaae579716ab33dd61">SVF::SVFG::isCallSiteRetSVFGNode</a></div><div class="ttdeci">const CallBlockNode * isCallSiteRetSVFGNode(const SVFGNode *node) const</div><div class="ttdoc">Whether a node is callsite return SVFGNode. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8cpp_source.html#l00714">SVFG.cpp:714</a></div></div>
|
|
181
|
+
<div class="ttc" id="classSVF_1_1SVFG_html_ae2cff3c963136f474fac0a66aa8cff7b"><div class="ttname"><a href="classSVF_1_1SVFG.html#ae2cff3c963136f474fac0a66aa8cff7b">SVF::SVFG::isFunEntrySVFGNode</a></div><div class="ttdeci">const SVFFunction * isFunEntrySVFGNode(const SVFGNode *node) const</div><div class="ttdoc">Whether a node is function entry SVFGNode. </div><div class="ttdef"><b>Definition:</b> <a href="SVFG_8cpp_source.html#l00688">SVFG.cpp:688</a></div></div>
|
|
182
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a8871031546861343c05346ae1a4550cd"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a8871031546861343c05346ae1a4550cd">SVF::VersionedFlowSensitive::meldMappingTime</a></div><div class="ttdeci">double meldMappingTime</div><div class="ttdoc">Time to map MeldVersions to Versions. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00240">VersionedFlowSensitive.h:240</a></div></div>
|
|
177
183
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a0b182ac680cce0547dbe7714c870ca85"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a0b182ac680cce0547dbe7714c870ca85">SVF::PointerAnalysis::PTATY</a></div><div class="ttdeci">PTATY</div><div class="ttdoc">Pointer analysis type list. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00062">PointerAnalysis.h:62</a></div></div>
|
|
178
184
|
<div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html">SVF::IndirectSVFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00042">SVFGEdge.h:42</a></div></div>
|
|
179
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a0f3bc278aa733bd637c9905530ff2e6c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">SVF::VersionedFlowSensitive::meldConsume</a></div><div class="ttdeci">LocMeldVersionMap meldConsume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
180
|
-
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a82b76087363b26fbe749653935569de7"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a82b76087363b26fbe749653935569de7">SVF::FlowSensitive::storeTime</a></div><div class="ttdeci">double storeTime</div><div class="ttdoc">time of store edges </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#
|
|
181
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a16224ee60494bb1fdf1c8a1026fbe7ab"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">SVF::VersionedFlowSensitive::yield</a></div><div class="ttdeci">LocVersionMap yield</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#
|
|
185
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a0f3bc278aa733bd637c9905530ff2e6c"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a0f3bc278aa733bd637c9905530ff2e6c">SVF::VersionedFlowSensitive::meldConsume</a></div><div class="ttdeci">LocMeldVersionMap meldConsume</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00192">VersionedFlowSensitive.h:192</a></div></div>
|
|
186
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a82b76087363b26fbe749653935569de7"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a82b76087363b26fbe749653935569de7">SVF::FlowSensitive::storeTime</a></div><div class="ttdeci">double storeTime</div><div class="ttdoc">time of store edges </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00316">FlowSensitive.h:316</a></div></div>
|
|
187
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a16224ee60494bb1fdf1c8a1026fbe7ab"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a16224ee60494bb1fdf1c8a1026fbe7ab">SVF::VersionedFlowSensitive::yield</a></div><div class="ttdeci">LocVersionMap yield</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00209">VersionedFlowSensitive.h:209</a></div></div>
|
|
182
188
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a0f71e4cd0948b294c7d33a690bde7dbe"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a0f71e4cd0948b294c7d33a690bde7dbe">SVF::PointerAnalysis::isFieldInsensitive</a></div><div class="ttdeci">bool isFieldInsensitive(NodeID id) const</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00370">PointerAnalysis.h:370</a></div></div>
|
|
183
189
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a1d1f71c41cc3e81e636b58f4436e6d9b"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a1d1f71c41cc3e81e636b58f4436e6d9b">SVF::VersionedFlowSensitive::processLoad</a></div><div class="ttdeci">virtual bool processLoad(const LoadSVFGNode *load) override</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00416">VersionedFlowSensitive.cpp:416</a></div></div>
|
|
184
190
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a8cad0df2ae7df81dc2a966e694a0f7a2"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a8cad0df2ae7df81dc2a966e694a0f7a2">SVF::VersionedFlowSensitive::processNode</a></div><div class="ttdeci">virtual void processNode(NodeID n) override</div><div class="ttdoc">Handle various constraints. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00360">VersionedFlowSensitive.cpp:360</a></div></div>
|
|
@@ -187,15 +193,17 @@ $(function() {
|
|
|
187
193
|
<div class="ttc" id="classSVF_1_1PointsTo_html"><div class="ttname"><a href="classSVF_1_1PointsTo.html">SVF::PointsTo</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00027">PointsTo.h:27</a></div></div>
|
|
188
194
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_aeec490de5955497af1a2a9cd429f0d5d"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#aeec490de5955497af1a2a9cd429f0d5d">SVF::PointerAnalysis::getAllFieldsObjNode</a></div><div class="ttdeci">virtual const NodeBS & getAllFieldsObjNode(NodeID id)</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00361">PointerAnalysis.h:361</a></div></div>
|
|
189
195
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_ac09fe1e8199f9ac3adb6c489ab608fd8"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#ac09fe1e8199f9ac3adb6c489ab608fd8">SVF::VersionedFlowSensitive::MeldVersion</a></div><div class="ttdeci">llvm::SparseBitVector MeldVersion</div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00033">VersionedFlowSensitive.h:33</a></div></div>
|
|
190
|
-
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a5cfee013a1a5821ef0c449842dd8690d"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">SVF::FlowSensitive::ander</a></div><div class="ttdeci">AndersenWaveDiff * ander</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#
|
|
196
|
+
<div class="ttc" id="classSVF_1_1FlowSensitive_html_a5cfee013a1a5821ef0c449842dd8690d"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#a5cfee013a1a5821ef0c449842dd8690d">SVF::FlowSensitive::ander</a></div><div class="ttdeci">AndersenWaveDiff * ander</div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8h_source.html#l00284">FlowSensitive.h:284</a></div></div>
|
|
197
|
+
<div class="ttc" id="classSVF_1_1PointsTo_html_a84eca4c7fc833f8ca4d119cd4da08ca8"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">SVF::PointsTo::setCurrentBestNodeMapping</a></div><div class="ttdeci">static void setCurrentBestNodeMapping(MappingPtr newCurrentBestNodeMapping, MappingPtr newCurrentBestReverseNodeMapping)</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00355">PointsTo.cpp:355</a></div></div>
|
|
191
198
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_a8fa72918fce7e9c0b2dc34b683a797c6"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">SVF::FIFOWorkList::pop</a></div><div class="ttdeci">Data pop()</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00174">WorkList.h:174</a></div></div>
|
|
192
199
|
<div class="ttc" id="structSVF_1_1VersionedFlowSensitive_1_1VersionCache_html"><div class="ttname"><a href="structSVF_1_1VersionedFlowSensitive_1_1VersionCache.html">SVF::VersionedFlowSensitive::VersionCache</a></div><div class="ttdoc">For caching the first step in LocVersionMaps. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8h_source.html#l00047">VersionedFlowSensitive.h:47</a></div></div>
|
|
193
|
-
<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#
|
|
200
|
+
<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>
|
|
194
201
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a8771956f7595b66d825b3dc459d1ae49"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a8771956f7595b66d825b3dc459d1ae49">SVF::PointerAnalysis::pag</a></div><div class="ttdeci">static PAG * pag</div><div class="ttdoc">PAG. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00147">PointerAnalysis.h:147</a></div></div>
|
|
202
|
+
<div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a36b25188130f4c21d145c950a70d616f"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">SVF::NodeIDAllocator::Clusterer::getReverseNodeMapping</a></div><div class="ttdeci">static std::vector< NodeID > getReverseNodeMapping(const std::vector< NodeID > &nodeMapping)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00385">NodeIDAllocator.cpp:385</a></div></div>
|
|
195
203
|
<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>
|
|
196
204
|
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a24746dcada35f10cb387c94860930e84"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a24746dcada35f10cb387c94860930e84">SVF::VersionedFlowSensitive::newMeldVersion</a></div><div class="ttdeci">MeldVersion newMeldVersion(NodeID o)</div><div class="ttdoc">Returns a new MeldVersion for o during the prelabeling phase. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00245">VersionedFlowSensitive.cpp:245</a></div></div>
|
|
197
205
|
<div class="ttc" id="classSVF_1_1DummyVersionPropSVFGNode_html"><div class="ttname"><a href="classSVF_1_1DummyVersionPropSVFGNode.html">SVF::DummyVersionPropSVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGNode_8h_source.html#l00468">SVFGNode.h:468</a></div></div>
|
|
198
|
-
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6ea3f8e2aa85ea588735514c0b6ff255"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">SVF::VersionedFlowSensitive::getYield</a></div><div class="ttdeci">Version getYield(const NodeID l, const NodeID o)</div><div class="ttdoc">Returns the yielded version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#
|
|
206
|
+
<div class="ttc" id="classSVF_1_1VersionedFlowSensitive_html_a6ea3f8e2aa85ea588735514c0b6ff255"><div class="ttname"><a href="classSVF_1_1VersionedFlowSensitive.html#a6ea3f8e2aa85ea588735514c0b6ff255">SVF::VersionedFlowSensitive::getYield</a></div><div class="ttdeci">Version getYield(const NodeID l, const NodeID o)</div><div class="ttdoc">Returns the yielded version of o at l. If no such version exists, returns invalidVersion. </div><div class="ttdef"><b>Definition:</b> <a href="VersionedFlowSensitive_8cpp_source.html#l00593">VersionedFlowSensitive.cpp:593</a></div></div>
|
|
199
207
|
<div class="ttc" id="classSVF_1_1VFGNode_html"><div class="ttname"><a href="classSVF_1_1VFGNode.html">SVF::VFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00047">VFGNode.h:47</a></div></div>
|
|
200
208
|
<div class="ttc" id="classSVF_1_1PTAStat_html_a3c4eaa1695ea13405911ae1621f98edc"><div class="ttname"><a href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">SVF::PTAStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="PTAStat_8cpp_source.html#l00113">PTAStat.cpp:113</a></div></div>
|
|
201
209
|
</div><!-- fragment --></div><!-- contents -->
|