svf-tools 1.0.474 → 1.0.475
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 +1 -1
- package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +8 -7
- package/SVF-doxygen/html/html/Andersen_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Andersen_8h_source.html +1 -1
- package/SVF-doxygen/html/html/CFLAlias_8h_source.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp.html +2 -2
- package/SVF-doxygen/html/html/CHGBuilder_8cpp_source.html +20 -19
- package/SVF-doxygen/html/html/CHGBuilder_8h_source.html +15 -15
- package/SVF-doxygen/html/html/CPPUtil_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/Casting_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ConsG_8h_source.html +1 -1
- package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
- package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAPass_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +4 -4
- package/SVF-doxygen/html/html/ExeState_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowDDA_8h_source.html +2 -2
- package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +7 -7
- package/SVF-doxygen/html/html/ICFG_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/IRGraph_8h_source.html +3 -3
- package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +24 -24
- package/SVF-doxygen/html/html/LLVMUtil_8h.html +111 -111
- package/SVF-doxygen/html/html/LLVMUtil_8h_source.html +41 -40
- package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +11 -10
- package/SVF-doxygen/html/html/LeakChecker_8h_source.html +8 -8
- package/SVF-doxygen/html/html/LocationSet_8cpp_source.html +14 -13
- package/SVF-doxygen/html/html/LocationSet_8h_source.html +9 -9
- package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +31 -30
- package/SVF-doxygen/html/html/LockAnalysis_8h_source.html +23 -23
- package/SVF-doxygen/html/html/MHP_8h_source.html +2 -2
- package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +1 -1
- package/SVF-doxygen/html/html/MTA_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/MemPartition_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +35 -34
- package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +28 -27
- package/SVF-doxygen/html/html/MemSSA_8h_source.html +19 -19
- package/SVF-doxygen/html/html/PTAStat_8cpp_source.html +14 -14
- package/SVF-doxygen/html/html/PathCondAllocator_8cpp_source.html +26 -25
- package/SVF-doxygen/html/html/PathCondAllocator_8h_source.html +22 -22
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +5 -5
- package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
- package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +27 -26
- package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +24 -24
- package/SVF-doxygen/html/html/ProgSlice_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFBasicTypes_8h_source.html +1 -1
- package/SVF-doxygen/html/html/SVFGBuilder_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/SVFGStat_8cpp_source.html +7 -7
- package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +17 -16
- package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +37 -37
- package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +6 -6
- package/SVF-doxygen/html/html/SVFIR_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SVFModule_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SVFStatements_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SVFVariables_8h_source.html +3 -3
- package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +40 -39
- package/SVF-doxygen/html/html/SymbolTableBuilder_8h_source.html +16 -16
- package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +58 -57
- package/SVF-doxygen/html/html/SymbolTableInfo_8h_source.html +24 -24
- package/SVF-doxygen/html/html/TCT_8h_source.html +2 -2
- package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +1 -1
- package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/WPAStat_8h_source.html +5 -5
- package/SVF-doxygen/html/html/cfl_8cpp.html +3 -3
- package/SVF-doxygen/html/html/cfl_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +14 -14
- package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +6 -6
- package/SVF-doxygen/html/html/classSVF_1_1BranchStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1CFLAlias.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1CHGBuilder.html +48 -48
- package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1DDAPass.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ExeState.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +23 -23
- package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1GepObjVar.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1GepStmt.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +23 -23
- package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1IRGraph.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +22 -22
- package/SVF-doxygen/html/html/classSVF_1_1LocationSet.html +28 -28
- package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +78 -78
- package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +100 -100
- package/SVF-doxygen/html/html/classSVF_1_1MTA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1MemObj.html +54 -54
- package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +56 -56
- package/SVF-doxygen/html/html/classSVF_1_1MemSSAStat.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1ObjTypeInfo.html +8 -8
- package/SVF-doxygen/html/html/classSVF_1_1ObjVar.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1PTAStat.html +15 -15
- package/SVF-doxygen/html/html/classSVF_1_1PathCondAllocator.html +71 -71
- package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +59 -59
- package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1RaceValidator.html +7 -7
- package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +3 -3
- package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +9 -9
- package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +148 -148
- package/SVF-doxygen/html/html/classSVF_1_1SVFModule.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1StInfo.html +4 -4
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +88 -88
- package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +65 -65
- package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +2 -2
- package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +1 -1
- package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +4 -4
- package/SVF-doxygen/html/html/dda_8cpp.html +2 -2
- package/SVF-doxygen/html/html/dda_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/mta_8cpp.html +2 -2
- package/SVF-doxygen/html/html/mta_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/namespaceSVF.html +4 -2
- package/SVF-doxygen/html/html/namespaceSVF_1_1LLVMUtil.html +1452 -0
- package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +41 -1409
- package/SVF-doxygen/html/html/namespaceSVF_1_1cppUtil.html +4 -4
- package/SVF-doxygen/html/html/namespacemembers.html +3 -3
- package/SVF-doxygen/html/html/namespacemembers_f.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_func.html +39 -39
- package/SVF-doxygen/html/html/namespacemembers_g.html +14 -14
- package/SVF-doxygen/html/html/namespacemembers_i.html +18 -18
- package/SVF-doxygen/html/html/namespacemembers_p.html +1 -1
- package/SVF-doxygen/html/html/namespacemembers_s.html +2 -2
- package/SVF-doxygen/html/html/namespaces.html +2 -1
- package/SVF-doxygen/html/html/saber_8cpp.html +2 -2
- package/SVF-doxygen/html/html/saber_8cpp_source.html +2 -2
- package/SVF-doxygen/html/html/search/all_1.js +3 -3
- package/SVF-doxygen/html/html/search/all_10.js +1 -1
- package/SVF-doxygen/html/html/search/all_13.js +3 -2
- package/SVF-doxygen/html/html/search/all_6.js +1 -1
- package/SVF-doxygen/html/html/search/all_7.js +14 -14
- package/SVF-doxygen/html/html/search/all_9.js +18 -18
- package/SVF-doxygen/html/html/search/functions_0.js +3 -3
- package/SVF-doxygen/html/html/search/functions_11.js +2 -2
- package/SVF-doxygen/html/html/search/functions_5.js +1 -1
- package/SVF-doxygen/html/html/search/functions_6.js +14 -14
- package/SVF-doxygen/html/html/search/functions_8.js +18 -18
- package/SVF-doxygen/html/html/search/functions_f.js +1 -1
- package/SVF-doxygen/html/html/search/namespaces_1.js +1 -0
- package/SVF-doxygen/html/html/svf-ex_8cpp.html +3 -3
- package/SVF-doxygen/html/html/svf-ex_8cpp_source.html +3 -3
- package/SVF-doxygen/html/html/wpa_8cpp.html +2 -2
- package/SVF-doxygen/html/html/wpa_8cpp_source.html +2 -2
- package/include/MTA/MHP.h +1 -1
- package/include/SVF-FE/LLVMUtil.h +7 -7
- package/lib/Graphs/ICFG.cpp +2 -2
- package/lib/MSSA/MemRegion.cpp +1 -0
- package/lib/MSSA/MemSSA.cpp +1 -0
- package/lib/MTA/LockAnalysis.cpp +1 -0
- package/lib/MemoryModel/LocationSet.cpp +1 -0
- package/lib/MemoryModel/PointerAnalysis.cpp +1 -0
- package/lib/MemoryModel/SVFIR.cpp +1 -1
- package/lib/MemoryModel/SymbolTableInfo.cpp +1 -0
- package/lib/SABER/LeakChecker.cpp +1 -0
- package/lib/SABER/PathCondAllocator.cpp +1 -0
- package/lib/SVF-FE/CHGBuilder.cpp +1 -0
- package/lib/SVF-FE/CPPUtil.cpp +2 -2
- package/lib/SVF-FE/ICFGBuilder.cpp +1 -0
- package/lib/SVF-FE/LLVMUtil.cpp +32 -32
- package/lib/SVF-FE/SVFIRBuilder.cpp +2 -1
- package/lib/SVF-FE/SymbolTableBuilder.cpp +8 -7
- package/lib/WPA/AndersenStat.cpp +1 -0
- package/lib/WPA/FlowSensitiveStat.cpp +1 -0
- package/package.json +1 -1
- package/tools/CFL/cfl.cpp +1 -1
- package/tools/DDA/dda.cpp +1 -1
- package/tools/Example/svf-ex.cpp +1 -1
- package/tools/MTA/mta.cpp +1 -1
- package/tools/SABER/saber.cpp +1 -1
- package/tools/WPA/wpa.cpp +1 -1
|
@@ -66,41 +66,41 @@ $(function() {
|
|
|
66
66
|
<div class="title">LockAnalysis.cpp</div> </div>
|
|
67
67
|
</div><!--header-->
|
|
68
68
|
<div class="contents">
|
|
69
|
-
<a href="LockAnalysis_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">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * LocksetAnalysis.cpp</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * Created on: 26 Aug 2015</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * Author: pengd</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="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#include "<a class="code" href="LockAnalysis_8h.html">MTA/LockAnalysis.h</a>"</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include "<a class="code" href="MTA_8h.html">MTA/MTA.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "<a class="code" href="MTAResultValidator_8h.html">MTA/MTAResultValidator.h</a>"</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="PTAStat_8h.html">MemoryModel/PTAStat.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="LockResultValidator_8h.html">MTA/LockResultValidator.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> </div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> <span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></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> </div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> <span class="comment">// Subclassing RCResultValidator to define the abstract methods.</span></div><div class="line"><a name="l00025"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html"> 25</a></span> <span class="keyword">class </span><a class="code" href="classSVF_1_1RaceValidator.html">RaceValidator</a> : <span class="keyword">public</span> <a class="code" href="classSVF_1_1RaceResultValidator.html">RaceResultValidator</a></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span> {</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00028"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#a7ec5d97155d170033398757af56691ad"> 28</a></span>  <a class="code" href="classSVF_1_1RaceValidator.html#a7ec5d97155d170033398757af56691ad">RaceValidator</a>(<a class="code" href="classSVF_1_1LockAnalysis.html">LockAnalysis</a>* ls) :lsa(ls)</div><div class="line"><a name="l00029"></a><span class="lineno"> 29</span>  {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  }</div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690"> 31</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690">protectedByCommonLocks</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I2)</div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>  {</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  <span class="keywordflow">return</span> lsa->isProtectedByCommonLock(I1, I2);</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  }</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span> <span class="keyword">private</span>:</div><div class="line"><a name="l00036"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#a6982b72e3e2551deab80d9e3fefaab64"> 36</a></span>  <a class="code" href="classSVF_1_1LockAnalysis.html">LockAnalysis</a> *<a class="code" href="classSVF_1_1RaceValidator.html#a6982b72e3e2551deab80d9e3fefaab64">lsa</a>;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span> };</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span> </div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span> } <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> </div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621"> 41</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621">LockAnalysis::analyze</a>()</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span> {</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> </div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>  collectLockUnlocksites();</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  buildCandidateFuncSetforLock();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span> </div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> lockStart = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>(<span class="keyword">true</span>));</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="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tIntra-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tIntra-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  analyzeIntraProcedualLock();</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="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tCollect context-sensitive locks\n"</span>);</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tCollect context-sensitive locks\n"</span>);</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  collectCxtLock();</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>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tInter-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tInter-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  analyzeLockSpanCxtStmt();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span> </div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> lockEnd = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>(<span class="keyword">true</span>));</div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(lockTime += (lockEnd - lockStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>);</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a78b3b44f2c0dc94dc1363ca57ee76d66">Options::LockValid</a>)</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  validateResults();</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> </div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d"> 71</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d">LockAnalysis::collectLockUnlocksites</a>()</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span> {</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>  <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct->getThreadCallGraph();</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFModule.html#a709371b13dcf500277f8bc275bdb23c7">SVFModule::iterator</a> <a class="code" href="CFLGrammar_8txt.html#acc7b4cf736579c4d83be2316d5a9e5f2">F</a> = tct->getSVFModule()->begin(), E = tct->getSVFModule()->end(); <a class="code" href="CFLGrammar_8txt.html#acc7b4cf736579c4d83be2316d5a9e5f2">F</a> != E; ++<a class="code" href="CFLGrammar_8txt.html#acc7b4cf736579c4d83be2316d5a9e5f2">F</a>)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>  <span class="keywordflow">for</span> (<a class="code" href="SVF-FE_2BasicTypes_8h.html#a160997c1a0fb1000445d04b89d9c1323">inst_iterator</a> II = inst_begin((*F)->getLLVMFun()), EE = inst_end((*F)->getLLVMFun()); II != EE; ++II)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = &*II;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keywordflow">if</span> (tcg-><a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-><a class="code" href="classSVF_1_1ThreadAPI.html#a38adae633d5aceddcca3b3a23ad66db9">isTDRelease</a>(inst))</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  unlocksites.insert(inst);</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>  <span class="keywordflow">if</span> (tcg-><a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-><a class="code" href="classSVF_1_1ThreadAPI.html#a9db4df7968ec179e5012794c58fdee70">isTDAcquire</a>(inst))</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>  locksites.insert(inst);</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"> 88</span>  }</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> </div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e"> 94</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e">LockAnalysis::buildCandidateFuncSetforLock</a>()</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</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>  <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct->getThreadCallGraph();</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>  <a class="code" href="classSVF_1_1TCT.html#afb579a5bdcc0a1c6b075bb9aae36c237">TCT::PTACGNodeSet</a> visited;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">FIFOWorkList<const PTACallGraphNode*></a> worklist;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span> </div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>  <span class="keywordflow">for</span> (InstSet::iterator it = locksites.begin(), eit = locksites.end(); it != eit; ++it)</div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun=(*it)->getParent()->getParent();</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-><a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct->getSVFFun(fun));</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(cgnode);</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  visited.insert(cgnode);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  }</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>  <span class="keywordflow">for</span> (InstSet::iterator it = unlocksites.begin(), eit = unlocksites.end(); it != eit; ++it)</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>  {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = (*it)->getParent()->getParent();</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-><a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct->getSVFFun(fun));</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</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>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(cgnode);</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  visited.insert(cgnode);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  }</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  <span class="keywordflow">while</span> (!worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* node = worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  lockcandidateFuncSet.insert(node-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = node-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(), neit = node-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); nit != neit; nit++)</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* srcNode = (*nit)->getSrcNode();</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keywordflow">if</span> (visited.find(srcNode) == visited.end())</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>  visited.insert(srcNode);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(srcNode);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  }</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span> }</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> </div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75"> 142</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75">LockAnalysis::analyzeIntraProcedualLock</a>()</div><div class="line"><a name="l00143"></a><span class="lineno"> 143</span> {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> </div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>  <span class="comment">// Identify the protected Instructions.</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="keywordflow">for</span> (InstSet::const_iterator it = locksites.begin(), ie = locksites.end(); it != ie; ++it)</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a> *lockSite = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>>(*it);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(lockSite && <span class="stringliteral">"Lock acquire instruction must be CallInst"</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span> </div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>  <span class="comment">// Perform forward traversal</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a> forwardInsts;</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a> backwardInsts;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a> unlockSet;</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>  <span class="keywordtype">bool</span> forward = intraForwardTraverse(lockSite,unlockSet,forwardInsts);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordtype">bool</span> backward = intraBackwardTraverse(unlockSet,backwardInsts);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span> </div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>  <span class="keywordflow">if</span>(forward && backward)</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  addIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(forward && !backward)</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  addCondIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  }</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span> }</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> </div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2"> 170</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2">LockAnalysis::intraForwardTraverse</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* lockSite, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& forwardInsts)</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> </div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = lockSite->getParent()->getParent();</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> worklist;</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>  worklist.push_back(lockSite);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  <span class="keywordflow">while</span> (!worklist.empty())</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I = worklist.back();</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  worklist.pop_back();</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>  <span class="keywordflow">if</span>(&(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a3cb226930eeaf558575e09e5b65e0223">getFunExitBB</a>(fun)->back()) == I)</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span> </div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>  <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>  <span class="keywordflow">if</span> (forwardInsts.find(I)!=forwardInsts.end())</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  forwardInsts.insert(I);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span> </div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>  <span class="keywordflow">if</span> (isTDRelease(I) && isAliasedLocks(lockSite, I))</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>  unlockSet.insert(I);</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci lock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(lockSite)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci unlock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  }</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span> </div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a2f9959fa23ab4bdc65ca36fbda8c1b70">getNextInsts</a>(I, nextInsts);</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  {</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>  worklist.push_back(*nit);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>  }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  }</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span> </div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span> }</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> </div><div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53"> 213</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53">LockAnalysis::intraBackwardTraverse</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& backwardInsts)</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> </div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> worklist;</div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>  <span class="keywordflow">for</span>(InstSet::const_iterator it = unlockSet.begin(), eit = unlockSet.end(); it!=eit; ++it)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* unlockSite = *it;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = unlockSite->getParent()->getParent();</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* entryInst = &(fun->getEntryBlock().back());</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  worklist.push_back(*it);</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>  <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I = worklist.back();</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>  worklist.pop_back();</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span> </div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>  <span class="keywordflow">if</span>(entryInst == I)</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</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>  <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="keywordflow">if</span> (backwardInsts.find(I)!=backwardInsts.end())</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  backwardInsts.insert(I);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span> </div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>  <span class="keywordflow">if</span> (isTDAcquire(I) && isAliasedLocks(unlockSite, I))</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>  {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci lock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci unlock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(unlockSite)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  }</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span> </div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a7e3a8d6cb1715db9518579fb60181d5b">getPrevInsts</a>(I, nextInsts);</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</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>  worklist.push_back(*nit);</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>  }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span> </div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span> }</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> </div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ae03db88ef0ad0da2c31cf1623b32165f"> 257</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae03db88ef0ad0da2c31cf1623b32165f">LockAnalysis::collectCxtLock</a>()</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span> {</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct->getEntryProcs();</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <span class="keywordflow">for</span> (FunSet::const_iterator it = entryFuncSet.begin(), eit = entryFuncSet.end(); it != eit; ++it)</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>  <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a> t(cxt, tct->getSVFFun(*it));</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  pushToCTPWorkList(t);</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>  <span class="keywordflow">while</span> (!clpList.empty())</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>  <a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a> clp = popFromCTPWorkList();</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgNode = getTCG()->getCallGraphNode(clp.<a class="code" href="classSVF_1_1CxtProc.html#ab9ac6459c90873b7dea35e0a22700189">getProc</a>());</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <span class="comment">// lzh TODO.</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="keywordflow">if</span> (!isLockCandidateFun(cgNode-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordflow">continue</span>;</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">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = cgNode-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), neit = cgNode-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); nit != neit; nit++)</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>  {</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphEdge.html">PTACallGraphEdge</a>* cgEdge = (*nit);</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">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#a750e50a9022451e406c4819979edffa5">directCallsBegin</a>(), ecit = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#acc4fcacefdc9be9a214dfcc455fe7970">directCallsEnd</a>();</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>  cit != ecit; ++cit)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nCollecting CxtLocks: handling direct call:"</span> << **cit << <span class="stringliteral">"\t"</span> << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()->getFunction()->getName()</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  << <span class="stringliteral">"-->"</span> << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getFunction()->getName() << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*cit)->getCallSite()));</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>  <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator ind = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#afbdb582d20ab953b2de1f3efacb74679">indirectCallsBegin</a>(), eind = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#a494bc8bacca5ca8d266286f3fb303495">indirectCallsEnd</a>();</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  ind != eind; ++ind)</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="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nCollecting CxtLocks: handling indirect call:"</span> << **ind << <span class="stringliteral">"\t"</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()->getFunction()->getName() << <span class="stringliteral">"-->"</span> << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getFunction()->getName()</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*ind)->getCallSite()));</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  }</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span> }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> </div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span> </div><div class="line"><a name="l00306"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680"> 306</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680">LockAnalysis::handleCallRelation</a>(<a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a>& clp, <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphEdge.html">PTACallGraphEdge</a>* cgEdge, <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</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>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt(clp.<a class="code" href="classSVF_1_1CxtProc.html#a99b0f68b4cbd733f91eea33aa3e64eb7">getContext</a>());</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>  <span class="keywordflow">if</span> (isTDAcquire(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>()))</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>  addCxtLock(cxt,cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getFunction();</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  pushCxt(cxt, cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>(), callee);</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>  <a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a> newclp(cxt, svfcallee);</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>  <span class="keywordflow">if</span> (pushToCTPWorkList(newclp))</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="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis Process CallRet old clp --"</span>; clp.<a class="code" href="classSVF_1_1CxtProc.html#a254c612f06a3f82b57b1c5a0e52c012f">dump</a>());</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis Process CallRet new clp --"</span>; newclp.dump());</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  }</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> }</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span> </div><div class="line"><a name="l00329"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe"> 329</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe">LockAnalysis::analyzeLockSpanCxtStmt</a>()</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> </div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct->getEntryProcs();</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>  <span class="keywordflow">for</span> (FunSet::const_iterator it = entryFuncSet.begin(), eit = entryFuncSet.end(); it != eit; ++it)</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>  <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> cxtstmt(cxt, &((*it)->front().front()));</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  pushToCTSWorkList(cxtstmt);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</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>  <span class="keywordflow">while</span> (!cxtStmtList.empty())</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>  {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> cts = popFromCTSWorkList();</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>  touchCxtStmt(cts);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* curInst = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>();</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  instToCxtStmtSet[curInst].insert(cts);</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span> </div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nVisit cxtStmt: "</span>);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, cts.<a class="code" href="classSVF_1_1CxtStmt.html#a56e2767c327a383db09dca96edb19614">dump</a>());</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>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nIts cxt lock sets: "</span>);</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, printLocks(cts));</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span> </div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>  <span class="keywordflow">if</span> (isTDFork(curInst))</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>  handleFork(cts);</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>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isTDAcquire(curInst))</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>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(hasCxtLock(cts) && <span class="stringliteral">"context-sensitive lock not found!!"</span>);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <span class="keywordflow">if</span>(addCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  handleIntra(cts);</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  }</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isTDRelease(curInst))</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  <span class="keywordflow">if</span>(removeCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  handleIntra(cts);</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">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<CallInst>(curInst) && !<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(curInst))</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>  handleCall(cts);</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ReturnInst>(curInst))</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>  handleRet(cts);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>  }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  {</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  handleIntra(cts);</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> </div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>  }</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span> </div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span> }</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> </div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> </div><div class="line"><a name="l00392"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a"> 392</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a">LockAnalysis::printLocks</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span> {</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a> & lockset = getCxtLockfromCxtStmt(cts);</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nlock sets size = "</span> << lockset.size() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <span class="keywordflow">for</span> (CxtLockSet::const_iterator it = lockset.begin(), eit = lockset.end(); it != eit; ++it)</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>  (*it).dump();</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> }</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> </div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span> </div><div class="line"><a name="l00405"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b"> 405</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b">LockAnalysis::handleFork</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span> {</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast<CallInst>(cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>());</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <span class="keywordflow">if</span>(getTCG()->hasThreadForkEdge(cbn))</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  <span class="keywordflow">for</span> (ThreadCallGraph::ForkEdgeSet::const_iterator cgIt = getTCG()->getForkEdgeBegin(cbn),</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  ecgIt = getTCG()->getForkEdgeEnd(cbn); cgIt != ecgIt; ++cgIt)</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)->getDstNode()->getFunction();</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  pushCxt(newCxt,call,callee);</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &(callee->getEntryBlock().front()));</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  markCxtStmtFlag(newCts, cts);</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>  handleIntra(cts);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span> }</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span> </div><div class="line"><a name="l00427"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a97b186f9417144557bb17c41d515a9f4"> 427</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a97b186f9417144557bb17c41d515a9f4">LockAnalysis::handleCall</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</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> </div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast<CallInst>(cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>());</div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <span class="keywordflow">if</span> (getTCG()->hasCallGraphEdge(cbn))</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  {</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>  <span class="keywordflow">for</span> (PTACallGraph::CallGraphEdgeSet::const_iterator cgIt = getTCG()->getCallEdgeBegin(cbn), ecgIt = getTCG()->getCallEdgeEnd(cbn);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>  cgIt != ecgIt; ++cgIt)</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="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)->getDstNode()->getFunction();</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(svfcallee))</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  pushCxt(newCxt, call, callee);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &(callee->getEntryBlock().front()));</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  markCxtStmtFlag(newCts, cts);</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>  }</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> </div><div class="line"><a name="l00451"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6"> 451</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6">LockAnalysis::handleRet</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</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> </div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* curInst = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>();</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = tct->getSVFFun(curInst->getParent()->getParent());</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* curFunNode = getTCG()->getCallGraphNode(svffun);</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span> </div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> it = curFunNode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin(), eit = curFunNode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().end(); it != eit; ++it)</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>  <a class="code" href="classSVF_1_1PTACallGraphEdge.html">PTACallGraphEdge</a>* edge = *it;</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ThreadForkEdge>(edge) || SVFUtil::isa<ThreadJoinEdge>(edge))</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)->directCallsBegin(), ecit = (edge)->directCallsEnd(); cit != ecit;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  ++cit)</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="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)->getCallSite();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a2f9959fa23ab4bdc65ca36fbda8c1b70">getNextInsts</a>(inst, nextInsts);</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  {</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, *nit);</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>  markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  }</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  }</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)->indirectCallsBegin(), ecit = (edge)->indirectCallsEnd();</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  cit != ecit; ++cit)</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>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)->getCallSite();</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a2f9959fa23ab4bdc65ca36fbda8c1b70">getNextInsts</a>(inst, nextInsts);</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  {</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, *nit);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  markCxtStmtFlag(newCts, cts);</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>  }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>  }</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span> }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> </div><div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c"> 500</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c">LockAnalysis::handleIntra</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* curInst = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>();</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#a2f9959fa23ab4bdc65ca36fbda8c1b70">getNextInsts</a>(curInst, nextInsts);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</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>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(curCxt, *nit);</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>  markCxtStmtFlag(newCts, cts);</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"><a class="line" href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17"> 516</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17">LockAnalysis::pushCxt</a>(<a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& cxt, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* call, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee)</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span> {</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call->getParent()->getParent();</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct->getSVFFun(callee);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct->getSVFFun(caller);</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()->getCallSiteID(cbn, svfcallee);</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span> </div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> <span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> <span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span> <span class="comment">// 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>  <span class="keywordflow">if</span> (tct->inSameCallGraphSCC(getTCG()->getCallGraphNode(svfcaller), getTCG()->getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>  {</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  tct->pushCxt(cxt,csId);</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct->dumpCxt(cxt));</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  }</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> </div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb"> 535</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb">LockAnalysis::matchCxt</a>(<a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& cxt, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* call, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee)</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span> {</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call->getParent()->getParent();</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct->getSVFFun(callee);</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct->getSVFFun(caller);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()->getCallSiteID(cbn, svfcallee);</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span> </div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span> <span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span> <span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> <span class="comment">// return true;</span></div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> </div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>  <span class="keywordflow">if</span> (cxt.empty())</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">return</span> <span class="keyword">true</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="keywordflow">if</span> (tct->inSameCallGraphSCC(getTCG()->getCallGraphNode(svfcaller), getTCG()->getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>  {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  <span class="keywordflow">if</span> (cxt.back() == csId)</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  cxt.pop_back();</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct->dumpCxt(cxt));</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span> }</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> </div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> </div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa"> 566</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa">LockAnalysis::isProtectedByCommonLock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span> {</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>  numOfTotalQueries++;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  <span class="keywordtype">bool</span> commonlock = <span class="keyword">false</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryStart = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <span class="keywordflow">if</span> (isInsideIntraLock(i1) && isInsideIntraLock(i2))</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  commonlock = isProtectedByCommonCILock(i1,i2) ;</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  commonlock = isProtectedByCommonCxtLock(i1,i2);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryEnd = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(lockQueriesTime += (queryEnd - queryStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>);</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <span class="keywordflow">return</span> commonlock;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span> }</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> </div><div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48"> 583</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48">LockAnalysis::isProtectedByCommonCILock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span> {</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> </div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>  <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) && !isInsideCondIntraLock(i2))</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  {</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keywordflow">for</span> (InstSet::const_iterator cil1 = lockset1.begin(), ecil1 = lockset1.end(); cil1!=ecil1; ++cil1)</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="keywordflow">for</span> (InstSet::const_iterator cil2=lockset2.begin(), ecil2=lockset2.end(); cil2!=ecil2; ++cil2)</div><div class="line"><a name="l00593"></a><span class="lineno"> 593</span>  {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  <span class="keywordflow">if</span> (isAliasedLocks(*cil1, *cil2))</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</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="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span> }</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> </div><div class="line"><a name="l00605"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3e2e629a588b44ed39e529babb59a4f9"> 605</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287">LockAnalysis::isProtectedByCommonCxtLock</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2)</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span> {</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>  <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keywordflow">if</span> (alias(lockset1,lockset2))</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span> </div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span> }</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> </div><div class="line"><a name="l00620"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287"> 620</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287">LockAnalysis::isProtectedByCommonCxtLock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</div><div class="line"><a name="l00621"></a><span class="lineno"> 621</span> {</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>  <span class="keywordflow">if</span>(!hasCxtStmtfromInst(i1) || !hasCxtStmtfromInst(i2))</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset1 = getCxtStmtfromInst(i1);</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset2 = getCxtStmtfromInst(i2);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts1 = ctsset1.begin(), ects1 = ctsset1.end(); cts1 != ects1; cts1++)</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1 = *cts1;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts2 = ctsset2.begin(), ects2 = ctsset2.end(); cts2 != ects2; cts2++)</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  {</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2 = *cts2;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keywordflow">if</span>(cxtStmt1==cxtStmt2) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">if</span>(isProtectedByCommonCxtLock(cxtStmt1,cxtStmt2)==<span class="keyword">false</span>)</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  }</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  }</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span> }</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> </div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> </div><div class="line"><a name="l00644"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3"> 644</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3">LockAnalysis::isInSameSpan</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</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>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryStart = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</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="keywordtype">bool</span> sameSpan = <span class="keyword">false</span>;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>  <span class="keywordflow">if</span> (isInsideIntraLock(i1) && isInsideIntraLock(i2))</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  sameSpan = isInSameCISpan(i1, i2);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  sameSpan = isInSameCSSpan(i1, i2);</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span> </div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryEnd = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(lockQueriesTime += (queryEnd - queryStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>);</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <span class="keywordflow">return</span> sameSpan;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span> }</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span> </div><div class="line"><a name="l00662"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae"> 662</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae">LockAnalysis::isInSameCISpan</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)<span class="keyword"> const</span></div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span> <span class="keyword"></span>{</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>  <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) && !isInsideCondIntraLock(i2))</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_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keywordflow">for</span> (InstSet::const_iterator cil1 = lockset1.begin(), ecil1 = lockset1.end(); cil1!=ecil1; ++cil1)</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>  <span class="keywordflow">for</span> (InstSet::const_iterator cil2=lockset2.begin(), ecil2=lockset2.end(); cil2!=ecil2; ++cil2)</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="keywordflow">if</span> (*cil1==*cil2)</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</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>  }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  }</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</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> </div><div class="line"><a name="l00683"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8595b976bf60d161561e5494257aa179"> 683</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd">LockAnalysis::isInSameCSSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2)<span class="keyword"> const</span></div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span> <span class="keyword"></span>{</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>  <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keywordflow">if</span> (intersects(lockset1,lockset2))</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keywordflow">return</span> <span class="keyword">true</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">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span> }</div><div class="line"><a name="l00697"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd"> 697</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd">LockAnalysis::isInSameCSSpan</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I2)<span class="keyword"> const</span></div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span> <span class="keyword"></span>{</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>  <span class="keywordflow">if</span>(!hasCxtStmtfromInst(I1) || !hasCxtStmtfromInst(I2))</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset1 = getCxtStmtfromInst(I1);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset2 = getCxtStmtfromInst(I2);</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>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts1 = ctsset1.begin(), ects1 = ctsset1.end(); cts1 != ects1; cts1++)</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>  {</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1 = *cts1;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts2 = ctsset2.begin(), ects2 = ctsset2.end(); cts2 != ects2; cts2++)</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  {</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2 = *cts2;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>  <span class="keywordflow">if</span>(cxtStmt1==cxtStmt2) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  <span class="keywordflow">if</span>(isInSameCSSpan(cxtStmt1,cxtStmt2)==<span class="keyword">false</span>)</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  }</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  }</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span> }</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span> </div><div class="line"><a name="l00718"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a935128c9952714fcc98febed491ee85d"> 718</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a935128c9952714fcc98febed491ee85d">LockAnalysis::validateResults</a>()</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> </div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>  <span class="comment">// Initialize the validator and perform validation.</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <a class="code" href="classSVF_1_1LockResultValidator.html">LockResultValidator</a> lockvalidator(<span class="keyword">this</span>);</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  lockvalidator.<a class="code" href="classSVF_1_1LockResultValidator.html#a88ff3ed1398a0b847d71a4c0352ed66d">analyze</a>();</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>  <a class="code" href="classSVF_1_1RaceValidator.html">RaceValidator</a> validator(<span class="keyword">this</span>);</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>  validator.<a class="code" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7">init</a>(tct->getSVFModule());</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  validator.<a class="code" href="classSVF_1_1RaceResultValidator.html#ab8a261120a7f6520d22a6f5cdf2257e9">analyze</a>();</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span> }</div><div class="ttc" id="classSVF_1_1RaceValidator_html_a6982b72e3e2551deab80d9e3fefaab64"><div class="ttname"><a href="classSVF_1_1RaceValidator.html#a6982b72e3e2551deab80d9e3fefaab64">SVF::RaceValidator::lsa</a></div><div class="ttdeci">LockAnalysis * lsa</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00036">LockAnalysis.cpp:36</a></div></div>
|
|
69
|
+
<a href="LockAnalysis_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">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span> <span class="comment"> * LocksetAnalysis.cpp</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span> <span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span> <span class="comment"> * Created on: 26 Aug 2015</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span> <span class="comment"> * Author: pengd</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="preprocessor">#include "<a class="code" href="Options_8h.html">Util/Options.h</a>"</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span> <span class="preprocessor">#include "<a class="code" href="LockAnalysis_8h.html">MTA/LockAnalysis.h</a>"</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span> <span class="preprocessor">#include "<a class="code" href="MTA_8h.html">MTA/MTA.h</a>"</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span> <span class="preprocessor">#include "<a class="code" href="MTAResultValidator_8h.html">MTA/MTAResultValidator.h</a>"</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span> <span class="preprocessor">#include "<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>"</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span> <span class="preprocessor">#include "<a class="code" href="PTAStat_8h.html">MemoryModel/PTAStat.h</a>"</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span> <span class="preprocessor">#include "<a class="code" href="LockResultValidator_8h.html">MTA/LockResultValidator.h</a>"</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span> </div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span> </div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span> <span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span> <span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span> <span class="keyword">using namespace </span><a class="code" href="namespaceLLVMUtil.html">LLVMUtil</a>;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span> </div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span> </div><div class="line"><a name="l00022"></a><span class="lineno"> 22</span> <span class="keyword">namespace </span><a class="code" href="namespaceSVF.html">SVF</a></div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span> {</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span> </div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span> <span class="comment">// Subclassing RCResultValidator to define the abstract methods.</span></div><div class="line"><a name="l00026"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html"> 26</a></span> <span class="keyword">class </span><a class="code" href="classSVF_1_1RaceValidator.html">RaceValidator</a> : <span class="keyword">public</span> <a class="code" href="classSVF_1_1RaceResultValidator.html">RaceResultValidator</a></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span> {</div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span> <span class="keyword">public</span>:</div><div class="line"><a name="l00029"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#a7ec5d97155d170033398757af56691ad"> 29</a></span>  <a class="code" href="classSVF_1_1RaceValidator.html#a7ec5d97155d170033398757af56691ad">RaceValidator</a>(<a class="code" href="classSVF_1_1LockAnalysis.html">LockAnalysis</a>* ls) :lsa(ls)</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>  {</div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>  }</div><div class="line"><a name="l00032"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690"> 32</a></span>  <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690">protectedByCommonLocks</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I2)</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>  {</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>  <span class="keywordflow">return</span> lsa->isProtectedByCommonLock(I1, I2);</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">private</span>:</div><div class="line"><a name="l00037"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#a6982b72e3e2551deab80d9e3fefaab64"> 37</a></span>  <a class="code" href="classSVF_1_1LockAnalysis.html">LockAnalysis</a> *<a class="code" href="classSVF_1_1RaceValidator.html#a6982b72e3e2551deab80d9e3fefaab64">lsa</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> </div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span> } <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00041"></a><span class="lineno"> 41</span> </div><div class="line"><a name="l00042"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621"> 42</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621">LockAnalysis::analyze</a>()</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span> {</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span> </div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>  collectLockUnlocksites();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>  buildCandidateFuncSetforLock();</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span> </div><div class="line"><a name="l00048"></a><span class="lineno"> 48</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> lockStart = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>(<span class="keyword">true</span>));</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span> </div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tIntra-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tIntra-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>  analyzeIntraProcedualLock();</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span> </div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tCollect context-sensitive locks\n"</span>);</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tCollect context-sensitive locks\n"</span>);</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>  collectCxtLock();</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span> </div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tInter-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\tInter-procedural LockAnalysis\n"</span>);</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>  analyzeLockSpanCxtStmt();</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span> </div><div class="line"><a name="l00062"></a><span class="lineno"> 62</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> lockEnd = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>(<span class="keyword">true</span>));</div><div class="line"><a name="l00063"></a><span class="lineno"> 63</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(lockTime += (lockEnd - lockStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>);</div><div class="line"><a name="l00064"></a><span class="lineno"> 64</span>  <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1Options.html#a78b3b44f2c0dc94dc1363ca57ee76d66">Options::LockValid</a>)</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>  validateResults();</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> </div><div class="line"><a name="l00068"></a><span class="lineno"> 68</span> </div><div class="line"><a name="l00072"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d"> 72</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d">LockAnalysis::collectLockUnlocksites</a>()</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span> {</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>  <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct->getThreadCallGraph();</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFModule.html#a709371b13dcf500277f8bc275bdb23c7">SVFModule::iterator</a> <a class="code" href="CFLGrammar_8txt.html#acc7b4cf736579c4d83be2316d5a9e5f2">F</a> = tct->getSVFModule()->begin(), E = tct->getSVFModule()->end(); <a class="code" href="CFLGrammar_8txt.html#acc7b4cf736579c4d83be2316d5a9e5f2">F</a> != E; ++<a class="code" href="CFLGrammar_8txt.html#acc7b4cf736579c4d83be2316d5a9e5f2">F</a>)</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>  <span class="keywordflow">for</span> (<a class="code" href="SVF-FE_2BasicTypes_8h.html#a160997c1a0fb1000445d04b89d9c1323">inst_iterator</a> II = inst_begin((*F)->getLLVMFun()), EE = inst_end((*F)->getLLVMFun()); II != EE; ++II)</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>  {</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = &*II;</div><div class="line"><a name="l00080"></a><span class="lineno"> 80</span>  <span class="keywordflow">if</span> (tcg-><a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-><a class="code" href="classSVF_1_1ThreadAPI.html#a38adae633d5aceddcca3b3a23ad66db9">isTDRelease</a>(inst))</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>  {</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>  unlocksites.insert(inst);</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>  }</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>  <span class="keywordflow">if</span> (tcg-><a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-><a class="code" href="classSVF_1_1ThreadAPI.html#a9db4df7968ec179e5012794c58fdee70">isTDAcquire</a>(inst))</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>  locksites.insert(inst);</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>  }</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>  }</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>  }</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span> }</div><div class="line"><a name="l00091"></a><span class="lineno"> 91</span> </div><div class="line"><a name="l00095"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e"> 95</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e">LockAnalysis::buildCandidateFuncSetforLock</a>()</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> </div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>  <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct->getThreadCallGraph();</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span> </div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>  <a class="code" href="classSVF_1_1TCT.html#afb579a5bdcc0a1c6b075bb9aae36c237">TCT::PTACGNodeSet</a> visited;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>  <a class="code" href="classSVF_1_1FIFOWorkList.html">FIFOWorkList<const PTACallGraphNode*></a> worklist;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span> </div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>  <span class="keywordflow">for</span> (InstSet::iterator it = locksites.begin(), eit = locksites.end(); it != eit; ++it)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun=(*it)->getParent()->getParent();</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-><a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct->getSVFFun(fun));</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>  <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>  {</div><div class="line"><a name="l00109"></a><span class="lineno"> 109</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(cgnode);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>  visited.insert(cgnode);</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"> 113</span>  <span class="keywordflow">for</span> (InstSet::iterator it = unlocksites.begin(), eit = unlocksites.end(); it != eit; ++it)</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = (*it)->getParent()->getParent();</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-><a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct->getSVFFun(fun));</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>  <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>  {</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(cgnode);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>  visited.insert(cgnode);</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>  }</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>  }</div><div class="line"><a name="l00123"></a><span class="lineno"> 123</span>  <span class="keywordflow">while</span> (!worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">empty</a>())</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>  {</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* node = worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">pop</a>();</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>  lockcandidateFuncSet.insert(node-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00127"></a><span class="lineno"> 127</span>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = node-><a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(), neit = node-><a class="code" href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">InEdgeEnd</a>(); nit != neit; nit++)</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>  {</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* srcNode = (*nit)->getSrcNode();</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>  <span class="keywordflow">if</span> (visited.find(srcNode) == visited.end())</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>  {</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>  visited.insert(srcNode);</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</span>  worklist.<a class="code" href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">push</a>(srcNode);</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>  }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>  }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>  }</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span> }</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span> </div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75"> 143</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75">LockAnalysis::analyzeIntraProcedualLock</a>()</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span> {</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span> </div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>  <span class="comment">// Identify the protected Instructions.</span></div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>  <span class="keywordflow">for</span> (InstSet::const_iterator it = locksites.begin(), ie = locksites.end(); it != ie; ++it)</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a> *lockSite = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a><<a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>>(*it);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(lockSite && <span class="stringliteral">"Lock acquire instruction must be CallInst"</span>);</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>  <span class="comment">// Perform forward traversal</span></div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a> forwardInsts;</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a> backwardInsts;</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a> unlockSet;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span> </div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>  <span class="keywordtype">bool</span> forward = intraForwardTraverse(lockSite,unlockSet,forwardInsts);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>  <span class="keywordtype">bool</span> backward = intraBackwardTraverse(unlockSet,backwardInsts);</div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span> </div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>  <span class="keywordflow">if</span>(forward && backward)</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>  addIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span>(forward && !backward)</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>  addCondIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>  }</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span> }</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span> </div><div class="line"><a name="l00171"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2"> 171</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2">LockAnalysis::intraForwardTraverse</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* lockSite, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& forwardInsts)</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span> {</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span> </div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = lockSite->getParent()->getParent();</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> worklist;</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>  worklist.push_back(lockSite);</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>  <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>  {</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I = worklist.back();</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>  worklist.pop_back();</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>  <span class="keywordflow">if</span>(&(<a class="code" href="namespaceSVF_1_1LLVMUtil.html#aa0e78f2e1c9c04aee478a7ecbf354800">getFunExitBB</a>(fun)->back()) == I)</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</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>  <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>  <span class="keywordflow">if</span> (forwardInsts.find(I)!=forwardInsts.end())</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>  forwardInsts.insert(I);</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span> </div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>  <span class="keywordflow">if</span> (isTDRelease(I) && isAliasedLocks(lockSite, I))</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>  unlockSet.insert(I);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci lock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(lockSite)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci unlock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>  }</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span> </div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a752d53b6b65d892d0e579aafe70083b4">getNextInsts</a>(I, nextInsts);</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</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>  worklist.push_back(*nit);</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>  }</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>  }</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>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</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> </div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span> </div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53"> 214</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53">LockAnalysis::intraBackwardTraverse</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& backwardInsts)</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span> {</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> worklist;</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>  <span class="keywordflow">for</span>(InstSet::const_iterator it = unlockSet.begin(), eit = unlockSet.end(); it!=eit; ++it)</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* unlockSite = *it;</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = unlockSite->getParent()->getParent();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* entryInst = &(fun->getEntryBlock().back());</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>  worklist.push_back(*it);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span> </div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>  <span class="keywordflow">while</span> (!worklist.empty())</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>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I = worklist.back();</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>  worklist.pop_back();</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">if</span>(entryInst == I)</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span> </div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>  <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>  <span class="keywordflow">if</span> (backwardInsts.find(I)!=backwardInsts.end())</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>  backwardInsts.insert(I);</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">if</span> (isTDAcquire(I) && isAliasedLocks(unlockSite, I))</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>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci lock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis ci unlock -- "</span> << <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(unlockSite)<<<span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>  }</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span> </div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#af904cd58192dccb85572cfa95f5ea670">getPrevInsts</a>(I, nextInsts);</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>  {</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>  worklist.push_back(*nit);</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>  }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>  }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>  }</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span> </div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</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> </div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span> </div><div class="line"><a name="l00258"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ae03db88ef0ad0da2c31cf1623b32165f"> 258</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae03db88ef0ad0da2c31cf1623b32165f">LockAnalysis::collectCxtLock</a>()</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span> {</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct->getEntryProcs();</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>  <span class="keywordflow">for</span> (FunSet::const_iterator it = entryFuncSet.begin(), eit = entryFuncSet.end(); it != eit; ++it)</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>  {</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>  <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt;</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>  <a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a> t(cxt, tct->getSVFFun(*it));</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>  pushToCTPWorkList(t);</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> </div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>  <span class="keywordflow">while</span> (!clpList.empty())</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>  {</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>  <a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a> clp = popFromCTPWorkList();</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgNode = getTCG()->getCallGraphNode(clp.<a class="code" href="classSVF_1_1CxtProc.html#ab9ac6459c90873b7dea35e0a22700189">getProc</a>());</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>  <span class="comment">// lzh TODO.</span></div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>  <span class="keywordflow">if</span> (!isLockCandidateFun(cgNode-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>  <span class="keywordflow">continue</span>;</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">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = cgNode-><a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), neit = cgNode-><a class="code" href="classSVF_1_1GenericNode.html#a19a3366fd8a58290d0c740c46c3dcb3d">OutEdgeEnd</a>(); nit != neit; nit++)</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="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphEdge.html">PTACallGraphEdge</a>* cgEdge = (*nit);</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>  <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#a750e50a9022451e406c4819979edffa5">directCallsBegin</a>(), ecit = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#acc4fcacefdc9be9a214dfcc455fe7970">directCallsEnd</a>();</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>  cit != ecit; ++cit)</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>  {</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nCollecting CxtLocks: handling direct call:"</span> << **cit << <span class="stringliteral">"\t"</span> << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()->getFunction()->getName()</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>  << <span class="stringliteral">"-->"</span> << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getFunction()->getName() << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>  handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*cit)->getCallSite()));</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>  }</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>  <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator ind = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#afbdb582d20ab953b2de1f3efacb74679">indirectCallsBegin</a>(), eind = cgEdge-><a class="code" href="classSVF_1_1PTACallGraphEdge.html#a494bc8bacca5ca8d266286f3fb303495">indirectCallsEnd</a>();</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>  ind != eind; ++ind)</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="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>,</div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nCollecting CxtLocks: handling indirect call:"</span> << **ind << <span class="stringliteral">"\t"</span></div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>  << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()->getFunction()->getName() << <span class="stringliteral">"-->"</span> << cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getFunction()->getName()</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>  << <span class="stringliteral">"\n"</span>);</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>  handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*ind)->getCallSite()));</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>  }</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>  }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>  }</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span> }</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> </div><div class="line"><a name="l00307"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680"> 307</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680">LockAnalysis::handleCallRelation</a>(<a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a>& clp, <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphEdge.html">PTACallGraphEdge</a>* cgEdge, <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs)</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> </div><div class="line"><a name="l00310"></a><span class="lineno"> 310</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt(clp.<a class="code" href="classSVF_1_1CxtProc.html#a99b0f68b4cbd733f91eea33aa3e64eb7">getContext</a>());</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>  <span class="keywordflow">if</span> (isTDAcquire(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>()))</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>  {</div><div class="line"><a name="l00314"></a><span class="lineno"> 314</span>  addCxtLock(cxt,cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>  <span class="keywordflow">return</span>;</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>  }</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = cgEdge-><a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()->getFunction();</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>  pushCxt(cxt, cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>(), callee);</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_1CxtProc.html">CxtLockProc</a> newclp(cxt, svfcallee);</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>  <span class="keywordflow">if</span> (pushToCTPWorkList(newclp))</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>  {</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis Process CallRet old clp --"</span>; clp.<a class="code" href="classSVF_1_1CxtProc.html#a254c612f06a3f82b57b1c5a0e52c012f">dump</a>());</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"LockAnalysis Process CallRet new clp --"</span>; newclp.dump());</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> </div><div class="line"><a name="l00328"></a><span class="lineno"> 328</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"><a class="line" href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe"> 330</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe">LockAnalysis::analyzeLockSpanCxtStmt</a>()</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span> {</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct->getEntryProcs();</div><div class="line"><a name="l00334"></a><span class="lineno"> 334</span>  <span class="keywordflow">for</span> (FunSet::const_iterator it = entryFuncSet.begin(), eit = entryFuncSet.end(); it != eit; ++it)</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>  <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> cxt;</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> cxtstmt(cxt, &((*it)->front().front()));</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>  pushToCTSWorkList(cxtstmt);</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"> 343</span>  <span class="keywordflow">while</span> (!cxtStmtList.empty())</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>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> cts = popFromCTSWorkList();</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span> </div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>  touchCxtStmt(cts);</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* curInst = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>();</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>  instToCxtStmtSet[curInst].insert(cts);</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span> </div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nVisit cxtStmt: "</span>);</div><div class="line"><a name="l00352"></a><span class="lineno"> 352</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, cts.<a class="code" href="classSVF_1_1CxtStmt.html#a56e2767c327a383db09dca96edb19614">dump</a>());</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="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nIts cxt lock sets: "</span>);</div><div class="line"><a name="l00355"></a><span class="lineno"> 355</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, printLocks(cts));</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span> </div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>  <span class="keywordflow">if</span> (isTDFork(curInst))</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>  handleFork(cts);</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>  }</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isTDAcquire(curInst))</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>  {</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>  <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(hasCxtLock(cts) && <span class="stringliteral">"context-sensitive lock not found!!"</span>);</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>  <span class="keywordflow">if</span>(addCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>  handleIntra(cts);</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>  }</div><div class="line"><a name="l00367"></a><span class="lineno"> 367</span>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (isTDRelease(curInst))</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>  {</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>  <span class="keywordflow">if</span>(removeCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>  handleIntra(cts);</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>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<CallInst>(curInst) && !<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(curInst))</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>  {</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>  handleCall(cts);</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>  <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa<ReturnInst>(curInst))</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>  handleRet(cts);</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>  }</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>  {</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>  handleIntra(cts);</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> </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> </div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span> }</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span> </div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span> </div><div class="line"><a name="l00393"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a"> 393</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a">LockAnalysis::printLocks</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a> & lockset = getCxtLockfromCxtStmt(cts);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>  <a class="code" href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">outs</a>() << <span class="stringliteral">"\nlock sets size = "</span> << lockset.size() << <span class="stringliteral">"\n"</span>;</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>  <span class="keywordflow">for</span> (CxtLockSet::const_iterator it = lockset.begin(), eit = lockset.end(); it != eit; ++it)</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>  (*it).dump();</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> }</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span> </div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span> </div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span> </div><div class="line"><a name="l00406"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b"> 406</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b">LockAnalysis::handleFork</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast<CallInst>(cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>());</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>  <span class="keywordflow">if</span>(getTCG()->hasThreadForkEdge(cbn))</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>  {</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>  <span class="keywordflow">for</span> (ThreadCallGraph::ForkEdgeSet::const_iterator cgIt = getTCG()->getForkEdgeBegin(cbn),</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>  ecgIt = getTCG()->getForkEdgeEnd(cbn); cgIt != ecgIt; ++cgIt)</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)->getDstNode()->getFunction();</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>  pushCxt(newCxt,call,callee);</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &(callee->getEntryBlock().front()));</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>  markCxtStmtFlag(newCts, cts);</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>  }</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>  handleIntra(cts);</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> </div><div class="line"><a name="l00428"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a97b186f9417144557bb17c41d515a9f4"> 428</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a97b186f9417144557bb17c41d515a9f4">LockAnalysis::handleCall</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span> {</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span> </div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast<CallInst>(cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>());</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>  <span class="keywordflow">if</span> (getTCG()->hasCallGraphEdge(cbn))</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>  <span class="keywordflow">for</span> (PTACallGraph::CallGraphEdgeSet::const_iterator cgIt = getTCG()->getCallEdgeBegin(cbn), ecgIt = getTCG()->getCallEdgeEnd(cbn);</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>  cgIt != ecgIt; ++cgIt)</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="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)->getDstNode()->getFunction();</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>  <span class="keywordflow">if</span> (<a class="code" href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">isExtCall</a>(svfcallee))</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>  pushCxt(newCxt, call, callee);</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &(callee->getEntryBlock().front()));</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>  markCxtStmtFlag(newCts, cts);</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>  }</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> </div><div class="line"><a name="l00452"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6"> 452</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6">LockAnalysis::handleRet</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span> {</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span> </div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* curInst = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>();</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = tct->getSVFFun(curInst->getParent()->getParent());</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>  <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* curFunNode = getTCG()->getCallGraphNode(svffun);</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>  <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> it = curFunNode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin(), eit = curFunNode-><a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().end(); it != eit; ++it)</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>  <a class="code" href="classSVF_1_1PTACallGraphEdge.html">PTACallGraphEdge</a>* edge = *it;</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>  <span class="keywordflow">if</span> (SVFUtil::isa<ThreadForkEdge>(edge) || SVFUtil::isa<ThreadJoinEdge>(edge))</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>  <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>  <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)->directCallsBegin(), ecit = (edge)->directCallsEnd(); cit != ecit;</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>  ++cit)</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>  {</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)->getCallSite();</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>  <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a752d53b6b65d892d0e579aafe70083b4">getNextInsts</a>(inst, nextInsts);</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</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_1CxtStmt.html">CxtStmt</a> newCts(newCxt, *nit);</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>  markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>  }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>  }</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>  }</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>  <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)->indirectCallsBegin(), ecit = (edge)->indirectCallsEnd();</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>  cit != ecit; ++cit)</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>  {</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>  <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)->getCallSite();</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>  <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-><a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-><a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>  {</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a752d53b6b65d892d0e579aafe70083b4">getNextInsts</a>(inst, nextInsts);</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>  {</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, *nit);</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>  markCxtStmtFlag(newCts, cts);</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>  }</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>  }</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span> }</div><div class="line"><a name="l00499"></a><span class="lineno"> 499</span> </div><div class="line"><a name="l00501"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c"> 501</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c">LockAnalysis::handleIntra</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cts)</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="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* curInst = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">getStmt</a>();</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& curCxt = cts.<a class="code" href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">getContext</a>();</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>  <a class="code" href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">InstVec</a> nextInsts;</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>  <a class="code" href="namespaceSVF_1_1LLVMUtil.html#a752d53b6b65d892d0e579aafe70083b4">getNextInsts</a>(curInst, nextInsts);</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>  <span class="keywordflow">for</span> (InstVec::const_iterator nit = nextInsts.begin(), enit = nextInsts.end(); nit != enit; ++nit)</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>  <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(curCxt, *nit);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>  markCxtStmtFlag(newCts, cts);</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_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17"> 517</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17">LockAnalysis::pushCxt</a>(<a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& cxt, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* call, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee)</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="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call->getParent()->getParent();</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct->getSVFFun(callee);</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct->getSVFFun(caller);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()->getCallSiteID(cbn, svfcallee);</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span> </div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span> <span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span> <span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span> <span class="comment">// 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>  <span class="keywordflow">if</span> (tct->inSameCallGraphSCC(getTCG()->getCallGraphNode(svfcaller), getTCG()->getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>  {</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>  tct->pushCxt(cxt,csId);</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct->dumpCxt(cxt));</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> }</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span> </div><div class="line"><a name="l00536"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb"> 536</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb">LockAnalysis::matchCxt</a>(<a class="code" href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">CallStrCxt</a>& cxt, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* call, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee)</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span> {</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>  <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call->getParent()->getParent();</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct->getSVFFun(callee);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct->getSVFFun(caller);</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>  <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct->getCallICFGNode(call);</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>  <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()->getCallSiteID(cbn, svfcallee);</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> <span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span> <span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span> <span class="comment">// return true;</span></div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span> </div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>  <span class="keywordflow">if</span> (cxt.empty())</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>  <span class="keywordflow">return</span> <span class="keyword">true</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="keywordflow">if</span> (tct->inSameCallGraphSCC(getTCG()->getCallGraphNode(svfcaller), getTCG()->getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>  {</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>  <span class="keywordflow">if</span> (cxt.back() == csId)</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>  cxt.pop_back();</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>  <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct->dumpCxt(cxt));</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>  }</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span> }</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span> </div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span> </div><div class="line"><a name="l00567"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa"> 567</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa">LockAnalysis::isProtectedByCommonLock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span> {</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>  numOfTotalQueries++;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>  <span class="keywordtype">bool</span> commonlock = <span class="keyword">false</span>;</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryStart = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>  <span class="keywordflow">if</span> (isInsideIntraLock(i1) && isInsideIntraLock(i2))</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>  commonlock = isProtectedByCommonCILock(i1,i2) ;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>  commonlock = isProtectedByCommonCxtLock(i1,i2);</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryEnd = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(lockQueriesTime += (queryEnd - queryStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>);</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>  <span class="keywordflow">return</span> commonlock;</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span> }</div><div class="line"><a name="l00580"></a><span class="lineno"> 580</span> </div><div class="line"><a name="l00584"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48"> 584</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48">LockAnalysis::isProtectedByCommonCILock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span> {</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span> </div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>  <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) && !isInsideCondIntraLock(i2))</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="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>  <span class="keywordflow">for</span> (InstSet::const_iterator cil1 = lockset1.begin(), ecil1 = lockset1.end(); cil1!=ecil1; ++cil1)</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="keywordflow">for</span> (InstSet::const_iterator cil2=lockset2.begin(), ecil2=lockset2.end(); cil2!=ecil2; ++cil2)</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>  {</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>  <span class="keywordflow">if</span> (isAliasedLocks(*cil1, *cil2))</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>  <span class="keywordflow">return</span> <span class="keyword">true</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>  }</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span> }</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span> </div><div class="line"><a name="l00606"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3e2e629a588b44ed39e529babb59a4f9"> 606</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287">LockAnalysis::isProtectedByCommonCxtLock</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2)</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span> {</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>  <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>  <span class="keywordflow">if</span> (alias(lockset1,lockset2))</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span> </div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span> }</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span> </div><div class="line"><a name="l00621"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287"> 621</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287">LockAnalysis::isProtectedByCommonCxtLock</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span> {</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>  <span class="keywordflow">if</span>(!hasCxtStmtfromInst(i1) || !hasCxtStmtfromInst(i2))</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset1 = getCxtStmtfromInst(i1);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset2 = getCxtStmtfromInst(i2);</div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts1 = ctsset1.begin(), ects1 = ctsset1.end(); cts1 != ects1; cts1++)</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>  {</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1 = *cts1;</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts2 = ctsset2.begin(), ects2 = ctsset2.end(); cts2 != ects2; cts2++)</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>  {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2 = *cts2;</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>  <span class="keywordflow">if</span>(cxtStmt1==cxtStmt2) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>  <span class="keywordflow">if</span>(isProtectedByCommonCxtLock(cxtStmt1,cxtStmt2)==<span class="keyword">false</span>)</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>  }</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>  }</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span> }</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span> </div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span> </div><div class="line"><a name="l00645"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3"> 645</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3">LockAnalysis::isInSameSpan</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span> {</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryStart = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</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="keywordtype">bool</span> sameSpan = <span class="keyword">false</span>;</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>  <span class="keywordflow">if</span> (isInsideIntraLock(i1) && isInsideIntraLock(i2))</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>  sameSpan = isInSameCISpan(i1, i2);</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>  <span class="keywordflow">else</span></div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>  sameSpan = isInSameCSSpan(i1, i2);</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>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(<span class="keywordtype">double</span> queryEnd = <a class="code" href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">PTAStat::getClk</a>());</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>  <a class="code" href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a>(lockQueriesTime += (queryEnd - queryStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>);</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>  <span class="keywordflow">return</span> sameSpan;</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="l00663"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae"> 663</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae">LockAnalysis::isInSameCISpan</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *i2)<span class="keyword"> const</span></div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span> <span class="keyword"></span>{</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>  <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) && !isInsideCondIntraLock(i2))</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="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>& lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>  <span class="keywordflow">for</span> (InstSet::const_iterator cil1 = lockset1.begin(), ecil1 = lockset1.end(); cil1!=ecil1; ++cil1)</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>  {</div><div class="line"><a name="l00671"></a><span class="lineno"> 671</span>  <span class="keywordflow">for</span> (InstSet::const_iterator cil2=lockset2.begin(), ecil2=lockset2.end(); cil2!=ecil2; ++cil2)</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="keywordflow">if</span> (*cil1==*cil2)</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>  }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>  }</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">return</span> <span class="keyword">false</span>;</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> </div><div class="line"><a name="l00684"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8595b976bf60d161561e5494257aa179"> 684</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd">LockAnalysis::isInSameCSSpan</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2)<span class="keyword"> const</span></div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span> <span class="keyword"></span>{</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>  <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>& lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>  <span class="keywordflow">if</span> (intersects(lockset1,lockset2))</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>  <span class="keywordflow">return</span> <span class="keyword">true</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">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span> }</div><div class="line"><a name="l00698"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd"> 698</a></span> <span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd">LockAnalysis::isInSameCSSpan</a>(<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I1, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *I2)<span class="keyword"> const</span></div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span> <span class="keyword"></span>{</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>  <span class="keywordflow">if</span>(!hasCxtStmtfromInst(I1) || !hasCxtStmtfromInst(I2))</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset1 = getCxtStmtfromInst(I1);</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>& ctsset2 = getCxtStmtfromInst(I2);</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>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts1 = ctsset1.begin(), ects1 = ctsset1.end(); cts1 != ects1; cts1++)</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt1 = *cts1;</div><div class="line"><a name="l00708"></a><span class="lineno"> 708</span>  <span class="keywordflow">for</span> (CxtStmtSet::const_iterator cts2 = ctsset2.begin(), ects2 = ctsset2.end(); cts2 != ects2; cts2++)</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>  <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>& cxtStmt2 = *cts2;</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>  <span class="keywordflow">if</span>(cxtStmt1==cxtStmt2) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>  <span class="keywordflow">if</span>(isInSameCSSpan(cxtStmt1,cxtStmt2)==<span class="keyword">false</span>)</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>  <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>  }</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>  }</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>  <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span> }</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span> </div><div class="line"><a name="l00719"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a935128c9952714fcc98febed491ee85d"> 719</a></span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a935128c9952714fcc98febed491ee85d">LockAnalysis::validateResults</a>()</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> </div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>  <span class="comment">// Initialize the validator and perform validation.</span></div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>  <a class="code" href="classSVF_1_1LockResultValidator.html">LockResultValidator</a> lockvalidator(<span class="keyword">this</span>);</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>  lockvalidator.<a class="code" href="classSVF_1_1LockResultValidator.html#a88ff3ed1398a0b847d71a4c0352ed66d">analyze</a>();</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>  <a class="code" href="classSVF_1_1RaceValidator.html">RaceValidator</a> validator(<span class="keyword">this</span>);</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>  validator.<a class="code" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7">init</a>(tct->getSVFModule());</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>  validator.<a class="code" href="classSVF_1_1RaceResultValidator.html#ab8a261120a7f6520d22a6f5cdf2257e9">analyze</a>();</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span> }</div><div class="ttc" id="classSVF_1_1RaceValidator_html_a6982b72e3e2551deab80d9e3fefaab64"><div class="ttname"><a href="classSVF_1_1RaceValidator.html#a6982b72e3e2551deab80d9e3fefaab64">SVF::RaceValidator::lsa</a></div><div class="ttdeci">LockAnalysis * lsa</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00037">LockAnalysis.cpp:37</a></div></div>
|
|
70
70
|
<div class="ttc" id="classSVF_1_1PTACallGraph_html_aaab54c670518d9d6790707f76ea76aa1"><div class="ttname"><a href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">SVF::PTACallGraph::getCallGraphNode</a></div><div class="ttdeci">PTACallGraphNode * getCallGraphNode(NodeID id) const</div><div class="ttdoc">Get call graph node. </div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00315">PTACallGraph.h:315</a></div></div>
|
|
71
|
+
<div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_af904cd58192dccb85572cfa95f5ea670"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#af904cd58192dccb85572cfa95f5ea670">SVF::LLVMUtil::getPrevInsts</a></div><div class="ttdeci">void getPrevInsts(const Instruction *curInst, std::vector< const Instruction *> &instList)</div><div class="ttdoc">Get the previous instructions following control flow. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00277">LLVMUtil.cpp:277</a></div></div>
|
|
71
72
|
<div class="ttc" id="classSVF_1_1GenericNode_html_afc8b5f86d7795b6a0dfc0687d942d79b"><div class="ttname"><a href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">SVF::GenericNode::getInEdges</a></div><div class="ttdeci">const GEdgeSetTy & getInEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00186">GenericGraph.h:186</a></div></div>
|
|
72
73
|
<div class="ttc" id="SVFBasicTypes_8h_html_a217a1ccdaec1abb103cf6b0373631234"><div class="ttname"><a href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a></div><div class="ttdeci">#define DMTA</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00174">SVFBasicTypes.h:174</a></div></div>
|
|
73
74
|
<div class="ttc" id="classSVF_1_1LockResultValidator_html"><div class="ttname"><a href="classSVF_1_1LockResultValidator.html">SVF::LockResultValidator</a></div><div class="ttdef"><b>Definition:</b> <a href="LockResultValidator_8h_source.html#l00018">LockResultValidator.h:18</a></div></div>
|
|
74
75
|
<div class="ttc" id="classSVF_1_1ThreadAPI_html_a9db4df7968ec179e5012794c58fdee70"><div class="ttname"><a href="classSVF_1_1ThreadAPI.html#a9db4df7968ec179e5012794c58fdee70">SVF::ThreadAPI::isTDAcquire</a></div><div class="ttdeci">bool isTDAcquire(const Instruction *inst) const</div><div class="ttdoc">Return true if this call acquire a lock. </div><div class="ttdef"><b>Definition:</b> <a href="ThreadAPI_8h_source.html#l00283">ThreadAPI.h:283</a></div></div>
|
|
75
76
|
<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#l00206">GenericGraph.h:206</a></div></div>
|
|
76
77
|
<div class="ttc" id="util_8h_html_a07d17d6d5d1074c0969bc5d3c3d1d84a"><div class="ttname"><a href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a></div><div class="ttdeci">#define assert(ex)</div><div class="ttdef"><b>Definition:</b> <a href="util_8h_source.html#l00141">util.h:141</a></div></div>
|
|
78
|
+
<div class="ttc" id="namespaceLLVMUtil_html"><div class="ttname"><a href="namespaceLLVMUtil.html">LLVMUtil</a></div></div>
|
|
77
79
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_a7056704c224dfb4b57287fe90c004aa8"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a7056704c224dfb4b57287fe90c004aa8">SVF::FIFOWorkList::empty</a></div><div class="ttdeci">bool empty() const</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00146">WorkList.h:146</a></div></div>
|
|
78
80
|
<div class="ttc" id="classSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00127">BasicTypes.h:127</a></div></div>
|
|
79
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a4245d946dd694b59b5c8ef30b08cb1dd"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd">SVF::LockAnalysis::isInSameCSSpan</a></div><div class="ttdeci">bool isInSameCSSpan(const Instruction *i1, const Instruction *i2) const</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
81
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a4245d946dd694b59b5c8ef30b08cb1dd"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd">SVF::LockAnalysis::isInSameCSSpan</a></div><div class="ttdeci">bool isInSameCSSpan(const Instruction *i1, const Instruction *i2) const</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00698">LockAnalysis.cpp:698</a></div></div>
|
|
80
82
|
<div class="ttc" id="namespaceSVF_html_adc8b60ca7d60cf6c81feae20e4a04c63"><div class="ttname"><a href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">SVF::CallInst</a></div><div class="ttdeci">llvm::CallInst CallInst</div><div class="ttdoc">LLVM Instructions. </div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00104">BasicTypes.h:104</a></div></div>
|
|
81
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a842ddef4d1cb9c45555d949375627a48"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48">SVF::LockAnalysis::isProtectedByCommonCILock</a></div><div class="ttdeci">bool isProtectedByCommonCILock(const Instruction *i1, const Instruction *i2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
83
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a842ddef4d1cb9c45555d949375627a48"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48">SVF::LockAnalysis::isProtectedByCommonCILock</a></div><div class="ttdeci">bool isProtectedByCommonCILock(const Instruction *i1, const Instruction *i2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00584">LockAnalysis.cpp:584</a></div></div>
|
|
82
84
|
<div class="ttc" id="SVFUtil_8h_html"><div class="ttname"><a href="SVFUtil_8h.html">SVFUtil.h</a></div></div>
|
|
83
85
|
<div class="ttc" id="classSVF_1_1Options_html_a78b3b44f2c0dc94dc1363ca57ee76d66"><div class="ttname"><a href="classSVF_1_1Options.html#a78b3b44f2c0dc94dc1363ca57ee76d66">SVF::Options::LockValid</a></div><div class="ttdeci">static const llvm::cl::opt< bool > LockValid</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00187">Options.h:187</a></div></div>
|
|
84
86
|
<div class="ttc" id="classSVF_1_1CallSite_html_ab36a6a35eea673d4bdca615efc4336b1"><div class="ttname"><a href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">SVF::CallSite::getInstruction</a></div><div class="ttdeci">CallBase * getInstruction() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00210">BasicTypes.h:210</a></div></div>
|
|
85
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ad1516b6cb1dbd06b8dff04ae3c944621"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621">SVF::LockAnalysis::analyze</a></div><div class="ttdeci">void analyze()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
87
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ad1516b6cb1dbd06b8dff04ae3c944621"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621">SVF::LockAnalysis::analyze</a></div><div class="ttdeci">void analyze()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00042">LockAnalysis.cpp:42</a></div></div>
|
|
86
88
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a28c0ede7e4765d2a686fc8ae0f5641a4"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVF::SVFUtil::getSourceLoc</a></div><div class="ttdeci">std::string getSourceLoc(const Value *val)</div><div class="ttdoc">Return source code including line number and file name from debug information. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00268">SVFUtil.cpp:268</a></div></div>
|
|
87
89
|
<div class="ttc" id="classSVF_1_1TCT_html_afb579a5bdcc0a1c6b075bb9aae36c237"><div class="ttname"><a href="classSVF_1_1TCT.html#afb579a5bdcc0a1c6b075bb9aae36c237">SVF::TCT::PTACGNodeSet</a></div><div class="ttdeci">Set< const PTACallGraphNode * > PTACGNodeSet</div><div class="ttdef"><b>Definition:</b> <a href="TCT_8h_source.html#l00124">TCT.h:124</a></div></div>
|
|
88
90
|
<div class="ttc" id="SVF-FE_2BasicTypes_8h_html_a160997c1a0fb1000445d04b89d9c1323"><div class="ttname"><a href="SVF-FE_2BasicTypes_8h.html#a160997c1a0fb1000445d04b89d9c1323">inst_iterator</a></div><div class="ttdeci">llvm::inst_iterator inst_iterator</div><div class="ttdef"><b>Definition:</b> <a href="SVF-FE_2BasicTypes_8h_source.html#l00110">BasicTypes.h:110</a></div></div>
|
|
89
91
|
<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#l00214">GenericGraph.h:214</a></div></div>
|
|
90
92
|
<div class="ttc" id="classSVF_1_1CxtProc_html_a254c612f06a3f82b57b1c5a0e52c012f"><div class="ttname"><a href="classSVF_1_1CxtProc.html#a254c612f06a3f82b57b1c5a0e52c012f">SVF::CxtProc::dump</a></div><div class="ttdeci">void dump() const</div><div class="ttdoc">Dump CxtProc. </div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00377">CxtStmt.h:377</a></div></div>
|
|
91
|
-
<div class="ttc" id="classSVF_1_1RaceValidator_html_ab95520388bafe1efae63196400350690"><div class="ttname"><a href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690">SVF::RaceValidator::protectedByCommonLocks</a></div><div class="ttdeci">bool protectedByCommonLocks(const Instruction *I1, const Instruction *I2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
92
|
-
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a2f9959fa23ab4bdc65ca36fbda8c1b70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a2f9959fa23ab4bdc65ca36fbda8c1b70">SVF::SVFUtil::getNextInsts</a></div><div class="ttdeci">void getNextInsts(const Instruction *curInst, std::vector< const Instruction *> &instList)</div><div class="ttdoc">Get the next instructions following control flow. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00250">LLVMUtil.cpp:250</a></div></div>
|
|
93
|
+
<div class="ttc" id="classSVF_1_1RaceValidator_html_ab95520388bafe1efae63196400350690"><div class="ttname"><a href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690">SVF::RaceValidator::protectedByCommonLocks</a></div><div class="ttdeci">bool protectedByCommonLocks(const Instruction *I1, const Instruction *I2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00032">LockAnalysis.cpp:32</a></div></div>
|
|
93
94
|
<div class="ttc" id="classSVF_1_1PTACallGraphEdge_html_a494bc8bacca5ca8d266286f3fb303495"><div class="ttname"><a href="classSVF_1_1PTACallGraphEdge.html#a494bc8bacca5ca8d266286f3fb303495">SVF::PTACallGraphEdge::indirectCallsEnd</a></div><div class="ttdeci">CallInstSet::const_iterator indirectCallsEnd() const</div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00135">PTACallGraph.h:135</a></div></div>
|
|
94
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a6febb0bb12f4983cd54b3bd310ce65d2"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2">SVF::LockAnalysis::intraForwardTraverse</a></div><div class="ttdeci">bool intraForwardTraverse(const Instruction *lock, InstSet &unlockset, InstSet &forwardInsts)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
95
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a6febb0bb12f4983cd54b3bd310ce65d2"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2">SVF::LockAnalysis::intraForwardTraverse</a></div><div class="ttdeci">bool intraForwardTraverse(const Instruction *lock, InstSet &unlockset, InstSet &forwardInsts)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00171">LockAnalysis.cpp:171</a></div></div>
|
|
95
96
|
<div class="ttc" id="classSVF_1_1CxtProc_html_ab9ac6459c90873b7dea35e0a22700189"><div class="ttname"><a href="classSVF_1_1CxtProc.html#ab9ac6459c90873b7dea35e0a22700189">SVF::CxtProc::getProc</a></div><div class="ttdeci">const SVFFunction * getProc() const</div><div class="ttdoc">Return current procedure. </div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00325">CxtStmt.h:325</a></div></div>
|
|
96
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a56405fa1fec68717958ed1c05dd34287"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287">SVF::LockAnalysis::isProtectedByCommonCxtLock</a></div><div class="ttdeci">bool isProtectedByCommonCxtLock(const Instruction *i1, const Instruction *i2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
97
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a56405fa1fec68717958ed1c05dd34287"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287">SVF::LockAnalysis::isProtectedByCommonCxtLock</a></div><div class="ttdeci">bool isProtectedByCommonCxtLock(const Instruction *i1, const Instruction *i2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00621">LockAnalysis.cpp:621</a></div></div>
|
|
97
98
|
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a0716c155b42b3ae7a6c8d7593bb6ac83"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">SVF::LockAnalysis::CxtLockSet</a></div><div class="ttdeci">Set< CxtLock > CxtLockSet</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8h_source.html#l00049">LockAnalysis.h:49</a></div></div>
|
|
98
99
|
<div class="ttc" id="classSVF_1_1ThreadCallGraph_html_adcad8524a53baf256cd45503ec568c10"><div class="ttname"><a href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">SVF::ThreadCallGraph::getThreadAPI</a></div><div class="ttdeci">ThreadAPI * getThreadAPI() const</div><div class="ttdoc">Thread API. </div><div class="ttdef"><b>Definition:</b> <a href="ThreadCallGraph_8h_source.html#l00324">ThreadCallGraph.h:324</a></div></div>
|
|
99
|
-
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a7e3a8d6cb1715db9518579fb60181d5b"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a7e3a8d6cb1715db9518579fb60181d5b">SVF::SVFUtil::getPrevInsts</a></div><div class="ttdeci">void getPrevInsts(const Instruction *curInst, std::vector< const Instruction *> &instList)</div><div class="ttdoc">Get the previous instructions following control flow. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00277">LLVMUtil.cpp:277</a></div></div>
|
|
100
100
|
<div class="ttc" id="classSVF_1_1CxtStmt_html_a5e8c4b10eb5c3240d2e21a020ed834a6"><div class="ttname"><a href="classSVF_1_1CxtStmt.html#a5e8c4b10eb5c3240d2e21a020ed834a6">SVF::CxtStmt::getStmt</a></div><div class="ttdeci">const Instruction * getStmt() const</div><div class="ttdoc">Return current statement. </div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00062">CxtStmt.h:62</a></div></div>
|
|
101
101
|
<div class="ttc" id="classSVF_1_1RaceResultValidator_html_aec8b923a0da580113a13bf94ffb3ebd7"><div class="ttname"><a href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7">SVF::RaceResultValidator::init</a></div><div class="ttdeci">void init(SVFModule *M)</div><div class="ttdoc">Initialization. </div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00215">MTAResultValidator.h:215</a></div></div>
|
|
102
102
|
<div class="ttc" id="classSVF_1_1RaceResultValidator_html_ab8a261120a7f6520d22a6f5cdf2257e9"><div class="ttname"><a href="classSVF_1_1RaceResultValidator.html#ab8a261120a7f6520d22a6f5cdf2257e9">SVF::RaceResultValidator::analyze</a></div><div class="ttdeci">void analyze()</div><div class="ttdoc">Analysis. </div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00223">MTAResultValidator.h:223</a></div></div>
|
|
103
|
-
<div class="ttc" id="classSVF_1_1RaceValidator_html_a7ec5d97155d170033398757af56691ad"><div class="ttname"><a href="classSVF_1_1RaceValidator.html#a7ec5d97155d170033398757af56691ad">SVF::RaceValidator::RaceValidator</a></div><div class="ttdeci">RaceValidator(LockAnalysis *ls)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
103
|
+
<div class="ttc" id="classSVF_1_1RaceValidator_html_a7ec5d97155d170033398757af56691ad"><div class="ttname"><a href="classSVF_1_1RaceValidator.html#a7ec5d97155d170033398757af56691ad">SVF::RaceValidator::RaceValidator</a></div><div class="ttdeci">RaceValidator(LockAnalysis *ls)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00029">LockAnalysis.cpp:29</a></div></div>
|
|
104
104
|
<div class="ttc" id="namespaceSVF_html_ab700523619b089b952498f39a7f5b6b1"><div class="ttname"><a href="namespaceSVF.html#ab700523619b089b952498f39a7f5b6b1">SVF::CallStrCxt</a></div><div class="ttdeci">std::vector< u32_t > CallStrCxt</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00130">SVFBasicTypes.h:130</a></div></div>
|
|
105
105
|
<div class="ttc" id="MTAResultValidator_8h_html"><div class="ttname"><a href="MTAResultValidator_8h.html">MTAResultValidator.h</a></div></div>
|
|
106
106
|
<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#l00093">GenericGraph.h:93</a></div></div>
|
|
@@ -108,33 +108,33 @@ $(function() {
|
|
|
108
108
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_ad4c6a48b60c870d63049fe7272cc7eb8"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#ad4c6a48b60c870d63049fe7272cc7eb8">SVF::FIFOWorkList::push</a></div><div class="ttdeci">bool push(Data data)</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00159">WorkList.h:159</a></div></div>
|
|
109
109
|
<div class="ttc" id="LockResultValidator_8h_html"><div class="ttname"><a href="LockResultValidator_8h.html">LockResultValidator.h</a></div></div>
|
|
110
110
|
<div class="ttc" id="namespaceSVF_html_a7875172ff434b2210eea7cecfbbd959e"><div class="ttname"><a href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">SVF::Instruction</a></div><div class="ttdeci">llvm::Instruction Instruction</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00073">BasicTypes.h:73</a></div></div>
|
|
111
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a65aca2bc12fc34203b16549653943eae"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae">SVF::LockAnalysis::isInSameCISpan</a></div><div class="ttdeci">bool isInSameCISpan(const Instruction *i1, const Instruction *i2) const</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
111
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a65aca2bc12fc34203b16549653943eae"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae">SVF::LockAnalysis::isInSameCISpan</a></div><div class="ttdeci">bool isInSameCISpan(const Instruction *i1, const Instruction *i2) const</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00663">LockAnalysis.cpp:663</a></div></div>
|
|
112
112
|
<div class="ttc" id="classSVF_1_1PTACallGraphEdge_html"><div class="ttname"><a href="classSVF_1_1PTACallGraphEdge.html">SVF::PTACallGraphEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00051">PTACallGraph.h:51</a></div></div>
|
|
113
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a3299f1fe234e1d6b4341498575bddcbb"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb">SVF::LockAnalysis::matchCxt</a></div><div class="ttdeci">bool matchCxt(CallStrCxt &cxt, const Instruction *call, const Function *callee)</div><div class="ttdoc">Match context. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
113
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a3299f1fe234e1d6b4341498575bddcbb"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb">SVF::LockAnalysis::matchCxt</a></div><div class="ttdeci">bool matchCxt(CallStrCxt &cxt, const Instruction *call, const Function *callee)</div><div class="ttdoc">Match context. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00536">LockAnalysis.cpp:536</a></div></div>
|
|
114
114
|
<div class="ttc" id="classSVF_1_1PTACallGraphEdge_html_acc4fcacefdc9be9a214dfcc455fe7970"><div class="ttname"><a href="classSVF_1_1PTACallGraphEdge.html#acc4fcacefdc9be9a214dfcc455fe7970">SVF::PTACallGraphEdge::directCallsEnd</a></div><div class="ttdeci">CallInstSet::const_iterator directCallsEnd() const</div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00126">PTACallGraph.h:126</a></div></div>
|
|
115
115
|
<div class="ttc" id="classSVF_1_1GenericNode_html_afe6a7b286d9af4992f41b59612fd2900"><div class="ttname"><a href="classSVF_1_1GenericNode.html#afe6a7b286d9af4992f41b59612fd2900">SVF::GenericNode::InEdgeEnd</a></div><div class="ttdeci">iterator InEdgeEnd()</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00218">GenericGraph.h:218</a></div></div>
|
|
116
116
|
<div class="ttc" id="classSVF_1_1LockAnalysis_html_aeb4b15ecc4ba1a0ca8794d304d1895cb"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#aeb4b15ecc4ba1a0ca8794d304d1895cb">SVF::LockAnalysis::InstVec</a></div><div class="ttdeci">TCT::InstVec InstVec</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8h_source.html#l00039">LockAnalysis.h:39</a></div></div>
|
|
117
117
|
<div class="ttc" id="classSVF_1_1LockAnalysis_html"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html">SVF::LockAnalysis</a></div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8h_source.html#l00023">LockAnalysis.h:23</a></div></div>
|
|
118
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a8a34f7544f22a87e1caf010c34abda75"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75">SVF::LockAnalysis::analyzeIntraProcedualLock</a></div><div class="ttdeci">void analyzeIntraProcedualLock()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
118
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a8a34f7544f22a87e1caf010c34abda75"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75">SVF::LockAnalysis::analyzeIntraProcedualLock</a></div><div class="ttdeci">void analyzeIntraProcedualLock()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00143">LockAnalysis.cpp:143</a></div></div>
|
|
119
119
|
<div class="ttc" id="namespaceSVF_html_a03d88a0302bcd253387690f13f693f64"><div class="ttname"><a href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">SVF::CallSiteID</a></div><div class="ttdeci">unsigned CallSiteID</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00092">SVFBasicTypes.h:92</a></div></div>
|
|
120
120
|
<div class="ttc" id="classSVF_1_1PTACallGraphNode_html_adf17f5699c9f40ffc8837e813e3af3ec"><div class="ttname"><a href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">SVF::PTACallGraphNode::const_iterator</a></div><div class="ttdeci">PTACallGraphEdge::CallGraphEdgeSet::const_iterator const_iterator</div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00180">PTACallGraph.h:180</a></div></div>
|
|
121
121
|
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a42ed881d4cd79eae099266a9e171aeb2"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">SVF::LockAnalysis::CxtStmtSet</a></div><div class="ttdeci">Set< CxtStmt > CxtStmtSet</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8h_source.html#l00048">LockAnalysis.h:48</a></div></div>
|
|
122
122
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_aed0b0b9f035057552a6a82154fd88e61"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#aed0b0b9f035057552a6a82154fd88e61">SVF::SVFUtil::outs</a></div><div class="ttdeci">std::ostream & outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
|
|
123
123
|
<div class="ttc" id="classSVF_1_1PTACallGraphNode_html_a959445c97605953fbdebbbd999437a09"><div class="ttname"><a href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">SVF::PTACallGraphNode::getFunction</a></div><div class="ttdeci">const SVFFunction * getFunction() const</div><div class="ttdoc">Get function of this call node. </div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00193">PTACallGraph.h:193</a></div></div>
|
|
124
124
|
<div class="ttc" id="classSVF_1_1ThreadCallGraph_html"><div class="ttname"><a href="classSVF_1_1ThreadCallGraph.html">SVF::ThreadCallGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="ThreadCallGraph_8h_source.html#l00160">ThreadCallGraph.h:160</a></div></div>
|
|
125
|
-
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a3cb226930eeaf558575e09e5b65e0223"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a3cb226930eeaf558575e09e5b65e0223">SVF::SVFUtil::getFunExitBB</a></div><div class="ttdeci">const BasicBlock * getFunExitBB(const Function *fun)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00167">LLVMUtil.h:167</a></div></div>
|
|
126
125
|
<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#l00089">GenericGraph.h:89</a></div></div>
|
|
127
126
|
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a561bb2fbfbeee9117efad7c7c70871d8"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">SVF::LockAnalysis::FunSet</a></div><div class="ttdeci">Set< const Function * > FunSet</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8h_source.html#l00043">LockAnalysis.h:43</a></div></div>
|
|
128
127
|
<div class="ttc" id="classSVF_1_1CxtStmt_html"><div class="ttname"><a href="classSVF_1_1CxtStmt.html">SVF::CxtStmt</a></div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00041">CxtStmt.h:41</a></div></div>
|
|
129
128
|
<div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00181">SVFBasicTypes.h:181</a></div></div>
|
|
130
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a5f693c893f3701e1e025881f91193d53"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53">SVF::LockAnalysis::intraBackwardTraverse</a></div><div class="ttdeci">bool intraBackwardTraverse(const InstSet &unlockset, InstSet &backwardInsts)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
129
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a5f693c893f3701e1e025881f91193d53"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53">SVF::LockAnalysis::intraBackwardTraverse</a></div><div class="ttdeci">bool intraBackwardTraverse(const InstSet &unlockset, InstSet &backwardInsts)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00214">LockAnalysis.cpp:214</a></div></div>
|
|
131
130
|
<div class="ttc" id="Options_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
|
|
132
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_aa8683de99ad02fb75b175b0bb54e5f7d"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d">SVF::LockAnalysis::collectLockUnlocksites</a></div><div class="ttdeci">void collectLockUnlocksites()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
133
|
-
<div class="ttc" id="
|
|
134
|
-
<div class="ttc" id="
|
|
135
|
-
<div class="ttc" id="
|
|
131
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_aa8683de99ad02fb75b175b0bb54e5f7d"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d">SVF::LockAnalysis::collectLockUnlocksites</a></div><div class="ttdeci">void collectLockUnlocksites()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00072">LockAnalysis.cpp:72</a></div></div>
|
|
132
|
+
<div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_a752d53b6b65d892d0e579aafe70083b4"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#a752d53b6b65d892d0e579aafe70083b4">SVF::LLVMUtil::getNextInsts</a></div><div class="ttdeci">void getNextInsts(const Instruction *curInst, std::vector< const Instruction *> &instList)</div><div class="ttdoc">Get the next instructions following control flow. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8cpp_source.html#l00250">LLVMUtil.cpp:250</a></div></div>
|
|
133
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a935128c9952714fcc98febed491ee85d"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a935128c9952714fcc98febed491ee85d">SVF::LockAnalysis::validateResults</a></div><div class="ttdeci">void validateResults()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00719">LockAnalysis.cpp:719</a></div></div>
|
|
134
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ae03db88ef0ad0da2c31cf1623b32165f"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ae03db88ef0ad0da2c31cf1623b32165f">SVF::LockAnalysis::collectCxtLock</a></div><div class="ttdeci">void collectCxtLock()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00258">LockAnalysis.cpp:258</a></div></div>
|
|
135
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a97b186f9417144557bb17c41d515a9f4"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a97b186f9417144557bb17c41d515a9f4">SVF::LockAnalysis::handleCall</a></div><div class="ttdeci">void handleCall(const CxtStmt &cts)</div><div class="ttdoc">Handle call. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00428">LockAnalysis.cpp:428</a></div></div>
|
|
136
136
|
<div class="ttc" id="SVFBasicTypes_8h_html_a2c64190a065f342897573a3ef4973adb"><div class="ttname"><a href="SVFBasicTypes_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="SVFBasicTypes_8h_source.html#l00159">SVFBasicTypes.h:159</a></div></div>
|
|
137
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_acc3d402c68b9c22ab6d576b38c994fc6"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6">SVF::LockAnalysis::handleRet</a></div><div class="ttdeci">void handleRet(const CxtStmt &cts)</div><div class="ttdoc">Handle return. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
137
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_acc3d402c68b9c22ab6d576b38c994fc6"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6">SVF::LockAnalysis::handleRet</a></div><div class="ttdeci">void handleRet(const CxtStmt &cts)</div><div class="ttdoc">Handle return. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00452">LockAnalysis.cpp:452</a></div></div>
|
|
138
138
|
<div class="ttc" id="classSVF_1_1PTACallGraphEdge_html_a750e50a9022451e406c4819979edffa5"><div class="ttname"><a href="classSVF_1_1PTACallGraphEdge.html#a750e50a9022451e406c4819979edffa5">SVF::PTACallGraphEdge::directCallsBegin</a></div><div class="ttdeci">CallInstSet::const_iterator directCallsBegin() const</div><div class="ttdoc">Iterators for direct and indirect callsites. </div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00122">PTACallGraph.h:122</a></div></div>
|
|
139
139
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html">SVF::FIFOWorkList</a></div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00137">WorkList.h:137</a></div></div>
|
|
140
140
|
<div class="ttc" id="CFLGrammar_8txt_html_acc7b4cf736579c4d83be2316d5a9e5f2"><div class="ttname"><a href="CFLGrammar_8txt.html#acc7b4cf736579c4d83be2316d5a9e5f2">F</a></div><div class="ttdeci">V Fbar V F</div><div class="ttdef"><b>Definition:</b> <a href="CFLGrammar_8txt_source.html#l00014">CFLGrammar.txt:14</a></div></div>
|
|
@@ -142,38 +142,39 @@ $(function() {
|
|
|
142
142
|
<div class="ttc" id="classSVF_1_1CallICFGNode_html"><div class="ttname"><a href="classSVF_1_1CallICFGNode.html">SVF::CallICFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00363">ICFGNode.h:363</a></div></div>
|
|
143
143
|
<div class="ttc" id="classSVF_1_1SVFFunction_html_ac4ae917ae35ac6fca652fe2dd90a8ac2"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">SVF::SVFFunction::getLLVMFun</a></div><div class="ttdeci">Function * getLLVMFun() const</div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00143">BasicTypes.h:143</a></div></div>
|
|
144
144
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a202de7ad2bea0311e2f75894c030e7a9"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVF::SVFUtil::getLLVMCallSite</a></div><div class="ttdeci">CallSite getLLVMCallSite(const Instruction *inst)</div><div class="ttdoc">Return LLVM callsite given a instruction. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00217">SVFUtil.h:217</a></div></div>
|
|
145
|
-
<div class="ttc" id="classSVF_1_1RaceValidator_html"><div class="ttname"><a href="classSVF_1_1RaceValidator.html">SVF::RaceValidator</a></div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
145
|
+
<div class="ttc" id="classSVF_1_1RaceValidator_html"><div class="ttname"><a href="classSVF_1_1RaceValidator.html">SVF::RaceValidator</a></div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00026">LockAnalysis.cpp:26</a></div></div>
|
|
146
146
|
<div class="ttc" id="classSVF_1_1CxtProc_html_a99b0f68b4cbd733f91eea33aa3e64eb7"><div class="ttname"><a href="classSVF_1_1CxtProc.html#a99b0f68b4cbd733f91eea33aa3e64eb7">SVF::CxtProc::getContext</a></div><div class="ttdeci">const CallStrCxt & getContext() const</div><div class="ttdoc">Return current context. </div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00330">CxtStmt.h:330</a></div></div>
|
|
147
147
|
<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>
|
|
148
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a711760ebaed0437176f4f9d314e9929c"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c">SVF::LockAnalysis::handleIntra</a></div><div class="ttdeci">void handleIntra(const CxtStmt &cts)</div><div class="ttdoc">Handle intra. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
148
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a711760ebaed0437176f4f9d314e9929c"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c">SVF::LockAnalysis::handleIntra</a></div><div class="ttdeci">void handleIntra(const CxtStmt &cts)</div><div class="ttdoc">Handle intra. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00501">LockAnalysis.cpp:501</a></div></div>
|
|
149
149
|
<div class="ttc" id="classSVF_1_1CallSite_html"><div class="ttname"><a href="classSVF_1_1CallSite.html">SVF::CallSite</a></div><div class="ttdef"><b>Definition:</b> <a href="Util_2BasicTypes_8h_source.html#l00202">BasicTypes.h:202</a></div></div>
|
|
150
150
|
<div class="ttc" id="MTA_8h_html"><div class="ttname"><a href="MTA_8h.html">MTA.h</a></div></div>
|
|
151
151
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00343">Casting.h:343</a></div></div>
|
|
152
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a00ccd89eff3fe8fec397df101f927cbe"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe">SVF::LockAnalysis::analyzeLockSpanCxtStmt</a></div><div class="ttdeci">void analyzeLockSpanCxtStmt()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
153
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a7d9fd3ddcadd84969b57491181983b17"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17">SVF::LockAnalysis::pushCxt</a></div><div class="ttdeci">void pushCxt(CallStrCxt &cxt, const Instruction *call, const Function *callee)</div><div class="ttdoc">Push calling context. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
152
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a00ccd89eff3fe8fec397df101f927cbe"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe">SVF::LockAnalysis::analyzeLockSpanCxtStmt</a></div><div class="ttdeci">void analyzeLockSpanCxtStmt()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00330">LockAnalysis.cpp:330</a></div></div>
|
|
153
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a7d9fd3ddcadd84969b57491181983b17"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17">SVF::LockAnalysis::pushCxt</a></div><div class="ttdeci">void pushCxt(CallStrCxt &cxt, const Instruction *call, const Function *callee)</div><div class="ttdoc">Push calling context. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00517">LockAnalysis.cpp:517</a></div></div>
|
|
154
154
|
<div class="ttc" id="classSVF_1_1SVFModule_html_a709371b13dcf500277f8bc275bdb23c7"><div class="ttname"><a href="classSVF_1_1SVFModule.html#a709371b13dcf500277f8bc275bdb23c7">SVF::SVFModule::iterator</a></div><div class="ttdeci">FunctionSetType::iterator iterator</div><div class="ttdoc">Iterators type def. </div><div class="ttdef"><b>Definition:</b> <a href="SVFModule_8h_source.html#l00051">SVFModule.h:51</a></div></div>
|
|
155
155
|
<div class="ttc" id="LockAnalysis_8h_html"><div class="ttname"><a href="LockAnalysis_8h.html">LockAnalysis.h</a></div></div>
|
|
156
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ac1b42b0a53feae04f848e5b0828ff01a"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a">SVF::LockAnalysis::printLocks</a></div><div class="ttdeci">void printLocks(const CxtStmt &cts)</div><div class="ttdoc">Print locks and spans. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
156
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ac1b42b0a53feae04f848e5b0828ff01a"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a">SVF::LockAnalysis::printLocks</a></div><div class="ttdeci">void printLocks(const CxtStmt &cts)</div><div class="ttdoc">Print locks and spans. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00393">LockAnalysis.cpp:393</a></div></div>
|
|
157
157
|
<div class="ttc" id="classSVF_1_1PTACallGraphNode_html"><div class="ttname"><a href="classSVF_1_1PTACallGraphNode.html">SVF::PTACallGraphNode</a></div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00174">PTACallGraph.h:174</a></div></div>
|
|
158
158
|
<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#l00210">GenericGraph.h:210</a></div></div>
|
|
159
159
|
<div class="ttc" id="classSVF_1_1CxtStmt_html_a56e2767c327a383db09dca96edb19614"><div class="ttname"><a href="classSVF_1_1CxtStmt.html#a56e2767c327a383db09dca96edb19614">SVF::CxtStmt::dump</a></div><div class="ttdeci">void dump() const</div><div class="ttdoc">Dump CxtStmt. </div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00109">CxtStmt.h:109</a></div></div>
|
|
160
160
|
<div class="ttc" id="classSVF_1_1LockResultValidator_html_a88ff3ed1398a0b847d71a4c0352ed66d"><div class="ttname"><a href="classSVF_1_1LockResultValidator.html#a88ff3ed1398a0b847d71a4c0352ed66d">SVF::LockResultValidator::analyze</a></div><div class="ttdeci">void analyze()</div><div class="ttdef"><b>Definition:</b> <a href="LockResultValidator_8cpp_source.html#l00166">LockResultValidator.cpp:166</a></div></div>
|
|
161
161
|
<div class="ttc" id="classSVF_1_1RaceResultValidator_html"><div class="ttname"><a href="classSVF_1_1RaceResultValidator.html">SVF::RaceResultValidator</a></div><div class="ttdoc">Validate the result of concurrent analysis. </div><div class="ttdef"><b>Definition:</b> <a href="MTAResultValidator_8h_source.html#l00168">MTAResultValidator.h:168</a></div></div>
|
|
162
162
|
<div class="ttc" id="classSVF_1_1PTACallGraphEdge_html_afbdb582d20ab953b2de1f3efacb74679"><div class="ttname"><a href="classSVF_1_1PTACallGraphEdge.html#afbdb582d20ab953b2de1f3efacb74679">SVF::PTACallGraphEdge::indirectCallsBegin</a></div><div class="ttdeci">CallInstSet::const_iterator indirectCallsBegin() const</div><div class="ttdef"><b>Definition:</b> <a href="PTACallGraph_8h_source.html#l00131">PTACallGraph.h:131</a></div></div>
|
|
163
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a4d4501d62bf51475662b6ba66e6380aa"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa">SVF::LockAnalysis::isProtectedByCommonLock</a></div><div class="ttdeci">bool isProtectedByCommonLock(const Instruction *i1, const Instruction *i2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
163
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a4d4501d62bf51475662b6ba66e6380aa"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa">SVF::LockAnalysis::isProtectedByCommonLock</a></div><div class="ttdeci">bool isProtectedByCommonLock(const Instruction *i1, const Instruction *i2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00567">LockAnalysis.cpp:567</a></div></div>
|
|
164
164
|
<div class="ttc" id="PTAStat_8h_html"><div class="ttname"><a href="PTAStat_8h.html">PTAStat.h</a></div></div>
|
|
165
165
|
<div class="ttc" id="SVFBasicTypes_8h_html_a173ce1b9b505fdadf5613b663749d3b0"><div class="ttname"><a href="SVFBasicTypes_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="SVFBasicTypes_8h_source.html#l00154">SVFBasicTypes.h:154</a></div></div>
|
|
166
166
|
<div class="ttc" id="classSVF_1_1FIFOWorkList_html_a8fa72918fce7e9c0b2dc34b683a797c6"><div class="ttname"><a href="classSVF_1_1FIFOWorkList.html#a8fa72918fce7e9c0b2dc34b683a797c6">SVF::FIFOWorkList::pop</a></div><div class="ttdeci">Data pop()</div><div class="ttdef"><b>Definition:</b> <a href="WorkList_8h_source.html#l00174">WorkList.h:174</a></div></div>
|
|
167
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a52e79d50288bfa2d146072be53ed058b"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b">SVF::LockAnalysis::handleFork</a></div><div class="ttdeci">void handleFork(const CxtStmt &cts)</div><div class="ttdoc">Handle fork. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
168
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a271506d5032033efae684b0d729f5b3e"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e">SVF::LockAnalysis::buildCandidateFuncSetforLock</a></div><div class="ttdeci">void buildCandidateFuncSetforLock()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
167
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a52e79d50288bfa2d146072be53ed058b"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b">SVF::LockAnalysis::handleFork</a></div><div class="ttdeci">void handleFork(const CxtStmt &cts)</div><div class="ttdoc">Handle fork. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00406">LockAnalysis.cpp:406</a></div></div>
|
|
168
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_a271506d5032033efae684b0d729f5b3e"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e">SVF::LockAnalysis::buildCandidateFuncSetforLock</a></div><div class="ttdeci">void buildCandidateFuncSetforLock()</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00095">LockAnalysis.cpp:95</a></div></div>
|
|
169
169
|
<div class="ttc" id="SVFBasicTypes_8h_html_ab6f41e9db3675dc689c5492418885041"><div class="ttname"><a href="SVFBasicTypes_8h.html#ab6f41e9db3675dc689c5492418885041">DOTIMESTAT</a></div><div class="ttdeci">#define DOTIMESTAT(X)</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00156">SVFBasicTypes.h:156</a></div></div>
|
|
170
170
|
<div class="ttc" id="classSVF_1_1CxtProc_html"><div class="ttname"><a href="classSVF_1_1CxtProc.html">SVF::CxtProc</a></div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00307">CxtStmt.h:307</a></div></div>
|
|
171
171
|
<div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a22ef185e767ff76c098e75126c885400"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a22ef185e767ff76c098e75126c885400">SVF::SVFUtil::isExtCall</a></div><div class="ttdeci">bool isExtCall(const SVFFunction *fun)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00358">SVFUtil.h:358</a></div></div>
|
|
172
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ab99ef73905f35d4c20ca408586fc8680"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680">SVF::LockAnalysis::handleCallRelation</a></div><div class="ttdeci">void handleCallRelation(CxtLockProc &clp, const PTACallGraphEdge *cgEdge, CallSite call)</div><div class="ttdoc">Handle call relations. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
172
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ab99ef73905f35d4c20ca408586fc8680"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680">SVF::LockAnalysis::handleCallRelation</a></div><div class="ttdeci">void handleCallRelation(CxtLockProc &clp, const PTACallGraphEdge *cgEdge, CallSite call)</div><div class="ttdoc">Handle call relations. </div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00307">LockAnalysis.cpp:307</a></div></div>
|
|
173
173
|
<div class="ttc" id="classSVF_1_1ThreadAPI_html_a38adae633d5aceddcca3b3a23ad66db9"><div class="ttname"><a href="classSVF_1_1ThreadAPI.html#a38adae633d5aceddcca3b3a23ad66db9">SVF::ThreadAPI::isTDRelease</a></div><div class="ttdeci">bool isTDRelease(const Instruction *inst) const</div><div class="ttdoc">Return true if this call release a lock. </div><div class="ttdef"><b>Definition:</b> <a href="ThreadAPI_8h_source.html#l00296">ThreadAPI.h:296</a></div></div>
|
|
174
174
|
<div class="ttc" id="classSVF_1_1LockAnalysis_html_ae682eb30763f0f52184eb36c95fc3811"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">SVF::LockAnalysis::InstSet</a></div><div class="ttdeci">Set< const Instruction * > InstSet</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8h_source.html#l00040">LockAnalysis.h:40</a></div></div>
|
|
175
|
-
<div class="ttc" id="classSVF_1_1LockAnalysis_html_af30d0dad3d17188de8c2cea9b004f3d3"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3">SVF::LockAnalysis::isInSameSpan</a></div><div class="ttdeci">bool isInSameSpan(const Instruction *I1, const Instruction *I2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#
|
|
175
|
+
<div class="ttc" id="classSVF_1_1LockAnalysis_html_af30d0dad3d17188de8c2cea9b004f3d3"><div class="ttname"><a href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3">SVF::LockAnalysis::isInSameSpan</a></div><div class="ttdeci">bool isInSameSpan(const Instruction *I1, const Instruction *I2)</div><div class="ttdef"><b>Definition:</b> <a href="LockAnalysis_8cpp_source.html#l00645">LockAnalysis.cpp:645</a></div></div>
|
|
176
176
|
<div class="ttc" id="classSVF_1_1PTAStat_html_a3c4eaa1695ea13405911ae1621f98edc"><div class="ttname"><a href="classSVF_1_1PTAStat.html#a3c4eaa1695ea13405911ae1621f98edc">SVF::PTAStat::getClk</a></div><div class="ttdeci">static double getClk(bool mark=false)</div><div class="ttdef"><b>Definition:</b> <a href="PTAStat_8cpp_source.html#l00114">PTAStat.cpp:114</a></div></div>
|
|
177
|
+
<div class="ttc" id="namespaceSVF_1_1LLVMUtil_html_aa0e78f2e1c9c04aee478a7ecbf354800"><div class="ttname"><a href="namespaceSVF_1_1LLVMUtil.html#aa0e78f2e1c9c04aee478a7ecbf354800">SVF::LLVMUtil::getFunExitBB</a></div><div class="ttdeci">const BasicBlock * getFunExitBB(const Function *fun)</div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00167">LLVMUtil.h:167</a></div></div>
|
|
177
178
|
</div><!-- fragment --></div><!-- contents -->
|
|
178
179
|
<!-- start footer part -->
|
|
179
180
|
<hr class="footer"/><address class="footer"><small>
|