svf-tools 1.0.604 → 1.0.606
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/AndersenSFR_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CFLGraphBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CFLStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CSC_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/Casting_8h.html +3 -0
- package/SVF-doxygen/html/html/Casting_8h_source.html +22 -22
- package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +15 -15
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +3 -3
- package/SVF-doxygen/html/html/DCHG_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DCHG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +82 -74
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +14 -14
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +9 -9
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +27 -21
- package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +18 -18
- package/SVF-doxygen/html/html/IRAnnotator_8h_source.html +1 -1
- package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +1 -1
- package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MHP_8cpp_source.html +33 -38
- package/SVF-doxygen/html/html/MHP_8h_source.html +22 -22
- package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +1 -1
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +12 -11
- package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +11 -11
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFValue_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +8 -1
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +11 -11
- package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +8 -8
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1AliasCFLGraphBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1CFLStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CSC.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +19 -19
- package/SVF-doxygen/html/html/classSVF_1_1DCHGraph.html +11 -11
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +228 -220
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +17 -17
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +64 -58
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +30 -38
- package/SVF-doxygen/html/html/classSVF_1_1IRAnnotator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MHP.html +67 -83
- package/SVF-doxygen/html/html/classSVF_1_1MHPValidator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +53 -53
- package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1RaceResultValidator.html +5 -5
- package/SVF-doxygen/html/html/classSVF_1_1SVFCallInst.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +46 -33
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +8 -1
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +32 -32
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VFCFLGraphBuilder.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive_1_1SCC.html +1 -1
- package/SVF-doxygen/html/html/include_2MTA_2MTAResultValidator_8h_source.html +2 -2
- package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +7 -7
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +50 -17
- package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +2 -2
- package/SVF-doxygen/html/html/namespacemembers_func_i.html +7 -7
- package/SVF-doxygen/html/html/namespacemembers_i.html +8 -8
- package/SVF-doxygen/html/html/search/all_9.js +1 -1
- package/SVF-doxygen/html/html/search/functions_8.js +1 -1
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__convert__val_3_01To_00_01FromTy_00_01FromTy_01_4.html +3 -3
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01From_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01const_01From_01_5const_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__impl_3_01To_00_01std_1_1unique__ptr_3_01From_01_4_01_4.html +4 -4
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1cast__retty__wrap_3_01To_00_01FromTy_00_01FromTy_01_4.html +2 -2
- package/SVF-doxygen/html/html/structSVF_1_1SVFUtil_1_1is__simple__type.html +2 -2
- package/SVF-doxygen/html/html/tools_2MTA_2MTAResultValidator_8h_source.html +1 -1
- package/include/DDA/DDAVFSolver.h +4 -8
- package/include/Graphs/SVFGOPT.h +2 -2
- package/include/MTA/MTAResultValidator.h +1 -1
- package/include/Util/Casting.h +7 -0
- package/lib/CFL/CFLStat.cpp +1 -1
- package/lib/DDA/ContextDDA.cpp +1 -1
- package/lib/Graphs/ConsG.cpp +2 -2
- package/lib/Graphs/SVFGOPT.cpp +15 -17
- package/lib/MTA/FSMPTA.cpp +7 -6
- package/lib/MTA/LockAnalysis.cpp +1 -1
- package/lib/MTA/MHP.cpp +216 -229
- package/lib/MemoryModel/LocationSet.cpp +1 -1
- package/lib/MemoryModel/PointerAnalysis.cpp +1 -1
- package/lib/SABER/SaberSVFGBuilder.cpp +1 -1
- package/lib/SABER/SrcSnkDDA.cpp +3 -3
- package/lib/SVF-LLVM/LLVMModule.cpp +1 -1
- package/lib/SVF-LLVM/LLVMUtil.cpp +1 -1
- package/lib/SVF-LLVM/SVFIRBuilder.cpp +4 -4
- package/lib/SVF-LLVM/SymbolTableBuilder.cpp +3 -2
- package/lib/SVFIR/SymbolTableInfo.cpp +1 -1
- package/lib/WPA/AndersenSFR.cpp +1 -1
- package/lib/WPA/FlowSensitive.cpp +23 -22
- package/package.json +1 -1
|
@@ -66,7 +66,7 @@ $(function() {
|
|
|
66
66
|
<div class="title">FSMPTA.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="FSMPTA_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">//===- FSMPTA.cpp -- Flow-sensitive analysis of multithreaded programs-------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * FSMPTA.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Jul 29, 2015</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui, Peng Di</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></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> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="FSMPTA_8h.html">MTA/FSMPTA.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="MHP_8h.html">MTA/MHP.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="PCG_8h.html">MTA/PCG.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> </div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVFUtil.html">SVFUtil</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <a class="code" href="classSVF_1_1FSMPTA.html">FSMPTA</a>* <a class="code" href="classSVF_1_1FSMPTA.html#af248a80855457ca9e5a7208c114681bb">FSMPTA::mfspta</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a019a4597074fdad6e51d936ed4ead0d9">MTASVFGBuilder::numOfNewSVFGEdges</a> = 0;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a0319d1d2e78c79f9943f2e2f65da26ed">MTASVFGBuilder::numOfRemovedSVFGEdges</a> = 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a07c3f5fa2e0092dac28521cf901a26cf">MTASVFGBuilder::numOfRemovedPTS</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a3b75cd10a314c920669cd0d4790e1a16"> 47</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a3b75cd10a314c920669cd0d4790e1a16">MTASVFGBuilder::buildSVFG</a>()</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> {</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1MemSSA.html">MemSSA</a>* mssa = svfg->getMSSA();</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  svfg->buildSVFG();</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">if</span> (ADDEDGE_NOEDGE != <a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  {</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"FSMPTA adding edge\n"</span>));</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"FSMPTA adding edge\n"</span>));</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  connectMHPEdges(mssa-><a class="code" href="classSVF_1_1MemSSA.html#ad40617a1907b9a6b8cc24888ce54a0ac">getPTA</a>());</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  }</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">if</span> (mssa-><a class="code" href="classSVF_1_1MemSSA.html#ad40617a1907b9a6b8cc24888ce54a0ac">getPTA</a>()-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4880571f57542afc50da506dfe273183">printStat</a>())</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  svfg->performStat();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> }</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a46d39980440040fc0ca50b3df7eead1a"> 64</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a46d39980440040fc0ca50b3df7eead1a">MTASVFGBuilder::collectLoadStoreSVFGNodes</a>()</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> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">SVFG::const_iterator</a> it = svfg->begin(), eit = svfg->end(); it != eit; ++it)</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  {</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* snode = it->second;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(snode))</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* node = SVFUtil::cast<StmtSVFGNode>(snode);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>())</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  {</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  ldnodeSet.insert(node);</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  }</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode>(snode))</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  {</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* node = SVFUtil::cast<StmtSVFGNode>(snode);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>())</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  stnodeSet.insert(node);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  }</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  }</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> }</div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a55da7f1a8921727f84232e5905d6135f"> 88</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a55da7f1a8921727f84232e5905d6135f">MTASVFGBuilder::recordEdge</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id1, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id2, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts)</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> {</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aed3e0bf64c3ccb6bfd24e89cc6f89ed9">NodeIDPair</a> pair = std::make_pair(id1, id2);</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">if</span> (recordedges.find(pair) == recordedges.end())</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>  recordedges.insert(pair);</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  edge2pts[pair] = pts;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  }</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keywordflow">else</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>  edge2pts[pair] |= pts;</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> }</div><div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a2effeeac276a64d612fe6af08ec25b74"> 103</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a2effeeac276a64d612fe6af08ec25b74">MTASVFGBuilder::recordAddingEdge</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id1, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id2, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts)</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>  <span class="keywordflow">return</span> recordEdge(id1, id2, pts);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> }</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> </div><div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a97179139a6395a7062d3200c23d4b69d"> 108</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a97179139a6395a7062d3200c23d4b69d">MTASVFGBuilder::recordRemovingEdge</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id1, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id2, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts)</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> {</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordflow">return</span> recordEdge(id1, id2, pts);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> }</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> </div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a0ed91beb4d3442c0a78ea81bde8d41a3"> 113</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a0ed91beb4d3442c0a78ea81bde8d41a3">MTASVFGBuilder::performAddingMHPEdges</a>()</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a019a4597074fdad6e51d936ed4ead0d9">MTASVFGBuilder::numOfNewSVFGEdges</a> = recordedges.size();</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">while</span> (!recordedges.empty())</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>  std::pair<NodeID, NodeID> edgepair = *recordedges.begin();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = edge2pts[edgepair];</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  recordedges.erase(recordedges.begin());</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  addTDEdges(edgepair.first, edgepair.second, pts);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> }</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> </div><div class="line"><a name="l00125"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a2e654f80c3680cd434fd04932a309a2d"> 125</a></span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a2e654f80c3680cd434fd04932a309a2d">MTASVFGBuilder::addTDEdges</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcId, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstId, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& pts)</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> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcNode = svfg->getSVFGNode(srcId);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstNode = svfg->getSVFGNode(dstId);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> </div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = svfg->hasThreadVFGEdge(srcNode,dstNode,<a class="code" href="classSVF_1_1VFGEdge.html#a156ae6a8b3a033f505c18c6b162e7cf5aae3168b6bc9141e4a1f3723eae4f3375">SVFGEdge::TheadMHPIndirectVF</a>))</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  assert(SVFUtil::isa<IndirectSVFGEdge>(edge) && <span class="stringliteral">"this should be a indirect value flow edge!"</span>);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">return</span> (SVFUtil::cast<IndirectSVFGEdge>(edge)->addPointsTo(pts.<a class="code" href="classSVF_1_1PointsTo.html#ae4749cf6dc43645e2479cefbcc246637">toNodeBS</a>()) ? edge : <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  {</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a019a4597074fdad6e51d936ed4ead0d9">MTASVFGBuilder::numOfNewSVFGEdges</a>++;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <a class="code" href="classSVF_1_1ThreadMHPIndSVFGEdge.html">ThreadMHPIndSVFGEdge</a>* indirectEdge = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ThreadMHPIndSVFGEdge.html">ThreadMHPIndSVFGEdge</a>(srcNode,dstNode);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  indirectEdge-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a50ac2e33c6a4a41291c0a476ed07de53">addPointsTo</a>(pts.<a class="code" href="classSVF_1_1PointsTo.html#ae4749cf6dc43645e2479cefbcc246637">toNodeBS</a>());</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordflow">return</span> (svfg->addSVFGEdge(indirectEdge) ? indirectEdge : <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</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"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a26b6750de23395a89767288b2eabb1ef"> 145</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a26b6750de23395a89767288b2eabb1ef">MTASVFGBuilder::performRemovingMHPEdges</a>()</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>  <span class="keywordflow">while</span> (!recordedges.empty())</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  {</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  std::pair<NodeID, NodeID> edgepair = *recordedges.begin();</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  recordedges.erase(recordedges.begin());</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> remove_pts = edge2pts[edgepair];</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1 = SVFUtil::cast<StmtSVFGNode>(svfg->getSVFGNode(edgepair.first));</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(svfg->getSVFGNode(edgepair.second));</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  assert (n1&&n2 && <span class="stringliteral">"one node of removed pair is null"</span>);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  assert (n1-><a class="code" href="classSVF_1_1GenericNode.html#a0931220d7a38e03f206cbdc6465d32ad">hasOutgoingEdge</a>() && <span class="stringliteral">"n1 doesn't have out edge"</span>);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  assert (n2->hasIncomingEdge() && <span class="stringliteral">"n2 doesn't have in edge"</span>);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<SVFGEdge*></a> removededges;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n1-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != n1-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</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>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && (edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()==n2))</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>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>& pts = e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> o = remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), eo = remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>(); o != eo; ++o)</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keywordflow">if</span> (const_cast<NodeBS&>(pts).test(*o))</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const_cast<</span><a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&<span class="keyword">></span>(pts).reset(*o);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a07c3f5fa2e0092dac28521cf901a26cf">MTASVFGBuilder::numOfRemovedPTS</a> ++;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  }</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  }</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>  <span class="keywordflow">if</span> (0 == e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>().<a class="code" href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9">count</a>())</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  {</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  removededges.insert(edge);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  }</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</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> </div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">while</span>(!removededges.empty())</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *removededges.begin();</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  removededges.erase(removededges.begin());</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  svfg->removeSVFGEdge(edge);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>()<<<span class="stringliteral">"Read Precision remove: "</span><<edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>()<<<span class="stringliteral">" -> "</span><<edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>()<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a0319d1d2e78c79f9943f2e2f65da26ed">MTASVFGBuilder::numOfRemovedSVFGEdges</a>++;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  }</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  }</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> }</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5c32c2f5038aab15ec2da50c7c99b405">MTASVFGBuilder::isHeadofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>, <a class="code" href="classSVF_1_1LockAnalysis.html#a07b7d49e1fbe3e5dc694b6aadbee05b8">LockAnalysis::LockSpan</a> lspan)</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>  <a class="code" href="classSVF_1_1SVFGNodeLockSpan.html">SVFGNodeLockSpan</a> pair(n,lspan);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordflow">if</span> (pairheadmap.find(pair) != pairheadmap.end())</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordflow">return</span> pairheadmap[pair];</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a> = getPrevNodes(n);</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  {</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  assert (SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) && <span class="stringliteral">"prev is not a store node"</span>);</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* prevNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* prevIns = prevNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> </div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">if</span> (lockana->hasOneCxtInLockSpan(prevIns, lspan))</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  {</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  pairheadmap[pair]=<span class="keyword">false</span>;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  }</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  pairheadmap[pair]=<span class="keyword">true</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> }</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> </div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#ad0c3ea19875191721cd466fe85b91a8c"> 225</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5c32c2f5038aab15ec2da50c7c99b405">MTASVFGBuilder::isHeadofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aae87004825b3f30356ca49b8a1dab7f3">InstSet</a> mergespan)</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> {</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> </div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a> = getPrevNodes(n);</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> </div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  {</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  assert (SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) && <span class="stringliteral">"prev is not a store node"</span>);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* prevNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* prevIns = prevNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">if</span> (mergespan.find(prevIns)!=mergespan.end())</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> }</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a4d36dc553bc87508b78add9b52ce9c2a"> 243</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5c32c2f5038aab15ec2da50c7c99b405">MTASVFGBuilder::isHeadofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</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>  <span class="keywordflow">if</span> (headmap.find(n) != headmap.end())</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">return</span> headmap[n];</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a> = getPrevNodes(n);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</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>  assert(SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) && <span class="stringliteral">"prev is not a store node"</span>);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* prevNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* prevIns = prevNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">if</span> (lockana->isInSameSpan(prevIns, n-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>()))</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>  headmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<span class="keyword">false</span>;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  headmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<span class="keyword">true</span>;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> }</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#af8ea2da28e9818d4f9e4e9528997f023"> 266</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">MTASVFGBuilder::isTailofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aae87004825b3f30356ca49b8a1dab7f3">InstSet</a> mergespan)</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> {</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ = getSuccNodes(n);</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  {</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  assert ((SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) || SVFUtil::isa<LoadSVFGNode>(svfg->getSVFGNode(*it))) && <span class="stringliteral">"succ is not a store/load node"</span>);</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* succNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* succIns = succNode->getInst();</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span> </div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>  <span class="keywordflow">if</span> (mergespan.find(succIns)!=mergespan.end())</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  }</div><div class="line"><a name="l00280"></a><span class="lineno"> 280</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span> }</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> </div><div class="line"><a name="l00284"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f"> 284</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">MTASVFGBuilder::isTailofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="classSVF_1_1LockAnalysis.html#a07b7d49e1fbe3e5dc694b6aadbee05b8">LockAnalysis::LockSpan</a> lspan)</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span> {</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  assert(SVFUtil::isa<StoreSVFGNode>(n) && <span class="stringliteral">"Node is not a store node"</span>);</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span> </div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  <a class="code" href="classSVF_1_1SVFGNodeLockSpan.html">SVFGNodeLockSpan</a> pair(n,lspan);</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <span class="keywordflow">if</span> (pairtailmap.find(pair) != pairtailmap.end())</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">return</span> pairtailmap[pair];</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span> </div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ = getSuccNodes(n);</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</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>  assert ((SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) || SVFUtil::isa<LoadSVFGNode>(svfg->getSVFGNode(*it))) && <span class="stringliteral">"succ is not a store/load node"</span>);</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(svfg->getSVFGNode(*it)))</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* succNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* succIns = succNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> </div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keywordflow">if</span> (lockana->hasOneCxtInLockSpan(succIns, lspan))</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>  pairtailmap[pair]=<span class="keyword">false</span>;</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</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>  }</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  pairtailmap[pair]=<span class="keyword">true</span>;</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span> }</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span> </div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> </div><div class="line"><a name="l00314"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a9c8681767551575a18ee141f7336db05"> 314</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">MTASVFGBuilder::isTailofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</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>  assert(SVFUtil::isa<StoreSVFGNode>(n) && <span class="stringliteral">"Node is not a store node"</span>);</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> </div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keywordflow">if</span> (tailmap.find(n) != tailmap.end())</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  <span class="keywordflow">return</span> tailmap[n];</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>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ = getSuccNodes(n);</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  {</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  assert((SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) || SVFUtil::isa<LoadSVFGNode>(svfg->getSVFGNode(*it)))</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>  && <span class="stringliteral">"succ is not a store/load node"</span>);</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(svfg->getSVFGNode(*it)))</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span> </div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* succNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* succIns = succNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span> </div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">if</span> (lockana->isInSameSpan(succIns, n-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>()))</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  tailmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] = <span class="keyword">false</span>;</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keywordflow">return</span> <span class="keyword">false</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>  }</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  tailmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<span class="keyword">true</span>;</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</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> </div><div class="line"><a name="l00343"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a7b034f9f8f01823ecfb7f6c17e47b502"> 343</a></span> <a class="code" href="classSVF_1_1SparseBitVector.html">MTASVFGBuilder::SVFGNodeIDSet</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a7b034f9f8f01823ecfb7f6c17e47b502">MTASVFGBuilder::getPrevNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</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>  <span class="keywordflow">if</span> (prevset.find(n)!=prevset.end())</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>  <span class="keywordflow">return</span> prevset[n];</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span> </div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a>;</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> worklist;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> visited;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span> </div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(); iter != n-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); ++iter)</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="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>())</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>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>());</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  }</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>  }</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span> </div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">while</span> (!worklist.empty())</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = *worklist.begin();</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  worklist.erase(worklist.begin());</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  visited.insert(node);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode>(node))</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  {</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = node-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(); iter != node-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); ++iter)</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>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && visited.find(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>())==visited.end())</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>());</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"> 377</span>  }</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  prevset[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a>;</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">return</span> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a>;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span> }</div><div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0"> 381</a></span> <a class="code" href="classSVF_1_1SparseBitVector.html">MTASVFGBuilder::SVFGNodeIDSet</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0">MTASVFGBuilder::getSuccNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</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>  <span class="keywordflow">if</span> (succset.find(n)!=succset.end())</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordflow">return</span> succset[n];</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="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ;</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> worklist;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> visited;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> </div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != n-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</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>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>())</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</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>  }</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span> </div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>  <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>  {</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = *worklist.begin();</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  worklist.erase(worklist.begin());</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  visited.insert(node);</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode>(node) || SVFUtil::isa<LoadSVFGNode>(node))</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  <span class="keywordflow">else</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="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = node-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != node-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  {</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && visited.find(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()) == visited.end())</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  }</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  }</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  succset[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=succ;</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keywordflow">return</span> succ;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span> }</div><div class="line"><a name="l00419"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a8164ae39b494115142767abc29cebd53"> 419</a></span> <a class="code" href="classSVF_1_1SparseBitVector.html">MTASVFGBuilder::SVFGNodeIDSet</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0">MTASVFGBuilder::getSuccNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o)</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> </div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ;</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> worklist;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> visited;</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>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != n-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  {</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</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>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> pts = e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="keywordflow">if</span>(pts.test(o))</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  }</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  }</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span> </div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>  <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  {</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = *worklist.begin();</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  worklist.erase(worklist.begin());</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  visited.insert(node);</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode>(node) || SVFUtil::isa<LoadSVFGNode>(node))</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <span class="keywordflow">else</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">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = node-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != node-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</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>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && visited.find(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()) == visited.end())</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  {</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> pts = e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keywordflow">if</span>(pts.test(o))</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</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>  }</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>  }</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>  <span class="keywordflow">return</span> succ;</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> </div><div class="line"><a name="l00464"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a82b52f8e70f51353cbd7476a509ff523"> 464</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a82b52f8e70f51353cbd7476a509ff523">MTASVFGBuilder::handleStoreLoadNonSparse</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span> {</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>());</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>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</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> </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> </div><div class="line"><a name="l00474"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a91ff57e51b0650963b4b5541fa0f7056"> 474</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a91ff57e51b0650963b4b5541fa0f7056">MTASVFGBuilder::handleStoreStoreNonSparse</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span> {</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span> </div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  addTDEdges(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span> }</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span> </div><div class="line"><a name="l00483"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a24921d1b1d79d7ef0b358be8d7a9e2c4"> 483</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a24921d1b1d79d7ef0b358be8d7a9e2c4">MTASVFGBuilder::handleStoreLoad</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span> {</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i1 = n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <span class="keywordflow">if</span> (ADDEDGE_NOMHP!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <span class="keywordflow">if</span> (ADDEDGE_NOALIAS!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>()))</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span> </div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span> </div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>());</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span> </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> </div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keywordflow">if</span> (ADDEDGE_NOLOCK!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && lockana->isProtectedByCommonLock(i1, i2))</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="keywordflow">if</span> (isTailofSpan(n1) && isHeadofSpan(n2))</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  }</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  {</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  }</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> </div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span> </div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span> </div><div class="line"><a name="l00517"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a29a14309cfa1d7c4454fb1237704e487"> 517</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a29a14309cfa1d7c4454fb1237704e487">MTASVFGBuilder::handleStoreStore</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</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="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i1 = n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <span class="keywordflow">if</span> (ADDEDGE_NOMHP!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>  <span class="keywordflow">if</span> (ADDEDGE_NOALIAS!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>()))</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">return</span>;</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>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span> </div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <span class="keywordflow">if</span> (ADDEDGE_NOLOCK!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && lockana->isProtectedByCommonLock(i1, i2))</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="keywordflow">if</span> (isTailofSpan(n1) && isHeadofSpan(n2))</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  <span class="keywordflow">if</span> (isTailofSpan(n2) && isHeadofSpan(n1))</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  addTDEdges(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  }</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  {</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  addTDEdges(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  }</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> }</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> </div><div class="line"><a name="l00546"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#aa861922932233ab547b63c87551b8fd3"> 546</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aa861922932233ab547b63c87551b8fd3">MTASVFGBuilder::handleStoreLoadWithLockPrecisely</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> {</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">if</span> (!pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>()))</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">return</span>;</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="comment">// PointsTo pts = pta->getPts(n1->getPAGDstNodeID());</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> <span class="comment">// pts &= pta->getPts(n2->getPAGSrcNodeID());</span></div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> <span class="comment">//</span></div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> <span class="comment">// const SVFInstruction* i1 = n1->getInst();</span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> <span class="comment">// const SVFInstruction* i2 = n2->getInst();</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> <span class="comment">//</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="comment">// NodeBS comlocks1;</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> <span class="comment">// NodeBS comlocks2;</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> <span class="comment">// lockana->getCommonLocks(i1, i2, comlocks1, comlocks2);</span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> <span class="comment">//</span></div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> <span class="comment">// outs()<<comlocks1.count() << " "<< comlocks2.count()<<"\n";</span></div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> </div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span> <span class="comment">// if(comlocks1.count() && comlocks2.count()) {</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> <span class="comment">// bool n1istail = false;</span></div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> <span class="comment">// for (NodeBS::iterator it1 = comlocks1.begin(), ie1 = comlocks1.end(); it1 != ie1; ++it1) {</span></div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> <span class="comment">// LockAnalysis::LockSpan lspan1 = lockana->getSpanfromCxtLock(*it1);</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> <span class="comment">// /// exist lock span, n1 is tail;</span></div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span> <span class="comment">// if (isTailofSpan(n1, lspan1))</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span> <span class="comment">// n1istail = true;</span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span> <span class="comment">// }</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span> <span class="comment">//</span></div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span> <span class="comment">// bool n2ishead = false;</span></div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> <span class="comment">// for (NodeBS::iterator it2 = comlocks2.begin(), ie2 = comlocks2.end(); it2 != ie2; ++it2) {</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> <span class="comment">// LockAnalysis::LockSpan lspan2 = lockana->getSpanfromCxtLock(*it2);</span></div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> <span class="comment">// /// exist lock span, n2 is head;</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span> <span class="comment">// if (isHeadofSpan(n2, lspan2))</span></div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span> <span class="comment">// n2ishead = true;</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> <span class="comment">// }</span></div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> <span class="comment">//</span></div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> <span class="comment">// if (n1istail && n2ishead)</span></div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span> <span class="comment">// } else {</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> <span class="comment">// }</span></div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span> }</div><div class="line"><a name="l00587"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a1802d8ed854bef817afa748d2bbcea05"> 587</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a1802d8ed854bef817afa748d2bbcea05">MTASVFGBuilder::handleStoreStoreWithLockPrecisely</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span> {</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keywordflow">if</span> (!pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>()))</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span> </div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span> <span class="comment">// PointsTo pts = pta->getPts(n1->getPAGDstNodeID());</span></div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span> <span class="comment">// pts &= pta->getPts(n2->getPAGDstNodeID());</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span> <span class="comment">//</span></div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span> <span class="comment">// const SVFInstruction* i1 = n1->getInst();</span></div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span> <span class="comment">// const SVFInstruction* i2 = n2->getInst();</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span> </div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span> </div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span> <span class="comment">// NodeBS comlocks1;</span></div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> <span class="comment">// NodeBS comlocks2;</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> <span class="comment">// lockana->getCommonLocks(i1, i2, comlocks1, comlocks2);</span></div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> <span class="comment">// if(comlocks1.count() && comlocks2.count()) {</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span> <span class="comment">// bool n1istail = false;</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="comment">// for (NodeBS::iterator it1 = comlocks1.begin(), ie1 = comlocks1.end(); it1 != ie1; ++it1) {</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span> <span class="comment">// LockAnalysis::LockSpan lspan1 = lockana->getSpanfromCxtLock(*it1);</span></div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> <span class="comment">// /// exist lock span, n1 is tail;</span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="comment">// if (isTailofSpan(n1, lspan1))</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> <span class="comment">// n1istail = true;</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span> <span class="comment">// }</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="comment">// bool n2ishead = false;</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment">// for (NodeBS::iterator it2 = comlocks2.begin(), ie2 = comlocks2.end(); it2 != ie2; ++it2) {</span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment">// LockAnalysis::LockSpan lspan2 = lockana->getSpanfromCxtLock(*it2);</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment">// /// exist lock span, n2 is head;</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment">// if (isHeadofSpan(n2, lspan2))</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="comment">// n2ishead = true;</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="comment">// }</span></div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span> <span class="comment">// if (n1istail && n2ishead)</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> <span class="comment">//</span></div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> <span class="comment">//</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> <span class="comment">// bool n2istail = false;</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> <span class="comment">// for (NodeBS::iterator it2 = comlocks2.begin(), ie2 = comlocks2.end(); it2 != ie2; ++it2) {</span></div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> <span class="comment">// LockAnalysis::LockSpan lspan2 = lockana->getSpanfromCxtLock(*it2);</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span> <span class="comment">// /// exist lock span, n2 is tail;</span></div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <span class="comment">// if (isTailofSpan(n2, lspan2))</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="comment">// n2istail = true;</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment">// }</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> <span class="comment">// bool n1ishead = false;</span></div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="comment">// for (NodeBS::iterator it1 = comlocks1.begin(), ie1 = comlocks1.end(); it1 != ie1; ++it1) {</span></div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="comment">// LockAnalysis::LockSpan lspan1 = lockana->getSpanfromCxtLock(*it1);</span></div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span> <span class="comment">// /// exist lock span, n1 is head;</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span> <span class="comment">// if (isHeadofSpan(n1, lspan1))</span></div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> <span class="comment">// n1ishead = true;</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span> <span class="comment">// }</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="comment">// if (n2istail && n1ishead)</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span> <span class="comment">// addTDEdges(n2->getId(), n1->getId(), pts);</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="comment">//</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> <span class="comment">// } else {</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment">// addTDEdges(n2->getId(), n1->getId(), pts);</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="comment">// }</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> }</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> </div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> </div><div class="line"><a name="l00646"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#ae028fe894e3c6e7fd0ad6feeaa64320e"> 646</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ae028fe894e3c6e7fd0ad6feeaa64320e">MTASVFGBuilder::mergeSpan</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> comlocks, <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aae87004825b3f30356ca49b8a1dab7f3">InstSet</a>& res)</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span> {</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> <span class="comment">// for (NodeBS::iterator it = comlocks.begin(), ie = comlocks.end(); it != ie; ++it) {</span></div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span> <span class="comment">// LockAnalysis::LockSpan lspan = lockana->getSpanfromCxtLock(*it);</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span> <span class="comment">// for (LockAnalysis::LockSpan::const_iterator cts = lspan.begin(), ects = lspan.end(); cts!=ects; ++cts) {</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span> <span class="comment">// res.insert((*cts).getStmt());</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span> <span class="comment">// }</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span> <span class="comment">// }</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span> }</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span> </div><div class="line"><a name="l00657"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a5532751632ece036b3d6741908573b36"> 657</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5532751632ece036b3d6741908573b36">MTASVFGBuilder::readPrecision</a>()</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span> {</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span> </div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>  recordedges.clear();</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  edge2pts.clear();</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span> </div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>  <span class="keywordflow">for</span> (SVFGNodeSet::iterator it1 = stnodeSet.begin(), eit1 = stnodeSet.end(); it1 != eit1; ++it1)</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  {</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1 = SVFUtil::cast<StmtSVFGNode>(*it1);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span> </div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n1-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(); iter != n1-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  {</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && SVFUtil::isa<StoreSVFGNode>(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()))</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  {</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>());</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span> </div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> pts = e->getPointsTo();</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> remove_pts;</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span> </div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> o = pts.begin(), eo = pts.end(); o != eo; ++o)</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  {</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ1 = getSuccNodes(n1, *o);</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ2 = getSuccNodes(n2, *o);</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span> </div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>  <span class="keywordtype">bool</span> <span class="keyword">remove</span> = <span class="keyword">true</span>;</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> sn1 = succ1.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), esn1 = succ1.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); sn1 != esn1; sn1++)</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  {</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="keywordflow">if</span> (!succ2.<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(*sn1))</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  {</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keyword">remove</span> = <span class="keyword">false</span>;</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  }</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  <span class="keywordflow">if</span> (<span class="keyword">remove</span>)</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(*o);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  }</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span> </div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>  <span class="keywordflow">if</span> (remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">count</a>())</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  recordRemovingEdge(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), remove_pts);</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  }</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  }</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  }</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span> </div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  performRemovingMHPEdges();</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span> }</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span> </div><div class="line"><a name="l00705"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a1010ef4fc52e312f2b22867a63a5810d"> 705</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a1010ef4fc52e312f2b22867a63a5810d">MTASVFGBuilder::connectMHPEdges</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span> {</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <a class="code" href="classSVF_1_1PCG.html">PCG</a>* pcg = <span class="keyword">new</span> <a class="code" href="classSVF_1_1PCG.html">PCG</a>(pta);</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <span class="keywordflow">if</span> ((ADDEDGE_NONSPARSE==<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>) && <a class="code" href="classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762">Options::UsePCG</a>)</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  {</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  pcg-><a class="code" href="classSVF_1_1PCG.html#a50b677ec622247a464cee7f0f45c5a53">analyze</a>();</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  }</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  collectLoadStoreSVFGNodes();</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  recordedges.clear();</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  edge2pts.clear();</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span> </div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>  <span class="keywordflow">for</span> (SVFGNodeSet::const_iterator it1 = stnodeSet.begin(), eit1 = stnodeSet.end(); it1!=eit1; ++it1)</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  {</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1 = SVFUtil::cast<StmtSVFGNode>(*it1);</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i1 = n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span> </div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <span class="keywordflow">for</span> (SVFGNodeSet::const_iterator it2 = ldnodeSet.begin(), eit2 = ldnodeSet.end(); it2 != eit2; ++it2)</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  {</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(*it2);</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keywordflow">if</span> (ADDEDGE_NONSPARSE==<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  {</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762">Options::UsePCG</a>)</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  {</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  <span class="keywordflow">if</span> (pcg-><a class="code" href="classSVF_1_1PCG.html#a0c4d2c2648638794a02d890293a2805d">mayHappenInParallel</a>(i1, i2) || mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  handleStoreLoadNonSparse(n1, n2, pta);</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  }</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  {</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  handleStoreLoadNonSparse(n1, n2, pta);</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  }</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  }</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  {</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  handleStoreLoad(n1, n2, pta);</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  }</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  }</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span> </div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>  <span class="keywordflow">for</span> (SVFGNodeSet::const_iterator it2 = <a class="code" href="cJSON_8cpp.html#a2599f74bdbbc1b3fd1ba8db3789a0be7">std::next</a>(it1), eit2 = stnodeSet.end(); it2!=eit2; ++it2)</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  {</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(*it2);</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keywordflow">if</span> (ADDEDGE_NONSPARSE == <a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  {</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762">Options::UsePCG</a>)</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  {</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  <span class="keywordflow">if</span>(pcg-><a class="code" href="classSVF_1_1PCG.html#a0c4d2c2648638794a02d890293a2805d">mayHappenInParallel</a>(i1, i2) || mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  handleStoreStoreNonSparse(n1, n2, pta);</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  }</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  {</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  handleStoreStoreNonSparse(n1, n2, pta);</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  }</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  }</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  {</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  handleStoreStore(n1, n2, pta);</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span> </div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a6bec8aed8673d10d65cc3df9fad3383b">Options::ReadPrecisionTDEdge</a> && ADDEDGE_NORP!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  {</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>()<<<span class="stringliteral">"Read precision edge removing \n"</span>);</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>()<<<span class="stringliteral">"Read precision edge removing \n"</span>);</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  readPrecision();</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  }</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span> }</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span> </div><div class="line"><a name="l00779"></a><span class="lineno"><a class="line" href="classSVF_1_1FSMPTA.html#acbfb7d2a6d38b54966c98102c1ea6a38"> 779</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">FSMPTA::initialize</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* module)</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span> {</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span> </div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* ander = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">AndersenWaveDiff::createAndersenWaveDiff</a>(getPAG());</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html">MTASVFGBuilder</a> mtaSVFGBuilder(mhp,lockana);</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  svfg = mtaSVFGBuilder.<a class="code" href="classSVF_1_1SVFGBuilder.html#ab7353191edd06568e2598177d253c1d9">buildPTROnlySVFG</a>(ander);</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  setGraph(svfg);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  <span class="comment">//AndersenWaveDiff::releaseAndersenWaveDiff();</span></div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span> </div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>  stat = <span class="keyword">new</span> <a class="code" href="classSVF_1_1FlowSensitiveStat.html">FlowSensitiveStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span> }</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span> </div><div class="ttc" id="classSVF_1_1PointsTo_html_ae4749cf6dc43645e2479cefbcc246637"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ae4749cf6dc43645e2479cefbcc246637">SVF::PointsTo::toNodeBS</a></div><div class="ttdeci">NodeBS toNodeBS(void) const</div><div class="ttdoc">Returns this points-to set as a NodeBS. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00309">PointsTo.cpp:309</a></div></div>
|
|
69
|
+
<a href="FSMPTA_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">//===- FSMPTA.cpp -- Flow-sensitive analysis of multithreaded programs-------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment">// Copyright (C) <2013-> <Yulei Sui></span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span> <span class="comment">//</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span> </div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span> <span class="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> </div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> <span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> </div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="comment">// along with this program. If not, see <http://www.gnu.org/licenses/>.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> <span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="comment">//===----------------------------------------------------------------------===//</span></div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> </div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> <span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment"> * FSMPTA.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> <span class="comment"> * Created on: Jul 29, 2015</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="comment"> * Author: Yulei Sui, Peng Di</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="comment"> */</span></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> <span class="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span> <span class="preprocessor">#include "<a class="code" href="FSMPTA_8h.html">MTA/FSMPTA.h</a>"</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span> <span class="preprocessor">#include "<a class="code" href="MHP_8h.html">MTA/MHP.h</a>"</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span> <span class="preprocessor">#include "<a class="code" href="PCG_8h.html">MTA/PCG.h</a>"</span></div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span> <span class="preprocessor">#include "<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>"</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> </div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVFUtil.html">SVFUtil</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> <a class="code" href="classSVF_1_1FSMPTA.html">FSMPTA</a>* <a class="code" href="classSVF_1_1FSMPTA.html#af248a80855457ca9e5a7208c114681bb">FSMPTA::mfspta</a> = <span class="keyword">nullptr</span>;</div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a019a4597074fdad6e51d936ed4ead0d9">MTASVFGBuilder::numOfNewSVFGEdges</a> = 0;</div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a0319d1d2e78c79f9943f2e2f65da26ed">MTASVFGBuilder::numOfRemovedSVFGEdges</a> = 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> <a class="code" href="namespaceSVF.html#ad42bff8d0a7d60a085aa32d10f4955af">u32_t</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a07c3f5fa2e0092dac28521cf901a26cf">MTASVFGBuilder::numOfRemovedPTS</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00047"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a3b75cd10a314c920669cd0d4790e1a16"> 47</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a3b75cd10a314c920669cd0d4790e1a16">MTASVFGBuilder::buildSVFG</a>()</div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span> {</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>  <a class="code" href="classSVF_1_1MemSSA.html">MemSSA</a>* mssa = svfg->getMSSA();</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  svfg->buildSVFG();</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <span class="keywordflow">if</span> (ADDEDGE_NOEDGE != <a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  {</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"FSMPTA adding edge\n"</span>));</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">"FSMPTA adding edge\n"</span>));</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  connectMHPEdges(mssa-><a class="code" href="classSVF_1_1MemSSA.html#ad40617a1907b9a6b8cc24888ce54a0ac">getPTA</a>());</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  }</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>  <span class="keywordflow">if</span> (mssa-><a class="code" href="classSVF_1_1MemSSA.html#ad40617a1907b9a6b8cc24888ce54a0ac">getPTA</a>()-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4880571f57542afc50da506dfe273183">printStat</a>())</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  svfg->performStat();</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span> }</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a46d39980440040fc0ca50b3df7eead1a"> 64</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a46d39980440040fc0ca50b3df7eead1a">MTASVFGBuilder::collectLoadStoreSVFGNodes</a>()</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> </div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">SVFG::const_iterator</a> it = svfg->begin(), eit = svfg->end(); it != eit; ++it)</div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span>  {</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* snode = it->second;</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(snode))</div><div class="line"><a name="l00071"></a><span class="lineno"> 71</span>  {</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* node = SVFUtil::cast<StmtSVFGNode>(snode);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>())</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  {</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  ldnodeSet.insert(node);</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  }</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>  }</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode>(snode))</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  {</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* node = SVFUtil::cast<StmtSVFGNode>(snode);</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  <span class="keywordflow">if</span> (node-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>())</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  {</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  stnodeSet.insert(node);</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  }</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>  }</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>  }</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span> }</div><div class="line"><a name="l00088"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a55da7f1a8921727f84232e5905d6135f"> 88</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a55da7f1a8921727f84232e5905d6135f">MTASVFGBuilder::recordEdge</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id1, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id2, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts)</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span> {</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aed3e0bf64c3ccb6bfd24e89cc6f89ed9">NodeIDPair</a> pair = std::make_pair(id1, id2);</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span>  <span class="keywordflow">if</span> (recordedges.find(pair) == recordedges.end())</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>  recordedges.insert(pair);</div><div class="line"><a name="l00094"></a><span class="lineno"> 94</span>  edge2pts[pair] = pts;</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>  }</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>  <span class="keywordflow">else</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>  edge2pts[pair] |= pts;</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> }</div><div class="line"><a name="l00103"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a2effeeac276a64d612fe6af08ec25b74"> 103</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a2effeeac276a64d612fe6af08ec25b74">MTASVFGBuilder::recordAddingEdge</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id1, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id2, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts)</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>  <span class="keywordflow">return</span> recordEdge(id1, id2, pts);</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span> }</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span> </div><div class="line"><a name="l00108"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a97179139a6395a7062d3200c23d4b69d"> 108</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a97179139a6395a7062d3200c23d4b69d">MTASVFGBuilder::recordRemovingEdge</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id1, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> id2, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts)</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span> {</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  <span class="keywordflow">return</span> recordEdge(id1, id2, pts);</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span> }</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span> </div><div class="line"><a name="l00113"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a0ed91beb4d3442c0a78ea81bde8d41a3"> 113</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a0ed91beb4d3442c0a78ea81bde8d41a3">MTASVFGBuilder::performAddingMHPEdges</a>()</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span> {</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a019a4597074fdad6e51d936ed4ead0d9">MTASVFGBuilder::numOfNewSVFGEdges</a> = recordedges.size();</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">while</span> (!recordedges.empty())</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>  std::pair<NodeID, NodeID> edgepair = *recordedges.begin();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = edge2pts[edgepair];</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  recordedges.erase(recordedges.begin());</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  addTDEdges(edgepair.first, edgepair.second, pts);</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span> }</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span> </div><div class="line"><a name="l00125"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a2e654f80c3680cd434fd04932a309a2d"> 125</a></span> <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a2e654f80c3680cd434fd04932a309a2d">MTASVFGBuilder::addTDEdges</a>(<a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> srcId, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> dstId, <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>& pts)</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> </div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* srcNode = svfg->getSVFGNode(srcId);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* dstNode = svfg->getSVFGNode(dstId);</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span> </div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = svfg->hasThreadVFGEdge(srcNode,dstNode,<a class="code" href="classSVF_1_1VFGEdge.html#a156ae6a8b3a033f505c18c6b162e7cf5aae3168b6bc9141e4a1f3723eae4f3375">SVFGEdge::TheadMHPIndirectVF</a>))</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  {</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  assert(SVFUtil::isa<IndirectSVFGEdge>(edge) && <span class="stringliteral">"this should be a indirect value flow edge!"</span>);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  <span class="keywordflow">return</span> (SVFUtil::cast<IndirectSVFGEdge>(edge)->addPointsTo(pts.<a class="code" href="classSVF_1_1PointsTo.html#ae4749cf6dc43645e2479cefbcc246637">toNodeBS</a>()) ? edge : <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>  {</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a019a4597074fdad6e51d936ed4ead0d9">MTASVFGBuilder::numOfNewSVFGEdges</a>++;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>  <a class="code" href="classSVF_1_1ThreadMHPIndSVFGEdge.html">ThreadMHPIndSVFGEdge</a>* indirectEdge = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ThreadMHPIndSVFGEdge.html">ThreadMHPIndSVFGEdge</a>(srcNode,dstNode);</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>  indirectEdge-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a50ac2e33c6a4a41291c0a476ed07de53">addPointsTo</a>(pts.<a class="code" href="classSVF_1_1PointsTo.html#ae4749cf6dc43645e2479cefbcc246637">toNodeBS</a>());</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>  <span class="keywordflow">return</span> (svfg->addSVFGEdge(indirectEdge) ? indirectEdge : <span class="keyword">nullptr</span>);</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</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"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a26b6750de23395a89767288b2eabb1ef"> 145</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a26b6750de23395a89767288b2eabb1ef">MTASVFGBuilder::performRemovingMHPEdges</a>()</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>  <span class="keywordflow">while</span> (!recordedges.empty())</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  {</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  std::pair<NodeID, NodeID> edgepair = *recordedges.begin();</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  recordedges.erase(recordedges.begin());</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span> </div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> remove_pts = edge2pts[edgepair];</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1 = SVFUtil::cast<StmtSVFGNode>(svfg->getSVFGNode(edgepair.first));</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(svfg->getSVFGNode(edgepair.second));</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span> </div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>  assert (n1&&n2 && <span class="stringliteral">"one node of removed pair is null"</span>);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  assert (n1-><a class="code" href="classSVF_1_1GenericNode.html#a0931220d7a38e03f206cbdc6465d32ad">hasOutgoingEdge</a>() && <span class="stringliteral">"n1 doesn't have out edge"</span>);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  assert (n2->hasIncomingEdge() && <span class="stringliteral">"n2 doesn't have in edge"</span>);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <a class="code" href="namespaceSVF.html#af739db846e47ba6b2fd15eaad31ab7fb">Set<SVFGEdge*></a> removededges;</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n1-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != n1-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</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>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && (edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()==n2))</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>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>& pts = e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> o = remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), eo = remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>(); o != eo; ++o)</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>  {</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>  <span class="keywordflow">if</span> (const_cast<NodeBS&>(pts).test(*o))</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>  {</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>  <span class="keyword">const_cast<</span><a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a>&<span class="keyword">></span>(pts).reset(*o);</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a07c3f5fa2e0092dac28521cf901a26cf">MTASVFGBuilder::numOfRemovedPTS</a> ++;</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  }</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>  }</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>  <span class="keywordflow">if</span> (0 == e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>().<a class="code" href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9">count</a>())</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  {</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  removededges.insert(edge);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  }</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  }</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> </div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">while</span>(!removededges.empty())</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  {</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *removededges.begin();</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  removededges.erase(removededges.begin());</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  svfg->removeSVFGEdge(edge);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>()<<<span class="stringliteral">"Read Precision remove: "</span><<edge-><a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>()<<<span class="stringliteral">" -> "</span><<edge-><a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>()<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a0319d1d2e78c79f9943f2e2f65da26ed">MTASVFGBuilder::numOfRemovedSVFGEdges</a>++;</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  }</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>  }</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span> }</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span> </div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span> </div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5c32c2f5038aab15ec2da50c7c99b405">MTASVFGBuilder::isHeadofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* <a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>, <a class="code" href="classSVF_1_1LockAnalysis.html#a07b7d49e1fbe3e5dc694b6aadbee05b8">LockAnalysis::LockSpan</a> lspan)</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>  <a class="code" href="classSVF_1_1SVFGNodeLockSpan.html">SVFGNodeLockSpan</a> pair(n,lspan);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  <span class="keywordflow">if</span> (pairheadmap.find(pair) != pairheadmap.end())</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  <span class="keywordflow">return</span> pairheadmap[pair];</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span> </div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a> = getPrevNodes(n);</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span> </div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>  {</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>  assert (SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) && <span class="stringliteral">"prev is not a store node"</span>);</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* prevNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* prevIns = prevNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span> </div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>  <span class="keywordflow">if</span> (lockana->hasOneCxtInLockSpan(prevIns, lspan))</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  {</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  pairheadmap[pair]=<span class="keyword">false</span>;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  }</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  }</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  pairheadmap[pair]=<span class="keyword">true</span>;</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span> }</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> </div><div class="line"><a name="l00225"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#ad0c3ea19875191721cd466fe85b91a8c"> 225</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5c32c2f5038aab15ec2da50c7c99b405">MTASVFGBuilder::isHeadofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aae87004825b3f30356ca49b8a1dab7f3">InstSet</a> mergespan)</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span> {</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span> </div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a> = getPrevNodes(n);</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span> </div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  {</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>  assert (SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) && <span class="stringliteral">"prev is not a store node"</span>);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* prevNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* prevIns = prevNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">if</span> (mergespan.find(prevIns)!=mergespan.end())</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  }</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span> }</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span> </div><div class="line"><a name="l00243"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a4d36dc553bc87508b78add9b52ce9c2a"> 243</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5c32c2f5038aab15ec2da50c7c99b405">MTASVFGBuilder::isHeadofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</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>  <span class="keywordflow">if</span> (headmap.find(n) != headmap.end())</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">return</span> headmap[n];</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span> </div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a> = getPrevNodes(n);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span> </div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</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>  assert(SVFUtil::isa<StoreSVFGNode>(svfg->getSVFGNode(*it)) && <span class="stringliteral">"prev is not a store node"</span>);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* prevNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* prevIns = prevNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span> </div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>  <span class="keywordflow">if</span> (lockana->isInSameSpan(prevIns, n-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>()))</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>  headmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<span class="keyword">false</span>;</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  }</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  }</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  headmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<span class="keyword">true</span>;</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span> }</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span> </div><div class="line"><a name="l00266"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#af8ea2da28e9818d4f9e4e9528997f023"> 266</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">MTASVFGBuilder::isTailofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aae87004825b3f30356ca49b8a1dab7f3">InstSet</a> mergespan)</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span> {</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span> </div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ = getSuccNodes(n);</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span> </div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  {</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  assert((SVFUtil::isa<StoreSVFGNode, LoadSVFGNode>(svfg->getSVFGNode(*it))) &&</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="stringliteral">"succ is not a store/load node"</span>);</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* succNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* succIns = succNode->getInst();</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span> </div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  <span class="keywordflow">if</span> (mergespan.find(succIns)!=mergespan.end())</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keywordflow">return</span> <span class="keyword">false</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="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span> }</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span> </div><div class="line"><a name="l00285"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f"> 285</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">MTASVFGBuilder::isTailofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="classSVF_1_1LockAnalysis.html#a07b7d49e1fbe3e5dc694b6aadbee05b8">LockAnalysis::LockSpan</a> lspan)</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>  assert(SVFUtil::isa<StoreSVFGNode>(n) && <span class="stringliteral">"Node is not a store node"</span>);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span> </div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  <a class="code" href="classSVF_1_1SVFGNodeLockSpan.html">SVFGNodeLockSpan</a> pair(n,lspan);</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">if</span> (pairtailmap.find(pair) != pairtailmap.end())</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  <span class="keywordflow">return</span> pairtailmap[pair];</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span> </div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ = getSuccNodes(n);</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</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>  assert((SVFUtil::isa<StoreSVFGNode, LoadSVFGNode>(svfg->getSVFGNode(*it))) &&</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  <span class="stringliteral">"succ is not a store/load node"</span>);</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(svfg->getSVFGNode(*it)))</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* succNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* succIns = succNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</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="keywordflow">if</span> (lockana->hasOneCxtInLockSpan(succIns, lspan))</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>  {</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>  pairtailmap[pair]=<span class="keyword">false</span>;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00307"></a><span class="lineno"> 307</span>  }</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>  }</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>  pairtailmap[pair]=<span class="keyword">true</span>;</div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span> }</div><div class="line"><a name="l00312"></a><span class="lineno"> 312</span> </div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span> </div><div class="line"><a name="l00316"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a9c8681767551575a18ee141f7336db05"> 316</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">MTASVFGBuilder::isTailofSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span> {</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  assert(SVFUtil::isa<StoreSVFGNode>(n) && <span class="stringliteral">"Node is not a store node"</span>);</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span> </div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>  <span class="keywordflow">if</span> (tailmap.find(n) != tailmap.end())</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="keywordflow">return</span> tailmap[n];</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span> </div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ = getSuccNodes(n);</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span> </div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> it = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), eit = succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); it != eit; ++it)</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>  assert((SVFUtil::isa<StoreSVFGNode, LoadSVFGNode>(svfg->getSVFGNode(*it))) && <span class="stringliteral">"succ is not a store/load node"</span>);</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>  <span class="keywordflow">if</span> (SVFUtil::isa<LoadSVFGNode>(svfg->getSVFGNode(*it)))</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00330"></a><span class="lineno"> 330</span> </div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* succNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVFUtil::dyn_cast</a><<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>>(svfg->getSVFGNode(*it));</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* succIns = succNode-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</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>  <span class="keywordflow">if</span> (lockana->isInSameSpan(succIns, n-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>()))</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>  {</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  tailmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>] = <span class="keyword">false</span>;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  }</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  }</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  tailmap[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<span class="keyword">true</span>;</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span> }</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span> </div><div class="line"><a name="l00344"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a7b034f9f8f01823ecfb7f6c17e47b502"> 344</a></span> <a class="code" href="classSVF_1_1SparseBitVector.html">MTASVFGBuilder::SVFGNodeIDSet</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a7b034f9f8f01823ecfb7f6c17e47b502">MTASVFGBuilder::getPrevNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</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>  <span class="keywordflow">if</span> (prevset.find(n)!=prevset.end())</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keywordflow">return</span> prevset[n];</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span> </div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a>;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> worklist;</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> visited;</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span> </div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(); iter != n-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  {</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>())</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  {</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>());</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</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> </div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  {</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = *worklist.begin();</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  worklist.erase(worklist.begin());</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  visited.insert(node);</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode>(node))</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  prev.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  {</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = node-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(); iter != node-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); ++iter)</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="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && visited.find(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>())==visited.end())</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>());</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>  }</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>  }</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>  prevset[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=<a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a>;</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">return</span> <a class="code" href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a>;</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span> }</div><div class="line"><a name="l00382"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0"> 382</a></span> <a class="code" href="classSVF_1_1SparseBitVector.html">MTASVFGBuilder::SVFGNodeIDSet</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0">MTASVFGBuilder::getSuccNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n)</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span> {</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  <span class="keywordflow">if</span> (succset.find(n)!=succset.end())</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>  <span class="keywordflow">return</span> succset[n];</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span> </div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> worklist;</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> visited;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span> </div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != n-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>  {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>())</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  {</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  }</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>  }</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="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>  {</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = *worklist.begin();</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>  worklist.erase(worklist.begin());</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>  visited.insert(node);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode, LoadSVFGNode>(node))</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>  succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  {</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = node-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != node-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  {</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && visited.find(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()) == visited.end())</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  }</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>  }</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  }</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  succset[<a class="code" href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a>]=succ;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <span class="keywordflow">return</span> succ;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span> }</div><div class="line"><a name="l00420"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a8164ae39b494115142767abc29cebd53"> 420</a></span> <a class="code" href="classSVF_1_1SparseBitVector.html">MTASVFGBuilder::SVFGNodeIDSet</a> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0">MTASVFGBuilder::getSuccNodes</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n, <a class="code" href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">NodeID</a> o)</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span> {</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span> </div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ;</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> worklist;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVFGNodeSet</a> visited;</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span> </div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != n-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>  {</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>())</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  {</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> pts = e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="keywordflow">if</span>(pts.test(o))</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  }</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  }</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span> </div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keywordflow">while</span> (!worklist.empty())</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1VFGNode.html">SVFGNode</a>* node = *worklist.begin();</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  worklist.erase(worklist.begin());</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  visited.insert(node);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <span class="keywordflow">if</span> (SVFUtil::isa<StoreSVFGNode, LoadSVFGNode>(node))</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  succ.<a class="code" href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">set</a>(node-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>  {</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = node-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(); iter != node-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>  {</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && visited.find(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()) == visited.end())</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>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> pts = e-><a class="code" href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">getPointsTo</a>();</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keywordflow">if</span>(pts.test(o))</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  worklist.insert(edge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>());</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  }</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  }</div><div class="line"><a name="l00459"></a><span class="lineno"> 459</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> </div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordflow">return</span> succ;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span> }</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span> </div><div class="line"><a name="l00465"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a82b52f8e70f51353cbd7476a509ff523"> 465</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a82b52f8e70f51353cbd7476a509ff523">MTASVFGBuilder::handleStoreLoadNonSparse</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</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>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>());</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span> </div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span> }</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span> </div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span> </div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span> </div><div class="line"><a name="l00475"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a91ff57e51b0650963b4b5541fa0f7056"> 475</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a91ff57e51b0650963b4b5541fa0f7056">MTASVFGBuilder::handleStoreStoreNonSparse</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</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="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</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>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  addTDEdges(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span> }</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span> </div><div class="line"><a name="l00484"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a24921d1b1d79d7ef0b358be8d7a9e2c4"> 484</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a24921d1b1d79d7ef0b358be8d7a9e2c4">MTASVFGBuilder::handleStoreLoad</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</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="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i1 = n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">if</span> (ADDEDGE_NOMHP!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <span class="keywordflow">if</span> (ADDEDGE_NOALIAS!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>()))</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span> </div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span> </div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>());</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> </div><div class="line"><a name="l00503"></a><span class="lineno"> 503</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>  <span class="keywordflow">if</span> (ADDEDGE_NOLOCK!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && lockana->isProtectedByCommonLock(i1, i2))</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>  {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <span class="keywordflow">if</span> (isTailofSpan(n1) && isHeadofSpan(n2))</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  }</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>  <span class="keywordflow">else</span></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>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</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> }</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span> </div><div class="line"><a name="l00516"></a><span class="lineno"> 516</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"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a29a14309cfa1d7c4454fb1237704e487"> 518</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a29a14309cfa1d7c4454fb1237704e487">MTASVFGBuilder::handleStoreStore</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span> {</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i1 = n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <span class="keywordflow">if</span> (ADDEDGE_NOMHP!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>  <span class="keywordflow">if</span> (ADDEDGE_NOALIAS!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && !pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>()))</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span> </div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> pts = pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  pts &= pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">getPts</a>(n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>());</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span> </div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>  <span class="keywordflow">if</span> (ADDEDGE_NOLOCK!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a> && lockana->isProtectedByCommonLock(i1, i2))</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>  {</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>  <span class="keywordflow">if</span> (isTailofSpan(n1) && isHeadofSpan(n2))</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keywordflow">if</span> (isTailofSpan(n2) && isHeadofSpan(n1))</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  addTDEdges(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</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="keywordflow">else</span></div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  {</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  addTDEdges(n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>  addTDEdges(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), pts);</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>  }</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> }</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div><div class="line"><a name="l00547"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#aa861922932233ab547b63c87551b8fd3"> 547</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aa861922932233ab547b63c87551b8fd3">MTASVFGBuilder::handleStoreLoadWithLockPrecisely</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</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>  <span class="keywordflow">if</span> (!pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a791a01f5d3528f8a8bf19369b5c61c37">getPAGSrcNodeID</a>()))</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span> </div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span> <span class="comment">// PointsTo pts = pta->getPts(n1->getPAGDstNodeID());</span></div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span> <span class="comment">// pts &= pta->getPts(n2->getPAGSrcNodeID());</span></div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span> <span class="comment">//</span></div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span> <span class="comment">// const SVFInstruction* i1 = n1->getInst();</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span> <span class="comment">// const SVFInstruction* i2 = n2->getInst();</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span> <span class="comment">//</span></div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span> <span class="comment">// NodeBS comlocks1;</span></div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span> <span class="comment">// NodeBS comlocks2;</span></div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> <span class="comment">// lockana->getCommonLocks(i1, i2, comlocks1, comlocks2);</span></div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> <span class="comment">//</span></div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> <span class="comment">// outs()<<comlocks1.count() << " "<< comlocks2.count()<<"\n";</span></div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span> </div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span> <span class="comment">// if(comlocks1.count() && comlocks2.count()) {</span></div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span> <span class="comment">// bool n1istail = false;</span></div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> <span class="comment">// for (NodeBS::iterator it1 = comlocks1.begin(), ie1 = comlocks1.end(); it1 != ie1; ++it1) {</span></div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> <span class="comment">// LockAnalysis::LockSpan lspan1 = lockana->getSpanfromCxtLock(*it1);</span></div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span> <span class="comment">// /// exist lock span, n1 is tail;</span></div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span> <span class="comment">// if (isTailofSpan(n1, lspan1))</span></div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span> <span class="comment">// n1istail = true;</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span> <span class="comment">// }</span></div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span> <span class="comment">//</span></div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span> <span class="comment">// bool n2ishead = false;</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span> <span class="comment">// for (NodeBS::iterator it2 = comlocks2.begin(), ie2 = comlocks2.end(); it2 != ie2; ++it2) {</span></div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span> <span class="comment">// LockAnalysis::LockSpan lspan2 = lockana->getSpanfromCxtLock(*it2);</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span> <span class="comment">// /// exist lock span, n2 is head;</span></div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span> <span class="comment">// if (isHeadofSpan(n2, lspan2))</span></div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> <span class="comment">// n2ishead = true;</span></div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> <span class="comment">// }</span></div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span> <span class="comment">//</span></div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span> <span class="comment">// if (n1istail && n2ishead)</span></div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> <span class="comment">// } else {</span></div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span> <span class="comment">// }</span></div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span> }</div><div class="line"><a name="l00588"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a1802d8ed854bef817afa748d2bbcea05"> 588</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a1802d8ed854bef817afa748d2bbcea05">MTASVFGBuilder::handleStoreStoreWithLockPrecisely</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1,<span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2, <a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span> {</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">if</span> (!pta-><a class="code" href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">alias</a>(n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>(), n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a04986961ad507be9fcf141ab51787da8">getPAGDstNodeID</a>()))</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span> </div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span> <span class="comment">// PointsTo pts = pta->getPts(n1->getPAGDstNodeID());</span></div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span> <span class="comment">// pts &= pta->getPts(n2->getPAGDstNodeID());</span></div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span> <span class="comment">//</span></div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span> <span class="comment">// const SVFInstruction* i1 = n1->getInst();</span></div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span> <span class="comment">// const SVFInstruction* i2 = n2->getInst();</span></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> </div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> <span class="comment">// NodeBS comlocks1;</span></div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> <span class="comment">// NodeBS comlocks2;</span></div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> <span class="comment">// lockana->getCommonLocks(i1, i2, comlocks1, comlocks2);</span></div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span> <span class="comment">// if(comlocks1.count() && comlocks2.count()) {</span></div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span> <span class="comment">// bool n1istail = false;</span></div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span> <span class="comment">// for (NodeBS::iterator it1 = comlocks1.begin(), ie1 = comlocks1.end(); it1 != ie1; ++it1) {</span></div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> <span class="comment">// LockAnalysis::LockSpan lspan1 = lockana->getSpanfromCxtLock(*it1);</span></div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> <span class="comment">// /// exist lock span, n1 is tail;</span></div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span> <span class="comment">// if (isTailofSpan(n1, lspan1))</span></div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span> <span class="comment">// n1istail = true;</span></div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span> <span class="comment">// }</span></div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span> <span class="comment">// bool n2ishead = false;</span></div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span> <span class="comment">// for (NodeBS::iterator it2 = comlocks2.begin(), ie2 = comlocks2.end(); it2 != ie2; ++it2) {</span></div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> <span class="comment">// LockAnalysis::LockSpan lspan2 = lockana->getSpanfromCxtLock(*it2);</span></div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> <span class="comment">// /// exist lock span, n2 is head;</span></div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> <span class="comment">// if (isHeadofSpan(n2, lspan2))</span></div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> <span class="comment">// n2ishead = true;</span></div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span> <span class="comment">// }</span></div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span> <span class="comment">// if (n1istail && n2ishead)</span></div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span> <span class="comment">//</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> <span class="comment">//</span></div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span> <span class="comment">// bool n2istail = false;</span></div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span> <span class="comment">// for (NodeBS::iterator it2 = comlocks2.begin(), ie2 = comlocks2.end(); it2 != ie2; ++it2) {</span></div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span> <span class="comment">// LockAnalysis::LockSpan lspan2 = lockana->getSpanfromCxtLock(*it2);</span></div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span> <span class="comment">// /// exist lock span, n2 is tail;</span></div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span> <span class="comment">// if (isTailofSpan(n2, lspan2))</span></div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span> <span class="comment">// n2istail = true;</span></div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span> <span class="comment">// }</span></div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span> <span class="comment">// bool n1ishead = false;</span></div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span> <span class="comment">// for (NodeBS::iterator it1 = comlocks1.begin(), ie1 = comlocks1.end(); it1 != ie1; ++it1) {</span></div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span> <span class="comment">// LockAnalysis::LockSpan lspan1 = lockana->getSpanfromCxtLock(*it1);</span></div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span> <span class="comment">// /// exist lock span, n1 is head;</span></div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span> <span class="comment">// if (isHeadofSpan(n1, lspan1))</span></div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span> <span class="comment">// n1ishead = true;</span></div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span> <span class="comment">// }</span></div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span> <span class="comment">// if (n2istail && n1ishead)</span></div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> <span class="comment">// addTDEdges(n2->getId(), n1->getId(), pts);</span></div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> <span class="comment">//</span></div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> <span class="comment">// } else {</span></div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> <span class="comment">// addTDEdges(n1->getId(), n2->getId(), pts);</span></div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span> <span class="comment">// addTDEdges(n2->getId(), n1->getId(), pts);</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span> <span class="comment">// }</span></div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span> }</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span> </div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span> </div><div class="line"><a name="l00647"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#ae028fe894e3c6e7fd0ad6feeaa64320e"> 647</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#ae028fe894e3c6e7fd0ad6feeaa64320e">MTASVFGBuilder::mergeSpan</a>(<a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> comlocks, <a class="code" href="classSVF_1_1MTASVFGBuilder.html#aae87004825b3f30356ca49b8a1dab7f3">InstSet</a>& res)</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span> {</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span> <span class="comment">// for (NodeBS::iterator it = comlocks.begin(), ie = comlocks.end(); it != ie; ++it) {</span></div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span> <span class="comment">// LockAnalysis::LockSpan lspan = lockana->getSpanfromCxtLock(*it);</span></div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span> <span class="comment">// for (LockAnalysis::LockSpan::const_iterator cts = lspan.begin(), ects = lspan.end(); cts!=ects; ++cts) {</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span> <span class="comment">// res.insert((*cts).getStmt());</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span> <span class="comment">// }</span></div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span> <span class="comment">// }</span></div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span> }</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span> </div><div class="line"><a name="l00658"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a5532751632ece036b3d6741908573b36"> 658</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a5532751632ece036b3d6741908573b36">MTASVFGBuilder::readPrecision</a>()</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span> {</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span> </div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>  recordedges.clear();</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>  edge2pts.clear();</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span> </div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keywordflow">for</span> (SVFGNodeSet::iterator it1 = stnodeSet.begin(), eit1 = stnodeSet.end(); it1 != eit1; ++it1)</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  {</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1 = SVFUtil::cast<StmtSVFGNode>(*it1);</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span> </div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordflow">for</span> (SVFGEdge::SVFGEdgeSetTy::iterator iter = n1-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(); iter != n1-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); ++iter)</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  {</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  <a class="code" href="classSVF_1_1VFGEdge.html">SVFGEdge</a>* edge = *iter;</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keywordflow">if</span> (edge-><a class="code" href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">isIndirectVFGEdge</a>() && SVFUtil::isa<StoreSVFGNode>(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()))</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>  {</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(edge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>());</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span> </div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  <a class="code" href="classSVF_1_1IndirectSVFGEdge.html">IndirectSVFGEdge</a>* e = SVFUtil::cast<IndirectSVFGEdge>(edge);</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">NodeBS</a> pts = e->getPointsTo();</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> remove_pts;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span> </div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">NodeBS::iterator</a> o = pts.begin(), eo = pts.end(); o != eo; ++o)</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>  {</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ1 = getSuccNodes(n1, *o);</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>  <a class="code" href="classSVF_1_1SparseBitVector.html">SVFGNodeIDSet</a> succ2 = getSuccNodes(n2, *o);</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span> </div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>  <span class="keywordtype">bool</span> <span class="keyword">remove</span> = <span class="keyword">true</span>;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVFGNodeIDSet::iterator</a> sn1 = succ1.<a class="code" href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">begin</a>(), esn1 = succ1.<a class="code" href="classSVF_1_1SparseBitVector.html#a1b5abe09fd0fcd337385653cb47343c1">end</a>(); sn1 != esn1; sn1++)</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keywordflow">if</span> (!succ2.<a class="code" href="classSVF_1_1SparseBitVector.html#a112f2ede1240c95f9fe810f2882fab80">test</a>(*sn1))</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  {</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keyword">remove</span> = <span class="keyword">false</span>;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keywordflow">break</span>;</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  }</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>  }</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>  <span class="keywordflow">if</span> (<span class="keyword">remove</span>)</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>  remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(*o);</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>  }</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span> </div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>  <span class="keywordflow">if</span> (remove_pts.<a class="code" href="classSVF_1_1PointsTo.html#a879783ba6629e500af9aa7dfcda2563d">count</a>())</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>  recordRemovingEdge(n2-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), n1-><a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(), remove_pts);</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  }</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  }</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  }</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span> </div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  performRemovingMHPEdges();</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span> }</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span> </div><div class="line"><a name="l00706"></a><span class="lineno"><a class="line" href="classSVF_1_1MTASVFGBuilder.html#a1010ef4fc52e312f2b22867a63a5810d"> 706</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1MTASVFGBuilder.html#a1010ef4fc52e312f2b22867a63a5810d">MTASVFGBuilder::connectMHPEdges</a>(<a class="code" href="classSVF_1_1PointerAnalysis.html">PointerAnalysis</a>* pta)</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span> {</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <a class="code" href="classSVF_1_1PCG.html">PCG</a>* pcg = <span class="keyword">new</span> <a class="code" href="classSVF_1_1PCG.html">PCG</a>(pta);</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keywordflow">if</span> ((ADDEDGE_NONSPARSE==<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>) && <a class="code" href="classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762">Options::UsePCG</a>)</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  pcg-><a class="code" href="classSVF_1_1PCG.html#a50b677ec622247a464cee7f0f45c5a53">analyze</a>();</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  }</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  collectLoadStoreSVFGNodes();</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  recordedges.clear();</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  edge2pts.clear();</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span> </div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>  <span class="keywordflow">for</span> (SVFGNodeSet::const_iterator it1 = stnodeSet.begin(), eit1 = stnodeSet.end(); it1!=eit1; ++it1)</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>  {</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n1 = SVFUtil::cast<StmtSVFGNode>(*it1);</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i1 = n1-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span> </div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  <span class="keywordflow">for</span> (SVFGNodeSet::const_iterator it2 = ldnodeSet.begin(), eit2 = ldnodeSet.end(); it2 != eit2; ++it2)</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>  {</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(*it2);</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  <span class="keywordflow">if</span> (ADDEDGE_NONSPARSE==<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>  {</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762">Options::UsePCG</a>)</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>  {</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>  <span class="keywordflow">if</span> (pcg-><a class="code" href="classSVF_1_1PCG.html#a0c4d2c2648638794a02d890293a2805d">mayHappenInParallel</a>(i1, i2) || mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>  handleStoreLoadNonSparse(n1, n2, pta);</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>  }</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>  {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>  handleStoreLoadNonSparse(n1, n2, pta);</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>  }</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>  }</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>  {</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>  handleStoreLoad(n1, n2, pta);</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>  }</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>  }</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span> </div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>  <span class="keywordflow">for</span> (SVFGNodeSet::const_iterator it2 = <a class="code" href="cJSON_8cpp.html#a2599f74bdbbc1b3fd1ba8db3789a0be7">std::next</a>(it1), eit2 = stnodeSet.end(); it2!=eit2; ++it2)</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>  {</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1StmtVFGNode.html">StmtSVFGNode</a>* n2 = SVFUtil::cast<StmtSVFGNode>(*it2);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFInstruction.html">SVFInstruction</a>* i2 = n2-><a class="code" href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">getInst</a>();</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>  <span class="keywordflow">if</span> (ADDEDGE_NONSPARSE == <a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>  {</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>  <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762">Options::UsePCG</a>)</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>  {</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>  <span class="keywordflow">if</span>(pcg-><a class="code" href="classSVF_1_1PCG.html#a0c4d2c2648638794a02d890293a2805d">mayHappenInParallel</a>(i1, i2) || mhp->mayHappenInParallel(i1, i2))</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>  handleStoreStoreNonSparse(n1, n2, pta);</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>  }</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>  {</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>  handleStoreStoreNonSparse(n1, n2, pta);</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>  }</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>  }</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>  {</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>  handleStoreStore(n1, n2, pta);</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>  }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>  }</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>  }</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span> </div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a6bec8aed8673d10d65cc3df9fad3383b">Options::ReadPrecisionTDEdge</a> && ADDEDGE_NORP!=<a class="code" href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">Options::AddModelFlag</a>)</div><div class="line"><a name="l00770"></a><span class="lineno"> 770</span>  {</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>()<<<span class="stringliteral">"Read precision edge removing \n"</span>);</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>  <a class="code" href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFType_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,<a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>()<<<span class="stringliteral">"Read precision edge removing \n"</span>);</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>  readPrecision();</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>  }</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span> }</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span> </div><div class="line"><a name="l00780"></a><span class="lineno"><a class="line" href="classSVF_1_1FSMPTA.html#acbfb7d2a6d38b54966c98102c1ea6a38"> 780</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">FSMPTA::initialize</a>(<a class="code" href="classSVF_1_1SVFModule.html">SVFModule</a>* module)</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span> {</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>  <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span> </div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>  <a class="code" href="classSVF_1_1AndersenWaveDiff.html">AndersenWaveDiff</a>* ander = <a class="code" href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">AndersenWaveDiff::createAndersenWaveDiff</a>(getPAG());</div><div class="line"><a name="l00785"></a><span class="lineno"> 785</span>  <a class="code" href="classSVF_1_1MTASVFGBuilder.html">MTASVFGBuilder</a> mtaSVFGBuilder(mhp,lockana);</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>  svfg = mtaSVFGBuilder.<a class="code" href="classSVF_1_1SVFGBuilder.html#ab7353191edd06568e2598177d253c1d9">buildPTROnlySVFG</a>(ander);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>  setGraph(svfg);</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>  <span class="comment">//AndersenWaveDiff::releaseAndersenWaveDiff();</span></div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span> </div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>  stat = <span class="keyword">new</span> <a class="code" href="classSVF_1_1FlowSensitiveStat.html">FlowSensitiveStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span> }</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span> </div><div class="ttc" id="classSVF_1_1PointsTo_html_ae4749cf6dc43645e2479cefbcc246637"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ae4749cf6dc43645e2479cefbcc246637">SVF::PointsTo::toNodeBS</a></div><div class="ttdeci">NodeBS toNodeBS(void) const</div><div class="ttdoc">Returns this points-to set as a NodeBS. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00309">PointsTo.cpp:309</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator_html"><div class="ttname"><a href="classSVF_1_1SparseBitVector_1_1SparseBitVectorIterator.html">SVF::SparseBitVector::SparseBitVectorIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00536">SparseBitVector.h:536</a></div></div>
|
|
71
71
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_aed3e0bf64c3ccb6bfd24e89cc6f89ed9"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#aed3e0bf64c3ccb6bfd24e89cc6f89ed9">SVF::MTASVFGBuilder::NodeIDPair</a></div><div class="ttdeci">std::pair< NodeID, NodeID > NodeIDPair</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00108">FSMPTA.h:108</a></div></div>
|
|
72
72
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a019a4597074fdad6e51d936ed4ead0d9"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a019a4597074fdad6e51d936ed4ead0d9">SVF::MTASVFGBuilder::numOfNewSVFGEdges</a></div><div class="ttdeci">static u32_t numOfNewSVFGEdges</div><div class="ttdoc">Number of newly added SVFG edges. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00120">FSMPTA.h:120</a></div></div>
|
|
@@ -77,14 +77,14 @@ $(function() {
|
|
|
77
77
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a2effeeac276a64d612fe6af08ec25b74"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a2effeeac276a64d612fe6af08ec25b74">SVF::MTASVFGBuilder::recordAddingEdge</a></div><div class="ttdeci">bool recordAddingEdge(NodeID id1, NodeID id2, PointsTo pts)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00103">FSMPTA.cpp:103</a></div></div>
|
|
78
78
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a4dfb43679e9fa794ebad99b6584c32ec"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a4dfb43679e9fa794ebad99b6584c32ec">SVF::PointerAnalysis::getPts</a></div><div class="ttdeci">virtual const PointsTo & getPts(NodeID ptr)=0</div><div class="ttdoc">Get points-to targets of a pointer. It needs to be implemented in child class. </div></div>
|
|
79
79
|
<div class="ttc" id="namespaceSVF_html_a350ae9bf8606bdfe23c8679681b969dc"><div class="ttname"><a href="namespaceSVF.html#a350ae9bf8606bdfe23c8679681b969dc">SVF::NodeID</a></div><div class="ttdeci">unsigned NodeID</div><div class="ttdef"><b>Definition:</b> <a href="include_2MTA_2MTAResultValidator_8h_source.html#l00020">MTAResultValidator.h:20</a></div></div>
|
|
80
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a1802d8ed854bef817afa748d2bbcea05"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a1802d8ed854bef817afa748d2bbcea05">SVF::MTASVFGBuilder::handleStoreStoreWithLockPrecisely</a></div><div class="ttdeci">void handleStoreStoreWithLockPrecisely(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
80
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a1802d8ed854bef817afa748d2bbcea05"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a1802d8ed854bef817afa748d2bbcea05">SVF::MTASVFGBuilder::handleStoreStoreWithLockPrecisely</a></div><div class="ttdeci">void handleStoreStoreWithLockPrecisely(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00588">FSMPTA.cpp:588</a></div></div>
|
|
81
81
|
<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#l00079">GenericGraph.h:79</a></div></div>
|
|
82
82
|
<div class="ttc" id="classSVF_1_1VFGEdge_html_aa8f30d093d4950724a6688707326b57b"><div class="ttname"><a href="classSVF_1_1VFGEdge.html#aa8f30d093d4950724a6688707326b57b">SVF::VFGEdge::isIndirectVFGEdge</a></div><div class="ttdeci">bool isIndirectVFGEdge() const</div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00080">VFGEdge.h:80</a></div></div>
|
|
83
83
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a609eea630a8f88fe9eaba15ce7e48738"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVF::SVFUtil::pasMsg</a></div><div class="ttdeci">std::string pasMsg(std::string msg)</div><div class="ttdoc">Print each pass/phase message by converting a string into blue string output. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00098">SVFUtil.cpp:98</a></div></div>
|
|
84
84
|
<div class="ttc" id="classSVF_1_1GenericNode_html_aa4f103330118c8976bf95e4bf53416eb"><div class="ttname"><a href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">SVF::GenericNode::OutEdgeBegin</a></div><div class="ttdeci">iterator OutEdgeBegin()</div><div class="ttdoc">iterators </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00208">GenericGraph.h:208</a></div></div>
|
|
85
85
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a46d39980440040fc0ca50b3df7eead1a"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a46d39980440040fc0ca50b3df7eead1a">SVF::MTASVFGBuilder::collectLoadStoreSVFGNodes</a></div><div class="ttdeci">void collectLoadStoreSVFGNodes()</div><div class="ttdoc">Collect all loads/stores SVFGNodes. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00064">FSMPTA.cpp:64</a></div></div>
|
|
86
86
|
<div class="ttc" id="classSVF_1_1PCG_html"><div class="ttname"><a href="classSVF_1_1PCG.html">SVF::PCG</a></div><div class="ttdef"><b>Definition:</b> <a href="PCG_8h_source.html#l00050">PCG.h:50</a></div></div>
|
|
87
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a5532751632ece036b3d6741908573b36"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a5532751632ece036b3d6741908573b36">SVF::MTASVFGBuilder::readPrecision</a></div><div class="ttdeci">void readPrecision()</div><div class="ttdoc">For o, n2-o->n1, n1 and n2 are write. Foreach n3:n1->n3, n2->n3; then remove n2->n1. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
87
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a5532751632ece036b3d6741908573b36"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a5532751632ece036b3d6741908573b36">SVF::MTASVFGBuilder::readPrecision</a></div><div class="ttdeci">void readPrecision()</div><div class="ttdoc">For o, n2-o->n1, n1 and n2 are write. Foreach n3:n1->n3, n2->n3; then remove n2->n1. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00658">FSMPTA.cpp:658</a></div></div>
|
|
88
88
|
<div class="ttc" id="classSVF_1_1AndersenWaveDiff_html"><div class="ttname"><a href="classSVF_1_1AndersenWaveDiff.html">SVF::AndersenWaveDiff</a></div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00378">Andersen.h:378</a></div></div>
|
|
89
89
|
<div class="ttc" id="classSVF_1_1PointsTo_1_1PointsToIterator_html"><div class="ttname"><a href="classSVF_1_1PointsTo_1_1PointsToIterator.html">SVF::PointsTo::PointsToIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00181">PointsTo.h:181</a></div></div>
|
|
90
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#l00075">GenericGraph.h:75</a></div></div>
|
|
@@ -93,30 +93,30 @@ $(function() {
|
|
|
93
93
|
<div class="ttc" id="SVFType_8h_html_a2c64190a065f342897573a3ef4973adb"><div class="ttname"><a href="SVFType_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a></div><div class="ttdeci">#define DGENERAL</div><div class="ttdoc">General debug flag is for each phase of a pass, it is often in a colorful output format. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00424">SVFType.h:424</a></div></div>
|
|
94
94
|
<div class="ttc" id="classSVF_1_1GenericNode_html_a0931220d7a38e03f206cbdc6465d32ad"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a0931220d7a38e03f206cbdc6465d32ad">SVF::GenericNode::hasOutgoingEdge</a></div><div class="ttdeci">bool hasOutgoingEdge() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00200">GenericGraph.h:200</a></div></div>
|
|
95
95
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a4880571f57542afc50da506dfe273183"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a4880571f57542afc50da506dfe273183">SVF::PointerAnalysis::printStat</a></div><div class="ttdeci">bool printStat()</div><div class="ttdoc">Whether print statistics. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00362">PointerAnalysis.h:362</a></div></div>
|
|
96
|
-
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_af6e96694d983643a66c238cce01bff0e"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if_t<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type > dyn_cast(const Y &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#
|
|
96
|
+
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_af6e96694d983643a66c238cce01bff0e"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#af6e96694d983643a66c238cce01bff0e">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if_t<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type > dyn_cast(const Y &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00405">Casting.h:405</a></div></div>
|
|
97
97
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a55da7f1a8921727f84232e5905d6135f"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a55da7f1a8921727f84232e5905d6135f">SVF::MTASVFGBuilder::recordEdge</a></div><div class="ttdeci">bool recordEdge(NodeID id1, NodeID id2, PointsTo pts)</div><div class="ttdoc">Record edges. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00088">FSMPTA.cpp:88</a></div></div>
|
|
98
98
|
<div class="ttc" id="classSVF_1_1SparseBitVector_html_a9f96e6a886fa69e07cda5dbfaed8b7c9"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html#a9f96e6a886fa69e07cda5dbfaed8b7c9">SVF::SparseBitVector::count</a></div><div class="ttdeci">unsigned count() const</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l01104">SparseBitVector.h:1104</a></div></div>
|
|
99
99
|
<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>
|
|
100
100
|
<div class="ttc" id="classSVF_1_1FSMPTA_html"><div class="ttname"><a href="classSVF_1_1FSMPTA.html">SVF::FSMPTA</a></div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00202">FSMPTA.h:202</a></div></div>
|
|
101
101
|
<div class="ttc" id="classSVF_1_1Options_html_af129d2ff94af3f6830c0678cb4b72371"><div class="ttname"><a href="classSVF_1_1Options.html#af129d2ff94af3f6830c0678cb4b72371">SVF::Options::AddModelFlag</a></div><div class="ttdeci">static const llvm::cl::opt< u32_t > AddModelFlag</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00169">Options.h:169</a></div></div>
|
|
102
102
|
<div class="ttc" id="classSVF_1_1GenericNode_html_ae5b113921530eee6afe58a65d8e5b3a7"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">SVF::GenericNode::InEdgeBegin</a></div><div class="ttdeci">iterator InEdgeBegin()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00216">GenericGraph.h:216</a></div></div>
|
|
103
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a7033805052c8fae5cd0104fdd9e345c0"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0">SVF::MTASVFGBuilder::getSuccNodes</a></div><div class="ttdeci">SVFGNodeIDSet getSuccNodes(const StmtSVFGNode *n)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
103
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a7033805052c8fae5cd0104fdd9e345c0"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a7033805052c8fae5cd0104fdd9e345c0">SVF::MTASVFGBuilder::getSuccNodes</a></div><div class="ttdeci">SVFGNodeIDSet getSuccNodes(const StmtSVFGNode *n)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00382">FSMPTA.cpp:382</a></div></div>
|
|
104
104
|
<div class="ttc" id="classSVF_1_1GenericGraph_html_a5dfa3f178d4abf37177d0d74ff4c6a97"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">SVF::GenericGraph::const_iterator</a></div><div class="ttdeci">IDToNodeMapTy::const_iterator const_iterator</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00347">GenericGraph.h:347</a></div></div>
|
|
105
105
|
<div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html_a50ac2e33c6a4a41291c0a476ed07de53"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html#a50ac2e33c6a4a41291c0a476ed07de53">SVF::IndirectSVFGEdge::addPointsTo</a></div><div class="ttdeci">bool addPointsTo(const NodeBS &c)</div><div class="ttdoc">Handle memory region. </div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00056">SVFGEdge.h:56</a></div></div>
|
|
106
106
|
<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="SVFType_8h_source.html#l00050">SVFType.h:50</a></div></div>
|
|
107
107
|
<div class="ttc" id="classSVF_1_1FSMPTA_html_af248a80855457ca9e5a7208c114681bb"><div class="ttname"><a href="classSVF_1_1FSMPTA.html#af248a80855457ca9e5a7208c114681bb">SVF::FSMPTA::mfspta</a></div><div class="ttdeci">static FSMPTA * mfspta</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00252">FSMPTA.h:252</a></div></div>
|
|
108
108
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a2e654f80c3680cd434fd04932a309a2d"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a2e654f80c3680cd434fd04932a309a2d">SVF::MTASVFGBuilder::addTDEdges</a></div><div class="ttdeci">SVFGEdge * addTDEdges(NodeID srcId, NodeID dstId, PointsTo &pts)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00125">FSMPTA.cpp:125</a></div></div>
|
|
109
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_ae028fe894e3c6e7fd0ad6feeaa64320e"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#ae028fe894e3c6e7fd0ad6feeaa64320e">SVF::MTASVFGBuilder::mergeSpan</a></div><div class="ttdeci">void mergeSpan(NodeBS comlocks, InstSet &res)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
109
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_ae028fe894e3c6e7fd0ad6feeaa64320e"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#ae028fe894e3c6e7fd0ad6feeaa64320e">SVF::MTASVFGBuilder::mergeSpan</a></div><div class="ttdeci">void mergeSpan(NodeBS comlocks, InstSet &res)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00647">FSMPTA.cpp:647</a></div></div>
|
|
110
110
|
<div class="ttc" id="classSVF_1_1SVFGNodeLockSpan_html"><div class="ttname"><a href="classSVF_1_1SVFGNodeLockSpan.html">SVF::SVFGNodeLockSpan</a></div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00051">FSMPTA.h:51</a></div></div>
|
|
111
111
|
<div class="ttc" id="classSVF_1_1VFGEdge_html"><div class="ttname"><a href="classSVF_1_1VFGEdge.html">SVF::VFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00044">VFGEdge.h:44</a></div></div>
|
|
112
112
|
<div class="ttc" id="classSVF_1_1StmtVFGNode_html_a3fb14833d95bb3550f904b5e236a5364"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html#a3fb14833d95bb3550f904b5e236a5364">SVF::StmtVFGNode::getInst</a></div><div class="ttdeci">const SVFInstruction * getInst() const</div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00185">VFGNode.h:185</a></div></div>
|
|
113
113
|
<div class="ttc" id="cJSON_8cpp_html_ab6e2ea6dc7bd57d1483413449998230a"><div class="ttname"><a href="cJSON_8cpp.html#ab6e2ea6dc7bd57d1483413449998230a">n</a></div><div class="ttdeci">cJSON * n</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02558">cJSON.cpp:2558</a></div></div>
|
|
114
114
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a07c3f5fa2e0092dac28521cf901a26cf"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a07c3f5fa2e0092dac28521cf901a26cf">SVF::MTASVFGBuilder::numOfRemovedPTS</a></div><div class="ttdeci">static u32_t numOfRemovedPTS</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00122">FSMPTA.h:122</a></div></div>
|
|
115
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a24921d1b1d79d7ef0b358be8d7a9e2c4"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a24921d1b1d79d7ef0b358be8d7a9e2c4">SVF::MTASVFGBuilder::handleStoreLoad</a></div><div class="ttdeci">void handleStoreLoad(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
115
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a24921d1b1d79d7ef0b358be8d7a9e2c4"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a24921d1b1d79d7ef0b358be8d7a9e2c4">SVF::MTASVFGBuilder::handleStoreLoad</a></div><div class="ttdeci">void handleStoreLoad(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00484">FSMPTA.cpp:484</a></div></div>
|
|
116
116
|
<div class="ttc" id="classSVF_1_1FlowSensitive_html_ad6243c1317503bed39411dab47c83da7"><div class="ttname"><a href="classSVF_1_1FlowSensitive.html#ad6243c1317503bed39411dab47c83da7">SVF::FlowSensitive::initialize</a></div><div class="ttdeci">virtual void initialize()</div><div class="ttdoc">Initialize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="FlowSensitive_8cpp_source.html#l00045">FlowSensitive.cpp:45</a></div></div>
|
|
117
117
|
<div class="ttc" id="classSVF_1_1PCG_html_a50b677ec622247a464cee7f0f45c5a53"><div class="ttname"><a href="classSVF_1_1PCG.html#a50b677ec622247a464cee7f0f45c5a53">SVF::PCG::analyze</a></div><div class="ttdeci">virtual bool analyze()</div><div class="ttdoc">We start the pass here. </div><div class="ttdef"><b>Definition:</b> <a href="PCG_8cpp_source.html#l00043">PCG.cpp:43</a></div></div>
|
|
118
118
|
<div class="ttc" id="classSVF_1_1SVFGBuilder_html_ab7353191edd06568e2598177d253c1d9"><div class="ttname"><a href="classSVF_1_1SVFGBuilder.html#ab7353191edd06568e2598177d253c1d9">SVF::SVFGBuilder::buildPTROnlySVFG</a></div><div class="ttdeci">SVFG * buildPTROnlySVFG(BVDataPTAImpl *pta)</div><div class="ttdef"><b>Definition:</b> <a href="SVFGBuilder_8cpp_source.html#l00044">SVFGBuilder.cpp:44</a></div></div>
|
|
119
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a91ff57e51b0650963b4b5541fa0f7056"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a91ff57e51b0650963b4b5541fa0f7056">SVF::MTASVFGBuilder::handleStoreStoreNonSparse</a></div><div class="ttdeci">void handleStoreStoreNonSparse(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
119
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a91ff57e51b0650963b4b5541fa0f7056"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a91ff57e51b0650963b4b5541fa0f7056">SVF::MTASVFGBuilder::handleStoreStoreNonSparse</a></div><div class="ttdeci">void handleStoreStoreNonSparse(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00475">FSMPTA.cpp:475</a></div></div>
|
|
120
120
|
<div class="ttc" id="classSVF_1_1PointsTo_html_aa53962e561399bf493d1f2b9137356f6"><div class="ttname"><a href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">SVF::PointsTo::begin</a></div><div class="ttdeci">const_iterator begin(void) const</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00128">PointsTo.h:128</a></div></div>
|
|
121
121
|
<div class="ttc" id="SVFType_8h_html_a217a1ccdaec1abb103cf6b0373631234"><div class="ttname"><a href="SVFType_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a></div><div class="ttdeci">#define DMTA</div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00439">SVFType.h:439</a></div></div>
|
|
122
122
|
<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#l00095">GenericGraph.h:95</a></div></div>
|
|
@@ -138,38 +138,38 @@ $(function() {
|
|
|
138
138
|
<div class="ttc" id="classSVF_1_1GenericEdge_html_ab47ca533c415841ef75456cbad439589"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">SVF::GenericEdge::getSrcNode</a></div><div class="ttdeci">NodeType * getSrcNode() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00091">GenericGraph.h:91</a></div></div>
|
|
139
139
|
<div class="ttc" id="classSVF_1_1PointsTo_html_ab196d86cfb48d1c5d27a0c03c7497afa"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">SVF::PointsTo::set</a></div><div class="ttdeci">void set(u32_t n)</div><div class="ttdoc">Inserts n in the set. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00153">PointsTo.cpp:153</a></div></div>
|
|
140
140
|
<div class="ttc" id="classSVF_1_1ThreadMHPIndSVFGEdge_html"><div class="ttname"><a href="classSVF_1_1ThreadMHPIndSVFGEdge.html">SVF::ThreadMHPIndSVFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00206">SVFGEdge.h:206</a></div></div>
|
|
141
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_ac8339229ade604f4205b111bfc99f23f"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">SVF::MTASVFGBuilder::isTailofSpan</a></div><div class="ttdeci">bool isTailofSpan(const StmtSVFGNode *n, LockAnalysis::LockSpan lspan)</div><div class="ttdoc">whether is a last write in the lock span. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
141
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_ac8339229ade604f4205b111bfc99f23f"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#ac8339229ade604f4205b111bfc99f23f">SVF::MTASVFGBuilder::isTailofSpan</a></div><div class="ttdeci">bool isTailofSpan(const StmtSVFGNode *n, LockAnalysis::LockSpan lspan)</div><div class="ttdoc">whether is a last write in the lock span. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00285">FSMPTA.cpp:285</a></div></div>
|
|
142
142
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a5c32c2f5038aab15ec2da50c7c99b405"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a5c32c2f5038aab15ec2da50c7c99b405">SVF::MTASVFGBuilder::isHeadofSpan</a></div><div class="ttdeci">bool isHeadofSpan(const StmtSVFGNode *n, LockAnalysis::LockSpan lspan)</div><div class="ttdoc">whether is a first write in the lock span. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00201">FSMPTA.cpp:201</a></div></div>
|
|
143
143
|
<div class="ttc" id="Options_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
|
|
144
144
|
<div class="ttc" id="classSVF_1_1VFGEdge_html_a156ae6a8b3a033f505c18c6b162e7cf5aae3168b6bc9141e4a1f3723eae4f3375"><div class="ttname"><a href="classSVF_1_1VFGEdge.html#a156ae6a8b3a033f505c18c6b162e7cf5aae3168b6bc9141e4a1f3723eae4f3375">SVF::VFGEdge::TheadMHPIndirectVF</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00059">VFGEdge.h:59</a></div></div>
|
|
145
145
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a26b6750de23395a89767288b2eabb1ef"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a26b6750de23395a89767288b2eabb1ef">SVF::MTASVFGBuilder::performRemovingMHPEdges</a></div><div class="ttdeci">void performRemovingMHPEdges()</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00145">FSMPTA.cpp:145</a></div></div>
|
|
146
146
|
<div class="ttc" id="classSVF_1_1AndersenWaveDiff_html_a48ff6fc4badc79ad3204ae9bd95cc540"><div class="ttname"><a href="classSVF_1_1AndersenWaveDiff.html#a48ff6fc4badc79ad3204ae9bd95cc540">SVF::AndersenWaveDiff::createAndersenWaveDiff</a></div><div class="ttdeci">static AndersenWaveDiff * createAndersenWaveDiff(SVFIR *_pag)</div><div class="ttdoc">Create an singleton instance directly instead of invoking llvm pass manager. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00389">Andersen.h:389</a></div></div>
|
|
147
147
|
<div class="ttc" id="classSVF_1_1SparseBitVector_html_abf76d8157c49ddba24bdc9dab3655772"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html#abf76d8157c49ddba24bdc9dab3655772">SVF::SparseBitVector::begin</a></div><div class="ttdeci">iterator begin() const</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l01115">SparseBitVector.h:1115</a></div></div>
|
|
148
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a29a14309cfa1d7c4454fb1237704e487"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a29a14309cfa1d7c4454fb1237704e487">SVF::MTASVFGBuilder::handleStoreStore</a></div><div class="ttdeci">void handleStoreStore(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
148
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a29a14309cfa1d7c4454fb1237704e487"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a29a14309cfa1d7c4454fb1237704e487">SVF::MTASVFGBuilder::handleStoreStore</a></div><div class="ttdeci">void handleStoreStore(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00518">FSMPTA.cpp:518</a></div></div>
|
|
149
149
|
<div class="ttc" id="classSVF_1_1SparseBitVector_html"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html">SVF::SparseBitVector</a></div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00462">SparseBitVector.h:462</a></div></div>
|
|
150
150
|
<div class="ttc" id="classSVF_1_1Options_html_af2f66307e1d51947676f622c98ef0762"><div class="ttname"><a href="classSVF_1_1Options.html#af2f66307e1d51947676f622c98ef0762">SVF::Options::UsePCG</a></div><div class="ttdeci">static const llvm::cl::opt< bool > UsePCG</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00166">Options.h:166</a></div></div>
|
|
151
151
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a467e7b445394acb735b1b24ce39e966a"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a467e7b445394acb735b1b24ce39e966a">SVF::MTASVFGBuilder::SVFGNodeSet</a></div><div class="ttdeci">Set< const SVFGNode * > SVFGNodeSet</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00104">FSMPTA.h:104</a></div></div>
|
|
152
152
|
<div class="ttc" id="PCG_8h_html"><div class="ttname"><a href="PCG_8h.html">PCG.h</a></div></div>
|
|
153
153
|
<div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="CFGNormalizer_8h_source.html#l00035">CFGNormalizer.h:35</a></div></div>
|
|
154
154
|
<div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00171">GenericGraph.h:171</a></div></div>
|
|
155
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a1010ef4fc52e312f2b22867a63a5810d"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a1010ef4fc52e312f2b22867a63a5810d">SVF::MTASVFGBuilder::connectMHPEdges</a></div><div class="ttdeci">void connectMHPEdges(PointerAnalysis *pta)</div><div class="ttdoc">Connect MHP indirect value-flow edges for two nodes that may-happen-in-parallel. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
155
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a1010ef4fc52e312f2b22867a63a5810d"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a1010ef4fc52e312f2b22867a63a5810d">SVF::MTASVFGBuilder::connectMHPEdges</a></div><div class="ttdeci">void connectMHPEdges(PointerAnalysis *pta)</div><div class="ttdoc">Connect MHP indirect value-flow edges for two nodes that may-happen-in-parallel. </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00706">FSMPTA.cpp:706</a></div></div>
|
|
156
156
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_ae1323233941cdc9b99332e4b954a2217"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#ae1323233941cdc9b99332e4b954a2217">SVF::PointerAnalysis::alias</a></div><div class="ttdeci">virtual AliasResult alias(const SVFValue *V1, const SVFValue *V2)=0</div><div class="ttdoc">Interface exposed to users of our pointer analysis, given Value infos. </div></div>
|
|
157
157
|
<div class="ttc" id="classSVF_1_1StmtVFGNode_html"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html">SVF::StmtVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00116">VFGNode.h:116</a></div></div>
|
|
158
158
|
<div class="ttc" id="classSVF_1_1SparseBitVector_html_a61bd86909a141f9de873d92c0f904832"><div class="ttname"><a href="classSVF_1_1SparseBitVector.html#a61bd86909a141f9de873d92c0f904832">SVF::SparseBitVector::set</a></div><div class="ttdeci">void set(unsigned Idx)</div><div class="ttdef"><b>Definition:</b> <a href="SparseBitVector_8h_source.html#l00747">SparseBitVector.h:747</a></div></div>
|
|
159
159
|
<div class="ttc" id="cJSON_8cpp_html_a8f132000c2609a05d1bfd83e25db97d5"><div class="ttname"><a href="cJSON_8cpp.html#a8f132000c2609a05d1bfd83e25db97d5">prev</a></div><div class="ttdeci">newitem prev</div><div class="ttdef"><b>Definition:</b> <a href="cJSON_8cpp_source.html#l02285">cJSON.cpp:2285</a></div></div>
|
|
160
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a82b52f8e70f51353cbd7476a509ff523"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a82b52f8e70f51353cbd7476a509ff523">SVF::MTASVFGBuilder::handleStoreLoadNonSparse</a></div><div class="ttdeci">void handleStoreLoadNonSparse(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
160
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a82b52f8e70f51353cbd7476a509ff523"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a82b52f8e70f51353cbd7476a509ff523">SVF::MTASVFGBuilder::handleStoreLoadNonSparse</a></div><div class="ttdeci">void handleStoreLoadNonSparse(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00465">FSMPTA.cpp:465</a></div></div>
|
|
161
161
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a0ed91beb4d3442c0a78ea81bde8d41a3"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a0ed91beb4d3442c0a78ea81bde8d41a3">SVF::MTASVFGBuilder::performAddingMHPEdges</a></div><div class="ttdeci">void performAddingMHPEdges()</div><div class="ttdoc">perform adding/removing MHP Edges in value flow graph </div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00113">FSMPTA.cpp:113</a></div></div>
|
|
162
162
|
<div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html">SVF::IndirectSVFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00042">SVFGEdge.h:42</a></div></div>
|
|
163
163
|
<div class="ttc" id="classSVF_1_1GenericNode_html_a19a3366fd8a58290d0c740c46c3dcb3d"><div class="ttname"><a href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">SVF::GenericNode::OutEdgeEnd</a></div><div class="ttdeci">iterator OutEdgeEnd()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00212">GenericGraph.h:212</a></div></div>
|
|
164
164
|
<div class="ttc" id="classSVF_1_1MemSSA_html_ad40617a1907b9a6b8cc24888ce54a0ac"><div class="ttname"><a href="classSVF_1_1MemSSA.html#ad40617a1907b9a6b8cc24888ce54a0ac">SVF::MemSSA::getPTA</a></div><div class="ttdeci">BVDataPTAImpl * getPTA() const</div><div class="ttdoc">Return PTA. </div><div class="ttdef"><b>Definition:</b> <a href="MemSSA_8h_source.html#l00306">MemSSA.h:306</a></div></div>
|
|
165
165
|
<div class="ttc" id="classSVF_1_1Options_html_a6bec8aed8673d10d65cc3df9fad3383b"><div class="ttname"><a href="classSVF_1_1Options.html#a6bec8aed8673d10d65cc3df9fad3383b">SVF::Options::ReadPrecisionTDEdge</a></div><div class="ttdeci">static const llvm::cl::opt< bool > ReadPrecisionTDEdge</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00168">Options.h:168</a></div></div>
|
|
166
166
|
<div class="ttc" id="classSVF_1_1PointsTo_html"><div class="ttname"><a href="classSVF_1_1PointsTo.html">SVF::PointsTo</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00028">PointsTo.h:28</a></div></div>
|
|
167
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a7b034f9f8f01823ecfb7f6c17e47b502"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a7b034f9f8f01823ecfb7f6c17e47b502">SVF::MTASVFGBuilder::getPrevNodes</a></div><div class="ttdeci">SVFGNodeIDSet getPrevNodes(const StmtSVFGNode *n)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
167
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_a7b034f9f8f01823ecfb7f6c17e47b502"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#a7b034f9f8f01823ecfb7f6c17e47b502">SVF::MTASVFGBuilder::getPrevNodes</a></div><div class="ttdeci">SVFGNodeIDSet getPrevNodes(const StmtSVFGNode *n)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00344">FSMPTA.cpp:344</a></div></div>
|
|
168
168
|
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html">SVF::MTASVFGBuilder</a></div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8h_source.html#l00097">FSMPTA.h:97</a></div></div>
|
|
169
169
|
<div class="ttc" id="SVFType_8h_html_a173ce1b9b505fdadf5613b663749d3b0"><div class="ttname"><a href="SVFType_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a></div><div class="ttdeci">#define DBOUT(TYPE, X)</div><div class="ttdoc">LLVM debug macros, define type of your DEBUG model of each pass. </div><div class="ttdef"><b>Definition:</b> <a href="SVFType_8h_source.html#l00419">SVFType.h:419</a></div></div>
|
|
170
170
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html_a431ec4f85eb0f029e5740b92fd9ceb32"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">SVF::PointerAnalysis::initialize</a></div><div class="ttdeci">virtual void initialize()</div><div class="ttdoc">Initialization of a pointer analysis, including building symbol table and SVFIR etc. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8cpp_source.html#l00105">PointerAnalysis.cpp:105</a></div></div>
|
|
171
171
|
<div class="ttc" id="classSVF_1_1PointsTo_html_a8f741cdffbf3c5fe0f602cdca677dee6"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">SVF::PointsTo::end</a></div><div class="ttdeci">const_iterator end(void) const</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00132">PointsTo.h:132</a></div></div>
|
|
172
|
-
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_aa861922932233ab547b63c87551b8fd3"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#aa861922932233ab547b63c87551b8fd3">SVF::MTASVFGBuilder::handleStoreLoadWithLockPrecisely</a></div><div class="ttdeci">void handleStoreLoadWithLockPrecisely(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#
|
|
172
|
+
<div class="ttc" id="classSVF_1_1MTASVFGBuilder_html_aa861922932233ab547b63c87551b8fd3"><div class="ttname"><a href="classSVF_1_1MTASVFGBuilder.html#aa861922932233ab547b63c87551b8fd3">SVF::MTASVFGBuilder::handleStoreLoadWithLockPrecisely</a></div><div class="ttdeci">void handleStoreLoadWithLockPrecisely(const StmtSVFGNode *n1, const StmtSVFGNode *n2, PointerAnalysis *pta)</div><div class="ttdef"><b>Definition:</b> <a href="FSMPTA_8cpp_source.html#l00547">FSMPTA.cpp:547</a></div></div>
|
|
173
173
|
<div class="ttc" id="FSMPTA_8h_html"><div class="ttname"><a href="FSMPTA_8h.html">FSMPTA.h</a></div></div>
|
|
174
174
|
<div class="ttc" id="classSVF_1_1IndirectSVFGEdge_html_a30aca718d25924f1babdf348bb0ace71"><div class="ttname"><a href="classSVF_1_1IndirectSVFGEdge.html#a30aca718d25924f1babdf348bb0ace71">SVF::IndirectSVFGEdge::getPointsTo</a></div><div class="ttdeci">const NodeBS & getPointsTo() const</div><div class="ttdef"><b>Definition:</b> <a href="SVFGEdge_8h_source.html#l00060">SVFGEdge.h:60</a></div></div>
|
|
175
175
|
<div class="ttc" id="classSVF_1_1PointerAnalysis_html"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html">SVF::PointerAnalysis</a></div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00058">PointerAnalysis.h:58</a></div></div>
|