svf-tools 1.0.855 → 1.0.857
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-doxygen/html/AndersenPWC_8h_source.html +4 -4
- package/SVF-doxygen/html/AndersenSCD_8cpp_source.html +2 -2
- package/SVF-doxygen/html/AndersenStat_8cpp_source.html +154 -163
- package/SVF-doxygen/html/Andersen_8cpp_source.html +2 -2
- package/SVF-doxygen/html/Andersen_8h_source.html +13 -13
- package/SVF-doxygen/html/CFBasicBlockGWTO_8h.html +109 -0
- package/SVF-doxygen/html/CFBasicBlockGWTO_8h_source.html +185 -0
- package/SVF-doxygen/html/CFLAlias_8cpp_source.html +2 -2
- package/SVF-doxygen/html/CFLAlias_8h_source.html +4 -4
- package/SVF-doxygen/html/CFLBase_8cpp_source.html +1 -1
- package/SVF-doxygen/html/CFLBase_8h_source.html +1 -1
- package/SVF-doxygen/html/CFLSVFGBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/CFLStat_8cpp_source.html +2 -2
- package/SVF-doxygen/html/CFLVF_8h_source.html +2 -2
- package/SVF-doxygen/html/CSC_8h.html +3 -3
- package/SVF-doxygen/html/CSC_8h_source.html +5 -5
- package/SVF-doxygen/html/ConsGNode_8h_source.html +4 -4
- package/SVF-doxygen/html/ContextDDA_8cpp_source.html +14 -14
- package/SVF-doxygen/html/ContextDDA_8h_source.html +6 -6
- package/SVF-doxygen/html/DDAClient_8cpp_source.html +5 -5
- package/SVF-doxygen/html/DDAClient_8h_source.html +1 -1
- package/SVF-doxygen/html/DDAPass_8cpp_source.html +7 -7
- package/SVF-doxygen/html/DDAPass_8h.html +3 -3
- package/SVF-doxygen/html/DDAPass_8h_source.html +4 -4
- package/SVF-doxygen/html/DDAStat_8cpp_source.html +10 -10
- package/SVF-doxygen/html/DDAStat_8h_source.html +1 -1
- package/SVF-doxygen/html/DDAVFSolver_8h.html +2 -2
- package/SVF-doxygen/html/DDAVFSolver_8h_source.html +5 -5
- package/SVF-doxygen/html/FSMPTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/FSMPTA_8h_source.html +5 -5
- package/SVF-doxygen/html/FlowDDA_8h_source.html +11 -11
- package/SVF-doxygen/html/FlowSensitiveStat_8cpp_source.html +236 -238
- package/SVF-doxygen/html/FlowSensitive_8cpp_source.html +3 -3
- package/SVF-doxygen/html/FlowSensitive_8h_source.html +7 -7
- package/SVF-doxygen/html/ICFGStat_8h_source.html +1 -1
- package/SVF-doxygen/html/ICFGWTO_8h.html +109 -0
- package/SVF-doxygen/html/ICFGWTO_8h_source.html +177 -0
- package/SVF-doxygen/html/LLVMModule_8cpp_source.html +2 -2
- package/SVF-doxygen/html/MTAAnnotator_8cpp_source.html +2 -2
- package/SVF-doxygen/html/MTAAnnotator_8h_source.html +1 -1
- package/SVF-doxygen/html/MTAStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/MTA_8cpp_source.html +3 -3
- package/SVF-doxygen/html/MemRegion_8cpp_source.html +3 -3
- package/SVF-doxygen/html/MemRegion_8h.html +3 -3
- package/SVF-doxygen/html/MemRegion_8h_source.html +4 -4
- package/SVF-doxygen/html/MemSSA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/Options_8cpp_source.html +10 -10
- package/SVF-doxygen/html/PCG_8h_source.html +4 -4
- package/SVF-doxygen/html/PTAStat_8cpp_source.html +99 -87
- package/SVF-doxygen/html/PTAStat_8h_source.html +2 -2
- package/SVF-doxygen/html/PointerAnalysisImpl_8cpp_source.html +30 -30
- package/SVF-doxygen/html/PointerAnalysisImpl_8h_source.html +15 -15
- package/SVF-doxygen/html/PointerAnalysis_8cpp_source.html +42 -42
- package/SVF-doxygen/html/PointerAnalysis_8h.html +5 -5
- package/SVF-doxygen/html/PointerAnalysis_8h_source.html +409 -418
- package/SVF-doxygen/html/SCC_8h.html +2 -2
- package/SVF-doxygen/html/SCC_8h_source.html +2 -2
- package/SVF-doxygen/html/SVFGBuilder_8h_source.html +3 -3
- package/SVF-doxygen/html/SVFGStat_8cpp_source.html +16 -19
- package/SVF-doxygen/html/SVFGStat_8h.html +1 -1
- package/SVF-doxygen/html/SVFGStat_8h_source.html +3 -3
- package/SVF-doxygen/html/SVFG_8h_source.html +1 -1
- package/SVF-doxygen/html/SVFStat_8cpp_source.html +196 -186
- package/SVF-doxygen/html/SVFStat_8h_source.html +44 -41
- package/SVF-doxygen/html/SaberSVFGBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/SrcSnkDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/Steensgaard_8cpp_source.html +2 -2
- package/SVF-doxygen/html/Steensgaard_8h_source.html +4 -4
- package/SVF-doxygen/html/TCT_8h.html +2 -2
- package/SVF-doxygen/html/TCT_8h_source.html +9 -9
- package/SVF-doxygen/html/ThreadCallGraph_8cpp_source.html +3 -3
- package/SVF-doxygen/html/ThreadCallGraph_8h_source.html +1 -1
- package/SVF-doxygen/html/TypeAnalysis_8cpp_source.html +3 -3
- package/SVF-doxygen/html/TypeAnalysis_8h_source.html +6 -6
- package/SVF-doxygen/html/VFG_8cpp_source.html +3 -3
- package/SVF-doxygen/html/VFG_8h_source.html +1 -1
- package/SVF-doxygen/html/VersionedFlowSensitiveStat_8cpp_source.html +77 -79
- package/SVF-doxygen/html/VersionedFlowSensitive_8cpp_source.html +6 -6
- package/SVF-doxygen/html/VersionedFlowSensitive_8h_source.html +4 -4
- package/SVF-doxygen/html/WPAPass_8cpp_source.html +12 -12
- package/SVF-doxygen/html/WPAPass_8h_source.html +1 -1
- package/SVF-doxygen/html/WPAStat_8h_source.html +9 -9
- package/SVF-doxygen/html/WTO_8h.html +25 -13
- package/SVF-doxygen/html/WTO_8h_source.html +794 -853
- package/SVF-doxygen/html/annotated.html +402 -397
- package/SVF-doxygen/html/classSVF_1_1Andersen-members.html +121 -123
- package/SVF-doxygen/html/classSVF_1_1Andersen.html +11 -17
- package/SVF-doxygen/html/classSVF_1_1AndersenBase-members.html +100 -102
- package/SVF-doxygen/html/classSVF_1_1AndersenBase.html +11 -17
- package/SVF-doxygen/html/classSVF_1_1AndersenSCD-members.html +124 -126
- package/SVF-doxygen/html/classSVF_1_1AndersenSCD.html +2 -8
- package/SVF-doxygen/html/classSVF_1_1AndersenSFR-members.html +129 -131
- package/SVF-doxygen/html/classSVF_1_1AndersenSFR.html +1 -7
- package/SVF-doxygen/html/classSVF_1_1AndersenStat-members.html +21 -20
- package/SVF-doxygen/html/classSVF_1_1AndersenStat.html +155 -161
- package/SVF-doxygen/html/classSVF_1_1AndersenWaveDiff-members.html +122 -124
- package/SVF-doxygen/html/classSVF_1_1AndersenWaveDiff.html +2 -8
- package/SVF-doxygen/html/classSVF_1_1BVDataPTAImpl-members.html +58 -60
- package/SVF-doxygen/html/classSVF_1_1BVDataPTAImpl.html +26 -32
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockGWTO-members.html +57 -50
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockGWTO.html +203 -1663
- package/SVF-doxygen/html/classSVF_1_1CFBasicBlockGWTO.png +0 -0
- package/SVF-doxygen/html/classSVF_1_1CFLAlias-members.html +78 -80
- package/SVF-doxygen/html/classSVF_1_1CFLAlias.html +4 -10
- package/SVF-doxygen/html/classSVF_1_1CFLBase-members.html +75 -77
- package/SVF-doxygen/html/classSVF_1_1CFLBase.html +1 -7
- package/SVF-doxygen/html/classSVF_1_1CFLSVFGBuilder.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1CFLStat-members.html +19 -18
- package/SVF-doxygen/html/classSVF_1_1CFLStat.html +5 -2
- package/SVF-doxygen/html/classSVF_1_1CFLVF-members.html +77 -79
- package/SVF-doxygen/html/classSVF_1_1CFLVF.html +2 -8
- package/SVF-doxygen/html/classSVF_1_1CondPTAImpl-members.html +50 -52
- package/SVF-doxygen/html/classSVF_1_1CondPTAImpl.html +9 -15
- package/SVF-doxygen/html/classSVF_1_1ConstraintNode-members.html +34 -34
- package/SVF-doxygen/html/classSVF_1_1ConstraintNode.html +25 -65
- package/SVF-doxygen/html/classSVF_1_1ContextDDA-members.html +97 -99
- package/SVF-doxygen/html/classSVF_1_1ContextDDA.html +18 -24
- package/SVF-doxygen/html/classSVF_1_1DDAClient.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1DDAPass.html +6 -6
- package/SVF-doxygen/html/classSVF_1_1DDAStat-members.html +18 -17
- package/SVF-doxygen/html/classSVF_1_1DDAStat.html +12 -9
- package/SVF-doxygen/html/classSVF_1_1DDAVFSolver.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1FSMPTA-members.html +140 -142
- package/SVF-doxygen/html/classSVF_1_1FSMPTA.html +2 -8
- package/SVF-doxygen/html/classSVF_1_1FlowDDA-members.html +102 -104
- package/SVF-doxygen/html/classSVF_1_1FlowDDA.html +15 -21
- package/SVF-doxygen/html/classSVF_1_1FlowSensitive-members.html +133 -135
- package/SVF-doxygen/html/classSVF_1_1FlowSensitive.html +18 -24
- package/SVF-doxygen/html/classSVF_1_1FlowSensitiveStat-members.html +24 -23
- package/SVF-doxygen/html/classSVF_1_1FlowSensitiveStat.html +241 -240
- package/SVF-doxygen/html/classSVF_1_1FunptrDDAClient.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1GenericNode.html +9 -10
- package/SVF-doxygen/html/classSVF_1_1GenericNode.png +0 -0
- package/SVF-doxygen/html/classSVF_1_1ICFGStat-members.html +19 -18
- package/SVF-doxygen/html/classSVF_1_1ICFGStat.html +4 -1
- package/SVF-doxygen/html/classSVF_1_1ICFGWTO-members.html +140 -0
- package/SVF-doxygen/html/classSVF_1_1ICFGWTO.html +379 -0
- package/SVF-doxygen/html/classSVF_1_1ICFGWTO.png +0 -0
- package/SVF-doxygen/html/classSVF_1_1LLVMModuleSet.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1MRGenerator.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1MTA.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1MTAAnnotator.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1MTASVFGBuilder.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1MTAStat-members.html +20 -19
- package/SVF-doxygen/html/classSVF_1_1MTAStat.html +6 -3
- package/SVF-doxygen/html/classSVF_1_1MemSSA.html +5 -5
- package/SVF-doxygen/html/classSVF_1_1MemSSAStat-members.html +24 -23
- package/SVF-doxygen/html/classSVF_1_1MemSSAStat.html +7 -4
- package/SVF-doxygen/html/classSVF_1_1PCG.html +3 -3
- package/SVF-doxygen/html/classSVF_1_1POCRAlias-members.html +78 -80
- package/SVF-doxygen/html/classSVF_1_1POCRAlias.html +0 -6
- package/SVF-doxygen/html/classSVF_1_1POCRHybrid-members.html +78 -80
- package/SVF-doxygen/html/classSVF_1_1POCRHybrid.html +0 -6
- package/SVF-doxygen/html/classSVF_1_1PTAStat-members.html +19 -18
- package/SVF-doxygen/html/classSVF_1_1PTAStat.html +100 -85
- package/SVF-doxygen/html/classSVF_1_1PointerAnalysis-members.html +34 -36
- package/SVF-doxygen/html/classSVF_1_1PointerAnalysis.html +291 -356
- package/SVF-doxygen/html/classSVF_1_1SCCDetection.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1SCCDetection_1_1GNodeSCCInfo.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1SVFGStat-members.html +41 -40
- package/SVF-doxygen/html/classSVF_1_1SVFGStat.html +18 -18
- package/SVF-doxygen/html/classSVF_1_1SVFIRBuilder.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1SVFStat-members.html +13 -12
- package/SVF-doxygen/html/classSVF_1_1SVFStat.html +208 -168
- package/SVF-doxygen/html/classSVF_1_1SaberSVFGBuilder.html +5 -5
- package/SVF-doxygen/html/classSVF_1_1SrcSnkDDA.html +1 -1
- package/SVF-doxygen/html/classSVF_1_1Steensgaard-members.html +109 -111
- package/SVF-doxygen/html/classSVF_1_1Steensgaard.html +4 -10
- package/SVF-doxygen/html/classSVF_1_1TCT.html +4 -4
- package/SVF-doxygen/html/classSVF_1_1ThreadCallGraph.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1TypeAnalysis-members.html +103 -105
- package/SVF-doxygen/html/classSVF_1_1TypeAnalysis.html +9 -15
- package/SVF-doxygen/html/classSVF_1_1VFG.html +2 -2
- package/SVF-doxygen/html/classSVF_1_1VersionedFlowSensitive-members.html +158 -160
- package/SVF-doxygen/html/classSVF_1_1VersionedFlowSensitive.html +6 -12
- package/SVF-doxygen/html/classSVF_1_1VersionedFlowSensitiveStat-members.html +24 -23
- package/SVF-doxygen/html/classSVF_1_1VersionedFlowSensitiveStat.html +84 -83
- package/SVF-doxygen/html/classSVF_1_1WPAPass.html +12 -12
- package/SVF-doxygen/html/classSVF_1_1WTO-members.html +137 -0
- package/SVF-doxygen/html/classSVF_1_1WTO.html +1998 -0
- package/SVF-doxygen/html/classSVF_1_1WTOComponent-members.html +97 -0
- package/SVF-doxygen/html/classSVF_1_1WTOComponent.html +515 -0
- package/SVF-doxygen/html/classSVF_1_1WTOComponentVisitor-members.html +93 -0
- package/SVF-doxygen/html/classSVF_1_1WTOComponentVisitor.html +421 -0
- package/SVF-doxygen/html/classSVF_1_1WTOComponentVisitor.png +0 -0
- package/SVF-doxygen/html/classSVF_1_1WTOCycle-members.html +98 -0
- package/SVF-doxygen/html/classSVF_1_1WTOCycle.html +630 -0
- package/SVF-doxygen/html/classSVF_1_1WTOCycleDepth-members.html +24 -23
- package/SVF-doxygen/html/classSVF_1_1WTOCycleDepth.html +338 -317
- package/SVF-doxygen/html/classSVF_1_1WTONode-members.html +91 -0
- package/SVF-doxygen/html/classSVF_1_1WTONode.html +390 -0
- package/SVF-doxygen/html/classSVF_1_1WTO_1_1WTOCycleDepthBuilder-members.html +96 -0
- package/SVF-doxygen/html/classSVF_1_1WTO_1_1WTOCycleDepthBuilder.html +332 -0
- package/SVF-doxygen/html/classSVF_1_1WTO_1_1WTOCycleDepthBuilder.png +0 -0
- package/SVF-doxygen/html/classes.html +383 -377
- package/SVF-doxygen/html/dir_445b24f35a8ddd2effd3d23ee1278e0a.html +0 -2
- package/SVF-doxygen/html/dir_f63327fc9cf9e35b7653a5e341daceab.html +4 -2
- package/SVF-doxygen/html/dir_fc0329f850c815763e0c5b05933e8d55.html +4 -0
- package/SVF-doxygen/html/files.html +31 -29
- package/SVF-doxygen/html/functions.html +18 -30
- package/SVF-doxygen/html/functions_a.html +17 -14
- package/SVF-doxygen/html/functions_b.html +25 -25
- package/SVF-doxygen/html/functions_c.html +37 -51
- package/SVF-doxygen/html/functions_e.html +7 -4
- package/SVF-doxygen/html/functions_enum.html +2 -2
- package/SVF-doxygen/html/functions_eval_c.html +1 -1
- package/SVF-doxygen/html/functions_eval_n.html +1 -1
- package/SVF-doxygen/html/functions_f.html +26 -21
- package/SVF-doxygen/html/functions_func.html +14 -11
- package/SVF-doxygen/html/functions_func_b.html +6 -10
- package/SVF-doxygen/html/functions_func_c.html +30 -36
- package/SVF-doxygen/html/functions_func_e.html +5 -5
- package/SVF-doxygen/html/functions_func_f.html +8 -3
- package/SVF-doxygen/html/functions_func_g.html +15 -25
- package/SVF-doxygen/html/functions_func_h.html +3 -3
- package/SVF-doxygen/html/functions_func_i.html +18 -14
- package/SVF-doxygen/html/functions_func_n.html +6 -6
- package/SVF-doxygen/html/functions_func_o.html +16 -16
- package/SVF-doxygen/html/functions_func_p.html +4 -7
- package/SVF-doxygen/html/functions_func_s.html +1 -1
- package/SVF-doxygen/html/functions_func_t.html +7 -10
- package/SVF-doxygen/html/functions_func_v.html +4 -5
- package/SVF-doxygen/html/functions_func_w.html +16 -4
- package/SVF-doxygen/html/functions_func_~.html +10 -10
- package/SVF-doxygen/html/functions_g.html +14 -21
- package/SVF-doxygen/html/functions_h.html +9 -6
- package/SVF-doxygen/html/functions_i.html +32 -29
- package/SVF-doxygen/html/functions_l.html +3 -3
- package/SVF-doxygen/html/functions_n.html +25 -23
- package/SVF-doxygen/html/functions_o.html +31 -29
- package/SVF-doxygen/html/functions_p.html +21 -15
- package/SVF-doxygen/html/functions_r.html +1 -1
- package/SVF-doxygen/html/functions_rela_o.html +3 -3
- package/SVF-doxygen/html/functions_s.html +26 -23
- package/SVF-doxygen/html/functions_t.html +14 -20
- package/SVF-doxygen/html/functions_type_b.html +4 -0
- package/SVF-doxygen/html/functions_type_c.html +3 -9
- package/SVF-doxygen/html/functions_type_e.html +3 -0
- package/SVF-doxygen/html/functions_type_g.html +3 -0
- package/SVF-doxygen/html/functions_type_i.html +7 -8
- package/SVF-doxygen/html/functions_type_n.html +13 -9
- package/SVF-doxygen/html/functions_type_s.html +3 -0
- package/SVF-doxygen/html/functions_type_w.html +19 -6
- package/SVF-doxygen/html/functions_v.html +8 -9
- package/SVF-doxygen/html/functions_vars.html +18 -30
- package/SVF-doxygen/html/functions_vars_h.html +3 -0
- package/SVF-doxygen/html/functions_vars_p.html +3 -0
- package/SVF-doxygen/html/functions_vars_t.html +0 -3
- package/SVF-doxygen/html/functions_vars_w.html +4 -0
- package/SVF-doxygen/html/functions_w.html +47 -20
- package/SVF-doxygen/html/functions_~.html +10 -10
- package/SVF-doxygen/html/hierarchy.html +621 -614
- package/SVF-doxygen/html/namespaceSVF.html +127 -7
- package/SVF-doxygen/html/namespacemembers_c.html +9 -0
- package/SVF-doxygen/html/namespacemembers_i.html +14 -5
- package/SVF-doxygen/html/namespacemembers_type_c.html +9 -0
- package/SVF-doxygen/html/namespacemembers_type_i.html +9 -0
- package/SVF-doxygen/html/search/all_0.js +124 -127
- package/SVF-doxygen/html/search/all_1.js +495 -495
- package/SVF-doxygen/html/search/all_10.js +325 -325
- package/SVF-doxygen/html/search/all_11.js +225 -225
- package/SVF-doxygen/html/search/all_12.js +555 -554
- package/SVF-doxygen/html/search/all_13.js +201 -203
- package/SVF-doxygen/html/search/all_14.js +67 -67
- package/SVF-doxygen/html/search/all_15.js +168 -168
- package/SVF-doxygen/html/search/all_16.js +73 -63
- package/SVF-doxygen/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/search/all_18.js +1 -1
- package/SVF-doxygen/html/search/all_19.js +11 -11
- package/SVF-doxygen/html/search/all_1a.js +175 -175
- package/SVF-doxygen/html/search/all_2.js +172 -173
- package/SVF-doxygen/html/search/all_3.js +648 -649
- package/SVF-doxygen/html/search/all_4.js +230 -230
- package/SVF-doxygen/html/search/all_5.js +120 -119
- package/SVF-doxygen/html/search/all_6.js +227 -226
- package/SVF-doxygen/html/search/all_7.js +1046 -1048
- package/SVF-doxygen/html/search/all_8.js +196 -191
- package/SVF-doxygen/html/search/all_9.js +579 -574
- package/SVF-doxygen/html/search/all_a.js +46 -46
- package/SVF-doxygen/html/search/all_b.js +26 -26
- package/SVF-doxygen/html/search/all_c.js +115 -115
- package/SVF-doxygen/html/search/all_d.js +197 -197
- package/SVF-doxygen/html/search/all_e.js +207 -207
- package/SVF-doxygen/html/search/all_f.js +116 -116
- package/SVF-doxygen/html/search/classes_0.js +26 -26
- package/SVF-doxygen/html/search/classes_1.js +9 -9
- package/SVF-doxygen/html/search/classes_10.js +74 -74
- package/SVF-doxygen/html/search/classes_11.js +14 -15
- package/SVF-doxygen/html/search/classes_12.js +2 -2
- package/SVF-doxygen/html/search/classes_13.js +10 -10
- package/SVF-doxygen/html/search/classes_14.js +20 -14
- package/SVF-doxygen/html/search/classes_15.js +1 -1
- package/SVF-doxygen/html/search/classes_2.js +78 -81
- package/SVF-doxygen/html/search/classes_3.js +37 -37
- package/SVF-doxygen/html/search/classes_4.js +9 -9
- package/SVF-doxygen/html/search/classes_5.js +28 -28
- package/SVF-doxygen/html/search/classes_6.js +104 -104
- package/SVF-doxygen/html/search/classes_7.js +38 -34
- package/SVF-doxygen/html/search/classes_8.js +58 -57
- package/SVF-doxygen/html/search/classes_9.js +1 -1
- package/SVF-doxygen/html/search/classes_a.js +12 -12
- package/SVF-doxygen/html/search/classes_b.js +29 -29
- package/SVF-doxygen/html/search/classes_c.js +6 -6
- package/SVF-doxygen/html/search/classes_d.js +18 -18
- package/SVF-doxygen/html/search/classes_e.js +36 -36
- package/SVF-doxygen/html/search/classes_f.js +25 -25
- package/SVF-doxygen/html/search/defines_0.js +3 -3
- package/SVF-doxygen/html/search/defines_1.js +2 -2
- package/SVF-doxygen/html/search/defines_2.js +30 -30
- package/SVF-doxygen/html/search/defines_3.js +20 -20
- package/SVF-doxygen/html/search/defines_4.js +2 -2
- package/SVF-doxygen/html/search/defines_5.js +4 -4
- package/SVF-doxygen/html/search/defines_6.js +2 -2
- package/SVF-doxygen/html/search/defines_7.js +5 -5
- package/SVF-doxygen/html/search/defines_8.js +11 -11
- package/SVF-doxygen/html/search/defines_9.js +9 -9
- package/SVF-doxygen/html/search/defines_a.js +2 -2
- package/SVF-doxygen/html/search/defines_b.js +1 -1
- package/SVF-doxygen/html/search/defines_c.js +3 -3
- package/SVF-doxygen/html/search/defines_d.js +2 -2
- package/SVF-doxygen/html/search/defines_e.js +7 -7
- package/SVF-doxygen/html/search/defines_f.js +3 -3
- package/SVF-doxygen/html/search/enums_0.js +3 -3
- package/SVF-doxygen/html/search/enums_1.js +2 -2
- package/SVF-doxygen/html/search/enums_10.js +1 -1
- package/SVF-doxygen/html/search/enums_11.js +1 -1
- package/SVF-doxygen/html/search/enums_2.js +8 -8
- package/SVF-doxygen/html/search/enums_3.js +1 -1
- package/SVF-doxygen/html/search/enums_4.js +3 -3
- package/SVF-doxygen/html/search/enums_5.js +1 -1
- package/SVF-doxygen/html/search/enums_6.js +2 -2
- package/SVF-doxygen/html/search/enums_7.js +2 -2
- package/SVF-doxygen/html/search/enums_8.js +4 -4
- package/SVF-doxygen/html/search/enums_9.js +1 -1
- package/SVF-doxygen/html/search/enums_a.js +1 -1
- package/SVF-doxygen/html/search/enums_b.js +7 -7
- package/SVF-doxygen/html/search/enums_c.js +1 -1
- package/SVF-doxygen/html/search/enums_d.js +4 -4
- package/SVF-doxygen/html/search/enums_e.js +2 -2
- package/SVF-doxygen/html/search/enums_f.js +4 -4
- package/SVF-doxygen/html/search/enumvalues_0.js +14 -14
- package/SVF-doxygen/html/search/enumvalues_1.js +14 -14
- package/SVF-doxygen/html/search/enumvalues_10.js +35 -35
- package/SVF-doxygen/html/search/enumvalues_11.js +3 -3
- package/SVF-doxygen/html/search/enumvalues_12.js +10 -10
- package/SVF-doxygen/html/search/enumvalues_13.js +1 -1
- package/SVF-doxygen/html/search/enumvalues_14.js +1 -1
- package/SVF-doxygen/html/search/enumvalues_15.js +3 -3
- package/SVF-doxygen/html/search/enumvalues_2.js +36 -36
- package/SVF-doxygen/html/search/enumvalues_3.js +13 -13
- package/SVF-doxygen/html/search/enumvalues_4.js +2 -2
- package/SVF-doxygen/html/search/enumvalues_5.js +47 -47
- package/SVF-doxygen/html/search/enumvalues_6.js +6 -6
- package/SVF-doxygen/html/search/enumvalues_7.js +8 -8
- package/SVF-doxygen/html/search/enumvalues_8.js +23 -23
- package/SVF-doxygen/html/search/enumvalues_9.js +6 -6
- package/SVF-doxygen/html/search/enumvalues_a.js +15 -15
- package/SVF-doxygen/html/search/enumvalues_b.js +11 -11
- package/SVF-doxygen/html/search/enumvalues_c.js +5 -5
- package/SVF-doxygen/html/search/enumvalues_d.js +18 -18
- package/SVF-doxygen/html/search/enumvalues_e.js +9 -9
- package/SVF-doxygen/html/search/enumvalues_f.js +45 -45
- package/SVF-doxygen/html/search/files_0.js +14 -14
- package/SVF-doxygen/html/search/files_1.js +7 -7
- package/SVF-doxygen/html/search/files_10.js +8 -8
- package/SVF-doxygen/html/search/files_11.js +8 -8
- package/SVF-doxygen/html/search/files_12.js +2 -2
- package/SVF-doxygen/html/search/files_2.js +58 -57
- package/SVF-doxygen/html/search/files_3.js +14 -14
- package/SVF-doxygen/html/search/files_4.js +5 -5
- package/SVF-doxygen/html/search/files_5.js +13 -13
- package/SVF-doxygen/html/search/files_6.js +9 -9
- package/SVF-doxygen/html/search/files_7.js +15 -14
- package/SVF-doxygen/html/search/files_8.js +13 -13
- package/SVF-doxygen/html/search/files_9.js +18 -18
- package/SVF-doxygen/html/search/files_a.js +3 -3
- package/SVF-doxygen/html/search/files_b.js +2 -2
- package/SVF-doxygen/html/search/files_c.js +20 -20
- package/SVF-doxygen/html/search/files_d.js +4 -4
- package/SVF-doxygen/html/search/files_e.js +62 -62
- package/SVF-doxygen/html/search/files_f.js +8 -8
- package/SVF-doxygen/html/search/functions_0.js +13 -13
- package/SVF-doxygen/html/search/functions_1.js +365 -364
- package/SVF-doxygen/html/search/functions_10.js +139 -140
- package/SVF-doxygen/html/search/functions_11.js +140 -140
- package/SVF-doxygen/html/search/functions_12.js +289 -289
- package/SVF-doxygen/html/search/functions_13.js +71 -72
- package/SVF-doxygen/html/search/functions_14.js +39 -39
- package/SVF-doxygen/html/search/functions_15.js +71 -71
- package/SVF-doxygen/html/search/functions_16.js +36 -32
- package/SVF-doxygen/html/search/functions_17.js +3 -3
- package/SVF-doxygen/html/search/functions_18.js +175 -175
- package/SVF-doxygen/html/search/functions_2.js +90 -91
- package/SVF-doxygen/html/search/functions_3.js +260 -262
- package/SVF-doxygen/html/search/functions_4.js +78 -78
- package/SVF-doxygen/html/search/functions_5.js +53 -53
- package/SVF-doxygen/html/search/functions_6.js +61 -60
- package/SVF-doxygen/html/search/functions_7.js +854 -857
- package/SVF-doxygen/html/search/functions_8.js +148 -148
- package/SVF-doxygen/html/search/functions_9.js +422 -421
- package/SVF-doxygen/html/search/functions_a.js +30 -30
- package/SVF-doxygen/html/search/functions_b.js +2 -2
- package/SVF-doxygen/html/search/functions_c.js +25 -25
- package/SVF-doxygen/html/search/functions_d.js +79 -79
- package/SVF-doxygen/html/search/functions_e.js +35 -35
- package/SVF-doxygen/html/search/functions_f.js +56 -56
- package/SVF-doxygen/html/search/namespaces_0.js +1 -1
- package/SVF-doxygen/html/search/namespaces_1.js +7 -7
- package/SVF-doxygen/html/search/related_0.js +2 -2
- package/SVF-doxygen/html/search/related_1.js +2 -2
- package/SVF-doxygen/html/search/related_2.js +3 -3
- package/SVF-doxygen/html/search/related_3.js +2 -2
- package/SVF-doxygen/html/search/related_4.js +2 -2
- package/SVF-doxygen/html/search/related_5.js +1 -1
- package/SVF-doxygen/html/search/related_6.js +2 -2
- package/SVF-doxygen/html/search/related_7.js +4 -4
- package/SVF-doxygen/html/search/related_8.js +2 -2
- package/SVF-doxygen/html/search/related_9.js +4 -4
- package/SVF-doxygen/html/search/related_a.js +19 -19
- package/SVF-doxygen/html/search/related_b.js +4 -4
- package/SVF-doxygen/html/search/related_c.js +2 -2
- package/SVF-doxygen/html/search/related_d.js +12 -12
- package/SVF-doxygen/html/search/related_e.js +2 -2
- package/SVF-doxygen/html/search/related_f.js +2 -2
- package/SVF-doxygen/html/search/typedefs_0.js +19 -19
- package/SVF-doxygen/html/search/typedefs_1.js +27 -26
- package/SVF-doxygen/html/search/typedefs_10.js +63 -62
- package/SVF-doxygen/html/search/typedefs_11.js +13 -13
- package/SVF-doxygen/html/search/typedefs_12.js +11 -11
- package/SVF-doxygen/html/search/typedefs_13.js +33 -33
- package/SVF-doxygen/html/search/typedefs_14.js +11 -8
- package/SVF-doxygen/html/search/typedefs_2.js +129 -129
- package/SVF-doxygen/html/search/typedefs_3.js +39 -39
- package/SVF-doxygen/html/search/typedefs_4.js +18 -17
- package/SVF-doxygen/html/search/typedefs_5.js +41 -41
- package/SVF-doxygen/html/search/typedefs_6.js +57 -56
- package/SVF-doxygen/html/search/typedefs_7.js +47 -44
- package/SVF-doxygen/html/search/typedefs_8.js +1 -1
- package/SVF-doxygen/html/search/typedefs_9.js +6 -6
- package/SVF-doxygen/html/search/typedefs_a.js +29 -29
- package/SVF-doxygen/html/search/typedefs_b.js +29 -29
- package/SVF-doxygen/html/search/typedefs_c.js +41 -41
- package/SVF-doxygen/html/search/typedefs_d.js +14 -14
- package/SVF-doxygen/html/search/typedefs_e.js +52 -52
- package/SVF-doxygen/html/search/typedefs_f.js +14 -14
- package/SVF-doxygen/html/search/variables_0.js +148 -151
- package/SVF-doxygen/html/search/variables_1.js +76 -76
- package/SVF-doxygen/html/search/variables_10.js +99 -98
- package/SVF-doxygen/html/search/variables_11.js +45 -45
- package/SVF-doxygen/html/search/variables_12.js +91 -91
- package/SVF-doxygen/html/search/variables_13.js +73 -74
- package/SVF-doxygen/html/search/variables_14.js +14 -14
- package/SVF-doxygen/html/search/variables_15.js +49 -49
- package/SVF-doxygen/html/search/variables_16.js +10 -9
- package/SVF-doxygen/html/search/variables_17.js +1 -1
- package/SVF-doxygen/html/search/variables_18.js +2 -2
- package/SVF-doxygen/html/search/variables_2.js +38 -38
- package/SVF-doxygen/html/search/variables_3.js +142 -142
- package/SVF-doxygen/html/search/variables_4.js +50 -50
- package/SVF-doxygen/html/search/variables_5.js +37 -37
- package/SVF-doxygen/html/search/variables_6.js +66 -66
- package/SVF-doxygen/html/search/variables_7.js +34 -34
- package/SVF-doxygen/html/search/variables_8.js +8 -7
- package/SVF-doxygen/html/search/variables_9.js +78 -78
- package/SVF-doxygen/html/search/variables_a.js +4 -4
- package/SVF-doxygen/html/search/variables_b.js +10 -10
- package/SVF-doxygen/html/search/variables_c.js +45 -45
- package/SVF-doxygen/html/search/variables_d.js +55 -55
- package/SVF-doxygen/html/search/variables_e.js +123 -123
- package/SVF-doxygen/html/search/variables_f.js +30 -30
- package/SVF-doxygen/html/structSVF_1_1has__edgetype.html +97 -0
- package/SVF-doxygen/html/structSVF_1_1has__edgetype.png +0 -0
- package/SVF-doxygen/html/structSVF_1_1has__edgetype_3_01T_00_01std_1_1void__t_3_01typename_01T_1_1EdgeType_01_4_01_4.html +97 -0
- package/SVF-doxygen/html/structSVF_1_1has__edgetype_3_01T_00_01std_1_1void__t_3_01typename_01T_1_1EdgeType_01_4_01_4.png +0 -0
- package/SVF-doxygen/html/structSVF_1_1has__nodetype.html +97 -0
- package/SVF-doxygen/html/structSVF_1_1has__nodetype.png +0 -0
- package/SVF-doxygen/html/structSVF_1_1has__nodetype_3_01T_00_01std_1_1void__t_3_01typename_01T_1_1NodeType_01_4_01_4.html +97 -0
- package/SVF-doxygen/html/structSVF_1_1has__nodetype_3_01T_00_01std_1_1void__t_3_01typename_01T_1_1NodeType_01_4_01_4.png +0 -0
- package/SVF-doxygen/html/svf-ex_8cpp.html +2 -2
- package/SVF-doxygen/html/svf-ex_8cpp_source.html +3 -3
- package/package.json +1 -1
- package/svf/include/AbstractExecution/CFBasicBlockGWTO.h +83 -0
- package/svf/include/AbstractExecution/ICFGWTO.h +78 -0
- package/svf/include/DDA/DDAPass.h +2 -2
- package/svf/include/DDA/DDAVFSolver.h +2 -2
- package/svf/include/Graphs/SVFGStat.h +1 -1
- package/svf/include/Graphs/WTO.h +859 -0
- package/svf/include/MSSA/MemRegion.h +3 -3
- package/svf/include/MTA/TCT.h +2 -2
- package/svf/include/MemoryModel/PointerAnalysis.h +5 -14
- package/svf/include/Util/SVFStat.h +3 -0
- package/svf/include/WPA/CSC.h +3 -3
- package/svf/lib/DDA/DDAStat.cpp +2 -2
- package/svf/lib/Graphs/SVFGStat.cpp +2 -4
- package/svf/lib/MemoryModel/PointerAnalysis.cpp +1 -1
- package/svf/lib/Util/PTAStat.cpp +14 -4
- package/svf/lib/Util/SVFStat.cpp +13 -3
- package/svf/lib/WPA/AndersenStat.cpp +3 -8
- package/svf/lib/WPA/FlowSensitiveStat.cpp +1 -2
- package/svf/lib/WPA/VersionedFlowSensitiveStat.cpp +1 -2
- package/svf/include/AbstractExecution/WTO.h +0 -897
- /package/svf/include/{Util → Graphs}/SCC.h +0 -0
|
@@ -1,897 +0,0 @@
|
|
|
1
|
-
//===- WTO.h -- Weakest Topological Order Analysis-------------------------//
|
|
2
|
-
//
|
|
3
|
-
// SVF: Static Value-Flow Analysis
|
|
4
|
-
//
|
|
5
|
-
// Copyright (C) <2013-> <Yulei Sui>
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
// This program is free software: you can redistribute it and/or modify
|
|
9
|
-
// it under the terms of the GNU General Public License as published by
|
|
10
|
-
// the Free Software Foundation, either version 3 of the License, or
|
|
11
|
-
// (at your option) any later version.
|
|
12
|
-
|
|
13
|
-
// This program is distributed in the hope that it will be useful,
|
|
14
|
-
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
15
|
-
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
16
|
-
// GNU General Public License for more details.
|
|
17
|
-
|
|
18
|
-
// You should have received a copy of the GNU General Public License
|
|
19
|
-
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
-
//
|
|
21
|
-
//===----------------------------------------------------------------------===//
|
|
22
|
-
|
|
23
|
-
/*
|
|
24
|
-
* WTO.h
|
|
25
|
-
*
|
|
26
|
-
* The implementation is based on F. Bourdoncle's paper:
|
|
27
|
-
* "Efficient chaotic iteration strategies with widenings", Formal
|
|
28
|
-
* Methods in Programming and Their Applications, 1993, pages 128-141.
|
|
29
|
-
*
|
|
30
|
-
* Created on: Jul 3, 2022
|
|
31
|
-
* Author: Xiao Cheng, Jiawei Wang
|
|
32
|
-
*
|
|
33
|
-
*/
|
|
34
|
-
|
|
35
|
-
#ifndef WTO_H_
|
|
36
|
-
#define WTO_H_
|
|
37
|
-
|
|
38
|
-
#include "SVFIR/SVFType.h"
|
|
39
|
-
#include "SVFIR/SVFValue.h"
|
|
40
|
-
#include "Graphs/CFBasicBlockG.h"
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
namespace SVF
|
|
44
|
-
{
|
|
45
|
-
|
|
46
|
-
class CFBasicBlockGWTO;
|
|
47
|
-
|
|
48
|
-
class CFBasicBlockGWTONode;
|
|
49
|
-
|
|
50
|
-
class CFBasicBlockGWTOCycle;
|
|
51
|
-
|
|
52
|
-
/*!
|
|
53
|
-
* Cycle depth of a WTO Component
|
|
54
|
-
*
|
|
55
|
-
* The cycle depth is represented as **a list of cycle's heads**,
|
|
56
|
-
* **from the outermost to the innermost**.
|
|
57
|
-
*
|
|
58
|
-
* e.g., consider the following nested cycle:
|
|
59
|
-
*
|
|
60
|
-
* -->1 --> 2 --> 3 --> 4
|
|
61
|
-
* \ /
|
|
62
|
-
* <-- 6 <-- 5 <--
|
|
63
|
-
* \ /
|
|
64
|
-
* >7>
|
|
65
|
-
*
|
|
66
|
-
* where C1: (1 2 3 4 5 6 7) is the outer cycle, where 1 is the head,
|
|
67
|
-
* and C2: (5 6 7) is the inner cycle, where 5 is the head.
|
|
68
|
-
*
|
|
69
|
-
* The cycle depth is as following:
|
|
70
|
-
* ---------------------------------
|
|
71
|
-
* | Node NO. | Cycle Depth |
|
|
72
|
-
* --------------------------------
|
|
73
|
-
* | 1 (head of C1) | [ ] |
|
|
74
|
-
* --------------------------------
|
|
75
|
-
* | 2, 3, 4 | [1] |
|
|
76
|
-
* --------------------------------
|
|
77
|
-
* | 5 (head of C2) | [1] |
|
|
78
|
-
* --------------------------------
|
|
79
|
-
* | 6, 7 | [1, 5] |
|
|
80
|
-
* --------------------------------
|
|
81
|
-
*/
|
|
82
|
-
template <typename NodeRef>
|
|
83
|
-
class WTOCycleDepth
|
|
84
|
-
{
|
|
85
|
-
public:
|
|
86
|
-
typedef std::vector<NodeRef> NodeRefList;
|
|
87
|
-
typedef typename NodeRefList::const_iterator Iterator;
|
|
88
|
-
|
|
89
|
-
private:
|
|
90
|
-
NodeRefList _heads;
|
|
91
|
-
|
|
92
|
-
public:
|
|
93
|
-
/// Default Constructor
|
|
94
|
-
WTOCycleDepth() = default;
|
|
95
|
-
|
|
96
|
-
/// Default Copy Constructor
|
|
97
|
-
WTOCycleDepth(const WTOCycleDepth &) = default;
|
|
98
|
-
|
|
99
|
-
/// Default Move Constructor
|
|
100
|
-
WTOCycleDepth(WTOCycleDepth &&) = default;
|
|
101
|
-
|
|
102
|
-
/// Default Copy Operator=
|
|
103
|
-
WTOCycleDepth &operator=(const WTOCycleDepth &) = default;
|
|
104
|
-
|
|
105
|
-
/// Default Move Operator=
|
|
106
|
-
WTOCycleDepth &operator=(WTOCycleDepth &&) = default;
|
|
107
|
-
|
|
108
|
-
/// Default Destructor
|
|
109
|
-
~WTOCycleDepth() = default;
|
|
110
|
-
|
|
111
|
-
/// Add a cycle head to the end of the head list
|
|
112
|
-
void push_back(NodeRef head)
|
|
113
|
-
{
|
|
114
|
-
_heads.push_back(head);
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
Iterator begin() const
|
|
118
|
-
{
|
|
119
|
-
return _heads.cbegin();
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
Iterator end() const
|
|
123
|
-
{
|
|
124
|
-
return _heads.cend();
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
/// Convert the wto-cycle-depth to a string
|
|
128
|
-
std::string toString() const
|
|
129
|
-
{
|
|
130
|
-
std::string str;
|
|
131
|
-
std::stringstream rawstr(str);
|
|
132
|
-
rawstr << "[";
|
|
133
|
-
for (auto it = begin(), et = end(); it != et;)
|
|
134
|
-
{
|
|
135
|
-
rawstr << (*it)->getName().data();
|
|
136
|
-
++it;
|
|
137
|
-
if (it != et)
|
|
138
|
-
{
|
|
139
|
-
rawstr << ", ";
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
rawstr << "]";
|
|
143
|
-
return rawstr.str();
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
private:
|
|
147
|
-
/// Compare the given wto-cycle-depth
|
|
148
|
-
int compare(const WTOCycleDepth &other) const
|
|
149
|
-
{
|
|
150
|
-
if (this == &other)
|
|
151
|
-
{
|
|
152
|
-
return 0; // 0 - equals
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
auto this_it = begin();
|
|
156
|
-
auto other_it = other.begin();
|
|
157
|
-
while (this_it != end())
|
|
158
|
-
{
|
|
159
|
-
if (other_it == other.end())
|
|
160
|
-
{
|
|
161
|
-
return 1; // `this` is inside `other`
|
|
162
|
-
}
|
|
163
|
-
else if (*this_it == *other_it)
|
|
164
|
-
{
|
|
165
|
-
++this_it;
|
|
166
|
-
++other_it;
|
|
167
|
-
}
|
|
168
|
-
else
|
|
169
|
-
{
|
|
170
|
-
return 2; // not comparable
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
if (other_it == other.end())
|
|
174
|
-
{
|
|
175
|
-
return 0; // equals
|
|
176
|
-
}
|
|
177
|
-
else
|
|
178
|
-
{
|
|
179
|
-
return -1; // `other` is inside `this`
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
public:
|
|
184
|
-
|
|
185
|
-
/// Overloading operators
|
|
186
|
-
//@{
|
|
187
|
-
/// Return the common prefix of the given wto-cycle-depth
|
|
188
|
-
WTOCycleDepth operator^(const WTOCycleDepth &other) const
|
|
189
|
-
{
|
|
190
|
-
WTOCycleDepth res;
|
|
191
|
-
for (auto this_it = begin(), other_it = other.begin();
|
|
192
|
-
this_it != end() && other_it != other.end();
|
|
193
|
-
++this_it, ++other_it)
|
|
194
|
-
{
|
|
195
|
-
if (*this_it == *other_it)
|
|
196
|
-
{
|
|
197
|
-
res.push_back(*this_it);
|
|
198
|
-
}
|
|
199
|
-
else
|
|
200
|
-
{
|
|
201
|
-
break;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
return res;
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
/// Less than other's depth - `other` is inside `this`
|
|
208
|
-
bool operator<(const WTOCycleDepth &other) const
|
|
209
|
-
{
|
|
210
|
-
return compare(other) == -1;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/// Less than or Equal with other's depth
|
|
214
|
-
bool operator<=(const WTOCycleDepth &other) const
|
|
215
|
-
{
|
|
216
|
-
return compare(other) <= 0;
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
/// Equal with other's depth
|
|
220
|
-
bool operator==(const WTOCycleDepth &other) const
|
|
221
|
-
{
|
|
222
|
-
return compare(other) == 0;
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
/// Greater than other's depth - `this` is inside `other`
|
|
226
|
-
bool operator>(const WTOCycleDepth &other) const
|
|
227
|
-
{
|
|
228
|
-
return compare(other) == 1;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
/// Greater than or Equal with other's depth
|
|
232
|
-
bool operator>=(const WTOCycleDepth &other) const
|
|
233
|
-
{
|
|
234
|
-
return operator<=(other);
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
/// Dump into CMD
|
|
238
|
-
friend std::ostream &operator<<(std::ostream &o, const WTOCycleDepth &CFBasicBlockGWTO)
|
|
239
|
-
{
|
|
240
|
-
o << CFBasicBlockGWTO.toString();
|
|
241
|
-
return o;
|
|
242
|
-
}
|
|
243
|
-
//@}
|
|
244
|
-
|
|
245
|
-
}; // end class WTOCycleDepth
|
|
246
|
-
|
|
247
|
-
/*!
|
|
248
|
-
* Weak topological order (WTO) visitor
|
|
249
|
-
*/
|
|
250
|
-
class WTOVisitor
|
|
251
|
-
{
|
|
252
|
-
|
|
253
|
-
public:
|
|
254
|
-
/// Default Constructor
|
|
255
|
-
WTOVisitor() = default;
|
|
256
|
-
|
|
257
|
-
/// Default Copy Constructor
|
|
258
|
-
WTOVisitor(const WTOVisitor &) noexcept = default;
|
|
259
|
-
|
|
260
|
-
/// Default Move Constructor
|
|
261
|
-
WTOVisitor(WTOVisitor &&) noexcept = default;
|
|
262
|
-
|
|
263
|
-
/// Default Copy Operator=
|
|
264
|
-
WTOVisitor &operator=(const WTOVisitor &) noexcept = default;
|
|
265
|
-
|
|
266
|
-
/// Default Move Operator=
|
|
267
|
-
WTOVisitor &operator=(WTOVisitor &&) noexcept = default;
|
|
268
|
-
|
|
269
|
-
/// Default Destructor
|
|
270
|
-
virtual ~WTOVisitor() = default;
|
|
271
|
-
|
|
272
|
-
/// Visit WTO Node
|
|
273
|
-
virtual void visit(const CFBasicBlockGWTONode &) = 0;
|
|
274
|
-
|
|
275
|
-
/// Visit WTO Cycle
|
|
276
|
-
virtual void visit(const CFBasicBlockGWTOCycle &) = 0;
|
|
277
|
-
|
|
278
|
-
}; // end class WTOVisitor
|
|
279
|
-
|
|
280
|
-
/*!
|
|
281
|
-
* Base class for a WTO component for CFBasicBlockG
|
|
282
|
-
*
|
|
283
|
-
* A WTO component can be either a node or cycle
|
|
284
|
-
*/
|
|
285
|
-
class CFBasicBlockGWTOComp
|
|
286
|
-
{
|
|
287
|
-
|
|
288
|
-
public:
|
|
289
|
-
enum WtoCT
|
|
290
|
-
{
|
|
291
|
-
Node, Cycle
|
|
292
|
-
};
|
|
293
|
-
|
|
294
|
-
public:
|
|
295
|
-
/// Default Constructor
|
|
296
|
-
CFBasicBlockGWTOComp(WtoCT k) : _type(k) {};
|
|
297
|
-
|
|
298
|
-
/// Copy Constructor
|
|
299
|
-
CFBasicBlockGWTOComp(const CFBasicBlockGWTOComp &) noexcept = default;
|
|
300
|
-
|
|
301
|
-
/// Move Constructor
|
|
302
|
-
CFBasicBlockGWTOComp(CFBasicBlockGWTOComp &&) noexcept = default;
|
|
303
|
-
|
|
304
|
-
/// Copy Operator=
|
|
305
|
-
CFBasicBlockGWTOComp &operator=(const CFBasicBlockGWTOComp &) noexcept = default;
|
|
306
|
-
|
|
307
|
-
/// Move Operator=
|
|
308
|
-
CFBasicBlockGWTOComp &operator=(CFBasicBlockGWTOComp &&) noexcept = default;
|
|
309
|
-
|
|
310
|
-
/// Default Destructor
|
|
311
|
-
virtual ~CFBasicBlockGWTOComp() = default;
|
|
312
|
-
|
|
313
|
-
/// Accept a visitor
|
|
314
|
-
virtual void accept(WTOVisitor *) const = 0;
|
|
315
|
-
|
|
316
|
-
/// Return the WTO Kind (node or cycle)
|
|
317
|
-
inline WtoCT getKind() const
|
|
318
|
-
{
|
|
319
|
-
return _type;
|
|
320
|
-
}
|
|
321
|
-
|
|
322
|
-
virtual std::string toString() const = 0;
|
|
323
|
-
|
|
324
|
-
friend std::ostream &operator<<(std::ostream &o, const CFBasicBlockGWTOComp &CFBasicBlockGWTO)
|
|
325
|
-
{
|
|
326
|
-
o << CFBasicBlockGWTO.toString();
|
|
327
|
-
return o;
|
|
328
|
-
}
|
|
329
|
-
|
|
330
|
-
private:
|
|
331
|
-
|
|
332
|
-
WtoCT _type;
|
|
333
|
-
|
|
334
|
-
}; // end class CFBasicBlockGWTOComp
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
/*!
|
|
338
|
-
* WTO node for CFBasicBlockG
|
|
339
|
-
*/
|
|
340
|
-
class CFBasicBlockGWTONode final : public CFBasicBlockGWTOComp
|
|
341
|
-
{
|
|
342
|
-
private:
|
|
343
|
-
const CFBasicBlockNode *_node;
|
|
344
|
-
|
|
345
|
-
public:
|
|
346
|
-
/// Constructor
|
|
347
|
-
explicit CFBasicBlockGWTONode(const CFBasicBlockNode *node) : CFBasicBlockGWTOComp(CFBasicBlockGWTOComp::Node), _node(node) {}
|
|
348
|
-
|
|
349
|
-
/// Return the graph node
|
|
350
|
-
const CFBasicBlockNode *node() const
|
|
351
|
-
{
|
|
352
|
-
return _node;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
/// Accept a visitor
|
|
356
|
-
void accept(WTOVisitor *v) const override
|
|
357
|
-
{
|
|
358
|
-
v->visit(*this);
|
|
359
|
-
}
|
|
360
|
-
|
|
361
|
-
/// Convert the node to string
|
|
362
|
-
std::string toString() const override
|
|
363
|
-
{
|
|
364
|
-
return std::string(_node->getName().data());
|
|
365
|
-
}
|
|
366
|
-
|
|
367
|
-
/// ClassOf
|
|
368
|
-
//@{
|
|
369
|
-
static inline bool classof(const CFBasicBlockGWTONode *)
|
|
370
|
-
{
|
|
371
|
-
return true;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
static inline bool classof(const CFBasicBlockGWTOComp *c)
|
|
375
|
-
{
|
|
376
|
-
return c->getKind() == CFBasicBlockGWTOComp::Node;
|
|
377
|
-
}
|
|
378
|
-
///@}
|
|
379
|
-
|
|
380
|
-
}; // end class CFBasicBlockGWTONode
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
/*!
|
|
384
|
-
* WTO cycle for CFBasicBlockG
|
|
385
|
-
*/
|
|
386
|
-
class CFBasicBlockGWTOCycle final : public CFBasicBlockGWTOComp
|
|
387
|
-
{
|
|
388
|
-
private:
|
|
389
|
-
typedef std::list<const CFBasicBlockGWTOComp *> WtoComponentRefList;
|
|
390
|
-
typedef WtoComponentRefList::const_iterator Iterator;
|
|
391
|
-
|
|
392
|
-
private:
|
|
393
|
-
/// Head of the cycle
|
|
394
|
-
const CFBasicBlockNode *_head;
|
|
395
|
-
|
|
396
|
-
/// List of components
|
|
397
|
-
WtoComponentRefList _components;
|
|
398
|
-
|
|
399
|
-
public:
|
|
400
|
-
/// Constructor
|
|
401
|
-
CFBasicBlockGWTOCycle(const CFBasicBlockNode *head, WtoComponentRefList components)
|
|
402
|
-
: CFBasicBlockGWTOComp(CFBasicBlockGWTOComp::Cycle), _head(head), _components(std::move(components)) {}
|
|
403
|
-
|
|
404
|
-
/// Return the head of the cycle
|
|
405
|
-
const CFBasicBlockNode *head() const
|
|
406
|
-
{
|
|
407
|
-
return _head;
|
|
408
|
-
}
|
|
409
|
-
|
|
410
|
-
Iterator begin() const
|
|
411
|
-
{
|
|
412
|
-
return _components.cbegin();
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
Iterator end() const
|
|
416
|
-
{
|
|
417
|
-
return _components.cend();
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
/// Accept a visitor
|
|
421
|
-
void accept(WTOVisitor *v) const override
|
|
422
|
-
{
|
|
423
|
-
v->visit(*this);
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
/// ClassOf
|
|
427
|
-
//@{
|
|
428
|
-
static inline bool classof(const CFBasicBlockGWTOCycle *)
|
|
429
|
-
{
|
|
430
|
-
return true;
|
|
431
|
-
}
|
|
432
|
-
|
|
433
|
-
static inline bool classof(const CFBasicBlockGWTOComp *c)
|
|
434
|
-
{
|
|
435
|
-
return c->getKind() == CFBasicBlockGWTOComp::Cycle;
|
|
436
|
-
}
|
|
437
|
-
///@}
|
|
438
|
-
|
|
439
|
-
std::string toString() const override
|
|
440
|
-
{
|
|
441
|
-
std::string str;
|
|
442
|
-
std::stringstream rawstr(str);
|
|
443
|
-
rawstr << "(";
|
|
444
|
-
rawstr << _head->getName().data() << ", ";
|
|
445
|
-
for (auto it = begin(), et = end(); it != et;)
|
|
446
|
-
{
|
|
447
|
-
rawstr << (*it)->toString();
|
|
448
|
-
++it;
|
|
449
|
-
if (it != et)
|
|
450
|
-
{
|
|
451
|
-
rawstr << ", ";
|
|
452
|
-
}
|
|
453
|
-
}
|
|
454
|
-
rawstr << ")";
|
|
455
|
-
return rawstr.str();
|
|
456
|
-
}
|
|
457
|
-
|
|
458
|
-
}; // end class CFBasicBlockGWTOCycle
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
/*!
|
|
462
|
-
* Weak topological order for CFBasicBlockG
|
|
463
|
-
*/
|
|
464
|
-
class CFBasicBlockGWTO
|
|
465
|
-
{
|
|
466
|
-
|
|
467
|
-
public:
|
|
468
|
-
typedef WTOCycleDepth<const CFBasicBlockNode*> CFBasicBlockGWTOCycleDepth;
|
|
469
|
-
typedef Set<const CFBasicBlockNode *> NodeRefSet;
|
|
470
|
-
|
|
471
|
-
protected:
|
|
472
|
-
typedef std::list<const CFBasicBlockGWTOComp *> WTOCompRefList;
|
|
473
|
-
typedef Set <const CFBasicBlockGWTOComp *> WTOCompRefSet;
|
|
474
|
-
typedef Map<const CFBasicBlockNode *, const CFBasicBlockGWTOCycle *> NodeRefToWTOCycleMap;
|
|
475
|
-
typedef Map<const CFBasicBlockNode *, NodeRefSet> NodeRefToNodeRefSetMap;
|
|
476
|
-
|
|
477
|
-
typedef u32_t CycleDepthNumber;
|
|
478
|
-
typedef Map<const CFBasicBlockNode *, CycleDepthNumber> NodeRefToCycleDepthNumber;
|
|
479
|
-
typedef std::vector<const CFBasicBlockNode *> CFBasicBlockNodes;
|
|
480
|
-
typedef std::shared_ptr<CFBasicBlockGWTOCycleDepth> CFBasicBlockGWTOCycleDepthPtr;
|
|
481
|
-
typedef Map<const CFBasicBlockNode *, CFBasicBlockGWTOCycleDepthPtr> NodeRefToWTOCycleDepthPtr;
|
|
482
|
-
|
|
483
|
-
public:
|
|
484
|
-
typedef typename WTOCompRefList::const_iterator Iterator;
|
|
485
|
-
|
|
486
|
-
protected:
|
|
487
|
-
WTOCompRefList _components;
|
|
488
|
-
WTOCompRefSet _allComponents;
|
|
489
|
-
NodeRefToWTOCycleMap _headToCycle;
|
|
490
|
-
NodeRefToNodeRefSetMap _headToTails;
|
|
491
|
-
NodeRefToWTOCycleDepthPtr _nodeToDepth;
|
|
492
|
-
NodeRefToCycleDepthNumber _nodeToCDN;
|
|
493
|
-
CycleDepthNumber _num;
|
|
494
|
-
CFBasicBlockNodes _stack;
|
|
495
|
-
CFBasicBlockGraph* _graph;
|
|
496
|
-
|
|
497
|
-
public:
|
|
498
|
-
explicit CFBasicBlockGWTO() : _num(0) {}
|
|
499
|
-
|
|
500
|
-
explicit CFBasicBlockGWTO(CFBasicBlockGraph* graph, const CFBasicBlockNode *entry) : _num(0), _graph(graph)
|
|
501
|
-
{
|
|
502
|
-
build(entry);
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
CFBasicBlockGWTO(const CFBasicBlockGWTO &other) = default;
|
|
506
|
-
|
|
507
|
-
CFBasicBlockGWTO(CFBasicBlockGWTO &&other) = default;
|
|
508
|
-
|
|
509
|
-
CFBasicBlockGWTO &operator=(const CFBasicBlockGWTO &other) = default;
|
|
510
|
-
|
|
511
|
-
CFBasicBlockGWTO &operator=(CFBasicBlockGWTO &&other) = default;
|
|
512
|
-
|
|
513
|
-
~CFBasicBlockGWTO()
|
|
514
|
-
{
|
|
515
|
-
for (const auto &component: _allComponents)
|
|
516
|
-
{
|
|
517
|
-
delete component;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
|
|
521
|
-
Iterator begin() const
|
|
522
|
-
{
|
|
523
|
-
return _components.cbegin();
|
|
524
|
-
}
|
|
525
|
-
|
|
526
|
-
Iterator end() const
|
|
527
|
-
{
|
|
528
|
-
return _components.cend();
|
|
529
|
-
}
|
|
530
|
-
|
|
531
|
-
bool isHead(const CFBasicBlockNode *node) const
|
|
532
|
-
{
|
|
533
|
-
return _headToCycle.find(node) != _headToCycle.end();
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
typename NodeRefToWTOCycleMap::const_iterator headBegin() const
|
|
537
|
-
{
|
|
538
|
-
return _headToCycle.cbegin();
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
typename NodeRefToWTOCycleMap::const_iterator headEnd() const
|
|
542
|
-
{
|
|
543
|
-
return _headToCycle.cend();
|
|
544
|
-
}
|
|
545
|
-
|
|
546
|
-
const NodeRefSet &getTails(const CFBasicBlockNode *node) const
|
|
547
|
-
{
|
|
548
|
-
auto it = _headToTails.find(node);
|
|
549
|
-
assert(it != _headToTails.end() && "node not found");
|
|
550
|
-
return it->second;
|
|
551
|
-
}
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
/// Get the wto-cycle-depth of the given node
|
|
555
|
-
const CFBasicBlockGWTOCycleDepth &getWTOCycleDepth(const CFBasicBlockNode *n) const
|
|
556
|
-
{
|
|
557
|
-
auto it = _nodeToDepth.find(n);
|
|
558
|
-
assert(it != _nodeToDepth.end() && "node not found");
|
|
559
|
-
return *(it->second);
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
/// Whether the given node is in the node to cycle getCDN
|
|
563
|
-
inline bool inNodeToCycleDepth(const CFBasicBlockNode *n) const
|
|
564
|
-
{
|
|
565
|
-
auto it = _nodeToDepth.find(n);
|
|
566
|
-
return it != _nodeToDepth.end();
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
/// Accept the given visitor
|
|
570
|
-
void accept(WTOVisitor* v)
|
|
571
|
-
{
|
|
572
|
-
for (const auto &c: _components)
|
|
573
|
-
{
|
|
574
|
-
c->accept(v);
|
|
575
|
-
}
|
|
576
|
-
}
|
|
577
|
-
|
|
578
|
-
std::string toString() const
|
|
579
|
-
{
|
|
580
|
-
std::string str;
|
|
581
|
-
std::stringstream rawstr(str);
|
|
582
|
-
rawstr << "[";
|
|
583
|
-
for (auto it = begin(), et = end(); it != et;)
|
|
584
|
-
{
|
|
585
|
-
rawstr << (*it)->toString();
|
|
586
|
-
++it;
|
|
587
|
-
if (it != et)
|
|
588
|
-
{
|
|
589
|
-
rawstr << ", ";
|
|
590
|
-
}
|
|
591
|
-
}
|
|
592
|
-
rawstr << "]";
|
|
593
|
-
return rawstr.str();
|
|
594
|
-
}
|
|
595
|
-
|
|
596
|
-
friend std::ostream &operator<<(std::ostream &o, const CFBasicBlockGWTO &CFBasicBlockGWTO)
|
|
597
|
-
{
|
|
598
|
-
o << CFBasicBlockGWTO.toString();
|
|
599
|
-
return o;
|
|
600
|
-
}
|
|
601
|
-
|
|
602
|
-
protected:
|
|
603
|
-
|
|
604
|
-
inline void build(const CFBasicBlockNode *entry)
|
|
605
|
-
{
|
|
606
|
-
visit(entry, _components);
|
|
607
|
-
_nodeToCDN.clear();
|
|
608
|
-
_stack.clear();
|
|
609
|
-
buildNodeToWTOCycleDepth();
|
|
610
|
-
build_tails();
|
|
611
|
-
}
|
|
612
|
-
|
|
613
|
-
/// Visitor to build the WTO cycle getCDN of each node
|
|
614
|
-
class WTOCycleDepthBuilder final
|
|
615
|
-
: public WTOVisitor
|
|
616
|
-
{
|
|
617
|
-
private:
|
|
618
|
-
CFBasicBlockGWTOCycleDepthPtr _wtoCycleDepth;
|
|
619
|
-
NodeRefToWTOCycleDepthPtr &_nodeToWTOCycleDepth;
|
|
620
|
-
|
|
621
|
-
public:
|
|
622
|
-
explicit WTOCycleDepthBuilder(NodeRefToWTOCycleDepthPtr &nodeToWTOCycleDepth)
|
|
623
|
-
: _wtoCycleDepth(std::make_shared<CFBasicBlockGWTOCycleDepth>()),
|
|
624
|
-
_nodeToWTOCycleDepth(nodeToWTOCycleDepth) {}
|
|
625
|
-
|
|
626
|
-
void visit(const CFBasicBlockGWTOCycle &cycle) override
|
|
627
|
-
{
|
|
628
|
-
const CFBasicBlockNode *head = cycle.head();
|
|
629
|
-
CFBasicBlockGWTOCycleDepthPtr previous_nesting = _wtoCycleDepth;
|
|
630
|
-
_nodeToWTOCycleDepth.insert(std::make_pair(head, _wtoCycleDepth));
|
|
631
|
-
_wtoCycleDepth = std::make_shared<CFBasicBlockGWTOCycleDepth>(*_wtoCycleDepth);
|
|
632
|
-
_wtoCycleDepth->push_back(head);
|
|
633
|
-
for (auto it = cycle.begin(), et = cycle.end(); it != et; ++it)
|
|
634
|
-
{
|
|
635
|
-
(*it)->accept(this);
|
|
636
|
-
}
|
|
637
|
-
_wtoCycleDepth = previous_nesting;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
void visit(const CFBasicBlockGWTONode &node) override
|
|
641
|
-
{
|
|
642
|
-
_nodeToWTOCycleDepth.insert(
|
|
643
|
-
std::make_pair(node.node(), _wtoCycleDepth));
|
|
644
|
-
}
|
|
645
|
-
|
|
646
|
-
}; // end class WTOCycleDepthBuilder
|
|
647
|
-
|
|
648
|
-
/// Visitor to build the tails of each head/loop
|
|
649
|
-
class TailBuilder : public WTOVisitor
|
|
650
|
-
{
|
|
651
|
-
protected:
|
|
652
|
-
NodeRefSet &_tails;
|
|
653
|
-
const CFBasicBlockGWTOCycleDepth &_headWTOCycleDepth;
|
|
654
|
-
const CFBasicBlockNode *_head;
|
|
655
|
-
NodeRefToWTOCycleDepthPtr &_nodeToWTOCycleDepth;
|
|
656
|
-
CFBasicBlockGraph* _graph;
|
|
657
|
-
|
|
658
|
-
public:
|
|
659
|
-
|
|
660
|
-
explicit TailBuilder(CFBasicBlockGraph* graph, NodeRefToWTOCycleDepthPtr &nodeToWTOCycleDepth, NodeRefSet &tails, const CFBasicBlockNode *head,
|
|
661
|
-
const CFBasicBlockGWTOCycleDepth &headWTOCycleDepth) : _tails(tails), _headWTOCycleDepth(headWTOCycleDepth), _head(head), _nodeToWTOCycleDepth(
|
|
662
|
-
nodeToWTOCycleDepth), _graph(graph)
|
|
663
|
-
{
|
|
664
|
-
}
|
|
665
|
-
|
|
666
|
-
void visit(const CFBasicBlockGWTOCycle &cycle) override
|
|
667
|
-
{
|
|
668
|
-
for (auto it = cycle.begin(), et = cycle.end(); it != et; ++it)
|
|
669
|
-
{
|
|
670
|
-
(*it)->accept(this);
|
|
671
|
-
}
|
|
672
|
-
}
|
|
673
|
-
|
|
674
|
-
virtual void visit(const CFBasicBlockGWTONode &node) override
|
|
675
|
-
{
|
|
676
|
-
if(const CallICFGNode* callNode = SVFUtil::dyn_cast<CallICFGNode>(node.node()->getICFGNodes().front()))
|
|
677
|
-
{
|
|
678
|
-
const CFBasicBlockNode *succ = _graph->getCFBasicBlockNode(callNode->getRetICFGNode()->getId());
|
|
679
|
-
const CFBasicBlockGWTOCycleDepth &succNesting = getWTOCycleDepth(succ);
|
|
680
|
-
if (succ != _head && succNesting <= _headWTOCycleDepth)
|
|
681
|
-
{
|
|
682
|
-
_tails.insert(node.node());
|
|
683
|
-
}
|
|
684
|
-
}
|
|
685
|
-
else
|
|
686
|
-
{
|
|
687
|
-
for (const auto &edge: node.node()->getOutEdges())
|
|
688
|
-
{
|
|
689
|
-
if(edge->getICFGEdge() && !edge->getICFGEdge()->isIntraCFGEdge()) continue;
|
|
690
|
-
const CFBasicBlockNode *succ = edge->getDstNode();
|
|
691
|
-
const CFBasicBlockGWTOCycleDepth &succNesting = getWTOCycleDepth(succ);
|
|
692
|
-
if (succ != _head && succNesting <= _headWTOCycleDepth)
|
|
693
|
-
{
|
|
694
|
-
_tails.insert(node.node());
|
|
695
|
-
}
|
|
696
|
-
}
|
|
697
|
-
}
|
|
698
|
-
}
|
|
699
|
-
|
|
700
|
-
protected:
|
|
701
|
-
/// Get the wto-cycle-depth of the given node
|
|
702
|
-
const CFBasicBlockGWTOCycleDepth &getWTOCycleDepth(const CFBasicBlockNode *n) const
|
|
703
|
-
{
|
|
704
|
-
auto it = _nodeToWTOCycleDepth.find(n);
|
|
705
|
-
assert(it != _nodeToWTOCycleDepth.end() && "node not found");
|
|
706
|
-
return *(it->second);
|
|
707
|
-
}
|
|
708
|
-
|
|
709
|
-
};
|
|
710
|
-
|
|
711
|
-
protected:
|
|
712
|
-
/// Get the cycle depth number of the given node
|
|
713
|
-
CycleDepthNumber getCDN(const CFBasicBlockNode *n) const
|
|
714
|
-
{
|
|
715
|
-
auto it = _nodeToCDN.find(n);
|
|
716
|
-
if (it != _nodeToCDN.end())
|
|
717
|
-
{
|
|
718
|
-
return it->second;
|
|
719
|
-
}
|
|
720
|
-
else
|
|
721
|
-
{
|
|
722
|
-
return 0;
|
|
723
|
-
}
|
|
724
|
-
}
|
|
725
|
-
|
|
726
|
-
/// Set the cycle depth number of the given node
|
|
727
|
-
void setCDN(const CFBasicBlockNode *n, const CycleDepthNumber &Depth)
|
|
728
|
-
{
|
|
729
|
-
auto res = _nodeToCDN.insert(std::make_pair(n, Depth));
|
|
730
|
-
if (!res.second)
|
|
731
|
-
{
|
|
732
|
-
(res.first)->second = Depth;
|
|
733
|
-
}
|
|
734
|
-
}
|
|
735
|
-
|
|
736
|
-
/// Pop a node from the stack
|
|
737
|
-
const CFBasicBlockNode *pop()
|
|
738
|
-
{
|
|
739
|
-
assert(!_stack.empty() && "empty stack");
|
|
740
|
-
const CFBasicBlockNode *top = _stack.back();
|
|
741
|
-
_stack.pop_back();
|
|
742
|
-
return top;
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
/// Push a node on the stack
|
|
746
|
-
void push(const CFBasicBlockNode *n)
|
|
747
|
-
{
|
|
748
|
-
_stack.push_back(n);
|
|
749
|
-
}
|
|
750
|
-
|
|
751
|
-
const CFBasicBlockGWTONode *newNode(const CFBasicBlockNode *node)
|
|
752
|
-
{
|
|
753
|
-
const CFBasicBlockGWTONode *ptr = new CFBasicBlockGWTONode(node);
|
|
754
|
-
_allComponents.insert(ptr);
|
|
755
|
-
return ptr;
|
|
756
|
-
}
|
|
757
|
-
|
|
758
|
-
const CFBasicBlockGWTOCycle *newCycle(const CFBasicBlockNode *node, const WTOCompRefList &partition)
|
|
759
|
-
{
|
|
760
|
-
const CFBasicBlockGWTOCycle *ptr = new CFBasicBlockGWTOCycle(node, std::move(partition));
|
|
761
|
-
_allComponents.insert(ptr);
|
|
762
|
-
return ptr;
|
|
763
|
-
}
|
|
764
|
-
|
|
765
|
-
/// Create the cycle component for the given node
|
|
766
|
-
const CFBasicBlockGWTOCycle *component(const CFBasicBlockNode *node)
|
|
767
|
-
{
|
|
768
|
-
WTOCompRefList partition;
|
|
769
|
-
if (const CallICFGNode* callNode = SVFUtil::dyn_cast<CallICFGNode>(node->getICFGNodes().front()))
|
|
770
|
-
{
|
|
771
|
-
const CFBasicBlockNode *succ = _graph->getCFBasicBlockNode(callNode->getRetICFGNode()->getId());
|
|
772
|
-
if (getCDN(succ) == 0)
|
|
773
|
-
{
|
|
774
|
-
visit(succ, partition);
|
|
775
|
-
}
|
|
776
|
-
}
|
|
777
|
-
else
|
|
778
|
-
{
|
|
779
|
-
for (auto it = node->getOutEdges().begin(), et = node->getOutEdges().end(); it != et; ++it)
|
|
780
|
-
{
|
|
781
|
-
if((*it)->getICFGEdge() && !(*it)->getICFGEdge()->isIntraCFGEdge()) continue;
|
|
782
|
-
const CFBasicBlockNode *succ = (*it)->getDstNode();
|
|
783
|
-
if (getCDN(succ) == 0)
|
|
784
|
-
{
|
|
785
|
-
visit(succ, partition);
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
const CFBasicBlockGWTOCycle *ptr = newCycle(node, partition);
|
|
790
|
-
_headToCycle.emplace(node, ptr);
|
|
791
|
-
return ptr;
|
|
792
|
-
}
|
|
793
|
-
|
|
794
|
-
/// Main algorithm to build WTO
|
|
795
|
-
virtual CycleDepthNumber visit(const CFBasicBlockNode *node, WTOCompRefList &partition)
|
|
796
|
-
{
|
|
797
|
-
CycleDepthNumber head(0);
|
|
798
|
-
CycleDepthNumber min(0);
|
|
799
|
-
bool loop;
|
|
800
|
-
|
|
801
|
-
push(node);
|
|
802
|
-
_num += CycleDepthNumber(1);
|
|
803
|
-
head = _num;
|
|
804
|
-
setCDN(node, head);
|
|
805
|
-
loop = false;
|
|
806
|
-
if (const CallICFGNode* callNode = SVFUtil::dyn_cast<CallICFGNode>(node->getICFGNodes().front()))
|
|
807
|
-
{
|
|
808
|
-
const CFBasicBlockNode *succ = _graph->getCFBasicBlockNode(callNode->getRetICFGNode()->getId());
|
|
809
|
-
CycleDepthNumber succ_dfn = getCDN(succ);
|
|
810
|
-
if (succ_dfn == CycleDepthNumber(0))
|
|
811
|
-
{
|
|
812
|
-
min = visit(succ, partition);
|
|
813
|
-
}
|
|
814
|
-
else
|
|
815
|
-
{
|
|
816
|
-
min = succ_dfn;
|
|
817
|
-
}
|
|
818
|
-
if (min <= head)
|
|
819
|
-
{
|
|
820
|
-
head = min;
|
|
821
|
-
loop = true;
|
|
822
|
-
}
|
|
823
|
-
}
|
|
824
|
-
else
|
|
825
|
-
{
|
|
826
|
-
for (auto it = node->getOutEdges().begin(), et = node->getOutEdges().end(); it != et; ++it)
|
|
827
|
-
{
|
|
828
|
-
if((*it)->getICFGEdge() && !(*it)->getICFGEdge()->isIntraCFGEdge()) continue;
|
|
829
|
-
const CFBasicBlockNode *succ = (*it)->getDstNode();
|
|
830
|
-
if (succ->getFunction() != node->getFunction())
|
|
831
|
-
continue;
|
|
832
|
-
CycleDepthNumber succ_dfn = getCDN(succ);
|
|
833
|
-
if (succ_dfn == CycleDepthNumber(0))
|
|
834
|
-
{
|
|
835
|
-
min = visit(succ, partition);
|
|
836
|
-
}
|
|
837
|
-
else
|
|
838
|
-
{
|
|
839
|
-
min = succ_dfn;
|
|
840
|
-
}
|
|
841
|
-
if (min <= head)
|
|
842
|
-
{
|
|
843
|
-
head = min;
|
|
844
|
-
loop = true;
|
|
845
|
-
}
|
|
846
|
-
}
|
|
847
|
-
}
|
|
848
|
-
if (head == getCDN(node))
|
|
849
|
-
{
|
|
850
|
-
setCDN(node, UINT_MAX);
|
|
851
|
-
const CFBasicBlockNode *element = pop();
|
|
852
|
-
if (loop)
|
|
853
|
-
{
|
|
854
|
-
while (element != node)
|
|
855
|
-
{
|
|
856
|
-
setCDN(element, 0);
|
|
857
|
-
element = pop();
|
|
858
|
-
}
|
|
859
|
-
partition.push_front(component(node));
|
|
860
|
-
}
|
|
861
|
-
else
|
|
862
|
-
{
|
|
863
|
-
partition.push_front(newNode(node));
|
|
864
|
-
}
|
|
865
|
-
}
|
|
866
|
-
return head;
|
|
867
|
-
}
|
|
868
|
-
|
|
869
|
-
/// Build the node to WTO cycle depth table
|
|
870
|
-
void buildNodeToWTOCycleDepth()
|
|
871
|
-
{
|
|
872
|
-
WTOCycleDepthBuilder builder(_nodeToDepth);
|
|
873
|
-
for (auto it = begin(), et = end(); it != et; ++it)
|
|
874
|
-
{
|
|
875
|
-
(*it)->accept(&builder);
|
|
876
|
-
}
|
|
877
|
-
}
|
|
878
|
-
|
|
879
|
-
/// Build the tails for each cycle
|
|
880
|
-
virtual void build_tails()
|
|
881
|
-
{
|
|
882
|
-
for (const auto &head: _headToCycle)
|
|
883
|
-
{
|
|
884
|
-
NodeRefSet tails;
|
|
885
|
-
TailBuilder builder(_graph, _nodeToDepth, tails, head.first, getWTOCycleDepth(head.first));
|
|
886
|
-
for (auto it = head.second->begin(), eit = head.second->end(); it != eit; ++it)
|
|
887
|
-
{
|
|
888
|
-
(*it)->accept(&builder);
|
|
889
|
-
}
|
|
890
|
-
_headToTails.emplace(head.first, tails);
|
|
891
|
-
}
|
|
892
|
-
}
|
|
893
|
-
|
|
894
|
-
}; // end class CFBasicBlockGWTO
|
|
895
|
-
|
|
896
|
-
} // end namespace SVF
|
|
897
|
-
#endif /* WTO_H_ */
|