svf-lib 1.0.2319 → 1.0.2321
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-linux-aarch64/Release-build/include/{Util → SVF/Util}/WorkList.h +0 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/Modules/FindZ3.cmake +93 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFConfig.cmake +106 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFConfigVersion.cmake +43 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFTargets-release.cmake +101 -0
- package/SVF-linux-aarch64/Release-build/lib/cmake/SVF/SVFTargets.cmake +180 -0
- package/SVF-linux-aarch64/Release-build/lib/libSvfCore.so.3.1 +0 -0
- package/SVF-linux-aarch64/Release-build/lib/libSvfLLVM.so.3.1 +0 -0
- package/SVF-linux-aarch64/Release-build/lib/pkgconfig/SVF.pc +12 -0
- package/SVF-osx/Release-build/bin/ae +0 -0
- package/SVF-osx/Release-build/bin/cfl +0 -0
- package/SVF-osx/Release-build/bin/dvf +0 -0
- package/SVF-osx/Release-build/bin/llvm2svf +0 -0
- package/SVF-osx/Release-build/bin/mta +0 -0
- package/SVF-osx/Release-build/bin/saber +0 -0
- package/SVF-osx/Release-build/bin/svf-ex +0 -0
- package/SVF-osx/Release-build/bin/wpa +0 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/AbstractState.h +425 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/AbstractValue.h +157 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/AddressValue.h +225 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/ICFGWTO.h +135 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/IntervalValue.h +1055 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/NumericValue.h +1292 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/RelExeState.h +226 -0
- package/SVF-osx/Release-build/include/SVF/AE/Core/RelationSolver.h +91 -0
- package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AEDetector.h +439 -0
- package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AbsExtAPI.h +138 -0
- package/SVF-osx/Release-build/include/SVF/AE/Svfexe/AbstractInterpretation.h +384 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFGNormalizer.h +84 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFGrammar.h +468 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLAlias.h +168 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLBase.h +118 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLGramGraphChecker.h +74 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLGraphBuilder.h +168 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLSVFGBuilder.h +58 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLSolver.h +374 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLStat.h +67 -0
- package/SVF-osx/Release-build/include/SVF/CFL/CFLVF.h +68 -0
- package/SVF-osx/Release-build/include/SVF/CFL/GrammarBuilder.h +100 -0
- package/SVF-osx/Release-build/include/SVF/DDA/ContextDDA.h +230 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAClient.h +163 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAPass.h +102 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAStat.h +121 -0
- package/SVF-osx/Release-build/include/SVF/DDA/DDAVFSolver.h +794 -0
- package/SVF-osx/Release-build/include/SVF/DDA/FlowDDA.h +178 -0
- package/SVF-osx/Release-build/include/SVF/FastCluster/fastcluster.h +80 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/BasicBlockG.h +318 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CDG.h +482 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CFLGraph.h +232 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CHG.h +368 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/CallGraph.h +497 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ConsG.h +402 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ConsGEdge.h +355 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ConsGNode.h +418 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/DOTGraphTraits.h +188 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GenericGraph.h +628 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GraphPrinter.h +111 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GraphTraits.h +150 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/GraphWriter.h +380 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFG.h +331 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFGEdge.h +281 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFGNode.h +669 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ICFGStat.h +164 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/IRGraph.h +398 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SCC.h +375 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFG.h +491 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGEdge.h +237 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGNode.h +501 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGOPT.h +372 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/SVFGStat.h +273 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/ThreadCallGraph.h +399 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/VFG.h +726 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/VFGEdge.h +295 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/VFGNode.h +1266 -0
- package/SVF-osx/Release-build/include/SVF/Graphs/WTO.h +872 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MSSAMuChi.h +722 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MemPartition.h +169 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MemRegion.h +489 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/MemSSA.h +452 -0
- package/SVF-osx/Release-build/include/SVF/MSSA/SVFGBuilder.h +104 -0
- package/SVF-osx/Release-build/include/SVF/MTA/LockAnalysis.h +533 -0
- package/SVF-osx/Release-build/include/SVF/MTA/MHP.h +546 -0
- package/SVF-osx/Release-build/include/SVF/MTA/MTA.h +97 -0
- package/SVF-osx/Release-build/include/SVF/MTA/MTAStat.h +73 -0
- package/SVF-osx/Release-build/include/SVF/MTA/TCT.h +620 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/AbstractPointsToDS.h +316 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/AccessPath.h +194 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/ConditionalPT.h +878 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/MutablePointsToDS.h +1025 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PersistentPointsToCache.h +463 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PersistentPointsToDS.h +955 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PointerAnalysis.h +428 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PointerAnalysisImpl.h +602 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/PointsTo.h +255 -0
- package/SVF-osx/Release-build/include/SVF/MemoryModel/SVFLoop.h +167 -0
- package/SVF-osx/Release-build/include/SVF/SABER/DoubleFreeChecker.h +76 -0
- package/SVF-osx/Release-build/include/SVF/SABER/FileChecker.h +80 -0
- package/SVF-osx/Release-build/include/SVF/SABER/LeakChecker.h +122 -0
- package/SVF-osx/Release-build/include/SVF/SABER/ProgSlice.h +327 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SaberCheckerAPI.h +151 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SaberCondAllocator.h +317 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SaberSVFGBuilder.h +114 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SrcSnkDDA.h +327 -0
- package/SVF-osx/Release-build/include/SVF/SABER/SrcSnkSolver.h +186 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/BasicTypes.h +280 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/BreakConstantExpr.h +93 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/CHGBuilder.h +78 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/CppUtil.h +184 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/DCHG.h +474 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/GEPTypeBridgeIterator.h +183 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/ICFGBuilder.h +160 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMLoopAnalysis.h +60 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMModule.h +527 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/LLVMUtil.h +433 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/ObjTypeInference.h +129 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/SVFIRBuilder.h +523 -0
- package/SVF-osx/Release-build/include/SVF/SVF-LLVM/SymbolTableBuilder.h +132 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/ObjTypeInfo.h +224 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/PAGBuilderFromFile.h +80 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFIR.h +856 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFStatements.h +1330 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFType.h +606 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFValue.h +338 -0
- package/SVF-osx/Release-build/include/SVF/SVFIR/SVFVariables.h +2212 -0
- package/SVF-osx/Release-build/include/SVF/Util/Annotator.h +180 -0
- package/SVF-osx/Release-build/include/SVF/Util/BitVector.h +55 -0
- package/SVF-osx/Release-build/include/SVF/Util/CDGBuilder.h +107 -0
- package/SVF-osx/Release-build/include/SVF/Util/CallGraphBuilder.h +61 -0
- package/SVF-osx/Release-build/include/SVF/Util/Casting.h +426 -0
- package/SVF-osx/Release-build/include/SVF/Util/CommandLine.h +530 -0
- package/SVF-osx/Release-build/include/SVF/Util/CoreBitVector.h +214 -0
- package/SVF-osx/Release-build/include/SVF/Util/CxtStmt.h +502 -0
- package/SVF-osx/Release-build/include/SVF/Util/DPItem.h +618 -0
- package/SVF-osx/Release-build/include/SVF/Util/ExtAPI.h +117 -0
- package/SVF-osx/Release-build/include/SVF/Util/GeneralType.h +127 -0
- package/SVF-osx/Release-build/include/SVF/Util/GraphReachSolver.h +186 -0
- package/SVF-osx/Release-build/include/SVF/Util/NodeIDAllocator.h +203 -0
- package/SVF-osx/Release-build/include/SVF/Util/Options.h +273 -0
- package/SVF-osx/Release-build/include/SVF/Util/PTAStat.h +83 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFBugReport.h +427 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFLoopAndDomInfo.h +169 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFStat.h +103 -0
- package/SVF-osx/Release-build/include/SVF/Util/SVFUtil.h +478 -0
- package/SVF-osx/Release-build/include/SVF/Util/SparseBitVector.h +1252 -0
- package/SVF-osx/Release-build/include/SVF/Util/ThreadAPI.h +188 -0
- package/SVF-osx/Release-build/include/SVF/Util/WorkList.h +317 -0
- package/SVF-osx/Release-build/include/SVF/Util/Z3Expr.h +325 -0
- package/SVF-osx/Release-build/include/SVF/Util/cJSON.h +300 -0
- package/SVF-osx/Release-build/include/SVF/Util/config.h +46 -0
- package/SVF-osx/Release-build/include/SVF/Util/iterator.h +407 -0
- package/SVF-osx/Release-build/include/SVF/Util/iterator_range.h +76 -0
- package/SVF-osx/Release-build/include/SVF/WPA/Andersen.h +434 -0
- package/SVF-osx/Release-build/include/SVF/WPA/AndersenPWC.h +160 -0
- package/SVF-osx/Release-build/include/SVF/WPA/CSC.h +95 -0
- package/SVF-osx/Release-build/include/SVF/WPA/FlowSensitive.h +322 -0
- package/SVF-osx/Release-build/include/SVF/WPA/Steensgaard.h +131 -0
- package/SVF-osx/Release-build/include/SVF/WPA/TypeAnalysis.h +90 -0
- package/SVF-osx/Release-build/include/SVF/WPA/VersionedFlowSensitive.h +295 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPAFSSolver.h +246 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPAPass.h +115 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPASolver.h +205 -0
- package/SVF-osx/Release-build/include/SVF/WPA/WPAStat.h +222 -0
- package/SVF-osx/Release-build/include/SVF/extapi.bc +2384 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/Modules/FindZ3.cmake +93 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFConfig.cmake +106 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFConfigVersion.cmake +43 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFTargets-release.cmake +101 -0
- package/SVF-osx/Release-build/lib/cmake/SVF/SVFTargets.cmake +180 -0
- package/SVF-osx/Release-build/lib/libSvfCore.3.1.dylib +0 -0
- package/SVF-osx/Release-build/lib/libSvfLLVM.3.1.dylib +0 -0
- package/SVF-osx/Release-build/lib/pkgconfig/SVF.pc +12 -0
- package/package.json +1 -1
- package/SVF-linux-aarch64/Release-build/include/CFL/grammar/PAGGrammar.txt +0 -15
- package/SVF-linux-aarch64/Release-build/include/CFL/grammar/PEGGrammar.txt +0 -11
- package/SVF-linux-aarch64/Release-build/include/CFL/grammar/VFGGrammar.txt +0 -7
- package/SVF-linux-aarch64/Release-build/include/FastCluster/LICENSE.TXT +0 -13
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AbstractState.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AbstractValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/AddressValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/ICFGWTO.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/IntervalValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/NumericValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/RelExeState.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Core/RelationSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AEDetector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AbsExtAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{AE → SVF/AE}/Svfexe/AbstractInterpretation.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFGNormalizer.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFGrammar.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLAlias.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLBase.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLGramGraphChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLGraphBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLSVFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/CFLVF.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{CFL → SVF/CFL}/GrammarBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/ContextDDA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAClient.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAPass.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/DDAVFSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{DDA → SVF/DDA}/FlowDDA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{FastCluster → SVF/FastCluster}/fastcluster.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/BasicBlockG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CDG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CFLGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CHG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/CallGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ConsGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/DOTGraphTraits.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GenericGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphPrinter.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphTraits.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/GraphWriter.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ICFGStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/IRGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SCC.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGOPT.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/SVFGStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/ThreadCallGraph.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFGEdge.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/VFGNode.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Graphs → SVF/Graphs}/WTO.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MSSAMuChi.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemPartition.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemRegion.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/MemSSA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MSSA → SVF/MSSA}/SVFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/LockAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MHP.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MTA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/MTAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MTA → SVF/MTA}/TCT.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/AbstractPointsToDS.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/AccessPath.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/ConditionalPT.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/MutablePointsToDS.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PersistentPointsToCache.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PersistentPointsToDS.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointerAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointerAnalysisImpl.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/PointsTo.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{MemoryModel → SVF/MemoryModel}/SVFLoop.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/DoubleFreeChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/FileChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/LeakChecker.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/ProgSlice.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberCheckerAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberCondAllocator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SaberSVFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SrcSnkDDA.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SABER → SVF/SABER}/SrcSnkSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/BasicTypes.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/BreakConstantExpr.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/CHGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/CppUtil.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/DCHG.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/GEPTypeBridgeIterator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/ICFGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMLoopAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMModule.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/LLVMUtil.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/ObjTypeInference.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/SVFIRBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVF-LLVM → SVF/SVF-LLVM}/SymbolTableBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/ObjTypeInfo.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/PAGBuilderFromFile.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFIR.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFStatements.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFType.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFValue.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{SVFIR → SVF/SVFIR}/SVFVariables.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Annotator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/BitVector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CDGBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CallGraphBuilder.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Casting.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CommandLine.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CoreBitVector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/CxtStmt.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/DPItem.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/ExtAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/GeneralType.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/GraphReachSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/NodeIDAllocator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Options.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/PTAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFBugReport.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFLoopAndDomInfo.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SVFUtil.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/SparseBitVector.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/ThreadAPI.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/Z3Expr.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/cJSON.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/iterator.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{Util → SVF/Util}/iterator_range.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/Andersen.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/AndersenPWC.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/CSC.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/FlowSensitive.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/Steensgaard.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/TypeAnalysis.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/VersionedFlowSensitive.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAFSSolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAPass.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPASolver.h +0 -0
- /package/SVF-linux-aarch64/Release-build/include/{WPA → SVF/WPA}/WPAStat.h +0 -0
- /package/SVF-linux-aarch64/Release-build/{lib → include/SVF}/extapi.bc +0 -0
|
@@ -0,0 +1,872 @@
|
|
|
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: Jan 22, 2024
|
|
31
|
+
* Author: Xiao Cheng, Jiawei Wang
|
|
32
|
+
*
|
|
33
|
+
*/
|
|
34
|
+
#ifndef WTO_H_
|
|
35
|
+
#define WTO_H_
|
|
36
|
+
|
|
37
|
+
#include "SVFIR/SVFType.h"
|
|
38
|
+
#include "SVFIR/SVFValue.h"
|
|
39
|
+
#include <functional>
|
|
40
|
+
|
|
41
|
+
namespace SVF
|
|
42
|
+
{
|
|
43
|
+
|
|
44
|
+
template <typename GraphT> class WTO;
|
|
45
|
+
|
|
46
|
+
template <typename GraphT> class WTONode;
|
|
47
|
+
|
|
48
|
+
template <typename GraphT> class WTOCycle;
|
|
49
|
+
|
|
50
|
+
template <typename GraphT> class WTOComponentVisitor;
|
|
51
|
+
|
|
52
|
+
// Helper to test for the existence of a sub type
|
|
53
|
+
template <typename T, typename = void> struct has_nodetype : std::false_type
|
|
54
|
+
{
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
template <typename T>
|
|
58
|
+
struct has_nodetype<T, std::void_t<typename T::NodeType>> : std::true_type
|
|
59
|
+
{
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
template <typename T, typename = void> struct has_edgetype : std::false_type
|
|
63
|
+
{
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
template <typename T>
|
|
67
|
+
struct has_edgetype<T, std::void_t<typename T::EdgeType>> : std::true_type
|
|
68
|
+
{
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
/*!
|
|
72
|
+
* Cycle depth of a WTO Component
|
|
73
|
+
*
|
|
74
|
+
* The cycle depth is represented as **a list of cycle's heads**,
|
|
75
|
+
* **from the outermost to the innermost**.
|
|
76
|
+
*
|
|
77
|
+
* e.g., consider the following nested cycle:
|
|
78
|
+
*
|
|
79
|
+
* -->1 --> 2 --> 3 --> 4
|
|
80
|
+
* \ /
|
|
81
|
+
* <-- 6 <-- 5 <--
|
|
82
|
+
* \ /
|
|
83
|
+
* >7>
|
|
84
|
+
*
|
|
85
|
+
* where C1: (1 2 3 4 5 6 7) is the outer cycle, where 1 is the head,
|
|
86
|
+
* and C2: (5 6 7) is the inner cycle, where 5 is the head.
|
|
87
|
+
*
|
|
88
|
+
* The cycle depth is as following:
|
|
89
|
+
* ---------------------------------
|
|
90
|
+
* | Node NO. | Cycle Depth |
|
|
91
|
+
* --------------------------------
|
|
92
|
+
* | 1 (head of C1) | [ ] |
|
|
93
|
+
* --------------------------------
|
|
94
|
+
* | 2, 3, 4 | [1] |
|
|
95
|
+
* --------------------------------
|
|
96
|
+
* | 5 (head of C2) | [1] |
|
|
97
|
+
* --------------------------------
|
|
98
|
+
* | 6, 7 | [1, 5] |
|
|
99
|
+
* --------------------------------
|
|
100
|
+
*/
|
|
101
|
+
template <typename GraphT> class WTOCycleDepth
|
|
102
|
+
{
|
|
103
|
+
public:
|
|
104
|
+
static_assert(has_nodetype<GraphT>::value,
|
|
105
|
+
"GraphT must have a nested type named 'NodeType'");
|
|
106
|
+
typedef typename GraphT::NodeType NodeT;
|
|
107
|
+
|
|
108
|
+
private:
|
|
109
|
+
typedef std::vector<const NodeT*> NodeRefList;
|
|
110
|
+
|
|
111
|
+
public:
|
|
112
|
+
typedef typename NodeRefList::const_iterator Iterator;
|
|
113
|
+
|
|
114
|
+
private:
|
|
115
|
+
NodeRefList _heads;
|
|
116
|
+
|
|
117
|
+
public:
|
|
118
|
+
/// Constructor
|
|
119
|
+
WTOCycleDepth() = default;
|
|
120
|
+
|
|
121
|
+
/// Copy constructor
|
|
122
|
+
WTOCycleDepth(const WTOCycleDepth&) = default;
|
|
123
|
+
|
|
124
|
+
/// Move constructor
|
|
125
|
+
WTOCycleDepth(WTOCycleDepth&&) = default;
|
|
126
|
+
|
|
127
|
+
/// Copy assignment operator
|
|
128
|
+
WTOCycleDepth& operator=(const WTOCycleDepth&) = default;
|
|
129
|
+
|
|
130
|
+
/// Move assignment operator
|
|
131
|
+
WTOCycleDepth& operator=(WTOCycleDepth&&) = default;
|
|
132
|
+
|
|
133
|
+
/// Destructor
|
|
134
|
+
~WTOCycleDepth() = default;
|
|
135
|
+
|
|
136
|
+
/// Add a cycle head in the cycleDepth
|
|
137
|
+
void add(const NodeT* head)
|
|
138
|
+
{
|
|
139
|
+
_heads.push_back(head);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/// Begin iterator over the head of cycles
|
|
143
|
+
Iterator begin() const
|
|
144
|
+
{
|
|
145
|
+
return _heads.cbegin();
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/// End iterator over the head of cycles
|
|
149
|
+
Iterator end() const
|
|
150
|
+
{
|
|
151
|
+
return _heads.cend();
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/// Return the common prefix of the given cycle depths
|
|
155
|
+
WTOCycleDepth operator^(const WTOCycleDepth& other) const
|
|
156
|
+
{
|
|
157
|
+
WTOCycleDepth res;
|
|
158
|
+
for (auto this_it = begin(), other_it = other.begin();
|
|
159
|
+
this_it != end() && other_it != other.end(); ++this_it, ++other_it)
|
|
160
|
+
{
|
|
161
|
+
if (*this_it == *other_it)
|
|
162
|
+
{
|
|
163
|
+
res.add(*this_it);
|
|
164
|
+
}
|
|
165
|
+
else
|
|
166
|
+
{
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
return res;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
private:
|
|
174
|
+
/// Compare the given cycle depths
|
|
175
|
+
int compare(const WTOCycleDepth& other) const
|
|
176
|
+
{
|
|
177
|
+
if (this == &other)
|
|
178
|
+
{
|
|
179
|
+
return 0; // equals
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
auto this_it = begin();
|
|
183
|
+
auto other_it = other.begin();
|
|
184
|
+
while (this_it != end())
|
|
185
|
+
{
|
|
186
|
+
if (other_it == other.end())
|
|
187
|
+
{
|
|
188
|
+
return 1; // `this` is nested within `other`
|
|
189
|
+
}
|
|
190
|
+
else if (*this_it == *other_it)
|
|
191
|
+
{
|
|
192
|
+
++this_it;
|
|
193
|
+
++other_it;
|
|
194
|
+
}
|
|
195
|
+
else
|
|
196
|
+
{
|
|
197
|
+
return 2; // not comparable
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
if (other_it == other.end())
|
|
201
|
+
{
|
|
202
|
+
return 0; // equals
|
|
203
|
+
}
|
|
204
|
+
else
|
|
205
|
+
{
|
|
206
|
+
return -1; // `other` is nested within `this`
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
public:
|
|
211
|
+
bool operator<(const WTOCycleDepth& other) const
|
|
212
|
+
{
|
|
213
|
+
return compare(other) == -1;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
bool operator<=(const WTOCycleDepth& other) const
|
|
217
|
+
{
|
|
218
|
+
return compare(other) <= 0;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
bool operator==(const WTOCycleDepth& other) const
|
|
222
|
+
{
|
|
223
|
+
return compare(other) == 0;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
bool operator>=(const WTOCycleDepth& other) const
|
|
227
|
+
{
|
|
228
|
+
return operator<=(other, *this);
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
bool operator>(const WTOCycleDepth& other) const
|
|
232
|
+
{
|
|
233
|
+
return compare(other) == 1;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
/// Dump the cycleDepth, for debugging purpose
|
|
237
|
+
[[nodiscard]] std::string toString() const
|
|
238
|
+
{
|
|
239
|
+
std::string str;
|
|
240
|
+
std::stringstream rawstr(str);
|
|
241
|
+
rawstr << "[";
|
|
242
|
+
for (auto it = begin(), et = end(); it != et;)
|
|
243
|
+
{
|
|
244
|
+
rawstr << (*it)->toString();
|
|
245
|
+
++it;
|
|
246
|
+
if (it != et)
|
|
247
|
+
{
|
|
248
|
+
rawstr << ", ";
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
rawstr << "]";
|
|
252
|
+
return rawstr.str();
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/// Overloading operator << for dumping ICFG node ID
|
|
256
|
+
//@{
|
|
257
|
+
friend std::ostream& operator<<(std::ostream& o,
|
|
258
|
+
const WTOCycleDepth<GraphT>& wto)
|
|
259
|
+
{
|
|
260
|
+
o << wto.toString();
|
|
261
|
+
return o;
|
|
262
|
+
}
|
|
263
|
+
//@}
|
|
264
|
+
|
|
265
|
+
}; // end class WTOCycleDepth
|
|
266
|
+
|
|
267
|
+
/*!
|
|
268
|
+
* Base class for a WTO component
|
|
269
|
+
*
|
|
270
|
+
* A WTO component can be either a node or cycle
|
|
271
|
+
*/
|
|
272
|
+
template <typename GraphT> class WTOComponent
|
|
273
|
+
{
|
|
274
|
+
public:
|
|
275
|
+
enum WTOCT
|
|
276
|
+
{
|
|
277
|
+
Node,
|
|
278
|
+
Cycle
|
|
279
|
+
};
|
|
280
|
+
|
|
281
|
+
/// Default constructor
|
|
282
|
+
explicit WTOComponent(WTOCT k) : _type(k) {};
|
|
283
|
+
|
|
284
|
+
/// Copy constructor
|
|
285
|
+
WTOComponent(const WTOComponent&) noexcept = default;
|
|
286
|
+
|
|
287
|
+
/// Move constructor
|
|
288
|
+
WTOComponent(WTOComponent&&) noexcept = default;
|
|
289
|
+
|
|
290
|
+
/// Copy assignment operator
|
|
291
|
+
WTOComponent& operator=(const WTOComponent&) noexcept = default;
|
|
292
|
+
|
|
293
|
+
/// Move assignment operator
|
|
294
|
+
WTOComponent& operator=(WTOComponent&&) noexcept = default;
|
|
295
|
+
|
|
296
|
+
/// Accept the given visitor
|
|
297
|
+
virtual void accept(WTOComponentVisitor<GraphT>&) const = 0;
|
|
298
|
+
|
|
299
|
+
/// Destructor
|
|
300
|
+
virtual ~WTOComponent() = default;
|
|
301
|
+
|
|
302
|
+
inline WTOCT getKind() const
|
|
303
|
+
{
|
|
304
|
+
return _type;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
[[nodiscard]] virtual std::string toString() const = 0;
|
|
308
|
+
|
|
309
|
+
/// Overloading operator << for dumping ICFG node ID
|
|
310
|
+
//@{
|
|
311
|
+
friend std::ostream& operator<<(std::ostream& o,
|
|
312
|
+
const WTOComponent<GraphT>& wto)
|
|
313
|
+
{
|
|
314
|
+
o << wto.toString();
|
|
315
|
+
return o;
|
|
316
|
+
}
|
|
317
|
+
//@}
|
|
318
|
+
|
|
319
|
+
WTOCT _type;
|
|
320
|
+
|
|
321
|
+
}; // end class WTOComponent
|
|
322
|
+
|
|
323
|
+
/*!
|
|
324
|
+
* WTO node for GraphT
|
|
325
|
+
*/
|
|
326
|
+
template <typename GraphT> class WTONode final : public WTOComponent<GraphT>
|
|
327
|
+
{
|
|
328
|
+
public:
|
|
329
|
+
static_assert(has_nodetype<GraphT>::value,
|
|
330
|
+
"GraphT must have a nested type named 'NodeType'");
|
|
331
|
+
typedef typename GraphT::NodeType NodeT;
|
|
332
|
+
|
|
333
|
+
private:
|
|
334
|
+
const NodeT* _node;
|
|
335
|
+
|
|
336
|
+
public:
|
|
337
|
+
/// Constructor
|
|
338
|
+
explicit WTONode(const NodeT* node)
|
|
339
|
+
: WTOComponent<GraphT>(WTOComponent<GraphT>::Node), _node(node)
|
|
340
|
+
{
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/// Return the graph node
|
|
344
|
+
const NodeT* getICFGNode() const
|
|
345
|
+
{
|
|
346
|
+
return _node;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/// Accept the given visitor
|
|
350
|
+
void accept(WTOComponentVisitor<GraphT>& v) const override
|
|
351
|
+
{
|
|
352
|
+
v.visit(*this);
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/// Dump the node, for debugging purpose
|
|
356
|
+
[[nodiscard]] std::string toString() const override
|
|
357
|
+
{
|
|
358
|
+
// return _node->toString();
|
|
359
|
+
return std::to_string(_node->getId());
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
/// ClassOf
|
|
363
|
+
//@{
|
|
364
|
+
static inline bool classof(const WTONode<GraphT>*)
|
|
365
|
+
{
|
|
366
|
+
return true;
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
static inline bool classof(const WTOComponent<GraphT>* c)
|
|
370
|
+
{
|
|
371
|
+
return c->getKind() == WTOComponent<GraphT>::Node;
|
|
372
|
+
}
|
|
373
|
+
///@}
|
|
374
|
+
|
|
375
|
+
}; // end class WTONode
|
|
376
|
+
|
|
377
|
+
/*!
|
|
378
|
+
* WTO cycle for GraphT
|
|
379
|
+
*/
|
|
380
|
+
template <typename GraphT> class WTOCycle final : public WTOComponent<GraphT>
|
|
381
|
+
{
|
|
382
|
+
public:
|
|
383
|
+
static_assert(has_nodetype<GraphT>::value,
|
|
384
|
+
"GraphT must have a nested type named 'NodeType'");
|
|
385
|
+
typedef typename GraphT::NodeType NodeT;
|
|
386
|
+
typedef WTOComponent<GraphT> WTOComponentT;
|
|
387
|
+
|
|
388
|
+
private:
|
|
389
|
+
typedef const WTOComponentT* WTOComponentPtr;
|
|
390
|
+
typedef std::list<WTOComponentPtr> WTOComponentRefList;
|
|
391
|
+
|
|
392
|
+
public:
|
|
393
|
+
/// Iterator over the components
|
|
394
|
+
typedef typename WTOComponentRefList::const_iterator Iterator;
|
|
395
|
+
|
|
396
|
+
private:
|
|
397
|
+
/// Head of the cycle
|
|
398
|
+
const WTONode<GraphT>* _head;
|
|
399
|
+
|
|
400
|
+
/// List of components
|
|
401
|
+
WTOComponentRefList _components;
|
|
402
|
+
|
|
403
|
+
public:
|
|
404
|
+
/// Constructor
|
|
405
|
+
WTOCycle(const WTONode<GraphT>* head, WTOComponentRefList components)
|
|
406
|
+
: WTOComponent<GraphT>(WTOComponent<GraphT>::Cycle), _head(head),
|
|
407
|
+
_components(std::move(components))
|
|
408
|
+
{
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
/// Return the head of the cycle
|
|
412
|
+
const WTONode<GraphT>* head() const
|
|
413
|
+
{
|
|
414
|
+
return _head;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/// Get all wto components in WTO cycle
|
|
418
|
+
const WTOComponentRefList& getWTOComponents() const
|
|
419
|
+
{
|
|
420
|
+
return _components;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/// Begin iterator over the components
|
|
424
|
+
Iterator begin() const
|
|
425
|
+
{
|
|
426
|
+
return _components.cbegin();
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
/// End iterator over the components
|
|
430
|
+
Iterator end() const
|
|
431
|
+
{
|
|
432
|
+
return _components.cend();
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
/// Accept the given visitor
|
|
436
|
+
void accept(WTOComponentVisitor<GraphT>& v) const override
|
|
437
|
+
{
|
|
438
|
+
v.visit(*this);
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
/// ClassOf
|
|
442
|
+
//@{
|
|
443
|
+
static inline bool classof(const WTOCycle<GraphT>*)
|
|
444
|
+
{
|
|
445
|
+
return true;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
static inline bool classof(const WTOComponent<GraphT>* c)
|
|
449
|
+
{
|
|
450
|
+
return c->getKind() == WTOComponent<GraphT>::Cycle;
|
|
451
|
+
}
|
|
452
|
+
///@}
|
|
453
|
+
|
|
454
|
+
/// Dump the cycle, for debugging purpose
|
|
455
|
+
[[nodiscard]] std::string toString() const override
|
|
456
|
+
{
|
|
457
|
+
std::string str;
|
|
458
|
+
std::stringstream rawstr(str);
|
|
459
|
+
rawstr << "(";
|
|
460
|
+
rawstr << _head->getICFGNode()->getId() << ", ";
|
|
461
|
+
for (auto it = begin(), et = end(); it != et;)
|
|
462
|
+
{
|
|
463
|
+
rawstr << (*it)->toString();
|
|
464
|
+
++it;
|
|
465
|
+
if (it != et)
|
|
466
|
+
{
|
|
467
|
+
rawstr << ", ";
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
rawstr << ")";
|
|
471
|
+
return rawstr.str();
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
}; // end class WTOCycle
|
|
475
|
+
|
|
476
|
+
/*!
|
|
477
|
+
* Weak topological order (WTO) visitor
|
|
478
|
+
*/
|
|
479
|
+
template <typename GraphT> class WTOComponentVisitor
|
|
480
|
+
{
|
|
481
|
+
public:
|
|
482
|
+
typedef WTONode<GraphT> WTONodeT;
|
|
483
|
+
typedef WTOCycle<GraphT> WTOCycleT;
|
|
484
|
+
|
|
485
|
+
public:
|
|
486
|
+
/// Default constructor
|
|
487
|
+
WTOComponentVisitor() = default;
|
|
488
|
+
|
|
489
|
+
/// Copy constructor
|
|
490
|
+
WTOComponentVisitor(const WTOComponentVisitor&) noexcept = default;
|
|
491
|
+
|
|
492
|
+
/// Move constructor
|
|
493
|
+
WTOComponentVisitor(WTOComponentVisitor&&) noexcept = default;
|
|
494
|
+
|
|
495
|
+
/// Copy assignment operator
|
|
496
|
+
WTOComponentVisitor& operator=(const WTOComponentVisitor&) noexcept =
|
|
497
|
+
default;
|
|
498
|
+
|
|
499
|
+
/// Move assignment operator
|
|
500
|
+
WTOComponentVisitor& operator=(WTOComponentVisitor&&) noexcept = default;
|
|
501
|
+
|
|
502
|
+
/// Visit the given node
|
|
503
|
+
virtual void visit(const WTONodeT&) = 0;
|
|
504
|
+
|
|
505
|
+
/// Visit the given cycle
|
|
506
|
+
virtual void visit(const WTOCycleT&) = 0;
|
|
507
|
+
|
|
508
|
+
/// Destructor
|
|
509
|
+
virtual ~WTOComponentVisitor() = default;
|
|
510
|
+
|
|
511
|
+
}; // end class WTOComponentVisitor
|
|
512
|
+
|
|
513
|
+
/*!
|
|
514
|
+
* Weak topological order for GraphT
|
|
515
|
+
*/
|
|
516
|
+
template <typename GraphT> class WTO
|
|
517
|
+
{
|
|
518
|
+
|
|
519
|
+
public:
|
|
520
|
+
static_assert(has_nodetype<GraphT>::value,
|
|
521
|
+
"GraphT must have a nested type named 'NodeType'");
|
|
522
|
+
static_assert(has_edgetype<GraphT>::value,
|
|
523
|
+
"GraphT must have a nested type named 'EdgeType'");
|
|
524
|
+
typedef typename GraphT::NodeType NodeT;
|
|
525
|
+
typedef typename GraphT::EdgeType EdgeT;
|
|
526
|
+
typedef WTOCycleDepth<GraphT> GraphTWTOCycleDepth;
|
|
527
|
+
typedef WTOComponent<GraphT> WTOComponentT;
|
|
528
|
+
typedef WTONode<GraphT> WTONodeT;
|
|
529
|
+
typedef WTOCycle<GraphT> WTOCycleT;
|
|
530
|
+
typedef Set<const NodeT*> NodeRefList;
|
|
531
|
+
|
|
532
|
+
protected:
|
|
533
|
+
typedef const WTOComponentT* WTOComponentPtr;
|
|
534
|
+
typedef std::list<WTOComponentPtr> WTOComponentRefList;
|
|
535
|
+
typedef Set<WTOComponentPtr> WTOComponentRefSet;
|
|
536
|
+
typedef Map<const NodeT*, const WTOCycleT*> NodeRefToWTOCycleMap;
|
|
537
|
+
typedef Map<const NodeT*, NodeRefList> NodeRefTONodeRefListMap;
|
|
538
|
+
|
|
539
|
+
typedef u32_t CycleDepthNumber;
|
|
540
|
+
typedef Map<const NodeT*, CycleDepthNumber> NodeRefToCycleDepthNumber;
|
|
541
|
+
typedef std::vector<const NodeT*> Stack;
|
|
542
|
+
typedef std::shared_ptr<GraphTWTOCycleDepth> WTOCycleDepthPtr;
|
|
543
|
+
typedef Map<const NodeT*, WTOCycleDepthPtr> NodeRefToWTOCycleDepthPtr;
|
|
544
|
+
|
|
545
|
+
public:
|
|
546
|
+
/// Iterator over the components
|
|
547
|
+
typedef typename WTOComponentRefList::const_iterator Iterator;
|
|
548
|
+
|
|
549
|
+
protected:
|
|
550
|
+
WTOComponentRefList _components;
|
|
551
|
+
WTOComponentRefSet _allComponents;
|
|
552
|
+
NodeRefToWTOCycleMap headRefToCycle;
|
|
553
|
+
NodeRefToWTOCycleDepthPtr _nodeToDepth;
|
|
554
|
+
NodeRefToCycleDepthNumber _nodeToCDN;
|
|
555
|
+
CycleDepthNumber _num;
|
|
556
|
+
Stack _stack;
|
|
557
|
+
GraphT* _graph;
|
|
558
|
+
const NodeT* _entry;
|
|
559
|
+
|
|
560
|
+
public:
|
|
561
|
+
|
|
562
|
+
/// Compute the weak topological order of the given graph
|
|
563
|
+
explicit WTO(GraphT* graph, const NodeT* entry) : _num(0), _graph(graph), _entry(entry)
|
|
564
|
+
{
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/// No copy constructor
|
|
568
|
+
WTO(const WTO& other) = default;
|
|
569
|
+
|
|
570
|
+
/// Move constructor
|
|
571
|
+
WTO(WTO&& other) = default;
|
|
572
|
+
|
|
573
|
+
/// No copy assignment operator
|
|
574
|
+
WTO& operator=(const WTO& other) = default;
|
|
575
|
+
|
|
576
|
+
/// Move assignment operator
|
|
577
|
+
WTO& operator=(WTO&& other) = default;
|
|
578
|
+
|
|
579
|
+
/// Destructor
|
|
580
|
+
~WTO()
|
|
581
|
+
{
|
|
582
|
+
for (const auto& component : _allComponents)
|
|
583
|
+
{
|
|
584
|
+
delete component;
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/// Get all wto components in WTO
|
|
589
|
+
const WTOComponentRefList& getWTOComponents() const
|
|
590
|
+
{
|
|
591
|
+
return _components;
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/// Begin iterator over the components
|
|
595
|
+
Iterator begin() const
|
|
596
|
+
{
|
|
597
|
+
return _components.cbegin();
|
|
598
|
+
}
|
|
599
|
+
|
|
600
|
+
/// End iterator over the components
|
|
601
|
+
Iterator end() const
|
|
602
|
+
{
|
|
603
|
+
return _components.cend();
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
bool isHead(const NodeT* node) const
|
|
607
|
+
{
|
|
608
|
+
return headRefToCycle.find(node) != headRefToCycle.end();
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
typename NodeRefToWTOCycleMap::const_iterator headBegin() const
|
|
612
|
+
{
|
|
613
|
+
return headRefToCycle.cbegin();
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/// End iterator over the components
|
|
617
|
+
typename NodeRefToWTOCycleMap::const_iterator headEnd() const
|
|
618
|
+
{
|
|
619
|
+
return headRefToCycle.cend();
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/// Return the cycleDepth of the given node
|
|
623
|
+
const GraphTWTOCycleDepth& cycleDepth(const NodeT* n) const
|
|
624
|
+
{
|
|
625
|
+
auto it = _nodeToDepth.find(n);
|
|
626
|
+
assert(it != _nodeToDepth.end() && "node not found");
|
|
627
|
+
return *(it->second);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
/// Return the cycleDepth of the given node
|
|
631
|
+
inline bool in_cycleDepth_table(const NodeT* n) const
|
|
632
|
+
{
|
|
633
|
+
auto it = _nodeToDepth.find(n);
|
|
634
|
+
return it != _nodeToDepth.end();
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
/// Accept the given visitor
|
|
638
|
+
void accept(WTOComponentVisitor<GraphT>& v)
|
|
639
|
+
{
|
|
640
|
+
for (const auto& c : _components)
|
|
641
|
+
{
|
|
642
|
+
c->accept(v);
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
|
|
646
|
+
/// Dump the order, for debugging purpose
|
|
647
|
+
[[nodiscard]] std::string toString() const
|
|
648
|
+
{
|
|
649
|
+
std::string str;
|
|
650
|
+
std::stringstream rawstr(str);
|
|
651
|
+
rawstr << "[";
|
|
652
|
+
for (auto it = begin(), et = end(); it != et;)
|
|
653
|
+
{
|
|
654
|
+
rawstr << (*it)->toString();
|
|
655
|
+
++it;
|
|
656
|
+
if (it != et)
|
|
657
|
+
{
|
|
658
|
+
rawstr << ", ";
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
rawstr << "]";
|
|
662
|
+
return rawstr.str();
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
/// Overloading operator << for dumping ICFG node ID
|
|
666
|
+
//@{
|
|
667
|
+
friend std::ostream& operator<<(std::ostream& o, const WTO<GraphT>& wto)
|
|
668
|
+
{
|
|
669
|
+
o << wto.toString();
|
|
670
|
+
return o;
|
|
671
|
+
}
|
|
672
|
+
//@}
|
|
673
|
+
|
|
674
|
+
void init()
|
|
675
|
+
{
|
|
676
|
+
visit(_entry, _components);
|
|
677
|
+
_nodeToCDN.clear();
|
|
678
|
+
_stack.clear();
|
|
679
|
+
buildNodeToDepth();
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
protected:
|
|
683
|
+
|
|
684
|
+
/// Visitor to build the cycle depths of each node
|
|
685
|
+
class WTOCycleDepthBuilder final : public WTOComponentVisitor<GraphT>
|
|
686
|
+
{
|
|
687
|
+
private:
|
|
688
|
+
WTOCycleDepthPtr _wtoCycleDepth;
|
|
689
|
+
NodeRefToWTOCycleDepthPtr& _nodeToWTOCycleDepth;
|
|
690
|
+
|
|
691
|
+
public:
|
|
692
|
+
explicit WTOCycleDepthBuilder(
|
|
693
|
+
NodeRefToWTOCycleDepthPtr& nodeToWTOCycleDepth)
|
|
694
|
+
: _wtoCycleDepth(std::make_shared<GraphTWTOCycleDepth>()),
|
|
695
|
+
_nodeToWTOCycleDepth(nodeToWTOCycleDepth)
|
|
696
|
+
{
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
void visit(const WTOCycleT& cycle) override
|
|
700
|
+
{
|
|
701
|
+
const NodeT* head = cycle.head()->getICFGNode();
|
|
702
|
+
WTOCycleDepthPtr previous_cycleDepth = _wtoCycleDepth;
|
|
703
|
+
_nodeToWTOCycleDepth.insert(std::make_pair(head, _wtoCycleDepth));
|
|
704
|
+
_wtoCycleDepth =
|
|
705
|
+
std::make_shared<GraphTWTOCycleDepth>(*_wtoCycleDepth);
|
|
706
|
+
_wtoCycleDepth->add(head);
|
|
707
|
+
for (auto it = cycle.begin(), et = cycle.end(); it != et; ++it)
|
|
708
|
+
{
|
|
709
|
+
(*it)->accept(*this);
|
|
710
|
+
}
|
|
711
|
+
_wtoCycleDepth = previous_cycleDepth;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
void visit(const WTONodeT& node) override
|
|
715
|
+
{
|
|
716
|
+
_nodeToWTOCycleDepth.insert(
|
|
717
|
+
std::make_pair(node.getICFGNode(), _wtoCycleDepth));
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
}; // end class WTOCycleDepthBuilder
|
|
721
|
+
|
|
722
|
+
protected:
|
|
723
|
+
|
|
724
|
+
inline virtual void forEachSuccessor(const NodeT* node, std::function<void(const NodeT*)> func) const
|
|
725
|
+
{
|
|
726
|
+
for (const auto& e : node->getOutEdges())
|
|
727
|
+
{
|
|
728
|
+
func(e->getDstNode());
|
|
729
|
+
}
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
protected:
|
|
733
|
+
/// Return the depth-first number of the given node
|
|
734
|
+
CycleDepthNumber getCDN(const NodeT* n) const
|
|
735
|
+
{
|
|
736
|
+
auto it = _nodeToCDN.find(n);
|
|
737
|
+
if (it != _nodeToCDN.end())
|
|
738
|
+
{
|
|
739
|
+
return it->second;
|
|
740
|
+
}
|
|
741
|
+
else
|
|
742
|
+
{
|
|
743
|
+
return 0;
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
/// Set the depth-first number of the given node
|
|
748
|
+
void setCDN(const NodeT* n, const CycleDepthNumber& dfn)
|
|
749
|
+
{
|
|
750
|
+
auto res = _nodeToCDN.insert(std::make_pair(n, dfn));
|
|
751
|
+
if (!res.second)
|
|
752
|
+
{
|
|
753
|
+
(res.first)->second = dfn;
|
|
754
|
+
}
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
/// Pop a node from the stack
|
|
758
|
+
const NodeT* pop()
|
|
759
|
+
{
|
|
760
|
+
assert(!_stack.empty() && "empty stack");
|
|
761
|
+
const NodeT* top = _stack.back();
|
|
762
|
+
_stack.pop_back();
|
|
763
|
+
return top;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
/// Push a node on the stack
|
|
767
|
+
void push(const NodeT* n)
|
|
768
|
+
{
|
|
769
|
+
_stack.push_back(n);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
const WTONodeT* newNode(const NodeT* node)
|
|
773
|
+
{
|
|
774
|
+
const WTONodeT* ptr = new WTONodeT(node);
|
|
775
|
+
_allComponents.insert(ptr);
|
|
776
|
+
return ptr;
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
const WTOCycleT* newCycle(const WTONodeT* node,
|
|
780
|
+
const WTOComponentRefList& partition)
|
|
781
|
+
{
|
|
782
|
+
const WTOCycleT* ptr = new WTOCycleT(node, std::move(partition));
|
|
783
|
+
_allComponents.insert(ptr);
|
|
784
|
+
return ptr;
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
/// Create the cycle component for the given node
|
|
788
|
+
virtual const WTOCycleT* component(const NodeT* node)
|
|
789
|
+
{
|
|
790
|
+
WTOComponentRefList partition;
|
|
791
|
+
forEachSuccessor(node, [&](const NodeT* succ)
|
|
792
|
+
{
|
|
793
|
+
if (getCDN(succ) == 0)
|
|
794
|
+
{
|
|
795
|
+
visit(succ, partition);
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
const WTONodeT* head = newNode(node);
|
|
799
|
+
const WTOCycleT* ptr = newCycle(head, partition);
|
|
800
|
+
headRefToCycle.emplace(node, ptr);
|
|
801
|
+
return ptr;
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/// Visit the given node
|
|
805
|
+
///
|
|
806
|
+
/// Algorithm to build a weak topological order of a graph
|
|
807
|
+
virtual CycleDepthNumber visit(const NodeT* node,
|
|
808
|
+
WTOComponentRefList& partition)
|
|
809
|
+
{
|
|
810
|
+
CycleDepthNumber head(0);
|
|
811
|
+
CycleDepthNumber min(0);
|
|
812
|
+
bool loop;
|
|
813
|
+
|
|
814
|
+
push(node);
|
|
815
|
+
_num += CycleDepthNumber(1);
|
|
816
|
+
head = _num;
|
|
817
|
+
setCDN(node, head);
|
|
818
|
+
loop = false;
|
|
819
|
+
forEachSuccessor(node, [&](const NodeT* succ)
|
|
820
|
+
{
|
|
821
|
+
CycleDepthNumber succ_dfn = getCDN(succ);
|
|
822
|
+
if (succ_dfn == CycleDepthNumber(0))
|
|
823
|
+
{
|
|
824
|
+
min = visit(succ, partition);
|
|
825
|
+
}
|
|
826
|
+
else
|
|
827
|
+
{
|
|
828
|
+
min = succ_dfn;
|
|
829
|
+
}
|
|
830
|
+
if (min <= head)
|
|
831
|
+
{
|
|
832
|
+
head = min;
|
|
833
|
+
loop = true;
|
|
834
|
+
}
|
|
835
|
+
});
|
|
836
|
+
|
|
837
|
+
if (head == getCDN(node))
|
|
838
|
+
{
|
|
839
|
+
setCDN(node, UINT_MAX);
|
|
840
|
+
const NodeT* element = pop();
|
|
841
|
+
if (loop)
|
|
842
|
+
{
|
|
843
|
+
while (element != node)
|
|
844
|
+
{
|
|
845
|
+
setCDN(element, 0);
|
|
846
|
+
element = pop();
|
|
847
|
+
}
|
|
848
|
+
partition.push_front(component(node));
|
|
849
|
+
}
|
|
850
|
+
else
|
|
851
|
+
{
|
|
852
|
+
partition.push_front(newNode(node));
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
return head;
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
/// Build the node to WTO cycle depth table
|
|
859
|
+
void buildNodeToDepth()
|
|
860
|
+
{
|
|
861
|
+
WTOCycleDepthBuilder builder(_nodeToDepth);
|
|
862
|
+
for (auto it = begin(), et = end(); it != et; ++it)
|
|
863
|
+
{
|
|
864
|
+
(*it)->accept(builder);
|
|
865
|
+
}
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
}; // end class WTO
|
|
869
|
+
|
|
870
|
+
} // namespace SVF
|
|
871
|
+
|
|
872
|
+
#endif /* WTO_H_ */
|