svf-tools 1.0.317 → 1.0.321
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/Andersen_8cpp.html +1 -1
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/Andersen_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CHGBuilder_8cpp.html +138 -0
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +178 -0
- package/SVF-doxygen/html/html/CHGBuilder_8h.html +95 -0
- package/SVF-doxygen/html/html/CHGBuilder_8h_source.html +109 -0
- package/SVF-doxygen/html/html/CHG_8cpp.html +10 -64
- package/SVF-doxygen/html/html/CHG_8cpp_source.html +31 -108
- package/SVF-doxygen/html/html/CHG_8h.html +9 -3
- package/SVF-doxygen/html/html/CHG_8h_source.html +82 -76
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +37 -33
- package/SVF-doxygen/html/html/ConsG_8h_source.html +32 -32
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +3 -3
- package/SVF-doxygen/html/html/DCHG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/DCHG_8h.html +1 -1
- package/SVF-doxygen/html/html/DCHG_8h_source.html +8 -8
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/DDAClient_8h_source.html +2 -2
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +12 -12
- package/SVF-doxygen/html/html/DataFlowUtil_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ExternalPAG_8cpp.html +1 -1
- package/SVF-doxygen/html/html/ExternalPAG_8cpp_source.html +22 -22
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FSMPTA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +4 -4
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8h_source.html +3 -3
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +16 -16
- package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +6 -6
- package/SVF-doxygen/html/html/GEPTypeBridgeIterator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/GenericGraph_8h_source.html +3 -3
- package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/GraphPrinter_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/ICFG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/IRGraph_8cpp_source.html +20 -21
- package/SVF-doxygen/html/html/IRGraph_8h_source.html +37 -40
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +2 -2
- package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +18 -18
- package/SVF-doxygen/html/html/MemRegion_8h_source.html +2 -2
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/MemSSA_8h_source.html +2 -2
- package/SVF-doxygen/html/html/OfflineConsG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/OfflineConsG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/PAGBuilderFromFile_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +1 -1
- package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +13 -13
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +5 -5
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp.html +1 -2
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +30 -33
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +31 -31
- package/SVF-doxygen/html/html/SVFBasicTypes_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/SVFGBuilder_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +48 -48
- package/SVF-doxygen/html/html/SVFG_8cpp_source.html +36 -36
- package/SVF-doxygen/html/html/SVFG_8h_source.html +25 -25
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp.html +0 -1
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +5 -6
- package/SVF-doxygen/html/html/SVFIRBuilder_8h.html +1 -7
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +90 -85
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +70 -62
- package/SVF-doxygen/html/html/SVFIR_8h_source.html +168 -182
- package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +39 -23
- package/SVF-doxygen/html/html/SVFStatements_8h.html +6 -0
- package/SVF-doxygen/html/html/SVFStatements_8h_source.html +146 -94
- package/SVF-doxygen/html/html/SVFVariables_8h_source.html +2 -2
- package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/TCT_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/TCT_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp.html +1 -1
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +9 -9
- package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/VFGEdge_8h_source.html +1 -1
- package/SVF-doxygen/html/html/VFGNode_8h.html +2 -0
- package/SVF-doxygen/html/html/VFGNode_8h_source.html +143 -126
- package/SVF-doxygen/html/html/VFG_8cpp_source.html +136 -129
- package/SVF-doxygen/html/html/VFG_8h_source.html +144 -133
- package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +4 -4
- package/SVF-doxygen/html/html/annotated.html +265 -261
- package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode-members.html +75 -74
- package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode-members.html +75 -74
- package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode-members.html +73 -72
- package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +31 -30
- package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode-members.html +75 -74
- package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +35 -34
- package/SVF-doxygen/html/html/classSVF_1_1AddrCGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AddrCGEdge.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1AddrPE-members.html +42 -39
- package/SVF-doxygen/html/html/classSVF_1_1AddrPE.html +27 -22
- package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode-members.html +77 -76
- package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +23 -22
- package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +18 -18
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode-members.html +69 -68
- package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +30 -29
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +20 -20
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPPE-members.html +49 -28
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPPE.html +295 -34
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPPE.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode-members.html +76 -75
- package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +12 -11
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt-members.html +70 -22
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +633 -89
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode-members.html +164 -0
- package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.html +694 -0
- package/SVF-doxygen/html/html/classSVF_1_1BranchVFGNode.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1CHEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CHEdge.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder-members.html +100 -0
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +777 -0
- package/SVF-doxygen/html/html/classSVF_1_1CHGraph-members.html +31 -46
- package/SVF-doxygen/html/html/classSVF_1_1CHGraph.html +103 -651
- package/SVF-doxygen/html/html/classSVF_1_1CHNode.html +54 -54
- package/SVF-doxygen/html/html/classSVF_1_1CallCFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CallCFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallDirSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CallDirSVFGEdge.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CallIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CallPE-members.html +48 -45
- package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +33 -28
- package/SVF-doxygen/html/html/classSVF_1_1CmpPE-members.html +49 -28
- package/SVF-doxygen/html/html/classSVF_1_1CmpPE.html +295 -34
- package/SVF-doxygen/html/html/classSVF_1_1CmpPE.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode-members.html +79 -78
- package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +13 -12
- package/SVF-doxygen/html/html/classSVF_1_1CommonCHGraph.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +90 -86
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1CopyCGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CopyCGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CopyPE-members.html +45 -42
- package/SVF-doxygen/html/html/classSVF_1_1CopyPE.html +27 -22
- package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode-members.html +80 -79
- package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +11 -10
- package/SVF-doxygen/html/html/classSVF_1_1DCHEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DCHEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1DDAClient.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1DirectSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DirectSVFGEdge.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DummyVersionPropSVFGNode-members.html +72 -71
- package/SVF-doxygen/html/html/classSVF_1_1DummyVersionPropSVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1ExternalPAG.html +22 -22
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +22 -22
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode-members.html +76 -75
- package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode-members.html +76 -75
- package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode-members.html +76 -75
- package/SVF-doxygen/html/html/classSVF_1_1FormalParmVFGNode.html +38 -37
- package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode-members.html +79 -78
- package/SVF-doxygen/html/html/classSVF_1_1FormalRetVFGNode.html +38 -37
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1GenericEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +8 -7
- package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1GepCGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepCGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1GepPE-members.html +45 -42
- package/SVF-doxygen/html/html/classSVF_1_1GepPE.html +22 -17
- package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode-members.html +80 -79
- package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +23 -22
- package/SVF-doxygen/html/html/classSVF_1_1HareParForEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1HareParForEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ICFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1IRGraph-members.html +36 -37
- package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +149 -163
- package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IndirectSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode-members.html +88 -87
- package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode-members.html +86 -85
- package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +46 -45
- package/SVF-doxygen/html/html/classSVF_1_1IntraCFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraCFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1IntraDirSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraDirSVFGEdge.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IntraIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode-members.html +85 -84
- package/SVF-doxygen/html/html/classSVF_1_1IntraMSSAPHISVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode-members.html +84 -83
- package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +33 -32
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1LoadCGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LoadCGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LoadPE-members.html +45 -42
- package/SVF-doxygen/html/html/classSVF_1_1LoadPE.html +27 -22
- package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode-members.html +80 -79
- package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +11 -10
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +24 -24
- package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode-members.html +70 -69
- package/SVF-doxygen/html/html/classSVF_1_1MRSVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode-members.html +81 -80
- package/SVF-doxygen/html/html/classSVF_1_1MSSAPHISVFGNode.html +10 -9
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt-members.html +143 -0
- package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt.html +669 -0
- package/SVF-doxygen/html/html/classSVF_1_1MultiOpndStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepCGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepCGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepPE-members.html +47 -44
- package/SVF-doxygen/html/html/classSVF_1_1NormalGepPE.html +34 -29
- package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode-members.html +66 -65
- package/SVF-doxygen/html/html/classSVF_1_1NullPtrVFGNode.html +37 -36
- package/SVF-doxygen/html/html/classSVF_1_1OfflineConsG.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +17 -16
- package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode-members.html +77 -76
- package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +44 -43
- package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1PhiPE-members.html +153 -0
- package/SVF-doxygen/html/html/classSVF_1_1PhiPE.html +717 -0
- package/SVF-doxygen/html/html/classSVF_1_1PhiPE.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +77 -79
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RetCFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1RetCFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RetDirSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1RetDirSVFGEdge.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1RetIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1RetPE-members.html +48 -45
- package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +33 -28
- package/SVF-doxygen/html/html/classSVF_1_1SVFG-members.html +90 -86
- package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +81 -71
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +16 -16
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT-members.html +105 -101
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +149 -138
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR-members.html +106 -119
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +621 -1090
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder-members.html +14 -12
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +401 -288
- package/SVF-doxygen/html/html/classSVF_1_1SVFStmt-members.html +41 -35
- package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.html +174 -37
- package/SVF-doxygen/html/html/classSVF_1_1SVFStmt.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1SaberAnnotator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode-members.html +76 -75
- package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode.html +14 -13
- package/SVF-doxygen/html/html/classSVF_1_1StoreCGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1StoreCGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StorePE-members.html +45 -42
- package/SVF-doxygen/html/html/classSVF_1_1StorePE.html +27 -22
- package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode-members.html +80 -79
- package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +11 -10
- package/SVF-doxygen/html/html/classSVF_1_1TCTEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TCTEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE-members.html +49 -46
- package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +22 -17
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE-members.html +49 -46
- package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +22 -17
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ThreadForkEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ThreadForkEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ThreadJoinEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ThreadJoinEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ThreadMHPIndSVFGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +12 -12
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPPE-members.html +56 -43
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPPE.html +329 -30
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode-members.html +34 -32
- package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +63 -30
- package/SVF-doxygen/html/html/classSVF_1_1VFG-members.html +52 -48
- package/SVF-doxygen/html/html/classSVF_1_1VFG.html +515 -441
- package/SVF-doxygen/html/html/classSVF_1_1VFGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VFGEdge.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1VFGNode-members.html +65 -64
- package/SVF-doxygen/html/html/classSVF_1_1VFGNode.html +22 -18
- package/SVF-doxygen/html/html/classSVF_1_1VFGNode.png +0 -0
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepCGEdge-members.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepCGEdge.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepPE-members.html +47 -44
- package/SVF-doxygen/html/html/classSVF_1_1VariantGepPE.html +28 -23
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +8 -8
- package/SVF-doxygen/html/html/classes.html +95 -94
- package/SVF-doxygen/html/html/dda_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/dir_1870ebf480d659cc38d2dd7ac3aa8993.html +2 -2
- package/SVF-doxygen/html/html/dir_5840dc76920ee0f379cd88b55fa041fd.html +1 -1
- package/SVF-doxygen/html/html/dir_770a542efe75a1b68c109cb4e4290224.html +1 -3
- package/SVF-doxygen/html/html/dir_fa02919a30fec2d2c2d591b4d920d648.html +2 -2
- package/SVF-doxygen/html/html/files.html +18 -19
- package/SVF-doxygen/html/html/functions_0x7e.html +0 -3
- package/SVF-doxygen/html/html/functions_a.html +35 -36
- package/SVF-doxygen/html/html/functions_b.html +24 -17
- package/SVF-doxygen/html/html/functions_c.html +44 -43
- package/SVF-doxygen/html/html/functions_d.html +0 -3
- package/SVF-doxygen/html/html/functions_e.html +7 -9
- package/SVF-doxygen/html/html/functions_eval_b.html +4 -0
- package/SVF-doxygen/html/html/functions_eval_p.html +3 -0
- package/SVF-doxygen/html/html/functions_f.html +6 -15
- package/SVF-doxygen/html/html/functions_func.html +40 -38
- package/SVF-doxygen/html/html/functions_func_0x7e.html +0 -3
- package/SVF-doxygen/html/html/functions_func_b.html +14 -8
- package/SVF-doxygen/html/html/functions_func_c.html +32 -28
- package/SVF-doxygen/html/html/functions_func_d.html +0 -3
- package/SVF-doxygen/html/html/functions_func_e.html +0 -3
- package/SVF-doxygen/html/html/functions_func_g.html +92 -60
- package/SVF-doxygen/html/html/functions_func_h.html +3 -9
- package/SVF-doxygen/html/html/functions_func_i.html +12 -16
- package/SVF-doxygen/html/html/functions_func_m.html +6 -0
- package/SVF-doxygen/html/html/functions_func_o.html +11 -4
- package/SVF-doxygen/html/html/functions_func_p.html +6 -6
- package/SVF-doxygen/html/html/functions_func_r.html +3 -4
- package/SVF-doxygen/html/html/functions_func_s.html +6 -9
- package/SVF-doxygen/html/html/functions_func_t.html +14 -11
- package/SVF-doxygen/html/html/functions_g.html +91 -59
- package/SVF-doxygen/html/html/functions_h.html +2 -11
- package/SVF-doxygen/html/html/functions_i.html +12 -16
- package/SVF-doxygen/html/html/functions_l.html +6 -6
- package/SVF-doxygen/html/html/functions_m.html +9 -0
- package/SVF-doxygen/html/html/functions_n.html +6 -6
- package/SVF-doxygen/html/html/functions_o.html +31 -16
- package/SVF-doxygen/html/html/functions_p.html +23 -18
- package/SVF-doxygen/html/html/functions_r.html +4 -8
- package/SVF-doxygen/html/html/functions_rela.html +3 -0
- package/SVF-doxygen/html/html/functions_s.html +14 -16
- package/SVF-doxygen/html/html/functions_t.html +18 -15
- package/SVF-doxygen/html/html/functions_type_b.html +0 -6
- package/SVF-doxygen/html/html/functions_type_c.html +2 -7
- package/SVF-doxygen/html/html/functions_type_o.html +3 -0
- package/SVF-doxygen/html/html/functions_type_p.html +4 -1
- package/SVF-doxygen/html/html/functions_type_u.html +0 -6
- package/SVF-doxygen/html/html/functions_type_v.html +3 -0
- package/SVF-doxygen/html/html/functions_type_w.html +1 -0
- package/SVF-doxygen/html/html/functions_u.html +4 -13
- package/SVF-doxygen/html/html/functions_v.html +8 -5
- package/SVF-doxygen/html/html/functions_vars_a.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_b.html +6 -3
- package/SVF-doxygen/html/html/functions_vars_c.html +5 -4
- package/SVF-doxygen/html/html/functions_vars_e.html +1 -2
- package/SVF-doxygen/html/html/functions_vars_f.html +0 -9
- package/SVF-doxygen/html/html/functions_vars_h.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_m.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_o.html +8 -3
- package/SVF-doxygen/html/html/functions_vars_p.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_r.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_s.html +3 -0
- package/SVF-doxygen/html/html/functions_vars_u.html +0 -3
- package/SVF-doxygen/html/html/functions_vars_v.html +3 -3
- package/SVF-doxygen/html/html/functions_w.html +9 -4
- package/SVF-doxygen/html/html/globals_d.html +0 -4
- package/SVF-doxygen/html/html/globals_e.html +6 -9
- package/SVF-doxygen/html/html/globals_func_d.html +0 -3
- package/SVF-doxygen/html/html/globals_func_e.html +6 -9
- package/SVF-doxygen/html/html/globals_func_g.html +2 -5
- package/SVF-doxygen/html/html/globals_g.html +0 -3
- package/SVF-doxygen/html/html/globals_o.html +0 -9
- package/SVF-doxygen/html/html/globals_p.html +1 -1
- package/SVF-doxygen/html/html/globals_r.html +3 -3
- package/SVF-doxygen/html/html/globals_s.html +3 -3
- package/SVF-doxygen/html/html/globals_vars.html +2 -5
- package/SVF-doxygen/html/html/globals_z.html +1 -1
- package/SVF-doxygen/html/html/hierarchy.html +105 -101
- package/SVF-doxygen/html/html/menudata.js +0 -1
- package/SVF-doxygen/html/html/mta_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/namespaceSVF.html +27 -37
- package/SVF-doxygen/html/html/namespacemembers_p.html +0 -3
- package/SVF-doxygen/html/html/namespacemembers_type_p.html +0 -3
- package/SVF-doxygen/html/html/saber_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/search/all_1.js +20 -21
- package/SVF-doxygen/html/html/search/all_10.js +11 -10
- package/SVF-doxygen/html/html/search/all_12.js +6 -7
- package/SVF-doxygen/html/html/search/all_13.js +13 -13
- package/SVF-doxygen/html/html/search/all_14.js +3 -3
- package/SVF-doxygen/html/html/search/all_15.js +2 -4
- package/SVF-doxygen/html/html/search/all_16.js +2 -2
- package/SVF-doxygen/html/html/search/all_17.js +1 -1
- package/SVF-doxygen/html/html/search/all_1a.js +1 -1
- package/SVF-doxygen/html/html/search/all_1b.js +0 -1
- package/SVF-doxygen/html/html/search/all_2.js +13 -10
- package/SVF-doxygen/html/html/search/all_3.js +15 -15
- package/SVF-doxygen/html/html/search/all_4.js +2 -4
- package/SVF-doxygen/html/html/search/all_5.js +3 -6
- package/SVF-doxygen/html/html/search/all_6.js +1 -4
- package/SVF-doxygen/html/html/search/all_7.js +34 -34
- package/SVF-doxygen/html/html/search/all_8.js +2 -5
- package/SVF-doxygen/html/html/search/all_9.js +4 -5
- package/SVF-doxygen/html/html/search/all_b.js +1 -1
- package/SVF-doxygen/html/html/search/all_c.js +3 -3
- package/SVF-doxygen/html/html/search/all_d.js +6 -3
- package/SVF-doxygen/html/html/search/all_e.js +6 -6
- package/SVF-doxygen/html/html/search/all_f.js +7 -8
- package/SVF-doxygen/html/html/search/classes_1.js +2 -0
- package/SVF-doxygen/html/html/search/classes_2.js +1 -0
- package/SVF-doxygen/html/html/search/classes_4.js +1 -2
- package/SVF-doxygen/html/html/search/classes_a.js +1 -0
- package/SVF-doxygen/html/html/search/classes_d.js +1 -0
- package/SVF-doxygen/html/html/search/enumvalues_1.js +1 -0
- package/SVF-doxygen/html/html/search/enumvalues_d.js +1 -0
- package/SVF-doxygen/html/html/search/files_2.js +2 -1
- package/SVF-doxygen/html/html/search/files_4.js +1 -3
- package/SVF-doxygen/html/html/search/functions_0.js +20 -20
- package/SVF-doxygen/html/html/search/functions_1.js +10 -8
- package/SVF-doxygen/html/html/search/functions_10.js +2 -3
- package/SVF-doxygen/html/html/search/functions_11.js +1 -1
- package/SVF-doxygen/html/html/search/functions_12.js +1 -1
- package/SVF-doxygen/html/html/search/functions_13.js +1 -1
- package/SVF-doxygen/html/html/search/functions_16.js +0 -1
- package/SVF-doxygen/html/html/search/functions_2.js +8 -8
- package/SVF-doxygen/html/html/search/functions_3.js +2 -4
- package/SVF-doxygen/html/html/search/functions_4.js +0 -2
- package/SVF-doxygen/html/html/search/functions_6.js +34 -34
- package/SVF-doxygen/html/html/search/functions_7.js +2 -4
- package/SVF-doxygen/html/html/search/functions_8.js +3 -4
- package/SVF-doxygen/html/html/search/functions_b.js +2 -0
- package/SVF-doxygen/html/html/search/functions_d.js +4 -6
- package/SVF-doxygen/html/html/search/functions_e.js +1 -1
- package/SVF-doxygen/html/html/search/functions_f.js +2 -2
- package/SVF-doxygen/html/html/search/related_0.js +1 -2
- package/SVF-doxygen/html/html/search/related_1.js +2 -1
- package/SVF-doxygen/html/html/search/related_2.js +1 -1
- package/SVF-doxygen/html/html/search/related_3.js +1 -2
- package/SVF-doxygen/html/html/search/related_4.js +2 -1
- package/SVF-doxygen/html/html/search/related_5.js +1 -4
- package/SVF-doxygen/html/html/search/related_6.js +4 -1
- package/SVF-doxygen/html/html/search/related_7.js +1 -5
- package/SVF-doxygen/html/html/search/related_8.js +5 -2
- package/SVF-doxygen/html/html/search/related_9.js +2 -1
- package/SVF-doxygen/html/html/search/related_a.html +26 -0
- package/SVF-doxygen/html/html/search/related_a.js +4 -0
- package/SVF-doxygen/html/html/search/searchdata.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_1.js +0 -2
- package/SVF-doxygen/html/html/search/typedefs_13.js +0 -2
- package/SVF-doxygen/html/html/search/typedefs_14.js +1 -0
- package/SVF-doxygen/html/html/search/typedefs_15.js +1 -1
- package/SVF-doxygen/html/html/search/typedefs_2.js +1 -3
- package/SVF-doxygen/html/html/search/typedefs_d.js +2 -2
- package/SVF-doxygen/html/html/search/typedefs_e.js +1 -0
- package/SVF-doxygen/html/html/search/typedefs_f.js +2 -2
- package/SVF-doxygen/html/html/search/variables_1.js +0 -1
- package/SVF-doxygen/html/html/search/variables_10.js +2 -1
- package/SVF-doxygen/html/html/search/variables_12.js +0 -1
- package/SVF-doxygen/html/html/search/variables_13.js +2 -1
- package/SVF-doxygen/html/html/search/variables_14.js +1 -1
- package/SVF-doxygen/html/html/search/variables_15.js +1 -2
- package/SVF-doxygen/html/html/search/variables_16.js +1 -1
- package/SVF-doxygen/html/html/search/variables_1a.js +1 -1
- package/SVF-doxygen/html/html/search/variables_2.js +2 -1
- package/SVF-doxygen/html/html/search/variables_3.js +2 -2
- package/SVF-doxygen/html/html/search/variables_4.js +0 -1
- package/SVF-doxygen/html/html/search/variables_5.js +1 -1
- package/SVF-doxygen/html/html/search/variables_6.js +1 -4
- package/SVF-doxygen/html/html/search/variables_8.js +0 -1
- package/SVF-doxygen/html/html/search/variables_b.js +1 -1
- package/SVF-doxygen/html/html/search/variables_d.js +2 -1
- package/SVF-doxygen/html/html/search/variables_e.js +1 -1
- package/SVF-doxygen/html/html/search/variables_f.js +2 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01CHGraph_01_5_01_4.html +14 -14
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +16 -16
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01IRGraph_01_5_01_4.html +18 -18
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +11 -11
- package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4.html +29 -29
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1CHNode_01_5_01_4_01_4.html +2 -2
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1SVFVar_01_5_01_4_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01Inverse_3_01SVF_1_1VFGNode_01_5_01_4_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CHGraph_01_5_01_4.html +3 -3
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1CHNode_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1IRGraph_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1SVFVar_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1VFGNode_01_5_01_4.html +1 -1
- package/SVF-doxygen/html/html/structllvm_1_1GraphTraits_3_01SVF_1_1VFG_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +5 -6
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/wpa_8cpp_source.html +1 -1
- package/include/{SVF-FE → Graphs}/CHG.h +37 -20
- package/include/Graphs/GenericGraph.h +1 -1
- package/include/Graphs/IRGraph.h +6 -15
- package/include/Graphs/SVFGOPT.h +3 -2
- package/include/Graphs/VFG.h +42 -41
- package/include/Graphs/VFGNode.h +60 -7
- package/include/MemoryModel/SVFIR.h +93 -159
- package/include/MemoryModel/SVFStatements.h +253 -21
- package/include/SVF-FE/CHGBuilder.h +69 -0
- package/include/SVF-FE/DCHG.h +1 -1
- package/include/SVF-FE/SVFIRBuilder.h +21 -8
- package/lib/Graphs/CHG.cpp +280 -0
- package/lib/Graphs/ConsG.cpp +9 -0
- package/lib/Graphs/IRGraph.cpp +23 -8
- package/lib/Graphs/VFG.cpp +45 -19
- package/lib/MSSA/SVFGBuilder.cpp +3 -2
- package/lib/MemoryModel/PAGBuilderFromFile.cpp +9 -3
- package/lib/MemoryModel/PointerAnalysis.cpp +3 -5
- package/lib/MemoryModel/SVFIR.cpp +68 -12
- package/lib/MemoryModel/SVFStatements.cpp +65 -4
- package/lib/SVF-FE/{CHG.cpp → CHGBuilder.cpp} +82 -324
- package/lib/SVF-FE/SVFIRBuilder.cpp +58 -57
- package/lib/WPA/Andersen.cpp +1 -1
- package/lib/WPA/TypeAnalysis.cpp +1 -1
- package/package.json +1 -1
- package/tools/Example/svf-ex.cpp +1 -1
- package/include/Graphs/ExternalPAG.h +0 -147
- package/include/SVF-FE/CommonCHG.h +0 -49
- package/lib/Graphs/ExternalPAG.cpp +0 -623
|
@@ -66,15 +66,14 @@ $(function() {
|
|
|
66
66
|
<div class="title">ExternalPAG.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="ExternalPAG_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- ExternalPAG.cpp -- Program assignment graph ---------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * ExternalPAG.cpp</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Created on: Sep 22, 2018</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> */</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include <fstream></span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include <sstream></span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="SVFIR_8h.html">MemoryModel/SVFIR.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include "<a class="code" href="ExternalPAG_8h.html">Graphs/ExternalPAG.h</a>"</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "<a class="code" href="BasicTypes_8h.html">Util/BasicTypes.h</a>"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include "<a class="code" href="ICFG_8h.html">Graphs/ICFG.h</a>"</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> </div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> llvm::cl::list<std::string> <a class="code" href="ExternalPAG_8cpp.html#aa6aef64c49ac60c404305e2e3d0bb312">ExternalPAGArgs</a>(<span class="stringliteral">"extpags"</span>,</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  llvm::cl::desc(<span class="stringliteral">"ExternalPAGs to use during SVFIR construction (format: func1@/path/to/graph,func2@/foo,..."</span>),</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  llvm::cl::CommaSeparated);</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> llvm::cl::list<std::string> <a class="code" href="ExternalPAG_8cpp.html#af98d1169e98f5fca2139efbe0c5b0170">DumpPAGFunctions</a>(<span class="stringliteral">"dump-function-pags"</span>,</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  llvm::cl::desc(<span class="stringliteral">"Dump SVFIR for functions"</span>),</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  llvm::cl::CommaSeparated);</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFFunction*, Map<int, PAGNode *></a>></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <a class="code" href="classSVF_1_1ExternalPAG.html#a851dbb85d0b80c3942398732ba900e41">ExternalPAG::functionToExternalPAGEntries</a>;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFFunction*, PAGNode *></a> <a class="code" href="classSVF_1_1ExternalPAG.html#aa478936bbf34d5cc23c6322a61a6885e">ExternalPAG::functionToExternalPAGReturns</a>;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> </div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> std::vector<std::pair<std::string, std::string>></div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a50cf3da29657a69d66396a6951f628d8"> 36</a></span>  <a class="code" href="classSVF_1_1ExternalPAG.html#a50cf3da29657a69d66396a6951f628d8">ExternalPAG::parseExternalPAGs</a>(llvm::cl::list<std::string> &extpagsArgs)</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> {</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  std::vector<std::pair<std::string, std::string>> parsedExternalPAGs;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> arg = extpagsArgs.begin(); arg != extpagsArgs.end();</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  ++arg)</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  {</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  std::stringstream ss(*arg);</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  std::string functionName;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  getline(ss, functionName, <span class="charliteral">'@'</span>);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  std::string path;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  getline(ss, path);</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  parsedExternalPAGs.push_back(</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  std::pair<std::string, std::string>(functionName, path));</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  }</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> </div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">return</span> parsedExternalPAGs;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> }</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a865a75aec231c9122842d2bdafeb4f6b"> 54</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a865a75aec231c9122842d2bdafeb4f6b">ExternalPAG::initialise</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>*)</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  std::vector<std::pair<std::string, std::string>> parsedExternalPAGs</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  = <a class="code" href="classSVF_1_1ExternalPAG.html#a50cf3da29657a69d66396a6951f628d8">ExternalPAG::parseExternalPAGs</a>(<a class="code" href="ExternalPAG_8cpp.html#aa6aef64c49ac60c404305e2e3d0bb312">ExternalPAGArgs</a>);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// Build ext PAGs (and add them) first to use them in SVFIR construction.</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extpagPair= parsedExternalPAGs.begin();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  extpagPair != parsedExternalPAGs.end(); ++extpagPair)</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  {</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  std::string fname = extpagPair->first;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  std::string path = extpagPair->second;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <a class="code" href="classSVF_1_1ExternalPAG.html">ExternalPAG</a> extpag = <a class="code" href="classSVF_1_1ExternalPAG.html">ExternalPAG</a>(fname);</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  extpag.<a class="code" href="classSVF_1_1ExternalPAG.html#ae010036c742cfdf95fad5355f0100984">readFromFile</a>(path);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  extpag.<a class="code" href="classSVF_1_1ExternalPAG.html#a6e8b309508de040504ad4b2ce6a5de28">addExternalPAG</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a4f457db1cfa0d4f94762a306c0ac3757">getFunction</a>(fname));</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  }</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> }</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a7a82128508395830433145977dbe37c0"> 72</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a7a82128508395830433145977dbe37c0">ExternalPAG::connectCallsiteToExternalPAG</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> *cs)</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> {</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a> *pag = <a class="code" href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVFIR::getPAG</a>();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* <span class="keyword">function</span> = cs-><a class="code" href="classSVF_1_1CallSite.html#ae9b0172e29199f2a938d7cf9e42241cf">getCalledFunction</a>();</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  std::string functionName = <span class="keyword">function</span>->getName().str();</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFun = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a547b3bc62de65b9dbfc6dee55c063dd7">getSVFFunction</a>(<span class="keyword">function</span>);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keywordflow">if</span> (!hasExternalPAG(svfFun)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<int, PAGNode*></a> argNodes =</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  functionToExternalPAGEntries[svfFun];</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *retNode = functionToExternalPAGReturns[svfFun];</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="comment">// Handle the return.</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordflow">if</span> (llvm::isa<PointerType>(cs-><a class="code" href="classSVF_1_1CallSite.html#a9b7d53a345875e4e6c72eb23ac6475de">getType</a>()))</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  {</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = pag-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(cs-><a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="comment">// Does it actually return a pointer?</span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(function->getReturnType()))</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keywordflow">if</span> (retNode != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  {</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* icfgNode = pag-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a7d10e8a815c836a070d35850f817a18c">getCallBlockNode</a>(cs-><a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a12fef4ec0537b26947eb0ab10799f29f">addRetPE</a>(retNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), dstrec, icfgNode);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="comment">// This is a int2ptr cast during parameter passing</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#aba877353c0eb383bf5ce216e7cb605bc">addBlackHoleAddrPE</a>(dstrec);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  }</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  }</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="comment">// Handle the arguments;</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="comment">// Actual arguments.</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <a class="code" href="classSVF_1_1CallSite.html#ac1cdfe5e54026960a23142e26b3150ff">CallSite::arg_iterator</a> itA = cs-><a class="code" href="classSVF_1_1CallSite.html#aabc0054b7f4e06b7ca0b6072746984e6">arg_begin</a>(), ieA = cs-><a class="code" href="classSVF_1_1CallSite.html#a46e8ffe430bb2711abaafc9d7864909e">arg_end</a>();</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  Function::const_arg_iterator itF = <span class="keyword">function</span>->arg_begin(),</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  ieF = <span class="keyword">function</span>->arg_end();</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="comment">// Formal arguments.</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordtype">size_t</span> formalNodeIndex = 0;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">for</span> (; itF != ieF ; ++itA, ++itF, ++formalNodeIndex)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">if</span> (itA == ieA)</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">// When unneeded args are left empty, e.g. Linux kernel.</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="comment">// Formal arg node is from the extpag, actual arg node would come from</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="comment">// the main pag.</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *formalArgNode = argNodes[formalNodeIndex];</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> actualArgNodeId = pag-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(*itA);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::Value</a> *formalArg = &*itF;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<PointerType>(formalArg->getType())) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>((*itA)->getType()))</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* icfgNode = pag-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a7d10e8a815c836a070d35850f817a18c">getCallBlockNode</a>(cs-><a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a9e99fcf29016ef401f53491ec54a4053">addCallPE</a>(actualArgNodeId, formalArgNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), icfgNode);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="comment">// This is a int2ptr cast during parameter passing</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="comment">//addFormalParamBlackHoleAddrEdge(formalArgNode->getId(), &*itF);</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"you need to set the current location of this PAGEdge"</span>);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#aba877353c0eb383bf5ce216e7cb605bc">addBlackHoleAddrPE</a>(formalArgNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  }</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="comment">// TODO proofread.</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  }</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a3a798aa788c5f1c200b7e2719660b5ec"> 148</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a3a798aa788c5f1c200b7e2719660b5ec">ExternalPAG::hasExternalPAG</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span>)</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> {</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordtype">bool</span> ret = functionToExternalPAGEntries.find(<span class="keyword">function</span>)</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  != functionToExternalPAGEntries.end();</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> }</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> </div><div class="line"><a name="l00155"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#abe9bb682282b331d0d8ca9d000d63443"> 155</a></span> <span class="keywordtype">int</span> <a class="code" href="ExternalPAG_8cpp.html#abe9bb682282b331d0d8ca9d000d63443">getArgNo</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *arg)</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> {</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordtype">int</span> argNo = 0;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = function->getLLVMFun()->arg_begin(); it != <span class="keyword">function</span>->getLLVMFun()->arg_end();</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  ++it, ++argNo)</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  {</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">if</span> (arg->getName() == it->getName()) <span class="keywordflow">return</span> argNo;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> }</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926"> 167</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode)</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> {</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  o << pagNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="comment">// TODO: is this check enough?</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1ObjPN.html#a5e7e7b1a2d78146e50ec36d99b0a3608">ObjPN::classof</a>(pagNode)) o << <span class="stringliteral">"v"</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">else</span> o << <span class="stringliteral">"o"</span>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> }</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> </div><div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38"> 175</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode)</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(o, pagNode);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> </div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#a6f48353c8b444aeff540d1e228be2e15"> 181</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode, <span class="keywordtype">int</span> argno)</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> {</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(o, pagNode);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  o << <span class="stringliteral">" "</span> << argno;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#aa31cdd956df22eadb2e1b1686d414012"> 188</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode,</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  std::string trail)</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> {</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(o, pagNode);</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  o << <span class="stringliteral">" "</span> << trail;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> }</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#a883ca6e5a9c61af716b49ba81adf4ca3"> 196</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a883ca6e5a9c61af716b49ba81adf4ca3">outputPAGEdge</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFStmt.html">PAGEdge</a> *pagEdge)</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcId = pagEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = pagEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> offset = 0;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  std::string edgeKind = <span class="stringliteral">"-"</span>;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">switch</span> (pagEdge-><a class="code" href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">getEdgeKind</a>())</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a0a9a0f650e864e89b7cbb3dc8c8aa197">PAGEdge::Addr</a>:</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  edgeKind = <span class="stringliteral">"addr"</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad3469cdfb64f05163b5310b731b221da">PAGEdge::Copy</a>:</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  edgeKind = <span class="stringliteral">"copy"</span>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9aa0f700b514c431ec5329aec49df56dcc">PAGEdge::Store</a>:</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  edgeKind = <span class="stringliteral">"store"</span>;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a62ac8480c43fcc657c631ec0003b15d5">PAGEdge::Load</a>:</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  edgeKind = <span class="stringliteral">"load"</span>;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a97ca16eba4c5f92e16388f0cdbcfcc00">PAGEdge::Call</a>:</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  edgeKind = <span class="stringliteral">"call"</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a8d269a45adf13e69468f0357222ab2af">PAGEdge::Ret</a>:</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  edgeKind = <span class="stringliteral">"ret"</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ac2089ffeab3f27354b2094758c805746">PAGEdge::NormalGep</a>:</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  edgeKind = <span class="stringliteral">"gep"</span>;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a6b3a8902fc2aa68428e271012861a2a2">PAGEdge::VariantGep</a>:</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  edgeKind = <span class="stringliteral">"variant-gep"</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a610d6662d1814cffbf23db29e7e620c0">PAGEdge::Cmp</a>:</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  edgeKind = <span class="stringliteral">"cmp"</span>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad58f5e59c55e1ffd23b83d16224fed13">PAGEdge::BinaryOp</a>:</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  edgeKind = <span class="stringliteral">"binary-op"</span>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad2a5e6fe0f2b5fefb53abb9e91c57688">PAGEdge::UnaryOp</a>:</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  edgeKind = <span class="stringliteral">"unary-op"</span>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a375b956af2119d7abca8f1995f7701fd">PAGEdge::ThreadFork</a>:</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"dump-function-pags: found ThreadFork edge.\n"</span>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a3c3f8883c2d3b50aef6331d5da97ffb0">PAGEdge::ThreadJoin</a>:</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"dump-function-pags: found ThreadJoin edge.\n"</span>;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  }</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> </div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NormalGepPE.html#a2d48376e5806de43fa0a916b807fb2c3">NormalGepPE::classof</a>(pagEdge)) offset =</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keyword">static_cast<</span><a class="code" href="classSVF_1_1NormalGepPE.html">NormalGepPE</a> *<span class="keyword">></span>(pagEdge)->getOffset();</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> </div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  o << srcId << <span class="stringliteral">" "</span> << edgeKind << <span class="stringliteral">" "</span> << dstId << <span class="stringliteral">" "</span> << offset << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> </div><div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#acee9fa409f3649dcf2c0f5e6da66ceb0"> 256</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExternalPAG.html#acee9fa409f3649dcf2c0f5e6da66ceb0">ExternalPAG::dumpFunctions</a>(std::vector<std::string> functions)</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> {</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a> *pag = <a class="code" href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVFIR::getPAG</a>();</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="comment">// Naive: first map functions to entries in SVFIR, then dump them.</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFFunction*, std::vector<PAGNode *></a>> functionToPAGNodes;</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<PAGNode *></a> callDsts;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFIR::iterator</a> it = pag-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != pag-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  {</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *currNode = it->second;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">if</span> (!currNode-><a class="code" href="classSVF_1_1SVFVar.html#a9b00f9b5f8ad2422162f4396e2d8fa42">hasOutgoingEdges</a>(PAGEdge::PEDGEK::Call)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="comment">// Where are these calls going?</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">for</span> (PAGEdge::PAGEdgeSetTy::iterator it =</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  currNode-><a class="code" href="classSVF_1_1SVFVar.html#adb1f35a6f8db19c48cf7fd6c8f4a8ff3">getOutgoingEdgesBegin</a>(PAGEdge::PEDGEK::Call);</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  it != currNode-><a class="code" href="classSVF_1_1SVFVar.html#adec782d2f9d055b0dbcb56f511e75c24">getOutgoingEdgesEnd</a>(PAGEdge::PEDGEK::Call); ++it)</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <a class="code" href="classSVF_1_1CallPE.html">CallPE</a> *callEdge = <span class="keyword">static_cast<</span><a class="code" href="classSVF_1_1CallPE.html">CallPE</a> *<span class="keyword">></span>(*it);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = callEdge-><a class="code" href="classSVF_1_1CallPE.html#ac8f25219948d3a6ff205048e746338d5">getCallInst</a>()-><a class="code" href="classSVF_1_1CallBlockNode.html#ad3d50024efcfa94b1246c982b43aff2f">getCallSite</a>();</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">:: Function</a>* currFunction =</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keyword">static_cast<</span><span class="keyword">const </span><a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a> *<span class="keyword">></span>(inst)->getCalledFunction();</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> </div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">if</span> (currFunction != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  {</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="comment">// Otherwise, it would be an indirect call which we don't want.</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  std::string currFunctionName = currFunction->getName().str();</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">if</span> (std::find(functions.begin(), functions.end(),</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  currFunctionName) != functions.end())</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="comment">// If the dst has already been added, we'd be duplicating</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="comment">// due to multiple actual->arg call edges.</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">if</span> (callDsts.find(callEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()) == callDsts.end())</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  {</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  callDsts.insert(callEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFun = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a547b3bc62de65b9dbfc6dee55c063dd7">getSVFFunction</a>(currFunction);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  functionToPAGNodes[svfFun].push_back(callEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  }</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  }</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> </div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = functionToPAGNodes.begin(); it != functionToPAGNodes.end();</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  ++it)</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span> = it->first;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  std::string functionName = it->first-><a class="code" href="classSVF_1_1SVFValue.html#adc15c1f7a77158142156fba7524e89c9">getName</a>().str();</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="comment">// The final nodes and edges we will print.</span></div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<PAGNode *></a> nodes;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<PAGEdge *></a> edges;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="comment">// The search stack.</span></div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  std::stack<PAGNode *> todoNodes;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="comment">// The arguments to the function.</span></div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  std::vector<PAGNode *> argNodes = it->second;</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *retNode = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> </div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> </div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"SVFIR for function: "</span> << functionName << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> node = argNodes.begin(); node != argNodes.end(); ++node)</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  {</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  todoNodes.push(*node);</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  }</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> </div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordflow">while</span> (!todoNodes.empty())</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *currNode = todoNodes.top();</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  todoNodes.pop();</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> </div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="comment">// If the node has been dealt with, ignore it.</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">if</span> (nodes.find(currNode) != nodes.end()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  nodes.insert(currNode);</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="comment">// Return signifies the end of a path.</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1RetPN.html#acedd9e576a077f96c0638065d4c70bcf">RetPN::classof</a>(currNode))</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  {</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  retNode = currNode;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  }</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> </div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keyword">auto</span> outEdges = currNode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>();</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> outEdge = outEdges.begin(); outEdge != outEdges.end();</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  ++outEdge)</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  {</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  edges.insert(*outEdge);</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  todoNodes.push((*outEdge)->getDstNode());</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  }</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  }</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> </div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> node = nodes.begin(); node != nodes.end(); ++node)</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="comment">// TODO: proper file.</span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="comment">// Argument nodes use extra information: it's argument number.</span></div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordflow">if</span> (std::find(argNodes.begin(), argNodes.end(), *node)</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  != argNodes.end())</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *node,</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <a class="code" href="ExternalPAG_8cpp.html#abe9bb682282b331d0d8ca9d000d63443">getArgNo</a>(<span class="keyword">function</span>, (*node)->getValue()));</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  }</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*node == retNode)</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  {</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *node, <span class="stringliteral">"ret"</span>);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  }</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  {</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *node);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  }</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  }</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> </div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> edge = edges.begin(); edge != edges.end(); ++edge)</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  {</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="comment">// TODO: proper file.</span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <a class="code" href="ExternalPAG_8cpp.html#a883ca6e5a9c61af716b49ba81adf4ca3">outputPAGEdge</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *edge);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  }</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> </div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"SVFIR for functionName "</span> << functionName << <span class="stringliteral">" done\n"</span>;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> }</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> </div><div class="line"><a name="l00377"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a6e8b309508de040504ad4b2ce6a5de28"> 377</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a6e8b309508de040504ad4b2ce6a5de28">ExternalPAG::addExternalPAG</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span>)</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> {</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="comment">// The function does not exist in the module - bad arg?</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="comment">// TODO: maybe some warning?</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="keywordflow">if</span> (<span class="keyword">function</span> == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a> *pag = <a class="code" href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVFIR::getPAG</a>();</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordflow">if</span> (hasExternalPAG(<span class="keyword">function</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Adding extpag "</span> << this->getFunctionName() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="comment">// Temporarily trick SVF Module into thinking we are reading from</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="comment">// file to avoid setting BBs/Values (as these nodes don't have any).</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  std::string oldSVFModuleFileName = <a class="code" href="classSVF_1_1SVFModule.html#a54c2bc2cb7cda0d74f4cadc676461b60">SVFModule::pagFileName</a>();</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <a class="code" href="classSVF_1_1SVFModule.html#ac630e9f18a239ac6b3b88d05e64140c5">SVFModule::setPagFromTXT</a>(<span class="stringliteral">"tmp"</span>);</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> </div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="comment">// We need: the new nodes.</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="comment">// : the new edges.</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="comment">// : to map function names to the entry nodes.</span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="comment">// : to map function names to the return node.</span></div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> </div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// To create the new edges.</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, PAGNode *></a> extToNewNodes;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> </div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="comment">// Add the value nodes.</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extNodeIt = this->getValueNodes().begin();</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  extNodeIt != this->getValueNodes().end(); ++extNodeIt)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newNodeId = pag-><a class="code" href="classSVF_1_1SVFIR.html#a6b1bb039f068ff2ab486214354df4684">addDummyValNode</a>();</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  extToNewNodes[*extNodeIt] = pag-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(newNodeId);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  }</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> </div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="comment">// Add the object nodes.</span></div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extNodeIt = this->getObjectNodes().begin();</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  extNodeIt != this->getObjectNodes().end(); ++extNodeIt)</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="comment">// TODO: fix obj node - there's more to it?</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newNodeId = pag-><a class="code" href="classSVF_1_1SVFIR.html#a3071c94ea72048d74a65a409a906af35">addDummyObjNode</a>();</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  extToNewNodes[*extNodeIt] = pag-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(newNodeId);</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span> </div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="comment">// Add the edges.</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extEdgeIt = this->getEdges().begin();</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  extEdgeIt != this->getEdges().end(); ++extEdgeIt)</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  {</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> extSrcId = std::get<0>(*extEdgeIt);</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> extDstId = std::get<1>(*extEdgeIt);</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  std::string extEdgeType = std::get<2>(*extEdgeIt);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keywordtype">int</span> extOffsetOrCSId = std::get<3>(*extEdgeIt);</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> </div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *srcNode = extToNewNodes[extSrcId];</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *dstNode = extToNewNodes[extDstId];</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcId = srcNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = dstNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> </div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"addr"</span>)</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  {</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a247f006b6f168a7d853814339b0a6ed5">addAddrPE</a>(srcId, dstId);</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"copy"</span>)</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  {</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a0aefb9f6ac03251dd2893e8d5fa30c30">addCopyPE</a>(srcId, dstId);</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  }</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"load"</span>)</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  {</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a5b89eb728f02a2d235f898dcf555d1a2">addLoadPE</a>(srcId, dstId);</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  }</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"store"</span>)</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  {</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a147a1a57edd4d2eff937b28f677866d2">addStorePE</a>(srcId, dstId, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  }</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"gep"</span>)</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#acd2ba7adf250f1a90b57e51a085b6363">addNormalGepPE</a>(srcId, dstId, <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a>(extOffsetOrCSId));</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"variant-gep"</span>)</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  {</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a33d8fad47352f7ca8aac035eb2adb57e">addVariantGepPE</a>(srcId, dstId);</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  }</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"call"</span>)</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  {</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  pag-><a class="code" href="classSVF_1_1IRGraph.html#a722f32d0a0a3bafdd97fc74819d2621e">addEdge</a>(srcNode, dstNode, <span class="keyword">new</span> <a class="code" href="classSVF_1_1CallPE.html">CallPE</a>(srcNode, dstNode, <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"ret"</span>)</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  pag-><a class="code" href="classSVF_1_1IRGraph.html#a722f32d0a0a3bafdd97fc74819d2621e">addEdge</a>(srcNode, dstNode, <span class="keyword">new</span> <a class="code" href="classSVF_1_1RetPE.html">RetPE</a>(srcNode, dstNode, <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  }</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"cmp"</span>)</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  {</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#ac655a9b115fb6a48a74d794847858aef">addCmpPE</a>(srcId, dstId);</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  }</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"binary-op"</span>)</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  {</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a1b04aece8eb719555982bd947840947d">addBinaryOPPE</a>(srcId, dstId);</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  }</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"unary-op"</span>)</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  {</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a3c167ee7cdf012306acef6149a874c3e">addUnaryOPPE</a>(srcId, dstId);</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  }</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  {</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Bad edge type found during extpag addition\n"</span>;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  }</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> </div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="comment">// Record the arg nodes.</span></div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<int, PAGNode *></a> argNodes;</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> argNodeIt = this->getArgNodes().begin();</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  argNodeIt != this->getArgNodes().end(); ++argNodeIt)</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keywordtype">int</span> index = argNodeIt->first;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> extNodeId = argNodeIt->second;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  argNodes[index] = extToNewNodes[extNodeId];</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  }</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> </div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  functionToExternalPAGEntries[<span class="keyword">function</span>] = argNodes;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> </div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="comment">// Record the return node.</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">if</span> (this->hasReturnNode())</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  {</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  functionToExternalPAGReturns[<span class="keyword">function</span>] =</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  extToNewNodes[this->getReturnNode()];</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> </div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="comment">// Put it back as if nothing happened.</span></div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <a class="code" href="classSVF_1_1SVFModule.html#ac630e9f18a239ac6b3b88d05e64140c5">SVFModule::setPagFromTXT</a>(oldSVFModuleFileName);</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> }</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span> </div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span> <span class="comment">// Very similar implementation to the PAGBuilderFromFile.</span></div><div class="line"><a name="l00507"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#ae010036c742cfdf95fad5355f0100984"> 507</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExternalPAG.html#ae010036c742cfdf95fad5355f0100984">ExternalPAG::readFromFile</a>(std::string filename)</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span> {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  std::string line;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  std::ifstream pagFile(filename.c_str());</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="keywordflow">if</span> (!pagFile.is_open())</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"ExternalPAG::buildFromFile: could not open "</span> << filename</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  }</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span> </div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordflow">while</span> (pagFile.good())</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  {</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  std::getline(pagFile, line);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span> </div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> tokenCount = 0;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  std::string tmps;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  std::istringstream ss(line);</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">while</span> (ss.good())</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  {</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  ss >> tmps;</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  tokenCount++;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">if</span> (tokenCount == 0)</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  {</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="comment">// Empty line.</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keywordflow">if</span> (tokenCount == 2 || tokenCount == 3)</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  {</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="comment">// It's a node.</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  std::string nodeType;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  std::istringstream ss(line);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  ss >> nodeId;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  ss >> nodeType;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">if</span> (nodeType == <span class="stringliteral">"v"</span>)</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  {</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  valueNodes.insert(nodeId);</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  }</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (nodeType == <span class="stringliteral">"o"</span>)</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  objectNodes.insert(nodeId);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  }</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  && <span class="stringliteral">"format not supported, please specify node type"</span>);</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> </div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> </div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">if</span> (tokenCount == 3)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="comment">// If there are 3 tokens, it should be 0, 1, 2, ... or ret.</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  std::string argNoOrRet;</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  ss >> argNoOrRet;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> </div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordflow">if</span> (argNoOrRet == <span class="stringliteral">"ret"</span>)</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  {</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  setReturnNode(nodeId);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  }</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (std::all_of(argNoOrRet.begin(), argNoOrRet.end(),</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  ::isdigit))</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordtype">int</span> argNo = std::stoi(argNoOrRet);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  argNodes[argNo] = nodeId;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  }</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  {</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span></div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  && <span class="stringliteral">"format not supported, not arg number or ret"</span>);</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  }</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span> </div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  }</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  }</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tokenCount == 4)</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  {</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="comment">// It's an edge</span></div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeSrc;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeDst;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> offsetOrCSId;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  std::string edge;</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  std::istringstream ss(line);</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  ss >> nodeSrc;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  ss >> edge;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  ss >> nodeDst;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  ss >> offsetOrCSId;</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  edges.insert(</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  std::tuple<NodeID, NodeID, std::string, int>(nodeSrc, nodeDst,</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  edge,</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  offsetOrCSId));</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  }</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  {</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordflow">if</span> (!line.empty())</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  {</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"format not supported, token count = "</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  << tokenCount << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"format not supported"</span>);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  }</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  }</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> </div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <span class="comment">/*</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="comment"> TODO: might need to include elsewhere.</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="comment"> u32_t lower_bound = 1000;</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> <span class="comment"> for(u32_t i = 0; i < lower_bound; i++)</span></div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> <span class="comment"> pag->incNodeNum();</span></div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span> <span class="comment"> */</span></div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span> }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> </div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00361">GenericGraph.h:361</a></div></div>
|
|
70
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a147a1a57edd4d2eff937b28f677866d2"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a147a1a57edd4d2eff937b28f677866d2">SVF::SVFIR::addStorePE</a></div><div class="ttdeci">StorePE * addStorePE(NodeID src, NodeID dst, const IntraBlockNode *val)</div><div class="ttdoc">Add Store edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
71
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_aba877353c0eb383bf5ce216e7cb605bc"><div class="ttname"><a href="classSVF_1_1SVFIR.html#aba877353c0eb383bf5ce216e7cb605bc">SVF::SVFIR::addBlackHoleAddrPE</a></div><div class="ttdeci">SVFStmt * addBlackHoleAddrPE(NodeID node)</div><div class="ttdoc">Set a pointer points-to black hole (e.g. int2ptr) </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
72
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a0aefb9f6ac03251dd2893e8d5fa30c30"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a0aefb9f6ac03251dd2893e8d5fa30c30">SVF::SVFIR::addCopyPE</a></div><div class="ttdeci">CopyPE * addCopyPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Copy edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
69
|
+
<a href="ExternalPAG_8cpp.html">Go to the documentation of this file.</a><div class="fragment"><div class="line"><a name="l00001"></a><span class="lineno"> 1</span> <span class="comment">//===- ExternalPAG.cpp -- Program assignment graph ---------------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> </div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">/*</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * ExternalPAG.cpp</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> *</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment"> * Created on: Sep 22, 2018</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> <span class="comment"> * Author: Mohamad Barbar</span></div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment"> */</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> </div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include <iostream></span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include <fstream></span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include <sstream></span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> </div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="SVFIR_8h.html">MemoryModel/SVFIR.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="preprocessor">#include "<a class="code" href="ExternalPAG_8h.html">Graphs/ExternalPAG.h</a>"</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="preprocessor">#include "<a class="code" href="BasicTypes_8h.html">Util/BasicTypes.h</a>"</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="preprocessor">#include "<a class="code" href="ICFG_8h.html">Graphs/ICFG.h</a>"</span></div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> </div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> llvm::cl::list<std::string> <a class="code" href="ExternalPAG_8cpp.html#aa6aef64c49ac60c404305e2e3d0bb312">ExternalPAGArgs</a>(<span class="stringliteral">"extpags"</span>,</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>  llvm::cl::desc(<span class="stringliteral">"ExternalPAGs to use during SVFIR construction (format: func1@/path/to/graph,func2@/foo,..."</span>),</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>  llvm::cl::CommaSeparated);</div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> </div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> llvm::cl::list<std::string> <a class="code" href="ExternalPAG_8cpp.html#af98d1169e98f5fca2139efbe0c5b0170">DumpPAGFunctions</a>(<span class="stringliteral">"dump-function-pags"</span>,</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>  llvm::cl::desc(<span class="stringliteral">"Dump SVFIR for functions"</span>),</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>  llvm::cl::CommaSeparated);</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span> </div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span> </div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFFunction*, Map<int, PAGNode *></a>></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  <a class="code" href="classSVF_1_1ExternalPAG.html#a851dbb85d0b80c3942398732ba900e41">ExternalPAG::functionToExternalPAGEntries</a>;</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFFunction*, PAGNode *></a> <a class="code" href="classSVF_1_1ExternalPAG.html#aa478936bbf34d5cc23c6322a61a6885e">ExternalPAG::functionToExternalPAGReturns</a>;</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> </div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> std::vector<std::pair<std::string, std::string>></div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a50cf3da29657a69d66396a6951f628d8"> 36</a></span>  <a class="code" href="classSVF_1_1ExternalPAG.html#a50cf3da29657a69d66396a6951f628d8">ExternalPAG::parseExternalPAGs</a>(llvm::cl::list<std::string> &extpagsArgs)</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> {</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>  std::vector<std::pair<std::string, std::string>> parsedExternalPAGs;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> arg = extpagsArgs.begin(); arg != extpagsArgs.end();</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>  ++arg)</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span>  {</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>  std::stringstream ss(*arg);</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>  std::string functionName;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  getline(ss, functionName, <span class="charliteral">'@'</span>);</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  std::string path;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  getline(ss, path);</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  parsedExternalPAGs.push_back(</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  std::pair<std::string, std::string>(functionName, path));</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  }</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span> </div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">return</span> parsedExternalPAGs;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span> }</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a865a75aec231c9122842d2bdafeb4f6b"> 54</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a865a75aec231c9122842d2bdafeb4f6b">ExternalPAG::initialise</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>*)</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span> {</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  std::vector<std::pair<std::string, std::string>> parsedExternalPAGs</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  = <a class="code" href="classSVF_1_1ExternalPAG.html#a50cf3da29657a69d66396a6951f628d8">ExternalPAG::parseExternalPAGs</a>(<a class="code" href="ExternalPAG_8cpp.html#aa6aef64c49ac60c404305e2e3d0bb312">ExternalPAGArgs</a>);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span> </div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <span class="comment">// Build ext PAGs (and add them) first to use them in SVFIR construction.</span></div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extpagPair= parsedExternalPAGs.begin();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  extpagPair != parsedExternalPAGs.end(); ++extpagPair)</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  {</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  std::string fname = extpagPair->first;</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  std::string path = extpagPair->second;</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span> </div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>  <a class="code" href="classSVF_1_1ExternalPAG.html">ExternalPAG</a> extpag = <a class="code" href="classSVF_1_1ExternalPAG.html">ExternalPAG</a>(fname);</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  extpag.<a class="code" href="classSVF_1_1ExternalPAG.html#ae010036c742cfdf95fad5355f0100984">readFromFile</a>(path);</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  extpag.<a class="code" href="classSVF_1_1ExternalPAG.html#a6e8b309508de040504ad4b2ce6a5de28">addExternalPAG</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a4f457db1cfa0d4f94762a306c0ac3757">getFunction</a>(fname));</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  }</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span> }</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span> </div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a7a82128508395830433145977dbe37c0"> 72</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a7a82128508395830433145977dbe37c0">ExternalPAG::connectCallsiteToExternalPAG</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> *cs)</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> {</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a> *pag = <a class="code" href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVFIR::getPAG</a>();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span> </div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* <span class="keyword">function</span> = cs-><a class="code" href="classSVF_1_1CallSite.html#ae9b0172e29199f2a938d7cf9e42241cf">getCalledFunction</a>();</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  std::string functionName = <span class="keyword">function</span>->getName().str();</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span> </div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFun = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a547b3bc62de65b9dbfc6dee55c063dd7">getSVFFunction</a>(<span class="keyword">function</span>);</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keywordflow">if</span> (!hasExternalPAG(svfFun)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span> </div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<int, PAGNode*></a> argNodes =</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  functionToExternalPAGEntries[svfFun];</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *retNode = functionToExternalPAGReturns[svfFun];</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span> </div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  <span class="comment">// Handle the return.</span></div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  <span class="keywordflow">if</span> (llvm::isa<PointerType>(cs-><a class="code" href="classSVF_1_1CallSite.html#a9b7d53a345875e4e6c72eb23ac6475de">getType</a>()))</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  {</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = pag-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(cs-><a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <span class="comment">// Does it actually return a pointer?</span></div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>(function->getReturnType()))</div><div class="line"><a name="l00092"></a><span class="lineno"> 92</span>  {</div><div class="line"><a name="l00093"></a><span class="lineno"> 93</span>  <span class="keywordflow">if</span> (retNode != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  {</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* icfgNode = pag-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a7d10e8a815c836a070d35850f817a18c">getCallBlockNode</a>(cs-><a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a12fef4ec0537b26947eb0ab10799f29f">addRetPE</a>(retNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), dstrec, icfgNode);</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  }</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  }</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <span class="comment">// This is a int2ptr cast during parameter passing</span></div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#aba877353c0eb383bf5ce216e7cb605bc">addBlackHoleAddrPE</a>(dstrec);</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  }</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  }</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span> </div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="comment">// Handle the arguments;</span></div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="comment">// Actual arguments.</span></div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  <a class="code" href="classSVF_1_1CallSite.html#ac1cdfe5e54026960a23142e26b3150ff">CallSite::arg_iterator</a> itA = cs-><a class="code" href="classSVF_1_1CallSite.html#aabc0054b7f4e06b7ca0b6072746984e6">arg_begin</a>(), ieA = cs-><a class="code" href="classSVF_1_1CallSite.html#a46e8ffe430bb2711abaafc9d7864909e">arg_end</a>();</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  Function::const_arg_iterator itF = <span class="keyword">function</span>->arg_begin(),</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  ieF = <span class="keyword">function</span>->arg_end();</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>  <span class="comment">// Formal arguments.</span></div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>  <span class="keywordtype">size_t</span> formalNodeIndex = 0;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span> </div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keywordflow">for</span> (; itF != ieF ; ++itA, ++itF, ++formalNodeIndex)</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">if</span> (itA == ieA)</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  <span class="comment">// When unneeded args are left empty, e.g. Linux kernel.</span></div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span> </div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="comment">// Formal arg node is from the extpag, actual arg node would come from</span></div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="comment">// the main pag.</span></div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *formalArgNode = argNodes[formalNodeIndex];</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> actualArgNodeId = pag-><a class="code" href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">getValueNode</a>(*itA);</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span> </div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">llvm::Value</a> *formalArg = &*itF;</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <span class="keywordflow">if</span> (!SVFUtil::isa<PointerType>(formalArg->getType())) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span> </div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (SVFUtil::isa<PointerType>((*itA)->getType()))</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* icfgNode = pag-><a class="code" href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">getICFG</a>()-><a class="code" href="classSVF_1_1ICFG.html#a7d10e8a815c836a070d35850f817a18c">getCallBlockNode</a>(cs-><a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a9e99fcf29016ef401f53491ec54a4053">addCallPE</a>(actualArgNodeId, formalArgNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), icfgNode);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  {</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  <span class="comment">// This is a int2ptr cast during parameter passing</span></div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <span class="comment">//addFormalParamBlackHoleAddrEdge(formalArgNode->getId(), &*itF);</span></div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"you need to set the current location of this PAGEdge"</span>);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#aba877353c0eb383bf5ce216e7cb605bc">addBlackHoleAddrPE</a>(formalArgNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  }</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>  <span class="comment">// TODO proofread.</span></div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span>  }</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span> }</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span> </div><div class="line"><a name="l00148"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a3a798aa788c5f1c200b7e2719660b5ec"> 148</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a3a798aa788c5f1c200b7e2719660b5ec">ExternalPAG::hasExternalPAG</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span>)</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span> {</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <span class="keywordtype">bool</span> ret = functionToExternalPAGEntries.find(<span class="keyword">function</span>)</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  != functionToExternalPAGEntries.end();</div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <span class="keywordflow">return</span> ret;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span> }</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span> </div><div class="line"><a name="l00155"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#abe9bb682282b331d0d8ca9d000d63443"> 155</a></span> <span class="keywordtype">int</span> <a class="code" href="ExternalPAG_8cpp.html#abe9bb682282b331d0d8ca9d000d63443">getArgNo</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span>, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">Value</a> *arg)</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> {</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordtype">int</span> argNo = 0;</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = function->getLLVMFun()->arg_begin(); it != <span class="keyword">function</span>->getLLVMFun()->arg_end();</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>  ++it, ++argNo)</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  {</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">if</span> (arg->getName() == it->getName()) <span class="keywordflow">return</span> argNo;</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  }</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span> </div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">return</span> -1;</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> }</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div><div class="line"><a name="l00167"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926"> 167</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode)</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span> {</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  o << pagNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() << <span class="stringliteral">" "</span>;</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="comment">// TODO: is this check enough?</span></div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1ObjPN.html#a5e7e7b1a2d78146e50ec36d99b0a3608">ObjPN::classof</a>(pagNode)) o << <span class="stringliteral">"v"</span>;</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keywordflow">else</span> o << <span class="stringliteral">"o"</span>;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> }</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span> </div><div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38"> 175</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode)</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span> {</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(o, pagNode);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span> }</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span> </div><div class="line"><a name="l00181"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#a6f48353c8b444aeff540d1e228be2e15"> 181</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode, <span class="keywordtype">int</span> argno)</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span> {</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(o, pagNode);</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  o << <span class="stringliteral">" "</span> << argno;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span> }</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span> </div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#aa31cdd956df22eadb2e1b1686d414012"> 188</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *pagNode,</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  std::string trail)</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> {</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <a class="code" href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a>(o, pagNode);</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  o << <span class="stringliteral">" "</span> << trail;</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  o << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> }</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00196"></a><span class="lineno"><a class="line" href="ExternalPAG_8cpp.html#a883ca6e5a9c61af716b49ba81adf4ca3"> 196</a></span> <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="ExternalPAG_8cpp.html#a883ca6e5a9c61af716b49ba81adf4ca3">outputPAGEdge</a>(<a class="code" href="namespaceSVF.html#a424cc053c29ad7303699c529d1a2cc71">raw_ostream</a> &o, <a class="code" href="classSVF_1_1SVFStmt.html">PAGEdge</a> *pagEdge)</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> {</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcId = pagEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = pagEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> offset = 0;</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  std::string edgeKind = <span class="stringliteral">"-"</span>;</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span> </div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  <span class="keywordflow">switch</span> (pagEdge-><a class="code" href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">getEdgeKind</a>())</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  {</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a0a9a0f650e864e89b7cbb3dc8c8aa197">PAGEdge::Addr</a>:</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  edgeKind = <span class="stringliteral">"addr"</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad3469cdfb64f05163b5310b731b221da">PAGEdge::Copy</a>:</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  edgeKind = <span class="stringliteral">"copy"</span>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9aa0f700b514c431ec5329aec49df56dcc">PAGEdge::Store</a>:</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  edgeKind = <span class="stringliteral">"store"</span>;</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a62ac8480c43fcc657c631ec0003b15d5">PAGEdge::Load</a>:</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  edgeKind = <span class="stringliteral">"load"</span>;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a97ca16eba4c5f92e16388f0cdbcfcc00">PAGEdge::Call</a>:</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  edgeKind = <span class="stringliteral">"call"</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a8d269a45adf13e69468f0357222ab2af">PAGEdge::Ret</a>:</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  edgeKind = <span class="stringliteral">"ret"</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ac2089ffeab3f27354b2094758c805746">PAGEdge::NormalGep</a>:</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>  edgeKind = <span class="stringliteral">"gep"</span>;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a6b3a8902fc2aa68428e271012861a2a2">PAGEdge::VariantGep</a>:</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  edgeKind = <span class="stringliteral">"variant-gep"</span>;</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a610d6662d1814cffbf23db29e7e620c0">PAGEdge::Cmp</a>:</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  edgeKind = <span class="stringliteral">"cmp"</span>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad58f5e59c55e1ffd23b83d16224fed13">PAGEdge::BinaryOp</a>:</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  edgeKind = <span class="stringliteral">"binary-op"</span>;</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad2a5e6fe0f2b5fefb53abb9e91c57688">PAGEdge::UnaryOp</a>:</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  edgeKind = <span class="stringliteral">"unary-op"</span>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a375b956af2119d7abca8f1995f7701fd">PAGEdge::ThreadFork</a>:</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"dump-function-pags: found ThreadFork edge.\n"</span>;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">case</span> <a class="code" href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a3c3f8883c2d3b50aef6331d5da97ffb0">PAGEdge::ThreadJoin</a>:</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"dump-function-pags: found ThreadJoin edge.\n"</span>;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  }</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span> </div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1NormalGepPE.html#a2d48376e5806de43fa0a916b807fb2c3">NormalGepPE::classof</a>(pagEdge)) offset =</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keyword">static_cast<</span><a class="code" href="classSVF_1_1NormalGepPE.html">NormalGepPE</a> *<span class="keyword">></span>(pagEdge)->getOffset();</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span> </div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  o << srcId << <span class="stringliteral">" "</span> << edgeKind << <span class="stringliteral">" "</span> << dstId << <span class="stringliteral">" "</span> << offset << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span> }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span> </div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> </div><div class="line"><a name="l00256"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#acee9fa409f3649dcf2c0f5e6da66ceb0"> 256</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExternalPAG.html#acee9fa409f3649dcf2c0f5e6da66ceb0">ExternalPAG::dumpFunctions</a>(std::vector<std::string> functions)</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> {</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>  <a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a> *pag = <a class="code" href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVFIR::getPAG</a>();</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> </div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="comment">// Naive: first map functions to entries in SVFIR, then dump them.</span></div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<const SVFFunction*, std::vector<PAGNode *></a>> functionToPAGNodes;</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span> </div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<PAGNode *></a> callDsts;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVFIR::iterator</a> it = pag-><a class="code" href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">begin</a>(); it != pag-><a class="code" href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">end</a>(); ++it)</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  {</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *currNode = it->second;</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  <span class="keywordflow">if</span> (!currNode-><a class="code" href="classSVF_1_1SVFVar.html#a9b00f9b5f8ad2422162f4396e2d8fa42">hasOutgoingEdges</a>(PAGEdge::PEDGEK::Call)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <span class="comment">// Where are these calls going?</span></div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">for</span> (PAGEdge::PAGEdgeSetTy::iterator it =</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  currNode-><a class="code" href="classSVF_1_1SVFVar.html#adb1f35a6f8db19c48cf7fd6c8f4a8ff3">getOutgoingEdgesBegin</a>(PAGEdge::PEDGEK::Call);</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  it != currNode-><a class="code" href="classSVF_1_1SVFVar.html#adec782d2f9d055b0dbcb56f511e75c24">getOutgoingEdgesEnd</a>(PAGEdge::PEDGEK::Call); ++it)</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <a class="code" href="classSVF_1_1CallPE.html">CallPE</a> *callEdge = <span class="keyword">static_cast<</span><a class="code" href="classSVF_1_1CallPE.html">CallPE</a> *<span class="keyword">></span>(*it);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = callEdge-><a class="code" href="classSVF_1_1CallPE.html#ac8f25219948d3a6ff205048e746338d5">getCallInst</a>()-><a class="code" href="classSVF_1_1CallBlockNode.html#ad3d50024efcfa94b1246c982b43aff2f">getCallSite</a>();</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">:: Function</a>* currFunction =</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keyword">static_cast<</span><span class="keyword">const </span><a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a> *<span class="keyword">></span>(inst)->getCalledFunction();</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span> </div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">if</span> (currFunction != <span class="keyword">nullptr</span>)</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  {</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>  <span class="comment">// Otherwise, it would be an indirect call which we don't want.</span></div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  std::string currFunctionName = currFunction->getName().str();</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <span class="keywordflow">if</span> (std::find(functions.begin(), functions.end(),</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  currFunctionName) != functions.end())</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  <span class="comment">// If the dst has already been added, we'd be duplicating</span></div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <span class="comment">// due to multiple actual->arg call edges.</span></div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">if</span> (callDsts.find(callEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()) == callDsts.end())</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  {</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  callDsts.insert(callEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfFun = <a class="code" href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">LLVMModuleSet::getLLVMModuleSet</a>()-><a class="code" href="classSVF_1_1LLVMModuleSet.html#a547b3bc62de65b9dbfc6dee55c063dd7">getSVFFunction</a>(currFunction);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  functionToPAGNodes[svfFun].push_back(callEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  }</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  }</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  }</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  }</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span> </div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> it = functionToPAGNodes.begin(); it != functionToPAGNodes.end();</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  ++it)</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>  {</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span> = it->first;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  std::string functionName = it->first-><a class="code" href="classSVF_1_1SVFValue.html#adc15c1f7a77158142156fba7524e89c9">getName</a>().str();</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span> </div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="comment">// The final nodes and edges we will print.</span></div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<PAGNode *></a> nodes;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<PAGEdge *></a> edges;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  <span class="comment">// The search stack.</span></div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  std::stack<PAGNode *> todoNodes;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>  <span class="comment">// The arguments to the function.</span></div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span>  std::vector<PAGNode *> argNodes = it->second;</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *retNode = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span> </div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span> </div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"SVFIR for function: "</span> << functionName << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> node = argNodes.begin(); node != argNodes.end(); ++node)</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  {</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  todoNodes.push(*node);</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  }</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span> </div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordflow">while</span> (!todoNodes.empty())</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *currNode = todoNodes.top();</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  todoNodes.pop();</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span> </div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="comment">// If the node has been dealt with, ignore it.</span></div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">if</span> (nodes.find(currNode) != nodes.end()) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  nodes.insert(currNode);</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="comment">// Return signifies the end of a path.</span></div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1RetPN.html#acedd9e576a077f96c0638065d4c70bcf">RetPN::classof</a>(currNode))</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  {</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  retNode = currNode;</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  }</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span> </div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <span class="keyword">auto</span> outEdges = currNode-><a class="code" href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">getOutEdges</a>();</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> outEdge = outEdges.begin(); outEdge != outEdges.end();</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  ++outEdge)</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  {</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>  edges.insert(*outEdge);</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  todoNodes.push((*outEdge)->getDstNode());</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  }</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>  }</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> </div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> node = nodes.begin(); node != nodes.end(); ++node)</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  {</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <span class="comment">// TODO: proper file.</span></div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <span class="comment">// Argument nodes use extra information: it's argument number.</span></div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <span class="keywordflow">if</span> (std::find(argNodes.begin(), argNodes.end(), *node)</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  != argNodes.end())</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  {</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *node,</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <a class="code" href="ExternalPAG_8cpp.html#abe9bb682282b331d0d8ca9d000d63443">getArgNo</a>(<span class="keyword">function</span>, (*node)->getValue()));</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  }</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (*node == retNode)</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  {</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *node, <span class="stringliteral">"ret"</span>);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  }</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  {</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <a class="code" href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *node);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  }</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  }</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span> </div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> edge = edges.begin(); edge != edges.end(); ++edge)</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  {</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="comment">// TODO: proper file.</span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <a class="code" href="ExternalPAG_8cpp.html#a883ca6e5a9c61af716b49ba81adf4ca3">outputPAGEdge</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>(), *edge);</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  }</div><div class="line"><a name="l00372"></a><span class="lineno"> 372</span> </div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"SVFIR for functionName "</span> << functionName << <span class="stringliteral">" done\n"</span>;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span> }</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span> </div><div class="line"><a name="l00377"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#a6e8b309508de040504ad4b2ce6a5de28"> 377</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1ExternalPAG.html#a6e8b309508de040504ad4b2ce6a5de28">ExternalPAG::addExternalPAG</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* <span class="keyword">function</span>)</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span> {</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="comment">// The function does not exist in the module - bad arg?</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="comment">// TODO: maybe some warning?</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  <span class="keywordflow">if</span> (<span class="keyword">function</span> == <span class="keyword">nullptr</span>) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span> </div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>  <a class="code" href="classSVF_1_1SVFIR.html">SVFIR</a> *pag = <a class="code" href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVFIR::getPAG</a>();</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordflow">if</span> (hasExternalPAG(<span class="keyword">function</span>)) <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Adding extpag "</span> << this->getFunctionName() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <span class="comment">// Temporarily trick SVF Module into thinking we are reading from</span></div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <span class="comment">// file to avoid setting BBs/Values (as these nodes don't have any).</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  std::string oldSVFModuleFileName = <a class="code" href="classSVF_1_1SVFModule.html#a54c2bc2cb7cda0d74f4cadc676461b60">SVFModule::pagFileName</a>();</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <a class="code" href="classSVF_1_1SVFModule.html#ac630e9f18a239ac6b3b88d05e64140c5">SVFModule::setPagFromTXT</a>(<span class="stringliteral">"tmp"</span>);</div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span> </div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  <span class="comment">// We need: the new nodes.</span></div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="comment">// : the new edges.</span></div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="comment">// : to map function names to the entry nodes.</span></div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <span class="comment">// : to map function names to the return node.</span></div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span> </div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="comment">// To create the new edges.</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<NodeID, PAGNode *></a> extToNewNodes;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span> </div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  <span class="comment">// Add the value nodes.</span></div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extNodeIt = this->getValueNodes().begin();</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  extNodeIt != this->getValueNodes().end(); ++extNodeIt)</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newNodeId = pag-><a class="code" href="classSVF_1_1SVFIR.html#a6b1bb039f068ff2ab486214354df4684">addDummyValNode</a>();</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  extToNewNodes[*extNodeIt] = pag-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(newNodeId);</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  }</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span> </div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="comment">// Add the object nodes.</span></div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extNodeIt = this->getObjectNodes().begin();</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  extNodeIt != this->getObjectNodes().end(); ++extNodeIt)</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="comment">// TODO: fix obj node - there's more to it?</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newNodeId = pag-><a class="code" href="classSVF_1_1SVFIR.html#a3071c94ea72048d74a65a409a906af35">addDummyObjNode</a>();</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  extToNewNodes[*extNodeIt] = pag-><a class="code" href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">getGNode</a>(newNodeId);</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span> </div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="comment">// Add the edges.</span></div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> extEdgeIt = this->getEdges().begin();</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  extEdgeIt != this->getEdges().end(); ++extEdgeIt)</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  {</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> extSrcId = std::get<0>(*extEdgeIt);</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> extDstId = std::get<1>(*extEdgeIt);</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  std::string extEdgeType = std::get<2>(*extEdgeIt);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <span class="keywordtype">int</span> extOffsetOrCSId = std::get<3>(*extEdgeIt);</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> </div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *srcNode = extToNewNodes[extSrcId];</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <a class="code" href="classSVF_1_1SVFVar.html">PAGNode</a> *dstNode = extToNewNodes[extDstId];</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcId = srcNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = dstNode-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> </div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"addr"</span>)</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  {</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a247f006b6f168a7d853814339b0a6ed5">addAddrPE</a>(srcId, dstId);</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  }</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"copy"</span>)</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  {</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a0aefb9f6ac03251dd2893e8d5fa30c30">addCopyPE</a>(srcId, dstId);</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  }</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"load"</span>)</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  {</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a5b89eb728f02a2d235f898dcf555d1a2">addLoadPE</a>(srcId, dstId);</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  }</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"store"</span>)</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  {</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a147a1a57edd4d2eff937b28f677866d2">addStorePE</a>(srcId, dstId, <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  }</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"gep"</span>)</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  {</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#acd2ba7adf250f1a90b57e51a085b6363">addNormalGepPE</a>(srcId, dstId, <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a>(extOffsetOrCSId));</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  }</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"variant-gep"</span>)</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  {</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a33d8fad47352f7ca8aac035eb2adb57e">addVariantGepPE</a>(srcId, dstId);</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  }</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"call"</span>)</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  {</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  pag-><a class="code" href="classSVF_1_1IRGraph.html#a722f32d0a0a3bafdd97fc74819d2621e">addEdge</a>(srcNode, dstNode, <span class="keyword">new</span> <a class="code" href="classSVF_1_1CallPE.html">CallPE</a>(srcNode, dstNode, <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"ret"</span>)</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>  {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>  pag-><a class="code" href="classSVF_1_1IRGraph.html#a722f32d0a0a3bafdd97fc74819d2621e">addEdge</a>(srcNode, dstNode, <span class="keyword">new</span> <a class="code" href="classSVF_1_1RetPE.html">RetPE</a>(srcNode, dstNode, <span class="keyword">nullptr</span>));</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  }</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"cmp"</span>)</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  {</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#ab4b37c70a339d1c9f2bc3d22f14691dc">addCmpPE</a>(srcId, dstId, dstId);</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  }</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"binary-op"</span>)</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  {</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a15836bec47926fda4c2b2aa1b2930e04">addBinaryOPPE</a>(srcId, dstId,dstId);</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  }</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (extEdgeType == <span class="stringliteral">"unary-op"</span>)</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  {</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  pag-><a class="code" href="classSVF_1_1SVFIR.html#a3c167ee7cdf012306acef6149a874c3e">addUnaryOPPE</a>(srcId, dstId);</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  }</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  {</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"Bad edge type found during extpag addition\n"</span>;</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  }</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span> </div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="comment">// Record the arg nodes.</span></div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map<int, PAGNode *></a> argNodes;</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  <span class="keywordflow">for</span> (<span class="keyword">auto</span> argNodeIt = this->getArgNodes().begin();</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  argNodeIt != this->getArgNodes().end(); ++argNodeIt)</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  {</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keywordtype">int</span> index = argNodeIt->first;</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> extNodeId = argNodeIt->second;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  argNodes[index] = extToNewNodes[extNodeId];</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  }</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span> </div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  functionToExternalPAGEntries[<span class="keyword">function</span>] = argNodes;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span> </div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="comment">// Record the return node.</span></div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>  <span class="keywordflow">if</span> (this->hasReturnNode())</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  {</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  functionToExternalPAGReturns[<span class="keyword">function</span>] =</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  extToNewNodes[this->getReturnNode()];</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>  }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> </div><div class="line"><a name="l00500"></a><span class="lineno"> 500</span>  <span class="comment">// Put it back as if nothing happened.</span></div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>  <a class="code" href="classSVF_1_1SVFModule.html#ac630e9f18a239ac6b3b88d05e64140c5">SVFModule::setPagFromTXT</a>(oldSVFModuleFileName);</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span> </div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span> }</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span> </div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span> <span class="comment">// Very similar implementation to the PAGBuilderFromFile.</span></div><div class="line"><a name="l00507"></a><span class="lineno"><a class="line" href="classSVF_1_1ExternalPAG.html#ae010036c742cfdf95fad5355f0100984"> 507</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1ExternalPAG.html#ae010036c742cfdf95fad5355f0100984">ExternalPAG::readFromFile</a>(std::string filename)</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span> {</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  std::string line;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  std::ifstream pagFile(filename.c_str());</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span> </div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  <span class="keywordflow">if</span> (!pagFile.is_open())</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>  {</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"ExternalPAG::buildFromFile: could not open "</span> << filename</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>  << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>  }</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span> </div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keywordflow">while</span> (pagFile.good())</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  {</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  std::getline(pagFile, line);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span> </div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> tokenCount = 0;</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  std::string tmps;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  std::istringstream ss(line);</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">while</span> (ss.good())</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  {</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>  ss >> tmps;</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  tokenCount++;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  }</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">if</span> (tokenCount == 0)</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  {</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  <span class="comment">// Empty line.</span></div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  }</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> </div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keywordflow">if</span> (tokenCount == 2 || tokenCount == 3)</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  {</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="comment">// It's a node.</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId;</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  std::string nodeType;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  std::istringstream ss(line);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  ss >> nodeId;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>  ss >> nodeType;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>  <span class="keywordflow">if</span> (nodeType == <span class="stringliteral">"v"</span>)</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  {</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  valueNodes.insert(nodeId);</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  }</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (nodeType == <span class="stringliteral">"o"</span>)</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  objectNodes.insert(nodeId);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  }</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  && <span class="stringliteral">"format not supported, please specify node type"</span>);</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> </div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> </div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>  <span class="keywordflow">if</span> (tokenCount == 3)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>  {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>  <span class="comment">// If there are 3 tokens, it should be 0, 1, 2, ... or ret.</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>  std::string argNoOrRet;</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>  ss >> argNoOrRet;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> </div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  <span class="keywordflow">if</span> (argNoOrRet == <span class="stringliteral">"ret"</span>)</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  {</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  setReturnNode(nodeId);</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  }</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (std::all_of(argNoOrRet.begin(), argNoOrRet.end(),</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  ::isdigit))</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  {</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <span class="keywordtype">int</span> argNo = std::stoi(argNoOrRet);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  argNodes[argNo] = nodeId;</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  }</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>  {</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span></div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>  && <span class="stringliteral">"format not supported, not arg number or ret"</span>);</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>  }</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span> </div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>  }</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>  }</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (tokenCount == 4)</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  {</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="comment">// It's an edge</span></div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeSrc;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeDst;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> offsetOrCSId;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>  std::string edge;</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  std::istringstream ss(line);</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  ss >> nodeSrc;</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  ss >> edge;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  ss >> nodeDst;</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>  ss >> offsetOrCSId;</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>  edges.insert(</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  std::tuple<NodeID, NodeID, std::string, int>(nodeSrc, nodeDst,</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>  edge,</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>  offsetOrCSId));</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>  }</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>  {</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>  <span class="keywordflow">if</span> (!line.empty())</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  {</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() << <span class="stringliteral">"format not supported, token count = "</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  << tokenCount << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> && <span class="stringliteral">"format not supported"</span>);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  }</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  }</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  }</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> </div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <span class="comment">/*</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="comment"> TODO: might need to include elsewhere.</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="comment"> u32_t lower_bound = 1000;</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> <span class="comment"> for(u32_t i = 0; i < lower_bound; i++)</span></div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> <span class="comment"> pag->incNodeNum();</span></div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span> <span class="comment"> */</span></div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span> }</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> </div><div class="ttc" id="classSVF_1_1GenericGraph_html_a0d9744b1b0e7a09a6f7af29188e243b7"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a0d9744b1b0e7a09a6f7af29188e243b7">SVF::GenericGraph::begin</a></div><div class="ttdeci">iterator begin()</div><div class="ttdoc">Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00361">GenericGraph.h:361</a></div></div>
|
|
70
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a147a1a57edd4d2eff937b28f677866d2"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a147a1a57edd4d2eff937b28f677866d2">SVF::SVFIR::addStorePE</a></div><div class="ttdeci">StorePE * addStorePE(NodeID src, NodeID dst, const IntraBlockNode *val)</div><div class="ttdoc">Add Store edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00185">SVFIR.cpp:185</a></div></div>
|
|
71
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_aba877353c0eb383bf5ce216e7cb605bc"><div class="ttname"><a href="classSVF_1_1SVFIR.html#aba877353c0eb383bf5ce216e7cb605bc">SVF::SVFIR::addBlackHoleAddrPE</a></div><div class="ttdeci">SVFStmt * addBlackHoleAddrPE(NodeID node)</div><div class="ttdoc">Set a pointer points-to black hole (e.g. int2ptr) </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00239">SVFIR.cpp:239</a></div></div>
|
|
72
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a0aefb9f6ac03251dd2893e8d5fa30c30"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a0aefb9f6ac03251dd2893e8d5fa30c30">SVF::SVFIR::addCopyPE</a></div><div class="ttdeci">CopyPE * addCopyPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Copy edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00069">SVFIR.cpp:69</a></div></div>
|
|
73
73
|
<div class="ttc" id="classSVF_1_1ExternalPAG_html_a851dbb85d0b80c3942398732ba900e41"><div class="ttname"><a href="classSVF_1_1ExternalPAG.html#a851dbb85d0b80c3942398732ba900e41">SVF::ExternalPAG::functionToExternalPAGEntries</a></div><div class="ttdeci">static Map< const SVFFunction *, Map< int, PAGNode * > > functionToExternalPAGEntries</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8h_source.html#l00028">ExternalPAG.h:28</a></div></div>
|
|
74
74
|
<div class="ttc" id="classSVF_1_1GenericEdge_html_abe8525c542def8162b094c169a01993b"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#abe8525c542def8162b094c169a01993b">SVF::GenericEdge::getEdgeKind</a></div><div class="ttdeci">GEdgeKind getEdgeKind() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00081">GenericGraph.h:81</a></div></div>
|
|
75
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_ac655a9b115fb6a48a74d794847858aef"><div class="ttname"><a href="classSVF_1_1SVFIR.html#ac655a9b115fb6a48a74d794847858aef">SVF::SVFIR::addCmpPE</a></div><div class="ttdeci">CmpPE * addCmpPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Copy edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00085">SVFIR.cpp:85</a></div></div>
|
|
76
75
|
<div class="ttc" id="classSVF_1_1SVFVar_html_a9b00f9b5f8ad2422162f4396e2d8fa42"><div class="ttname"><a href="classSVF_1_1SVFVar.html#a9b00f9b5f8ad2422162f4396e2d8fa42">SVF::SVFVar::hasOutgoingEdges</a></div><div class="ttdeci">bool hasOutgoingEdges(SVFStmt::PEDGEK kind) const</div><div class="ttdoc">Has outgoing SVFIR edges. </div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00210">SVFVariables.h:210</a></div></div>
|
|
77
|
-
<div class="ttc" id="classSVF_1_1RetPE_html"><div class="ttname"><a href="classSVF_1_1RetPE.html">SVF::RetPE</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#
|
|
76
|
+
<div class="ttc" id="classSVF_1_1RetPE_html"><div class="ttname"><a href="classSVF_1_1RetPE.html">SVF::RetPE</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00747">SVFStatements.h:747</a></div></div>
|
|
78
77
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9ad2a5e6fe0f2b5fefb53abb9e91c57688"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad2a5e6fe0f2b5fefb53abb9e91c57688">SVF::SVFStmt::UnaryOp</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
79
78
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9a97ca16eba4c5f92e16388f0cdbcfcc00"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a97ca16eba4c5f92e16388f0cdbcfcc00">SVF::SVFStmt::Call</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
80
79
|
<div class="ttc" id="ExternalPAG_8h_html"><div class="ttname"><a href="ExternalPAG_8h.html">ExternalPAG.h</a></div></div>
|
|
@@ -83,24 +82,23 @@ $(function() {
|
|
|
83
82
|
<div class="ttc" id="classSVF_1_1GenericEdge_html_ad9edb45e74ae675d9da82f5acf02d56e"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">SVF::GenericEdge::getDstID</a></div><div class="ttdeci">NodeID getDstID() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00077">GenericGraph.h:77</a></div></div>
|
|
84
83
|
<div class="ttc" id="namespaceSVF_html_a43a65e0d33af3c743294f7a1139d2301"><div class="ttname"><a href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00018">MTAResultValidator.h:18</a></div></div>
|
|
85
84
|
<div class="ttc" id="classSVF_1_1SVFVar_html_adb1f35a6f8db19c48cf7fd6c8f4a8ff3"><div class="ttname"><a href="classSVF_1_1SVFVar.html#adb1f35a6f8db19c48cf7fd6c8f4a8ff3">SVF::SVFVar::getOutgoingEdgesBegin</a></div><div class="ttdeci">SVFStmt::PAGEdgeSetTy::iterator getOutgoingEdgesBegin(SVFStmt::PEDGEK kind) const</div><div class="ttdoc">Get outgoing SVFStmt iterator. </div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00220">SVFVariables.h:220</a></div></div>
|
|
86
|
-
<div class="ttc" id="
|
|
87
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a3071c94ea72048d74a65a409a906af35"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a3071c94ea72048d74a65a409a906af35">SVF::SVFIR::addDummyObjNode</a></div><div class="ttdeci">NodeID addDummyObjNode(NodeID i, const Type *type)</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00631">SVFIR.h:631</a></div></div>
|
|
85
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a3071c94ea72048d74a65a409a906af35"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a3071c94ea72048d74a65a409a906af35">SVF::SVFIR::addDummyObjNode</a></div><div class="ttdeci">NodeID addDummyObjNode(NodeID i, const Type *type)</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00562">SVFIR.h:562</a></div></div>
|
|
88
86
|
<div class="ttc" id="classSVF_1_1ICFG_html_a7d10e8a815c836a070d35850f817a18c"><div class="ttname"><a href="classSVF_1_1ICFG.html#a7d10e8a815c836a070d35850f817a18c">SVF::ICFG::getCallBlockNode</a></div><div class="ttdeci">CallBlockNode * getCallBlockNode(const Instruction *inst)</div><div class="ttdef"><b>Definition:</b> <a href="ICFG_8cpp_source.html#l00197">ICFG.cpp:197</a></div></div>
|
|
89
87
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9a610d6662d1814cffbf23db29e7e620c0"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a610d6662d1814cffbf23db29e7e620c0">SVF::SVFStmt::Cmp</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
90
88
|
<div class="ttc" id="util_8h_html_a07d17d6d5d1074c0969bc5d3c3d1d84a"><div class="ttname"><a href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a></div><div class="ttdeci">#define assert(ex)</div><div class="ttdef"><b>Definition:</b> <a href="util_8h_source.html#l00141">util.h:141</a></div></div>
|
|
91
89
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9a0a9a0f650e864e89b7cbb3dc8c8aa197"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a0a9a0f650e864e89b7cbb3dc8c8aa197">SVF::SVFStmt::Addr</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
92
90
|
<div class="ttc" id="classSVF_1_1GenericEdge_html_ae6792506a0150a9400d635eceab7f9e7"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">SVF::GenericEdge::getSrcID</a></div><div class="ttdeci">NodeID getSrcID() const</div><div class="ttdoc">get methods of the components </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00073">GenericGraph.h:73</a></div></div>
|
|
93
91
|
<div class="ttc" id="classSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00233">BasicTypes.h:233</a></div></div>
|
|
94
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a3c167ee7cdf012306acef6149a874c3e"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a3c167ee7cdf012306acef6149a874c3e">SVF::SVFIR::addUnaryOPPE</a></div><div class="ttdeci">UnaryOPPE * addUnaryOPPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Unary edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
92
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a3c167ee7cdf012306acef6149a874c3e"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a3c167ee7cdf012306acef6149a874c3e">SVF::SVFIR::addUnaryOPPE</a></div><div class="ttdeci">UnaryOPPE * addUnaryOPPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Unary edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00148">SVFIR.cpp:148</a></div></div>
|
|
95
93
|
<div class="ttc" id="namespaceSVF_html_adc8b60ca7d60cf6c81feae20e4a04c63"><div class="ttname"><a href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">SVF::CallInst</a></div><div class="ttdeci">llvm::CallInst CallInst</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00148">BasicTypes.h:148</a></div></div>
|
|
96
94
|
<div class="ttc" id="ExternalPAG_8cpp_html_ad7218c518c78bf2f6a4527de22bed926"><div class="ttname"><a href="ExternalPAG_8cpp.html#ad7218c518c78bf2f6a4527de22bed926">outputPAGNodeNoNewLine</a></div><div class="ttdeci">static void outputPAGNodeNoNewLine(raw_ostream &o, PAGNode *pagNode)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00167">ExternalPAG.cpp:167</a></div></div>
|
|
97
95
|
<div class="ttc" id="classSVF_1_1SVFVar_html"><div class="ttname"><a href="classSVF_1_1SVFVar.html">SVF::SVFVar</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00046">SVFVariables.h:46</a></div></div>
|
|
98
96
|
<div class="ttc" id="classSVF_1_1SVFVar_html_adec782d2f9d055b0dbcb56f511e75c24"><div class="ttname"><a href="classSVF_1_1SVFVar.html#adec782d2f9d055b0dbcb56f511e75c24">SVF::SVFVar::getOutgoingEdgesEnd</a></div><div class="ttdeci">SVFStmt::PAGEdgeSetTy::iterator getOutgoingEdgesEnd(SVFStmt::PEDGEK kind) const</div><div class="ttdoc">Get outgoing SVFStmt iterator. </div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00228">SVFVariables.h:228</a></div></div>
|
|
99
97
|
<div class="ttc" id="classSVF_1_1CallSite_html_ab36a6a35eea673d4bdca615efc4336b1"><div class="ttname"><a href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">SVF::CallSite::getInstruction</a></div><div class="ttdeci">CallBase * getInstruction() const</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00310">BasicTypes.h:310</a></div></div>
|
|
100
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a37cfa2aa4e7b98ef9dc8179f581a2362"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVF::SVFIR::getPAG</a></div><div class="ttdeci">static SVFIR * getPAG(bool buildFromFile=false)</div><div class="ttdoc">Singleton design here to make sure we only have one instance during any analysis. ...</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#
|
|
98
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a37cfa2aa4e7b98ef9dc8179f581a2362"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a37cfa2aa4e7b98ef9dc8179f581a2362">SVF::SVFIR::getPAG</a></div><div class="ttdeci">static SVFIR * getPAG(bool buildFromFile=false)</div><div class="ttdoc">Singleton design here to make sure we only have one instance during any analysis. ...</div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00107">SVFIR.h:107</a></div></div>
|
|
101
99
|
<div class="ttc" id="classSVF_1_1SVFValue_html_adc15c1f7a77158142156fba7524e89c9"><div class="ttname"><a href="classSVF_1_1SVFValue.html#adc15c1f7a77158142156fba7524e89c9">SVF::SVFValue::getName</a></div><div class="ttdeci">const llvm::StringRef getName() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00231">SVFBasicTypes.h:231</a></div></div>
|
|
102
100
|
<div class="ttc" id="ExternalPAG_8cpp_html_a883ca6e5a9c61af716b49ba81adf4ca3"><div class="ttname"><a href="ExternalPAG_8cpp.html#a883ca6e5a9c61af716b49ba81adf4ca3">outputPAGEdge</a></div><div class="ttdeci">static void outputPAGEdge(raw_ostream &o, PAGEdge *pagEdge)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00196">ExternalPAG.cpp:196</a></div></div>
|
|
103
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a33d8fad47352f7ca8aac035eb2adb57e"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a33d8fad47352f7ca8aac035eb2adb57e">SVF::SVFIR::addVariantGepPE</a></div><div class="ttdeci">VariantGepPE * addVariantGepPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Variant(Gep) edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
101
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a33d8fad47352f7ca8aac035eb2adb57e"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a33d8fad47352f7ca8aac035eb2adb57e">SVF::SVFIR::addVariantGepPE</a></div><div class="ttdeci">VariantGepPE * addVariantGepPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Variant(Gep) edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00328">SVFIR.cpp:328</a></div></div>
|
|
104
102
|
<div class="ttc" id="classSVF_1_1SVFModule_html"><div class="ttname"><a href="classSVF_1_1SVFModule.html">SVF::SVFModule</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00041">SVFModule.h:41</a></div></div>
|
|
105
103
|
<div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map< Key, Value, Hash, KeyEqual, Allocator > Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00100">SVFBasicTypes.h:100</a></div></div>
|
|
106
104
|
<div class="ttc" id="classSVF_1_1CallSite_html_a46e8ffe430bb2711abaafc9d7864909e"><div class="ttname"><a href="classSVF_1_1CallSite.html#a46e8ffe430bb2711abaafc9d7864909e">SVF::CallSite::arg_end</a></div><div class="ttdeci">User::const_op_iterator arg_end() const</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00315">BasicTypes.h:315</a></div></div>
|
|
@@ -108,9 +106,9 @@ $(function() {
|
|
|
108
106
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9a6b3a8902fc2aa68428e271012861a2a2"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a6b3a8902fc2aa68428e271012861a2a2">SVF::SVFStmt::VariantGep</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
109
107
|
<div class="ttc" id="namespaceSVF_html_ad42bff8d0a7d60a085aa32d10f4955af"><div class="ttname"><a href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">SVF::u32_t</a></div><div class="ttdeci">unsigned u32_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00075">SVFBasicTypes.h:75</a></div></div>
|
|
110
108
|
<div class="ttc" id="classSVF_1_1ExternalPAG_html_a3a798aa788c5f1c200b7e2719660b5ec"><div class="ttname"><a href="classSVF_1_1ExternalPAG.html#a3a798aa788c5f1c200b7e2719660b5ec">SVF::ExternalPAG::hasExternalPAG</a></div><div class="ttdeci">static bool hasExternalPAG(const SVFFunction *function)</div><div class="ttdoc">Whether an external SVFIR implementing function exists. </div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00148">ExternalPAG.cpp:148</a></div></div>
|
|
111
|
-
<div class="ttc" id="classSVF_1_1IRGraph_html_abffddd41cc308b9b3bd5ad4a7f8f1624"><div class="ttname"><a href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">SVF::IRGraph::getValueNode</a></div><div class="ttdeci">NodeID getValueNode(const Value *V)</div><div class="ttdef"><b>Definition:</b> <a href="IRGraph_8h_source.html#
|
|
109
|
+
<div class="ttc" id="classSVF_1_1IRGraph_html_abffddd41cc308b9b3bd5ad4a7f8f1624"><div class="ttname"><a href="classSVF_1_1IRGraph.html#abffddd41cc308b9b3bd5ad4a7f8f1624">SVF::IRGraph::getValueNode</a></div><div class="ttdeci">NodeID getValueNode(const Value *V)</div><div class="ttdef"><b>Definition:</b> <a href="IRGraph_8h_source.html#l00120">IRGraph.h:120</a></div></div>
|
|
112
110
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9ad3469cdfb64f05163b5310b731b221da"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ad3469cdfb64f05163b5310b731b221da">SVF::SVFStmt::Copy</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
113
|
-
<div class="ttc" id="classSVF_1_1CallPE_html"><div class="ttname"><a href="classSVF_1_1CallPE.html">SVF::CallPE</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#
|
|
111
|
+
<div class="ttc" id="classSVF_1_1CallPE_html"><div class="ttname"><a href="classSVF_1_1CallPE.html">SVF::CallPE</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00695">SVFStatements.h:695</a></div></div>
|
|
114
112
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9a8d269a45adf13e69468f0357222ab2af"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a8d269a45adf13e69468f0357222ab2af">SVF::SVFStmt::Ret</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
115
113
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a4bef15157423cef48dc7333a803cd27d"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a4bef15157423cef48dc7333a803cd27d">SVF::GenericGraph::end</a></div><div class="ttdeci">iterator end()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00365">GenericGraph.h:365</a></div></div>
|
|
116
114
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_ac213302cf5c7cdf3b66f7b18649d0fbc"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVF::GenericGraph< SVFVar, SVFStmt >::iterator</a></div><div class="ttdeci">IDToNodeMapTy::iterator iterator</div><div class="ttdoc">Node Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00338">GenericGraph.h:338</a></div></div>
|
|
@@ -118,12 +116,13 @@ $(function() {
|
|
|
118
116
|
<div class="ttc" id="classSVF_1_1GenericEdge_html_aeaa31a2c8479e831b36ce2e2582ceb86"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">SVF::GenericEdge::getDstNode</a></div><div class="ttdeci">NodeType * getDstNode() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00089">GenericGraph.h:89</a></div></div>
|
|
119
117
|
<div class="ttc" id="classSVF_1_1SVFModule_html_a54c2bc2cb7cda0d74f4cadc676461b60"><div class="ttname"><a href="classSVF_1_1SVFModule.html#a54c2bc2cb7cda0d74f4cadc676461b60">SVF::SVFModule::pagFileName</a></div><div class="ttdeci">static std::string pagFileName()</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00093">SVFModule.h:93</a></div></div>
|
|
120
118
|
<div class="ttc" id="namespaceSVF_html_af739db846e47ba6b2fd15eaad31ab7fb"><div class="ttname"><a href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">SVF::Set</a></div><div class="ttdeci">std::unordered_set< Key, Hash, KeyEqual, Allocator > Set</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00095">SVFBasicTypes.h:95</a></div></div>
|
|
121
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a6b1bb039f068ff2ab486214354df4684"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a6b1bb039f068ff2ab486214354df4684">SVF::SVFIR::addDummyValNode</a></div><div class="ttdeci">NodeID addDummyValNode(NodeID i)</div><div class="ttdoc">Add a dummy value/object node according to node ID (llvm value is null) </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#
|
|
119
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a6b1bb039f068ff2ab486214354df4684"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a6b1bb039f068ff2ab486214354df4684">SVF::SVFIR::addDummyValNode</a></div><div class="ttdeci">NodeID addDummyValNode(NodeID i)</div><div class="ttdoc">Add a dummy value/object node according to node ID (llvm value is null) </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00558">SVFIR.h:558</a></div></div>
|
|
122
120
|
<div class="ttc" id="namespaceSVF_html_a5faee14fa1dd41447bc73ac365fe33c1"><div class="ttname"><a href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">SVF::Function</a></div><div class="ttdeci">llvm::Function Function</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00076">BasicTypes.h:76</a></div></div>
|
|
123
121
|
<div class="ttc" id="namespaceSVF_html_a7875172ff434b2210eea7cecfbbd959e"><div class="ttname"><a href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">SVF::Instruction</a></div><div class="ttdeci">llvm::Instruction Instruction</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00079">BasicTypes.h:79</a></div></div>
|
|
124
122
|
<div class="ttc" id="namespaceSVF_html_a2db29836a72e8d86e9baa6d8d55d2978"><div class="ttname"><a href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">SVF::Size_t</a></div><div class="ttdeci">signed long Size_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00078">SVFBasicTypes.h:78</a></div></div>
|
|
125
123
|
<div class="ttc" id="classSVF_1_1IRGraph_html_a722f32d0a0a3bafdd97fc74819d2621e"><div class="ttname"><a href="classSVF_1_1IRGraph.html#a722f32d0a0a3bafdd97fc74819d2621e">SVF::IRGraph::addEdge</a></div><div class="ttdeci">bool addEdge(SVFVar *src, SVFVar *dst, SVFStmt *edge)</div><div class="ttdoc">Add an edge into the graph. </div><div class="ttdef"><b>Definition:</b> <a href="IRGraph_8cpp_source.html#l00042">IRGraph.cpp:42</a></div></div>
|
|
126
|
-
<div class="ttc" id="
|
|
124
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_ab4b37c70a339d1c9f2bc3d22f14691dc"><div class="ttname"><a href="classSVF_1_1SVFIR.html#ab4b37c70a339d1c9f2bc3d22f14691dc">SVF::SVFIR::addCmpPE</a></div><div class="ttdeci">CmpPE * addCmpPE(NodeID op1, NodeID op2, NodeID dst)</div><div class="ttdoc">Add Copy edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00107">SVFIR.cpp:107</a></div></div>
|
|
125
|
+
<div class="ttc" id="classSVF_1_1NormalGepPE_html"><div class="ttname"><a href="classSVF_1_1NormalGepPE.html">SVF::NormalGepPE</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00606">SVFStatements.h:606</a></div></div>
|
|
127
126
|
<div class="ttc" id="classSVF_1_1GenericNode_html_a2d9cd758d6f8c5189d9b90b74f43e009"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a2d9cd758d6f8c5189d9b90b74f43e009">SVF::GenericNode::getOutEdges</a></div><div class="ttdeci">const GEdgeSetTy & getOutEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00178">GenericGraph.h:178</a></div></div>
|
|
128
127
|
<div class="ttc" id="classSVF_1_1ExternalPAG_html_a865a75aec231c9122842d2bdafeb4f6b"><div class="ttname"><a href="classSVF_1_1ExternalPAG.html#a865a75aec231c9122842d2bdafeb4f6b">SVF::ExternalPAG::initialise</a></div><div class="ttdeci">static void initialise(SVFModule *svfModule)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00054">ExternalPAG.cpp:54</a></div></div>
|
|
129
128
|
<div class="ttc" id="classSVF_1_1CallSite_html_aabc0054b7f4e06b7ca0b6072746984e6"><div class="ttname"><a href="classSVF_1_1CallSite.html#aabc0054b7f4e06b7ca0b6072746984e6">SVF::CallSite::arg_begin</a></div><div class="ttdeci">User::const_op_iterator arg_begin() const</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00314">BasicTypes.h:314</a></div></div>
|
|
@@ -132,13 +131,14 @@ $(function() {
|
|
|
132
131
|
<div class="ttc" id="classSVF_1_1ObjPN_html_a5e7e7b1a2d78146e50ec36d99b0a3608"><div class="ttname"><a href="classSVF_1_1ObjPN.html#a5e7e7b1a2d78146e50ec36d99b0a3608">SVF::ObjPN::classof</a></div><div class="ttdeci">static bool classof(const ObjPN *)</div><div class="ttdoc">Methods for support type inquiry through isa, cast, and dyn_cast: </div><div class="ttdef"><b>Definition:</b> <a href="SVFVariables_8h_source.html#l00330">SVFVariables.h:330</a></div></div>
|
|
133
132
|
<div class="ttc" id="BasicTypes_8h_html"><div class="ttname"><a href="BasicTypes_8h.html">BasicTypes.h</a></div></div>
|
|
134
133
|
<div class="ttc" id="ICFG_8h_html"><div class="ttname"><a href="ICFG_8h.html">ICFG.h</a></div></div>
|
|
135
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a5b89eb728f02a2d235f898dcf555d1a2"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a5b89eb728f02a2d235f898dcf555d1a2">SVF::SVFIR::addLoadPE</a></div><div class="ttdeci">LoadPE * addLoadPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Load edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
134
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a5b89eb728f02a2d235f898dcf555d1a2"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a5b89eb728f02a2d235f898dcf555d1a2">SVF::SVFIR::addLoadPE</a></div><div class="ttdeci">LoadPE * addLoadPE(NodeID src, NodeID dst)</div><div class="ttdoc">Add Load edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00166">SVFIR.cpp:166</a></div></div>
|
|
136
135
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9ac2089ffeab3f27354b2094758c805746"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9ac2089ffeab3f27354b2094758c805746">SVF::SVFStmt::NormalGep</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
137
136
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a85ab6b592fefc45a0674d3295e01638f"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVF::SVFUtil::outs</a></div><div class="ttdeci">raw_ostream & outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
|
|
138
|
-
<div class="ttc" id="classSVF_1_1CallPE_html_ac8f25219948d3a6ff205048e746338d5"><div class="ttname"><a href="classSVF_1_1CallPE.html#ac8f25219948d3a6ff205048e746338d5">SVF::CallPE::getCallInst</a></div><div class="ttdeci">const CallBlockNode * getCallInst() const</div><div class="ttdoc">Get method for the call instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#
|
|
137
|
+
<div class="ttc" id="classSVF_1_1CallPE_html_ac8f25219948d3a6ff205048e746338d5"><div class="ttname"><a href="classSVF_1_1CallPE.html#ac8f25219948d3a6ff205048e746338d5">SVF::CallPE::getCallInst</a></div><div class="ttdeci">const CallBlockNode * getCallInst() const</div><div class="ttdoc">Get method for the call instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00730">SVFStatements.h:730</a></div></div>
|
|
139
138
|
<div class="ttc" id="ExternalPAG_8cpp_html_a84db1ce5293fc8c7b74a997a02675c38"><div class="ttname"><a href="ExternalPAG_8cpp.html#a84db1ce5293fc8c7b74a997a02675c38">outputPAGNode</a></div><div class="ttdeci">static void outputPAGNode(raw_ostream &o, PAGNode *pagNode)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00175">ExternalPAG.cpp:175</a></div></div>
|
|
140
139
|
<div class="ttc" id="classSVF_1_1CallSite_html_ae9b0172e29199f2a938d7cf9e42241cf"><div class="ttname"><a href="classSVF_1_1CallSite.html#ae9b0172e29199f2a938d7cf9e42241cf">SVF::CallSite::getCalledFunction</a></div><div class="ttdeci">Function * getCalledFunction() const</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00320">BasicTypes.h:320</a></div></div>
|
|
141
|
-
<div class="ttc" id="
|
|
140
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a15836bec47926fda4c2b2aa1b2930e04"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a15836bec47926fda4c2b2aa1b2930e04">SVF::SVFIR::addBinaryOPPE</a></div><div class="ttdeci">BinaryOPPE * addBinaryOPPE(NodeID op1, NodeID op2, NodeID dst)</div><div class="ttdoc">Add Copy edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00128">SVFIR.cpp:128</a></div></div>
|
|
141
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a9e99fcf29016ef401f53491ec54a4053"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a9e99fcf29016ef401f53491ec54a4053">SVF::SVFIR::addCallPE</a></div><div class="ttdeci">CallPE * addCallPE(NodeID src, NodeID dst, const CallBlockNode *cs)</div><div class="ttdoc">Add Call edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00203">SVFIR.cpp:203</a></div></div>
|
|
142
142
|
<div class="ttc" id="ExternalPAG_8cpp_html_aa6aef64c49ac60c404305e2e3d0bb312"><div class="ttname"><a href="ExternalPAG_8cpp.html#aa6aef64c49ac60c404305e2e3d0bb312">ExternalPAGArgs</a></div><div class="ttdeci">llvm::cl::list< std::string > ExternalPAGArgs("extpags", llvm::cl::desc("ExternalPAGs to use during SVFIR construction (format: func1@/path/to/graph,func2@/foo,..."), llvm::cl::CommaSeparated)</div></div>
|
|
143
143
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_acf40310917909e4234282c0695a43160"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#acf40310917909e4234282c0695a43160">SVF::LLVMModuleSet::getLLVMModuleSet</a></div><div class="ttdeci">static LLVMModuleSet * getLLVMModuleSet()</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00069">LLVMModule.h:69</a></div></div>
|
|
144
144
|
<div class="ttc" id="classSVF_1_1SVFStmt_html_a0ab8621e75e75f03425c323b3ed62ce9a375b956af2119d7abca8f1995f7701fd"><div class="ttname"><a href="classSVF_1_1SVFStmt.html#a0ab8621e75e75f03425c323b3ed62ce9a375b956af2119d7abca8f1995f7701fd">SVF::SVFStmt::ThreadFork</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00056">SVFStatements.h:56</a></div></div>
|
|
@@ -158,19 +158,19 @@ $(function() {
|
|
|
158
158
|
<div class="ttc" id="classSVF_1_1ExternalPAG_html_a50cf3da29657a69d66396a6951f628d8"><div class="ttname"><a href="classSVF_1_1ExternalPAG.html#a50cf3da29657a69d66396a6951f628d8">SVF::ExternalPAG::parseExternalPAGs</a></div><div class="ttdeci">static std::vector< std::pair< std::string, std::string > > parseExternalPAGs(llvm::cl::list< std::string > &extpagsArgs)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00036">ExternalPAG.cpp:36</a></div></div>
|
|
159
159
|
<div class="ttc" id="classSVF_1_1SVFModule_html_ac630e9f18a239ac6b3b88d05e64140c5"><div class="ttname"><a href="classSVF_1_1SVFModule.html#ac630e9f18a239ac6b3b88d05e64140c5">SVF::SVFModule::setPagFromTXT</a></div><div class="ttdeci">static void setPagFromTXT(std::string txt)</div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00088">SVFModule.h:88</a></div></div>
|
|
160
160
|
<div class="ttc" id="classSVF_1_1CallBlockNode_html"><div class="ttname"><a href="classSVF_1_1CallBlockNode.html">SVF::CallBlockNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00364">ICFGNode.h:364</a></div></div>
|
|
161
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_a12fef4ec0537b26947eb0ab10799f29f"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a12fef4ec0537b26947eb0ab10799f29f">SVF::SVFIR::addRetPE</a></div><div class="ttdeci">RetPE * addRetPE(NodeID src, NodeID dst, const CallBlockNode *cs)</div><div class="ttdoc">Add Return edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
161
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_a12fef4ec0537b26947eb0ab10799f29f"><div class="ttname"><a href="classSVF_1_1SVFIR.html#a12fef4ec0537b26947eb0ab10799f29f">SVF::SVFIR::addRetPE</a></div><div class="ttdeci">RetPE * addRetPE(NodeID src, NodeID dst, const CallBlockNode *cs)</div><div class="ttdoc">Add Return edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00221">SVFIR.cpp:221</a></div></div>
|
|
162
162
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a43c9c773bfa17abf481c33073e30d01b"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a43c9c773bfa17abf481c33073e30d01b">SVF::GenericGraph::getGNode</a></div><div class="ttdeci">NodeType * getGNode(NodeID id) const</div><div class="ttdoc">Get a node. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00387">GenericGraph.h:387</a></div></div>
|
|
163
163
|
<div class="ttc" id="ExternalPAG_8cpp_html_af98d1169e98f5fca2139efbe0c5b0170"><div class="ttname"><a href="ExternalPAG_8cpp.html#af98d1169e98f5fca2139efbe0c5b0170">DumpPAGFunctions</a></div><div class="ttdeci">llvm::cl::list< std::string > DumpPAGFunctions("dump-function-pags", llvm::cl::desc("Dump SVFIR for functions"), llvm::cl::CommaSeparated)</div></div>
|
|
164
164
|
<div class="ttc" id="classSVF_1_1SVFIR_html"><div class="ttname"><a href="classSVF_1_1SVFIR.html">SVF::SVFIR</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00043">SVFIR.h:43</a></div></div>
|
|
165
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_aa1943d53e75aef9b014953143c6894da"><div class="ttname"><a href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">SVF::SVFIR::getICFG</a></div><div class="ttdeci">ICFG * getICFG()</div><div class="ttdoc">Return ICFG. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#
|
|
165
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_aa1943d53e75aef9b014953143c6894da"><div class="ttname"><a href="classSVF_1_1SVFIR.html#aa1943d53e75aef9b014953143c6894da">SVF::SVFIR::getICFG</a></div><div class="ttdeci">ICFG * getICFG()</div><div class="ttdoc">Return ICFG. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8h_source.html#l00133">SVFIR.h:133</a></div></div>
|
|
166
166
|
<div class="ttc" id="classSVF_1_1ExternalPAG_html_ae010036c742cfdf95fad5355f0100984"><div class="ttname"><a href="classSVF_1_1ExternalPAG.html#ae010036c742cfdf95fad5355f0100984">SVF::ExternalPAG::readFromFile</a></div><div class="ttdeci">void readFromFile(std::string filename)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00507">ExternalPAG.cpp:507</a></div></div>
|
|
167
|
-
<div class="ttc" id="classSVF_1_1SVFIR_html_acd2ba7adf250f1a90b57e51a085b6363"><div class="ttname"><a href="classSVF_1_1SVFIR.html#acd2ba7adf250f1a90b57e51a085b6363">SVF::SVFIR::addNormalGepPE</a></div><div class="ttdeci">NormalGepPE * addNormalGepPE(NodeID src, NodeID dst, const LocationSet &ls)</div><div class="ttdoc">Add Offset(Gep) edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#
|
|
167
|
+
<div class="ttc" id="classSVF_1_1SVFIR_html_acd2ba7adf250f1a90b57e51a085b6363"><div class="ttname"><a href="classSVF_1_1SVFIR.html#acd2ba7adf250f1a90b57e51a085b6363">SVF::SVFIR::addNormalGepPE</a></div><div class="ttdeci">NormalGepPE * addNormalGepPE(NodeID src, NodeID dst, const LocationSet &ls)</div><div class="ttdoc">Add Offset(Gep) edge. </div><div class="ttdef"><b>Definition:</b> <a href="SVFIR_8cpp_source.html#l00308">SVFIR.cpp:308</a></div></div>
|
|
168
168
|
<div class="ttc" id="namespaceSVF_html_a90b263fd2f541eca78135078114cabda"><div class="ttname"><a href="namespaceSVF.html#a90b263fd2f541eca78135078114cabda">SVF::Value</a></div><div class="ttdeci">llvm::Value Value</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00078">BasicTypes.h:78</a></div></div>
|
|
169
169
|
<div class="ttc" id="classSVF_1_1ExternalPAG_html_a6e8b309508de040504ad4b2ce6a5de28"><div class="ttname"><a href="classSVF_1_1ExternalPAG.html#a6e8b309508de040504ad4b2ce6a5de28">SVF::ExternalPAG::addExternalPAG</a></div><div class="ttdeci">bool addExternalPAG(const SVFFunction *function)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00377">ExternalPAG.cpp:377</a></div></div>
|
|
170
170
|
<div class="ttc" id="classSVF_1_1LLVMModuleSet_html_a547b3bc62de65b9dbfc6dee55c063dd7"><div class="ttname"><a href="classSVF_1_1LLVMModuleSet.html#a547b3bc62de65b9dbfc6dee55c063dd7">SVF::LLVMModuleSet::getSVFFunction</a></div><div class="ttdeci">const SVFFunction * getSVFFunction(const Function *fun) const</div><div class="ttdef"><b>Definition:</b> <a href="LLVMModule_8h_source.html#l00112">LLVMModule.h:112</a></div></div>
|
|
171
171
|
<div class="ttc" id="ExternalPAG_8cpp_html_abe9bb682282b331d0d8ca9d000d63443"><div class="ttname"><a href="ExternalPAG_8cpp.html#abe9bb682282b331d0d8ca9d000d63443">getArgNo</a></div><div class="ttdeci">int getArgNo(const SVFFunction *function, const Value *arg)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00155">ExternalPAG.cpp:155</a></div></div>
|
|
172
172
|
<div class="ttc" id="classSVF_1_1SVFStmt_html"><div class="ttname"><a href="classSVF_1_1SVFStmt.html">SVF::SVFStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00047">SVFStatements.h:47</a></div></div>
|
|
173
|
-
<div class="ttc" id="classSVF_1_1NormalGepPE_html_a2d48376e5806de43fa0a916b807fb2c3"><div class="ttname"><a href="classSVF_1_1NormalGepPE.html#a2d48376e5806de43fa0a916b807fb2c3">SVF::NormalGepPE::classof</a></div><div class="ttdeci">static bool classof(const NormalGepPE *)</div><div class="ttdoc">Methods for support type inquiry through isa, cast, and dyn_cast: </div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#
|
|
173
|
+
<div class="ttc" id="classSVF_1_1NormalGepPE_html_a2d48376e5806de43fa0a916b807fb2c3"><div class="ttname"><a href="classSVF_1_1NormalGepPE.html#a2d48376e5806de43fa0a916b807fb2c3">SVF::NormalGepPE::classof</a></div><div class="ttdeci">static bool classof(const NormalGepPE *)</div><div class="ttdoc">Methods for support type inquiry through isa, cast, and dyn_cast: </div><div class="ttdef"><b>Definition:</b> <a href="SVFStatements_8h_source.html#l00618">SVFStatements.h:618</a></div></div>
|
|
174
174
|
<div class="ttc" id="classSVF_1_1ExternalPAG_html_a7a82128508395830433145977dbe37c0"><div class="ttname"><a href="classSVF_1_1ExternalPAG.html#a7a82128508395830433145977dbe37c0">SVF::ExternalPAG::connectCallsiteToExternalPAG</a></div><div class="ttdeci">static bool connectCallsiteToExternalPAG(CallSite *cs)</div><div class="ttdef"><b>Definition:</b> <a href="ExternalPAG_8cpp_source.html#l00072">ExternalPAG.cpp:72</a></div></div>
|
|
175
175
|
</div><!-- fragment --></div><!-- contents -->
|
|
176
176
|
<!-- start footer part -->
|