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,546 @@
|
|
|
1
|
+
//===- MHP.h -- May-happen-in-parallel 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 Affero 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 Affero General Public License for more details.
|
|
17
|
+
|
|
18
|
+
// You should have received a copy of the GNU Affero General Public License
|
|
19
|
+
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
//
|
|
21
|
+
//===----------------------------------------------------------------------===//
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* MHP.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: Jan 21, 2014
|
|
27
|
+
* Author: Yulei Sui, Peng Di
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
#ifndef MHP_H_
|
|
31
|
+
#define MHP_H_
|
|
32
|
+
|
|
33
|
+
#include "MTA/TCT.h"
|
|
34
|
+
#include "Util/SVFUtil.h"
|
|
35
|
+
namespace SVF
|
|
36
|
+
{
|
|
37
|
+
|
|
38
|
+
class ForkJoinAnalysis;
|
|
39
|
+
class LockAnalysis;
|
|
40
|
+
|
|
41
|
+
/*!
|
|
42
|
+
* This class serves as a base may-happen in parallel analysis for multithreaded program
|
|
43
|
+
* Given a statement under an abstract thread, it tells which abstract threads may be alive at the same time (May-happen-in-parallel).
|
|
44
|
+
*/
|
|
45
|
+
class MHP
|
|
46
|
+
{
|
|
47
|
+
|
|
48
|
+
public:
|
|
49
|
+
typedef Set<const FunObjVar*> FunSet;
|
|
50
|
+
typedef FIFOWorkList<CxtThreadStmt> CxtThreadStmtWorkList;
|
|
51
|
+
typedef Set<CxtThreadStmt> CxtThreadStmtSet;
|
|
52
|
+
typedef Map<CxtThreadStmt,NodeBS> ThreadStmtToThreadInterleav;
|
|
53
|
+
typedef Map<const ICFGNode*,CxtThreadStmtSet> InstToThreadStmtSetMap;
|
|
54
|
+
typedef SVFLoopAndDomInfo::LoopBBs LoopBBs;
|
|
55
|
+
|
|
56
|
+
typedef Set<CxtStmt> LockSpan;
|
|
57
|
+
|
|
58
|
+
typedef std::pair<const FunObjVar*,const FunObjVar*> FuncPair;
|
|
59
|
+
typedef Map<FuncPair, bool> FuncPairToBool;
|
|
60
|
+
|
|
61
|
+
/// Constructor
|
|
62
|
+
MHP(TCT* t);
|
|
63
|
+
|
|
64
|
+
/// Destructor
|
|
65
|
+
virtual ~MHP();
|
|
66
|
+
|
|
67
|
+
/// Start analysis here
|
|
68
|
+
void analyze();
|
|
69
|
+
|
|
70
|
+
/// Analyze thread interleaving
|
|
71
|
+
void analyzeInterleaving();
|
|
72
|
+
|
|
73
|
+
/// Get ThreadCallGraph
|
|
74
|
+
inline ThreadCallGraph* getThreadCallGraph() const
|
|
75
|
+
{
|
|
76
|
+
return tcg;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// Get Thread Creation Tree
|
|
80
|
+
inline TCT* getTCT() const
|
|
81
|
+
{
|
|
82
|
+
return tct;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// Whether the function is connected from main function in thread call graph
|
|
86
|
+
bool isConnectedfromMain(const FunObjVar* fun);
|
|
87
|
+
|
|
88
|
+
// LockSpan getSpanfromCxtLock(NodeID l);
|
|
89
|
+
/// Interface to query whether two instructions may happen-in-parallel
|
|
90
|
+
virtual bool mayHappenInParallel(const ICFGNode* i1, const ICFGNode* i2);
|
|
91
|
+
virtual bool mayHappenInParallelCache(const ICFGNode* i1, const ICFGNode* i2);
|
|
92
|
+
virtual bool mayHappenInParallelInst(const ICFGNode* i1, const ICFGNode* i2);
|
|
93
|
+
virtual bool executedByTheSameThread(const ICFGNode* i1, const ICFGNode* i2);
|
|
94
|
+
|
|
95
|
+
/// Get interleaving thread for statement inst
|
|
96
|
+
//@{
|
|
97
|
+
inline const NodeBS& getInterleavingThreads(const CxtThreadStmt& cts)
|
|
98
|
+
{
|
|
99
|
+
return threadStmtToTheadInterLeav[cts];
|
|
100
|
+
}
|
|
101
|
+
inline bool hasInterleavingThreads(const CxtThreadStmt& cts) const
|
|
102
|
+
{
|
|
103
|
+
return threadStmtToTheadInterLeav.find(cts)!=threadStmtToTheadInterLeav.end();
|
|
104
|
+
}
|
|
105
|
+
//@}
|
|
106
|
+
|
|
107
|
+
/// Get/has ThreadStmt
|
|
108
|
+
//@{
|
|
109
|
+
inline const CxtThreadStmtSet& getThreadStmtSet(const ICFGNode* inst) const
|
|
110
|
+
{
|
|
111
|
+
InstToThreadStmtSetMap::const_iterator it = instToTSMap.find(inst);
|
|
112
|
+
assert(it!=instToTSMap.end() && "no thread access the instruction?");
|
|
113
|
+
return it->second;
|
|
114
|
+
}
|
|
115
|
+
inline bool hasThreadStmtSet(const ICFGNode* inst) const
|
|
116
|
+
{
|
|
117
|
+
return instToTSMap.find(inst)!=instToTSMap.end();
|
|
118
|
+
}
|
|
119
|
+
//@}
|
|
120
|
+
|
|
121
|
+
/// Print interleaving results
|
|
122
|
+
void printInterleaving();
|
|
123
|
+
|
|
124
|
+
private:
|
|
125
|
+
|
|
126
|
+
inline const CallGraph::FunctionSet& getCallee(const CallICFGNode* inst, CallGraph::FunctionSet& callees)
|
|
127
|
+
{
|
|
128
|
+
tcg->getCallees(inst, callees);
|
|
129
|
+
return callees;
|
|
130
|
+
}
|
|
131
|
+
/// Update non-candidate functions' interleaving.
|
|
132
|
+
/// Copy interleaving threads of the entry inst to other insts.
|
|
133
|
+
void updateNonCandidateFunInterleaving();
|
|
134
|
+
|
|
135
|
+
/// Handle non-candidate function
|
|
136
|
+
void handleNonCandidateFun(const CxtThreadStmt& cts);
|
|
137
|
+
|
|
138
|
+
/// Handle fork
|
|
139
|
+
void handleFork(const CxtThreadStmt& cts, NodeID rootTid);
|
|
140
|
+
|
|
141
|
+
/// Handle join
|
|
142
|
+
void handleJoin(const CxtThreadStmt& cts, NodeID rootTid);
|
|
143
|
+
|
|
144
|
+
/// Handle call
|
|
145
|
+
void handleCall(const CxtThreadStmt& cts, NodeID rootTid);
|
|
146
|
+
|
|
147
|
+
/// Handle return
|
|
148
|
+
void handleRet(const CxtThreadStmt& cts);
|
|
149
|
+
|
|
150
|
+
/// Handle intra
|
|
151
|
+
void handleIntra(const CxtThreadStmt& cts);
|
|
152
|
+
|
|
153
|
+
/// Add/Remove interleaving thread for statement inst
|
|
154
|
+
//@{
|
|
155
|
+
inline void addInterleavingThread(const CxtThreadStmt& tgr, NodeID tid)
|
|
156
|
+
{
|
|
157
|
+
if(threadStmtToTheadInterLeav[tgr].test_and_set(tid))
|
|
158
|
+
{
|
|
159
|
+
instToTSMap[tgr.getStmt()].insert(tgr);
|
|
160
|
+
pushToCTSWorkList(tgr);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
inline void addInterleavingThread(const CxtThreadStmt& tgr, const CxtThreadStmt& src)
|
|
164
|
+
{
|
|
165
|
+
bool changed = threadStmtToTheadInterLeav[tgr] |= threadStmtToTheadInterLeav[src];
|
|
166
|
+
if(changed)
|
|
167
|
+
{
|
|
168
|
+
instToTSMap[tgr.getStmt()].insert(tgr);
|
|
169
|
+
pushToCTSWorkList(tgr);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
inline void rmInterleavingThread(const CxtThreadStmt& tgr, const NodeBS& tids, const ICFGNode* joinsite)
|
|
173
|
+
{
|
|
174
|
+
NodeBS joinedTids;
|
|
175
|
+
for(NodeBS::iterator it = tids.begin(), eit = tids.end(); it!=eit; ++it)
|
|
176
|
+
{
|
|
177
|
+
if(isMustJoin(tgr.getTid(),joinsite))
|
|
178
|
+
joinedTids.set(*it);
|
|
179
|
+
}
|
|
180
|
+
if(threadStmtToTheadInterLeav[tgr].intersectWithComplement(joinedTids))
|
|
181
|
+
{
|
|
182
|
+
pushToCTSWorkList(tgr);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//@}
|
|
186
|
+
|
|
187
|
+
/// Update Ancestor and sibling threads
|
|
188
|
+
//@{
|
|
189
|
+
void updateAncestorThreads(NodeID tid);
|
|
190
|
+
void updateSiblingThreads(NodeID tid);
|
|
191
|
+
//@}
|
|
192
|
+
|
|
193
|
+
/// Thread curTid can be fully joined by parentTid recursively
|
|
194
|
+
bool isRecurFullJoin(NodeID parentTid, NodeID curTid);
|
|
195
|
+
|
|
196
|
+
/// Whether a join site must join a thread t
|
|
197
|
+
bool isMustJoin(const NodeID curTid, const ICFGNode* joinsite);
|
|
198
|
+
|
|
199
|
+
/// A thread is a multiForked thread if it is in a loop or recursion
|
|
200
|
+
inline bool isMultiForkedThread(NodeID curTid)
|
|
201
|
+
{
|
|
202
|
+
return tct->getTCTNode(curTid)->isMultiforked();
|
|
203
|
+
}
|
|
204
|
+
/// Push calling context
|
|
205
|
+
inline void pushCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee)
|
|
206
|
+
{
|
|
207
|
+
tct->pushCxt(cxt,call,callee);
|
|
208
|
+
}
|
|
209
|
+
/// Match context
|
|
210
|
+
inline bool matchCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee)
|
|
211
|
+
{
|
|
212
|
+
return tct->matchCxt(cxt,call,callee);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/// WorkList helper functions
|
|
216
|
+
//@{
|
|
217
|
+
inline bool pushToCTSWorkList(const CxtThreadStmt& cs)
|
|
218
|
+
{
|
|
219
|
+
return cxtStmtList.push(cs);
|
|
220
|
+
}
|
|
221
|
+
inline CxtThreadStmt popFromCTSWorkList()
|
|
222
|
+
{
|
|
223
|
+
CxtThreadStmt ctp = cxtStmtList.pop();
|
|
224
|
+
return ctp;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/// Whether it is a fork site
|
|
228
|
+
inline bool isTDFork(const ICFGNode* call)
|
|
229
|
+
{
|
|
230
|
+
const CallICFGNode* fork = SVFUtil::dyn_cast<CallICFGNode>(call);
|
|
231
|
+
return fork && tcg->getThreadAPI()->isTDFork(fork);
|
|
232
|
+
}
|
|
233
|
+
/// Whether it is a join site
|
|
234
|
+
inline bool isTDJoin(const ICFGNode* call)
|
|
235
|
+
{
|
|
236
|
+
const CallICFGNode* join = SVFUtil::dyn_cast<CallICFGNode>(call);
|
|
237
|
+
return join && tcg->getThreadAPI()->isTDJoin(join);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/// Return thread id(s) which are directly or indirectly joined at this join site
|
|
241
|
+
NodeBS getDirAndIndJoinedTid(const CallStrCxt& cxt, const ICFGNode* call);
|
|
242
|
+
|
|
243
|
+
/// Whether a context-sensitive join satisfies symmetric loop pattern
|
|
244
|
+
bool hasJoinInSymmetricLoop(const CallStrCxt& cxt, const ICFGNode* call) const;
|
|
245
|
+
|
|
246
|
+
/// Whether a context-sensitive join satisfies symmetric loop pattern
|
|
247
|
+
const LoopBBs& getJoinInSymmetricLoop(const CallStrCxt& cxt, const ICFGNode* call) const;
|
|
248
|
+
|
|
249
|
+
/// Whether thread t1 happens before t2 based on ForkJoin Analysis
|
|
250
|
+
bool isHBPair(NodeID tid1, NodeID tid2);
|
|
251
|
+
|
|
252
|
+
ThreadCallGraph* tcg; ///< TCG
|
|
253
|
+
TCT* tct; ///< TCT
|
|
254
|
+
ForkJoinAnalysis* fja; ///< ForJoin Analysis
|
|
255
|
+
CxtThreadStmtWorkList cxtStmtList; ///< CxtThreadStmt worklist
|
|
256
|
+
ThreadStmtToThreadInterleav threadStmtToTheadInterLeav; /// Map a statement to its thread interleavings
|
|
257
|
+
InstToThreadStmtSetMap instToTSMap; ///< Map an instruction to its ThreadStmtSet
|
|
258
|
+
FuncPairToBool nonCandidateFuncMHPRelMap;
|
|
259
|
+
|
|
260
|
+
|
|
261
|
+
public:
|
|
262
|
+
u32_t numOfTotalQueries; ///< Total number of queries
|
|
263
|
+
u32_t numOfMHPQueries; ///< Number of queries are answered as may-happen-in-parallel
|
|
264
|
+
double interleavingTime;
|
|
265
|
+
double interleavingQueriesTime;
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
/*!
|
|
271
|
+
*
|
|
272
|
+
*/
|
|
273
|
+
class ForkJoinAnalysis
|
|
274
|
+
{
|
|
275
|
+
|
|
276
|
+
public:
|
|
277
|
+
/// semilattice Empty==>TDDead==>TDAlive
|
|
278
|
+
enum ValDomain
|
|
279
|
+
{
|
|
280
|
+
Empty, // initial(dummy) state
|
|
281
|
+
TDAlive, // thread is alive
|
|
282
|
+
TDDead, // thread is dead
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
typedef SVFLoopAndDomInfo::LoopBBs LoopBBs;
|
|
286
|
+
typedef TCT::InstVec InstVec;
|
|
287
|
+
typedef Map<CxtStmt,ValDomain> CxtStmtToAliveFlagMap;
|
|
288
|
+
typedef Map<CxtStmt,NodeBS> CxtStmtToTIDMap;
|
|
289
|
+
typedef Set<NodePair> ThreadPairSet;
|
|
290
|
+
typedef Map<CxtStmt, LoopBBs> CxtStmtToLoopMap;
|
|
291
|
+
typedef FIFOWorkList<CxtStmt> CxtStmtWorkList;
|
|
292
|
+
|
|
293
|
+
ForkJoinAnalysis(TCT* t) : tct(t)
|
|
294
|
+
{
|
|
295
|
+
collectSCEVInfo();
|
|
296
|
+
}
|
|
297
|
+
/// functions
|
|
298
|
+
void collectSCEVInfo();
|
|
299
|
+
|
|
300
|
+
/// context-sensitive forward traversal from each fork site. Generate following results
|
|
301
|
+
/// (1) fork join pair, maps a context-sensitive join site to its corresponding thread ids
|
|
302
|
+
/// (2) never happen-in-parallel thread pairs
|
|
303
|
+
void analyzeForkJoinPair();
|
|
304
|
+
|
|
305
|
+
/// Get directly joined threadIDs based on a context-sensitive join site
|
|
306
|
+
inline NodeBS& getDirectlyJoinedTid(const CxtStmt& cs)
|
|
307
|
+
{
|
|
308
|
+
return directJoinMap[cs];
|
|
309
|
+
}
|
|
310
|
+
/// Get directly and indirectly joined threadIDs based on a context-sensitive join site
|
|
311
|
+
NodeBS getDirAndIndJoinedTid(const CxtStmt& cs);
|
|
312
|
+
|
|
313
|
+
/// Whether a context-sensitive join satisfies symmetric loop pattern
|
|
314
|
+
inline const LoopBBs& getJoinInSymmetricLoop(const CxtStmt& cs) const
|
|
315
|
+
{
|
|
316
|
+
CxtStmtToLoopMap::const_iterator it = cxtJoinInLoop.find(cs);
|
|
317
|
+
assert(it!=cxtJoinInLoop.end() && "does not have the loop");
|
|
318
|
+
return it->second;
|
|
319
|
+
}
|
|
320
|
+
inline bool hasJoinInSymmetricLoop(const CxtStmt& cs) const
|
|
321
|
+
{
|
|
322
|
+
CxtStmtToLoopMap::const_iterator it = cxtJoinInLoop.find(cs);
|
|
323
|
+
return it!=cxtJoinInLoop.end();
|
|
324
|
+
}
|
|
325
|
+
/// Whether thread t1 happens-before thread t2
|
|
326
|
+
inline bool isHBPair(NodeID tid1, NodeID tid2)
|
|
327
|
+
{
|
|
328
|
+
bool nonhp = HBPair.find(std::make_pair(tid1,tid2))!=HBPair.end();
|
|
329
|
+
bool hp = HPPair.find(std::make_pair(tid1,tid2))!=HPPair.end();
|
|
330
|
+
return nonhp && !hp;
|
|
331
|
+
}
|
|
332
|
+
/// Whether t1 fully joins t2
|
|
333
|
+
inline bool isFullJoin(NodeID tid1, NodeID tid2)
|
|
334
|
+
{
|
|
335
|
+
bool full = fullJoin.find(std::make_pair(tid1,tid2))!=fullJoin.end();
|
|
336
|
+
bool partial = partialJoin.find(std::make_pair(tid1,tid2))!=partialJoin.end();
|
|
337
|
+
return full && !partial;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/// Get exit instruction of the start routine function of tid's parent thread
|
|
341
|
+
inline const ICFGNode* getExitInstOfParentRoutineFun(NodeID tid) const
|
|
342
|
+
{
|
|
343
|
+
NodeID parentTid = tct->getParentThread(tid);
|
|
344
|
+
const CxtThread& parentct = tct->getTCTNode(parentTid)->getCxtThread();
|
|
345
|
+
const FunObjVar* parentRoutine = tct->getStartRoutineOfCxtThread(parentct);
|
|
346
|
+
return parentRoutine->getExitBB()->back();
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/// Get loop for join site
|
|
350
|
+
inline LoopBBs& getJoinLoop(const CallICFGNode* inst)
|
|
351
|
+
{
|
|
352
|
+
return tct->getJoinLoop(inst);
|
|
353
|
+
}
|
|
354
|
+
inline bool hasJoinLoop(const CallICFGNode* inst)
|
|
355
|
+
{
|
|
356
|
+
return tct->hasJoinLoop(inst);
|
|
357
|
+
}
|
|
358
|
+
private:
|
|
359
|
+
|
|
360
|
+
/// Handle fork
|
|
361
|
+
void handleFork(const CxtStmt& cts,NodeID rootTid);
|
|
362
|
+
|
|
363
|
+
/// Handle join
|
|
364
|
+
void handleJoin(const CxtStmt& cts,NodeID rootTid);
|
|
365
|
+
|
|
366
|
+
/// Handle call
|
|
367
|
+
void handleCall(const CxtStmt& cts,NodeID rootTid);
|
|
368
|
+
|
|
369
|
+
/// Handle return
|
|
370
|
+
void handleRet(const CxtStmt& cts);
|
|
371
|
+
|
|
372
|
+
/// Handle intra
|
|
373
|
+
void handleIntra(const CxtStmt& cts);
|
|
374
|
+
|
|
375
|
+
/// Return true if the fork and join have the same SCEV
|
|
376
|
+
bool isSameSCEV(const ICFGNode* forkSite, const ICFGNode* joinSite);
|
|
377
|
+
|
|
378
|
+
/// Same loop trip count
|
|
379
|
+
bool sameLoopTripCount(const ICFGNode* forkSite, const ICFGNode* joinSite);
|
|
380
|
+
|
|
381
|
+
/// Whether it is a matched fork join pair
|
|
382
|
+
bool isAliasedForkJoin(const CallICFGNode* forkSite, const CallICFGNode* joinSite)
|
|
383
|
+
{
|
|
384
|
+
return tct->getPTA()->alias(getForkedThread(forkSite)->getId(), getJoinedThread(joinSite)->getId()) && isSameSCEV(forkSite,joinSite);
|
|
385
|
+
}
|
|
386
|
+
/// Mark thread flags for cxtStmt
|
|
387
|
+
//@{
|
|
388
|
+
/// Get the flag for a cxtStmt
|
|
389
|
+
inline ValDomain getMarkedFlag(const CxtStmt& cs)
|
|
390
|
+
{
|
|
391
|
+
CxtStmtToAliveFlagMap::const_iterator it = cxtStmtToAliveFlagMap.find(cs);
|
|
392
|
+
if(it==cxtStmtToAliveFlagMap.end())
|
|
393
|
+
{
|
|
394
|
+
cxtStmtToAliveFlagMap[cs] = Empty;
|
|
395
|
+
return Empty;
|
|
396
|
+
}
|
|
397
|
+
else
|
|
398
|
+
return it->second;
|
|
399
|
+
}
|
|
400
|
+
/// Initialize TDAlive and TDDead flags
|
|
401
|
+
void markCxtStmtFlag(const CxtStmt& tgr, ValDomain flag)
|
|
402
|
+
{
|
|
403
|
+
ValDomain flag_tgr = getMarkedFlag(tgr);
|
|
404
|
+
cxtStmtToAliveFlagMap[tgr] = flag;
|
|
405
|
+
if(flag_tgr!=getMarkedFlag(tgr))
|
|
406
|
+
pushToCTSWorkList(tgr);
|
|
407
|
+
}
|
|
408
|
+
/// Transfer function for marking context-sensitive statement
|
|
409
|
+
void markCxtStmtFlag(const CxtStmt& tgr, const CxtStmt& src)
|
|
410
|
+
{
|
|
411
|
+
ValDomain flag_tgr = getMarkedFlag(tgr);
|
|
412
|
+
ValDomain flag_src = getMarkedFlag(src);
|
|
413
|
+
if(flag_tgr == Empty)
|
|
414
|
+
{
|
|
415
|
+
cxtStmtToAliveFlagMap[tgr] = flag_src;
|
|
416
|
+
}
|
|
417
|
+
else if(flag_tgr == TDDead)
|
|
418
|
+
{
|
|
419
|
+
if(flag_src==TDAlive)
|
|
420
|
+
cxtStmtToAliveFlagMap[tgr] = TDAlive;
|
|
421
|
+
}
|
|
422
|
+
else
|
|
423
|
+
{
|
|
424
|
+
/// alive is at the bottom of the semilattice, nothing needs to be done here
|
|
425
|
+
}
|
|
426
|
+
if(flag_tgr!=getMarkedFlag(tgr))
|
|
427
|
+
{
|
|
428
|
+
pushToCTSWorkList(tgr);
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
/// Clear flags
|
|
432
|
+
inline void clearFlagMap()
|
|
433
|
+
{
|
|
434
|
+
cxtStmtToAliveFlagMap.clear();
|
|
435
|
+
cxtStmtList.clear();
|
|
436
|
+
}
|
|
437
|
+
//@}
|
|
438
|
+
|
|
439
|
+
/// Worklist operations
|
|
440
|
+
//@{
|
|
441
|
+
inline bool pushToCTSWorkList(const CxtStmt& cs)
|
|
442
|
+
{
|
|
443
|
+
return cxtStmtList.push(cs);
|
|
444
|
+
}
|
|
445
|
+
inline CxtStmt popFromCTSWorkList()
|
|
446
|
+
{
|
|
447
|
+
CxtStmt ctp = cxtStmtList.pop();
|
|
448
|
+
return ctp;
|
|
449
|
+
}
|
|
450
|
+
//@}
|
|
451
|
+
|
|
452
|
+
/// Push calling context
|
|
453
|
+
inline void pushCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee)
|
|
454
|
+
{
|
|
455
|
+
tct->pushCxt(cxt,call,callee);
|
|
456
|
+
}
|
|
457
|
+
/// Match context
|
|
458
|
+
inline bool matchCxt(CallStrCxt& cxt, const CallICFGNode* call, const FunObjVar* callee)
|
|
459
|
+
{
|
|
460
|
+
return tct->matchCxt(cxt,call,callee);
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/// Whether it is a fork site
|
|
464
|
+
inline bool isTDFork(const ICFGNode* call)
|
|
465
|
+
{
|
|
466
|
+
const CallICFGNode* fork = SVFUtil::dyn_cast<CallICFGNode>(call);
|
|
467
|
+
return fork && getTCG()->getThreadAPI()->isTDFork(fork);
|
|
468
|
+
}
|
|
469
|
+
/// Whether it is a join site
|
|
470
|
+
inline bool isTDJoin(const ICFGNode* call)
|
|
471
|
+
{
|
|
472
|
+
const CallICFGNode* join = SVFUtil::dyn_cast<CallICFGNode>(call);
|
|
473
|
+
return join && getTCG()->getThreadAPI()->isTDJoin(join);
|
|
474
|
+
}
|
|
475
|
+
/// Get forked thread
|
|
476
|
+
inline const SVFVar* getForkedThread(const CallICFGNode* call)
|
|
477
|
+
{
|
|
478
|
+
return getTCG()->getThreadAPI()->getForkedThread(call);
|
|
479
|
+
}
|
|
480
|
+
/// Get joined thread
|
|
481
|
+
inline const SVFVar* getJoinedThread(const CallICFGNode* call)
|
|
482
|
+
{
|
|
483
|
+
return getTCG()->getThreadAPI()->getJoinedThread(call);
|
|
484
|
+
}
|
|
485
|
+
inline const CallGraph::FunctionSet& getCallee(const ICFGNode* inst, CallGraph::FunctionSet& callees)
|
|
486
|
+
{
|
|
487
|
+
getTCG()->getCallees(SVFUtil::cast<CallICFGNode>(inst), callees);
|
|
488
|
+
return callees;
|
|
489
|
+
}
|
|
490
|
+
/// ThreadCallGraph
|
|
491
|
+
inline ThreadCallGraph* getTCG() const
|
|
492
|
+
{
|
|
493
|
+
return tct->getThreadCallGraph();
|
|
494
|
+
}
|
|
495
|
+
///maps a context-sensitive join site to a thread id
|
|
496
|
+
inline void addDirectlyJoinTID(const CxtStmt& cs, NodeID tid)
|
|
497
|
+
{
|
|
498
|
+
directJoinMap[cs].set(tid);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/// happen-in-parallel pair
|
|
502
|
+
/// happens-before pair
|
|
503
|
+
//@{
|
|
504
|
+
inline void addToHPPair(NodeID tid1, NodeID tid2)
|
|
505
|
+
{
|
|
506
|
+
HPPair.insert(std::make_pair(tid1,tid2));
|
|
507
|
+
HPPair.insert(std::make_pair(tid2,tid1));
|
|
508
|
+
}
|
|
509
|
+
inline void addToHBPair(NodeID tid1, NodeID tid2)
|
|
510
|
+
{
|
|
511
|
+
HBPair.insert(std::make_pair(tid1,tid2));
|
|
512
|
+
}
|
|
513
|
+
//@}
|
|
514
|
+
|
|
515
|
+
/// full join and partial join
|
|
516
|
+
//@{
|
|
517
|
+
inline void addToFullJoin(NodeID tid1, NodeID tid2)
|
|
518
|
+
{
|
|
519
|
+
fullJoin.insert(std::make_pair(tid1,tid2));
|
|
520
|
+
}
|
|
521
|
+
inline void addToPartial(NodeID tid1, NodeID tid2)
|
|
522
|
+
{
|
|
523
|
+
partialJoin.insert(std::make_pair(tid1,tid2));
|
|
524
|
+
}
|
|
525
|
+
//@}
|
|
526
|
+
|
|
527
|
+
/// Add inloop join
|
|
528
|
+
inline void addSymmetricLoopJoin(const CxtStmt& cs, LoopBBs& lp)
|
|
529
|
+
{
|
|
530
|
+
cxtJoinInLoop[cs] = lp;
|
|
531
|
+
}
|
|
532
|
+
TCT* tct;
|
|
533
|
+
CxtStmtToAliveFlagMap cxtStmtToAliveFlagMap; ///< flags for context-sensitive statements
|
|
534
|
+
CxtStmtWorkList cxtStmtList; ///< context-sensitive statement worklist
|
|
535
|
+
CxtStmtToTIDMap directJoinMap; ///< maps a context-sensitive join site to directly joined thread ids
|
|
536
|
+
CxtStmtToTIDMap dirAndIndJoinMap; ///< maps a context-sensitive join site to directly and indirectly joined thread ids
|
|
537
|
+
CxtStmtToLoopMap cxtJoinInLoop; ///< a set of context-sensitive join inside loop
|
|
538
|
+
ThreadPairSet HBPair; ///< thread happens-before pair
|
|
539
|
+
ThreadPairSet HPPair; ///< threads happen-in-parallel
|
|
540
|
+
ThreadPairSet fullJoin; ///< t1 fully joins t2 along all program path
|
|
541
|
+
ThreadPairSet partialJoin; ///< t1 partially joins t2 along some program path(s)
|
|
542
|
+
};
|
|
543
|
+
|
|
544
|
+
} // End namespace SVF
|
|
545
|
+
|
|
546
|
+
#endif /* MHP_H_ */
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
//===- MTA.h -- Analysis of multithreaded programs-------------//
|
|
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 Affero 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 Affero General Public License for more details.
|
|
17
|
+
|
|
18
|
+
// You should have received a copy of the GNU Affero General Public License
|
|
19
|
+
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
20
|
+
//
|
|
21
|
+
//===----------------------------------------------------------------------===//
|
|
22
|
+
|
|
23
|
+
/*
|
|
24
|
+
* MTA.h
|
|
25
|
+
*
|
|
26
|
+
* Created on: May 14, 2014
|
|
27
|
+
* Author: Yulei Sui, Peng Di
|
|
28
|
+
*
|
|
29
|
+
* The implementation is based on
|
|
30
|
+
* Yulei Sui, Peng Di, and Jingling Xue. "Sparse Flow-Sensitive Pointer Analysis for Multithreaded Programs".
|
|
31
|
+
* 2016 International Symposium on Code Generation and Optimization (CGO'16)
|
|
32
|
+
*/
|
|
33
|
+
|
|
34
|
+
#ifndef MTA_H_
|
|
35
|
+
#define MTA_H_
|
|
36
|
+
|
|
37
|
+
#include <set>
|
|
38
|
+
#include <vector>
|
|
39
|
+
#include "SVFIR/SVFValue.h"
|
|
40
|
+
|
|
41
|
+
namespace SVF
|
|
42
|
+
{
|
|
43
|
+
|
|
44
|
+
class PointerAnalysis;
|
|
45
|
+
class AndersenWaveDiff;
|
|
46
|
+
class ThreadCallGraph;
|
|
47
|
+
class MTAStat;
|
|
48
|
+
class TCT;
|
|
49
|
+
class MHP;
|
|
50
|
+
class LockAnalysis;
|
|
51
|
+
|
|
52
|
+
/*!
|
|
53
|
+
* Base data race detector
|
|
54
|
+
*/
|
|
55
|
+
class MTA
|
|
56
|
+
{
|
|
57
|
+
|
|
58
|
+
public:
|
|
59
|
+
/// Constructor
|
|
60
|
+
MTA();
|
|
61
|
+
|
|
62
|
+
/// Destructor
|
|
63
|
+
virtual ~MTA();
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
/// We start the pass here
|
|
67
|
+
virtual bool runOnModule(SVFIR* module);
|
|
68
|
+
/// Compute MHP
|
|
69
|
+
virtual MHP* computeMHP();
|
|
70
|
+
/// Compute locksets
|
|
71
|
+
virtual LockAnalysis* computeLocksets(TCT* tct);
|
|
72
|
+
/// Perform detection
|
|
73
|
+
virtual void detect();
|
|
74
|
+
|
|
75
|
+
// Not implemented for now
|
|
76
|
+
// void dump(Module &module, MHP *mhp, LockAnalysis *lsa);
|
|
77
|
+
|
|
78
|
+
MHP* getMHP()
|
|
79
|
+
{
|
|
80
|
+
return mhp;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
LockAnalysis* getLockAnalysis()
|
|
84
|
+
{
|
|
85
|
+
return lsa;
|
|
86
|
+
}
|
|
87
|
+
private:
|
|
88
|
+
ThreadCallGraph* tcg;
|
|
89
|
+
std::unique_ptr<TCT> tct;
|
|
90
|
+
std::unique_ptr<MTAStat> stat;
|
|
91
|
+
MHP* mhp;
|
|
92
|
+
LockAnalysis* lsa;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
} // End namespace SVF
|
|
96
|
+
|
|
97
|
+
#endif /* MTA_H_ */
|