svf-tools 1.0.342 → 1.0.346

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.
Files changed (420) hide show
  1. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +2 -2
  2. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +8 -8
  3. package/SVF-doxygen/html/html/CallGraphBuilder_8cpp_source.html +9 -9
  4. package/SVF-doxygen/html/html/ConsG_8h_source.html +2 -2
  5. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +6 -6
  6. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +7 -7
  7. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +5 -5
  8. package/SVF-doxygen/html/html/DDAClient_8h_source.html +3 -3
  9. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +7 -7
  10. package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +3 -3
  11. package/SVF-doxygen/html/html/FSMPTA_8h_source.html +3 -3
  12. package/SVF-doxygen/html/html/FileChecker_8cpp_source.html +3 -3
  13. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +3 -3
  14. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +7 -7
  15. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +8 -8
  16. package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +2 -2
  17. package/SVF-doxygen/html/html/Graph2Json_8cpp_source.html +6 -6
  18. package/SVF-doxygen/html/html/ICFGBuilder_8cpp_source.html +11 -11
  19. package/SVF-doxygen/html/html/ICFGBuilder_8h_source.html +15 -15
  20. package/SVF-doxygen/html/html/ICFGNode_8h.html +7 -7
  21. package/SVF-doxygen/html/html/ICFGNode_8h_source.html +69 -69
  22. package/SVF-doxygen/html/html/ICFGStat_8h_source.html +1 -1
  23. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +45 -44
  24. package/SVF-doxygen/html/html/ICFG_8h_source.html +34 -34
  25. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +9 -9
  26. package/SVF-doxygen/html/html/LeakChecker_8h_source.html +6 -6
  27. package/SVF-doxygen/html/html/LockAnalysis_8cpp_source.html +2 -2
  28. package/SVF-doxygen/html/html/LockResultValidator_8h_source.html +5 -5
  29. package/SVF-doxygen/html/html/MHP_8cpp_source.html +9 -9
  30. package/SVF-doxygen/html/html/MHP_8h_source.html +6 -6
  31. package/SVF-doxygen/html/html/MSSAMuChi_8h_source.html +9 -9
  32. package/SVF-doxygen/html/html/MTAResultValidator_8cpp_source.html +2 -2
  33. package/SVF-doxygen/html/html/MTAStat_8cpp_source.html +5 -5
  34. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +26 -26
  35. package/SVF-doxygen/html/html/MemRegion_8h_source.html +18 -18
  36. package/SVF-doxygen/html/html/MemSSA_8cpp_source.html +9 -9
  37. package/SVF-doxygen/html/html/MemSSA_8h_source.html +12 -12
  38. package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +41 -41
  39. package/SVF-doxygen/html/html/NodeIDAllocator_8h_source.html +47 -46
  40. package/SVF-doxygen/html/html/Options_8cpp_source.html +1 -1
  41. package/SVF-doxygen/html/html/PCG_8cpp_source.html +2 -2
  42. package/SVF-doxygen/html/html/PCG_8h_source.html +4 -4
  43. package/SVF-doxygen/html/html/PTACallGraph_8cpp_source.html +10 -10
  44. package/SVF-doxygen/html/html/PTACallGraph_8h_source.html +17 -17
  45. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +6 -6
  46. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +2 -2
  47. package/SVF-doxygen/html/html/PointerAnalysis_8cpp_source.html +16 -16
  48. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +17 -17
  49. package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +4 -4
  50. package/SVF-doxygen/html/html/ProgSlice_8h_source.html +4 -4
  51. package/SVF-doxygen/html/html/SVFGBuilder_8h_source.html +3 -3
  52. package/SVF-doxygen/html/html/SVFGNode_8h_source.html +17 -17
  53. package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +2 -2
  54. package/SVF-doxygen/html/html/SVFGOPT_8h_source.html +9 -9
  55. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +31 -31
  56. package/SVF-doxygen/html/html/SVFG_8h_source.html +27 -27
  57. package/SVF-doxygen/html/html/SVFIRBuilder_8cpp_source.html +3 -3
  58. package/SVF-doxygen/html/html/SVFIRBuilder_8h_source.html +13 -13
  59. package/SVF-doxygen/html/html/SVFIR_8cpp_source.html +9 -9
  60. package/SVF-doxygen/html/html/SVFIR_8h_source.html +31 -31
  61. package/SVF-doxygen/html/html/SVFStatements_8h_source.html +14 -14
  62. package/SVF-doxygen/html/html/SaberCheckerAPI_8h_source.html +7 -7
  63. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +2 -2
  64. package/SVF-doxygen/html/html/SaberSVFGBuilder_8h_source.html +4 -4
  65. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +2 -2
  66. package/SVF-doxygen/html/html/SrcSnkDDA_8h_source.html +2 -2
  67. package/SVF-doxygen/html/html/SymbolTableBuilder_8cpp_source.html +2 -2
  68. package/SVF-doxygen/html/html/TCT_8h_source.html +3 -3
  69. package/SVF-doxygen/html/html/ThreadCallGraph_8cpp_source.html +15 -15
  70. package/SVF-doxygen/html/html/ThreadCallGraph_8h_source.html +20 -20
  71. package/SVF-doxygen/html/html/TypeAnalysis_8cpp_source.html +4 -4
  72. package/SVF-doxygen/html/html/TypeAnalysis_8h_source.html +2 -2
  73. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +3 -3
  74. package/SVF-doxygen/html/html/VFGNode_8h_source.html +11 -11
  75. package/SVF-doxygen/html/html/VFG_8cpp_source.html +19 -19
  76. package/SVF-doxygen/html/html/VFG_8h_source.html +19 -19
  77. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +6 -6
  78. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +4 -4
  79. package/SVF-doxygen/html/html/annotated.html +17 -17
  80. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode-members.html +3 -3
  81. package/SVF-doxygen/html/html/classSVF_1_1ActualINSVFGNode.html +23 -23
  82. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode-members.html +3 -3
  83. package/SVF-doxygen/html/html/classSVF_1_1ActualOUTSVFGNode.html +23 -23
  84. package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode-members.html +3 -3
  85. package/SVF-doxygen/html/html/classSVF_1_1ActualParmVFGNode.html +22 -22
  86. package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode-members.html +3 -3
  87. package/SVF-doxygen/html/html/classSVF_1_1ActualRetVFGNode.html +24 -24
  88. package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient-members.html +1 -1
  89. package/SVF-doxygen/html/html/classSVF_1_1AliasDDAClient.html +7 -7
  90. package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +12 -12
  91. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +51 -51
  92. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase-members.html +12 -12
  93. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +32 -32
  94. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +12 -12
  95. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +32 -32
  96. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +12 -12
  97. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +32 -32
  98. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +12 -12
  99. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +32 -32
  100. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +12 -12
  101. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +34 -34
  102. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +12 -12
  103. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +32 -32
  104. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +12 -12
  105. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +32 -32
  106. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl-members.html +12 -12
  107. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +38 -38
  108. package/SVF-doxygen/html/html/classSVF_1_1CallCHI-members.html +3 -3
  109. package/SVF-doxygen/html/html/classSVF_1_1CallCHI.html +22 -22
  110. package/SVF-doxygen/html/html/classSVF_1_1CallGraphBuilder.html +4 -4
  111. package/SVF-doxygen/html/html/classSVF_1_1CallICFGNode-members.html +158 -0
  112. package/SVF-doxygen/html/html/classSVF_1_1CallICFGNode.html +852 -0
  113. package/SVF-doxygen/html/html/classSVF_1_1CallICFGNode.png +0 -0
  114. package/SVF-doxygen/html/html/classSVF_1_1CallMU-members.html +3 -3
  115. package/SVF-doxygen/html/html/classSVF_1_1CallMU.html +22 -22
  116. package/SVF-doxygen/html/html/classSVF_1_1CallPE-members.html +4 -4
  117. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +27 -27
  118. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl-members.html +12 -12
  119. package/SVF-doxygen/html/html/classSVF_1_1CondPTAImpl.html +31 -31
  120. package/SVF-doxygen/html/html/classSVF_1_1ConstraintGraph.html +2 -2
  121. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA-members.html +14 -14
  122. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +60 -60
  123. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver-members.html +1 -1
  124. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +16 -16
  125. package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG-members.html +21 -21
  126. package/SVF-doxygen/html/html/classSVF_1_1DistinctMRG.html +51 -51
  127. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker-members.html +5 -5
  128. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +16 -16
  129. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +12 -12
  130. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +33 -33
  131. package/SVF-doxygen/html/html/classSVF_1_1FileChecker-members.html +5 -5
  132. package/SVF-doxygen/html/html/classSVF_1_1FileChecker.html +20 -20
  133. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA-members.html +11 -11
  134. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +52 -52
  135. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +12 -12
  136. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +45 -45
  137. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +12 -12
  138. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +33 -33
  139. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis-members.html +1 -1
  140. package/SVF-doxygen/html/html/classSVF_1_1ForkJoinAnalysis.html +21 -21
  141. package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode-members.html +3 -3
  142. package/SVF-doxygen/html/html/classSVF_1_1FormalINSVFGNode.html +19 -19
  143. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode-members.html +3 -3
  144. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +18 -18
  145. package/SVF-doxygen/html/html/classSVF_1_1FunEntryICFGNode-members.html +150 -0
  146. package/SVF-doxygen/html/html/classSVF_1_1FunEntryICFGNode.html +618 -0
  147. package/SVF-doxygen/html/html/classSVF_1_1FunEntryICFGNode.png +0 -0
  148. package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode-members.html +149 -0
  149. package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.html +624 -0
  150. package/SVF-doxygen/html/html/classSVF_1_1FunExitICFGNode.png +0 -0
  151. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient-members.html +1 -1
  152. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +12 -12
  153. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +3 -3
  154. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
  155. package/SVF-doxygen/html/html/classSVF_1_1GlobalICFGNode-members.html +144 -0
  156. package/SVF-doxygen/html/html/classSVF_1_1GlobalICFGNode.html +413 -0
  157. package/SVF-doxygen/html/html/classSVF_1_1GlobalICFGNode.png +0 -0
  158. package/SVF-doxygen/html/html/classSVF_1_1HareParForEdge-members.html +3 -3
  159. package/SVF-doxygen/html/html/classSVF_1_1HareParForEdge.html +11 -11
  160. package/SVF-doxygen/html/html/classSVF_1_1ICFG-members.html +22 -22
  161. package/SVF-doxygen/html/html/classSVF_1_1ICFG.html +191 -184
  162. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder-members.html +4 -4
  163. package/SVF-doxygen/html/html/classSVF_1_1ICFGBuilder.html +69 -66
  164. package/SVF-doxygen/html/html/classSVF_1_1ICFGNode.html +9 -9
  165. package/SVF-doxygen/html/html/classSVF_1_1ICFGNode.png +0 -0
  166. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter-members.html +11 -11
  167. package/SVF-doxygen/html/html/classSVF_1_1ICFGPrinter.html +30 -30
  168. package/SVF-doxygen/html/html/classSVF_1_1ICFGStat.html +3 -3
  169. package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG-members.html +21 -21
  170. package/SVF-doxygen/html/html/classSVF_1_1InterDisjointMRG.html +51 -51
  171. package/SVF-doxygen/html/html/classSVF_1_1InterICFGNode-members.html +144 -0
  172. package/SVF-doxygen/html/html/classSVF_1_1InterICFGNode.html +399 -0
  173. package/SVF-doxygen/html/html/classSVF_1_1InterICFGNode.png +0 -0
  174. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode-members.html +2 -2
  175. package/SVF-doxygen/html/html/classSVF_1_1InterMSSAPHISVFGNode.html +23 -23
  176. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode-members.html +2 -2
  177. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +20 -20
  178. package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG-members.html +21 -21
  179. package/SVF-doxygen/html/html/classSVF_1_1IntraDisjointMRG.html +51 -51
  180. package/SVF-doxygen/html/html/classSVF_1_1IntraICFGNode-members.html +146 -0
  181. package/SVF-doxygen/html/html/classSVF_1_1IntraICFGNode.html +494 -0
  182. package/SVF-doxygen/html/html/classSVF_1_1IntraICFGNode.png +0 -0
  183. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker-members.html +5 -5
  184. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +61 -61
  185. package/SVF-doxygen/html/html/classSVF_1_1LockAnalysis.html +14 -14
  186. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator-members.html +1 -1
  187. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +10 -10
  188. package/SVF-doxygen/html/html/classSVF_1_1MHP-members.html +1 -1
  189. package/SVF-doxygen/html/html/classSVF_1_1MHP.html +22 -22
  190. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator-members.html +24 -24
  191. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +196 -196
  192. package/SVF-doxygen/html/html/classSVF_1_1MTAResultValidator.html +8 -8
  193. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +6 -6
  194. package/SVF-doxygen/html/html/classSVF_1_1MTAStat.html +5 -5
  195. package/SVF-doxygen/html/html/classSVF_1_1MemSSA-members.html +10 -10
  196. package/SVF-doxygen/html/html/classSVF_1_1MemSSA.html +77 -77
  197. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator-members.html +5 -4
  198. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator.html +43 -39
  199. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +90 -90
  200. package/SVF-doxygen/html/html/classSVF_1_1OfflineConsG.html +1 -1
  201. package/SVF-doxygen/html/html/classSVF_1_1PAGBuilderFromFile.html +2 -2
  202. package/SVF-doxygen/html/html/classSVF_1_1PCG-members.html +1 -1
  203. package/SVF-doxygen/html/html/classSVF_1_1PCG.html +13 -13
  204. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph-members.html +15 -15
  205. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraph.html +118 -118
  206. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge-members.html +3 -3
  207. package/SVF-doxygen/html/html/classSVF_1_1PTACallGraphEdge.html +32 -32
  208. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis-members.html +12 -12
  209. package/SVF-doxygen/html/html/classSVF_1_1PointerAnalysis.html +107 -107
  210. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice-members.html +2 -2
  211. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +18 -18
  212. package/SVF-doxygen/html/html/classSVF_1_1RetICFGNode-members.html +153 -0
  213. package/SVF-doxygen/html/html/classSVF_1_1RetICFGNode.html +696 -0
  214. package/SVF-doxygen/html/html/classSVF_1_1RetICFGNode.png +0 -0
  215. package/SVF-doxygen/html/html/classSVF_1_1RetPE-members.html +4 -4
  216. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +26 -26
  217. package/SVF-doxygen/html/html/classSVF_1_1SVFG-members.html +24 -24
  218. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +159 -159
  219. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +4 -4
  220. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT-members.html +24 -24
  221. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +76 -76
  222. package/SVF-doxygen/html/html/classSVF_1_1SVFIR-members.html +19 -19
  223. package/SVF-doxygen/html/html/classSVF_1_1SVFIR.html +132 -132
  224. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder-members.html +4 -4
  225. package/SVF-doxygen/html/html/classSVF_1_1SVFIRBuilder.html +58 -58
  226. package/SVF-doxygen/html/html/classSVF_1_1SaberCheckerAPI-members.html +4 -4
  227. package/SVF-doxygen/html/html/classSVF_1_1SaberCheckerAPI.html +20 -20
  228. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder-members.html +1 -1
  229. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +13 -13
  230. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA-members.html +1 -1
  231. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +7 -7
  232. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard-members.html +12 -12
  233. package/SVF-doxygen/html/html/classSVF_1_1Steensgaard.html +32 -32
  234. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt-members.html +1 -1
  235. package/SVF-doxygen/html/html/classSVF_1_1StoreStmt.html +7 -7
  236. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableBuilder.html +4 -4
  237. package/SVF-doxygen/html/html/classSVF_1_1TCT-members.html +1 -1
  238. package/SVF-doxygen/html/html/classSVF_1_1TCT.html +22 -22
  239. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE-members.html +4 -4
  240. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +15 -15
  241. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE-members.html +4 -4
  242. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +15 -15
  243. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph-members.html +40 -40
  244. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraph.html +220 -220
  245. package/SVF-doxygen/html/html/classSVF_1_1ThreadCallGraphBuilder.html +10 -10
  246. package/SVF-doxygen/html/html/classSVF_1_1ThreadForkEdge-members.html +3 -3
  247. package/SVF-doxygen/html/html/classSVF_1_1ThreadForkEdge.html +11 -11
  248. package/SVF-doxygen/html/html/classSVF_1_1ThreadJoinEdge-members.html +3 -3
  249. package/SVF-doxygen/html/html/classSVF_1_1ThreadJoinEdge.html +11 -11
  250. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis-members.html +12 -12
  251. package/SVF-doxygen/html/html/classSVF_1_1TypeAnalysis.html +41 -41
  252. package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +3 -3
  253. package/SVF-doxygen/html/html/classSVF_1_1VFG-members.html +9 -9
  254. package/SVF-doxygen/html/html/classSVF_1_1VFG.html +96 -96
  255. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +12 -12
  256. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +39 -39
  257. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +12 -12
  258. package/SVF-doxygen/html/html/classes.html +16 -16
  259. package/SVF-doxygen/html/html/functions_a.html +59 -59
  260. package/SVF-doxygen/html/html/functions_c.html +65 -67
  261. package/SVF-doxygen/html/html/functions_eval_r.html +3 -0
  262. package/SVF-doxygen/html/html/functions_f.html +14 -14
  263. package/SVF-doxygen/html/html/functions_func.html +56 -56
  264. package/SVF-doxygen/html/html/functions_func_c.html +28 -28
  265. package/SVF-doxygen/html/html/functions_func_f.html +6 -6
  266. package/SVF-doxygen/html/html/functions_func_g.html +86 -86
  267. package/SVF-doxygen/html/html/functions_func_h.html +17 -17
  268. package/SVF-doxygen/html/html/functions_func_i.html +12 -12
  269. package/SVF-doxygen/html/html/functions_func_m.html +1 -1
  270. package/SVF-doxygen/html/html/functions_func_p.html +1 -1
  271. package/SVF-doxygen/html/html/functions_func_r.html +6 -6
  272. package/SVF-doxygen/html/html/functions_func_s.html +2 -2
  273. package/SVF-doxygen/html/html/functions_func_t.html +7 -7
  274. package/SVF-doxygen/html/html/functions_func_u.html +3 -3
  275. package/SVF-doxygen/html/html/functions_g.html +88 -88
  276. package/SVF-doxygen/html/html/functions_h.html +16 -16
  277. package/SVF-doxygen/html/html/functions_i.html +22 -22
  278. package/SVF-doxygen/html/html/functions_l.html +3 -3
  279. package/SVF-doxygen/html/html/functions_m.html +2 -2
  280. package/SVF-doxygen/html/html/functions_o.html +13 -13
  281. package/SVF-doxygen/html/html/functions_p.html +14 -14
  282. package/SVF-doxygen/html/html/functions_r.html +13 -12
  283. package/SVF-doxygen/html/html/functions_s.html +13 -13
  284. package/SVF-doxygen/html/html/functions_t.html +12 -14
  285. package/SVF-doxygen/html/html/functions_type.html +1 -1
  286. package/SVF-doxygen/html/html/functions_type_c.html +24 -24
  287. package/SVF-doxygen/html/html/functions_type_f.html +3 -3
  288. package/SVF-doxygen/html/html/functions_type_i.html +2 -2
  289. package/SVF-doxygen/html/html/functions_type_p.html +1 -1
  290. package/SVF-doxygen/html/html/functions_type_s.html +1 -1
  291. package/SVF-doxygen/html/html/functions_type_v.html +2 -2
  292. package/SVF-doxygen/html/html/functions_u.html +3 -3
  293. package/SVF-doxygen/html/html/functions_v.html +8 -8
  294. package/SVF-doxygen/html/html/functions_vars_a.html +2 -2
  295. package/SVF-doxygen/html/html/functions_vars_c.html +11 -11
  296. package/SVF-doxygen/html/html/functions_vars_f.html +5 -5
  297. package/SVF-doxygen/html/html/functions_vars_g.html +1 -1
  298. package/SVF-doxygen/html/html/functions_vars_i.html +3 -3
  299. package/SVF-doxygen/html/html/functions_vars_r.html +1 -1
  300. package/SVF-doxygen/html/html/functions_w.html +9 -5
  301. package/SVF-doxygen/html/html/hierarchy.html +7 -7
  302. package/SVF-doxygen/html/html/namespaceSVF.html +11 -11
  303. package/SVF-doxygen/html/html/search/all_1.js +58 -58
  304. package/SVF-doxygen/html/html/search/all_10.js +8 -8
  305. package/SVF-doxygen/html/html/search/all_12.js +8 -7
  306. package/SVF-doxygen/html/html/search/all_13.js +11 -11
  307. package/SVF-doxygen/html/html/search/all_14.js +8 -8
  308. package/SVF-doxygen/html/html/search/all_15.js +1 -1
  309. package/SVF-doxygen/html/html/search/all_16.js +4 -4
  310. package/SVF-doxygen/html/html/search/all_17.js +1 -1
  311. package/SVF-doxygen/html/html/search/all_3.js +35 -34
  312. package/SVF-doxygen/html/html/search/all_6.js +12 -12
  313. package/SVF-doxygen/html/html/search/all_7.js +62 -61
  314. package/SVF-doxygen/html/html/search/all_8.js +17 -17
  315. package/SVF-doxygen/html/html/search/all_9.js +16 -16
  316. package/SVF-doxygen/html/html/search/all_c.js +2 -2
  317. package/SVF-doxygen/html/html/search/all_d.js +5 -5
  318. package/SVF-doxygen/html/html/search/all_e.js +3 -3
  319. package/SVF-doxygen/html/html/search/all_f.js +3 -3
  320. package/SVF-doxygen/html/html/search/classes_2.js +1 -1
  321. package/SVF-doxygen/html/html/search/classes_5.js +2 -2
  322. package/SVF-doxygen/html/html/search/classes_6.js +1 -1
  323. package/SVF-doxygen/html/html/search/classes_8.js +2 -2
  324. package/SVF-doxygen/html/html/search/classes_e.js +1 -1
  325. package/SVF-doxygen/html/html/search/enumvalues_e.js +2 -1
  326. package/SVF-doxygen/html/html/search/functions_0.js +55 -55
  327. package/SVF-doxygen/html/html/search/functions_10.js +3 -3
  328. package/SVF-doxygen/html/html/search/functions_11.js +4 -4
  329. package/SVF-doxygen/html/html/search/functions_12.js +1 -1
  330. package/SVF-doxygen/html/html/search/functions_2.js +10 -10
  331. package/SVF-doxygen/html/html/search/functions_5.js +4 -4
  332. package/SVF-doxygen/html/html/search/functions_6.js +61 -61
  333. package/SVF-doxygen/html/html/search/functions_7.js +17 -17
  334. package/SVF-doxygen/html/html/search/functions_8.js +12 -12
  335. package/SVF-doxygen/html/html/search/functions_b.js +1 -1
  336. package/SVF-doxygen/html/html/search/functions_e.js +1 -1
  337. package/SVF-doxygen/html/html/search/functions_f.js +4 -4
  338. package/SVF-doxygen/html/html/search/typedefs_0.js +1 -1
  339. package/SVF-doxygen/html/html/search/typedefs_11.js +1 -1
  340. package/SVF-doxygen/html/html/search/typedefs_14.js +1 -1
  341. package/SVF-doxygen/html/html/search/typedefs_2.js +21 -21
  342. package/SVF-doxygen/html/html/search/typedefs_5.js +3 -3
  343. package/SVF-doxygen/html/html/search/typedefs_8.js +2 -2
  344. package/SVF-doxygen/html/html/search/typedefs_f.js +1 -1
  345. package/SVF-doxygen/html/html/search/variables_1.js +2 -2
  346. package/SVF-doxygen/html/html/search/variables_12.js +1 -1
  347. package/SVF-doxygen/html/html/search/variables_14.js +1 -1
  348. package/SVF-doxygen/html/html/search/variables_3.js +4 -4
  349. package/SVF-doxygen/html/html/search/variables_6.js +5 -5
  350. package/SVF-doxygen/html/html/search/variables_7.js +1 -1
  351. package/SVF-doxygen/html/html/search/variables_9.js +1 -1
  352. package/SVF-doxygen/html/html/search/variables_d.js +1 -1
  353. package/SVF-doxygen/html/html/search/variables_e.js +2 -2
  354. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +22 -22
  355. package/include/DDA/ContextDDA.h +3 -3
  356. package/include/DDA/DDAClient.h +2 -2
  357. package/include/DDA/DDAVFSolver.h +2 -2
  358. package/include/DDA/FlowDDA.h +2 -2
  359. package/include/Graphs/ICFG.h +33 -33
  360. package/include/Graphs/ICFGNode.h +33 -33
  361. package/include/Graphs/ICFGStat.h +11 -11
  362. package/include/Graphs/PTACallGraph.h +19 -19
  363. package/include/Graphs/SVFG.h +16 -16
  364. package/include/Graphs/SVFGNode.h +14 -14
  365. package/include/Graphs/SVFGOPT.h +1 -1
  366. package/include/Graphs/ThreadCallGraph.h +25 -25
  367. package/include/Graphs/VFG.h +10 -10
  368. package/include/Graphs/VFGNode.h +8 -8
  369. package/include/MSSA/MSSAMuChi.h +6 -6
  370. package/include/MSSA/MemRegion.h +24 -24
  371. package/include/MSSA/MemSSA.h +10 -10
  372. package/include/MTA/LockResultValidator.h +2 -2
  373. package/include/MTA/MHP.h +4 -4
  374. package/include/MTA/PCG.h +1 -1
  375. package/include/MTA/TCT.h +2 -2
  376. package/include/MemoryModel/PointerAnalysis.h +12 -12
  377. package/include/MemoryModel/SVFIR.h +21 -21
  378. package/include/MemoryModel/SVFStatements.h +11 -11
  379. package/include/SABER/LeakChecker.h +4 -4
  380. package/include/SABER/ProgSlice.h +2 -2
  381. package/include/SABER/SaberCheckerAPI.h +4 -4
  382. package/include/SABER/SaberSVFGBuilder.h +1 -1
  383. package/include/SABER/SrcSnkDDA.h +1 -1
  384. package/include/SVF-FE/ICFGBuilder.h +4 -4
  385. package/include/SVF-FE/SVFIRBuilder.h +5 -5
  386. package/include/Util/NodeIDAllocator.h +3 -0
  387. package/lib/DDA/ContextDDA.cpp +3 -3
  388. package/lib/DDA/DDAClient.cpp +1 -1
  389. package/lib/DDA/FlowDDA.cpp +1 -1
  390. package/lib/Graphs/ICFG.cpp +55 -50
  391. package/lib/Graphs/PTACallGraph.cpp +5 -5
  392. package/lib/Graphs/SVFG.cpp +7 -7
  393. package/lib/Graphs/ThreadCallGraph.cpp +6 -6
  394. package/lib/Graphs/VFG.cpp +6 -6
  395. package/lib/MSSA/MemRegion.cpp +17 -17
  396. package/lib/MSSA/MemSSA.cpp +3 -3
  397. package/lib/MTA/LockAnalysis.cpp +4 -4
  398. package/lib/MTA/MHP.cpp +5 -5
  399. package/lib/MTA/MTAResultValidator.cpp +1 -1
  400. package/lib/MTA/PCG.cpp +1 -1
  401. package/lib/MemoryModel/PointerAnalysis.cpp +10 -10
  402. package/lib/MemoryModel/PointerAnalysisImpl.cpp +1 -1
  403. package/lib/MemoryModel/SVFIR.cpp +5 -5
  404. package/lib/SABER/DoubleFreeChecker.cpp +1 -1
  405. package/lib/SABER/FileChecker.cpp +2 -2
  406. package/lib/SABER/LeakChecker.cpp +8 -8
  407. package/lib/SABER/ProgSlice.cpp +2 -2
  408. package/lib/SVF-FE/CallGraphBuilder.cpp +4 -4
  409. package/lib/SVF-FE/Graph2Json.cpp +5 -5
  410. package/lib/SVF-FE/ICFGBuilder.cpp +31 -25
  411. package/lib/SVF-FE/SVFIRBuilder.cpp +8 -8
  412. package/lib/Util/NodeIDAllocator.cpp +12 -0
  413. package/lib/Util/Options.cpp +2 -1
  414. package/lib/Util/TypeBasedHeapCloning.cpp +1 -1
  415. package/lib/WPA/Andersen.cpp +3 -3
  416. package/lib/WPA/FlowSensitive.cpp +2 -2
  417. package/lib/WPA/TypeAnalysis.cpp +1 -1
  418. package/lib/WPA/VersionedFlowSensitive.cpp +4 -4
  419. package/lib/WPA/WPAPass.cpp +4 -4
  420. package/package.json +1 -1
@@ -66,7 +66,7 @@ $(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>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * LocksetAnalysis.cpp</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * Created on: 26 Aug 2015</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * Author: pengd</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LockAnalysis_8h.html">MTA/LockAnalysis.h</a>&quot;</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="MTA_8h.html">MTA/MTA.h</a>&quot;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="MTAResultValidator_8h.html">MTA/MTAResultValidator.h</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PTAStat_8h.html">MemoryModel/PTAStat.h</a>&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LockResultValidator_8h.html">MTA/LockResultValidator.h</a>&quot;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<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>&#160;<span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<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>&#160;{</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<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>&#160;<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>&#160;{</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<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>&#160; <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>&#160; {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; }</div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690"> 31</a></span>&#160; <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>&#160; {</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keywordflow">return</span> lsa-&gt;isProtectedByCommonLock(I1, I2);</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; }</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<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>&#160; <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>&#160;};</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;} <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621"> 41</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; collectLockUnlocksites();</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; buildCandidateFuncSetforLock();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <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>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tIntra-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tIntra-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; analyzeIntraProcedualLock();</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tCollect context-sensitive locks\n&quot;</span>);</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tCollect context-sensitive locks\n&quot;</span>);</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; collectCxtLock();</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tInter-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tInter-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; analyzeLockSpanCxtStmt();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <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>&#160; <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>&#160; <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>&#160; validateResults();</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;}</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d"> 71</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct-&gt;getThreadCallGraph();</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFModule.html#a709371b13dcf500277f8bc275bdb23c7">SVFModule::iterator</a> F = tct-&gt;getSVFModule()-&gt;begin(), E = tct-&gt;getSVFModule()-&gt;end(); F != E; ++F)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a255af6ff30782cb9a548feadb0fe7d6b">inst_iterator</a> II = inst_begin((*F)-&gt;getLLVMFun()), EE = inst_end((*F)-&gt;getLLVMFun()); II != EE; ++II)</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; {</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = &amp;*II;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">if</span> (tcg-&gt;<a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-&gt;<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>&#160; {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; unlocksites.insert(inst);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; }</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">if</span> (tcg-&gt;<a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-&gt;<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>&#160; {</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; locksites.insert(inst);</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; }</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; }</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; }</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;}</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e"> 94</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct-&gt;getThreadCallGraph();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <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>&#160; <a class="code" href="classSVF_1_1FIFOWorkList.html">FIFOWorkList&lt;const PTACallGraphNode*&gt;</a> worklist;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <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>&#160; {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun=(*it)-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-&gt;<a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct-&gt;getSVFFun(fun));</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; 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>&#160; visited.insert(cgnode);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; }</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; }</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <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>&#160; {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = (*it)-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-&gt;<a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct-&gt;getSVFFun(fun));</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; 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>&#160; visited.insert(cgnode);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; }</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <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>&#160; {</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <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>&#160; lockcandidateFuncSet.insert(node-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(), neit = node-&gt;<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>&#160; {</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* srcNode = (*nit)-&gt;getSrcNode();</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span> (visited.find(srcNode) == visited.end())</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; visited.insert(srcNode);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; 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>&#160; }</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;}</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75"> 142</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Identify the protected Instructions.</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <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>&#160; {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <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>&lt;<a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>&gt;(*it);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(lockSite &amp;&amp; <span class="stringliteral">&quot;Lock acquire instruction must be CallInst&quot;</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="comment">// Perform forward traversal</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <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>&#160; <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>&#160; <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>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordtype">bool</span> forward = intraForwardTraverse(lockSite,unlockSet,forwardInsts);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordtype">bool</span> backward = intraBackwardTraverse(unlockSet,backwardInsts);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">if</span>(forward &amp;&amp; backward)</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; addIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(forward &amp;&amp; !backward)</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; addCondIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; }</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;}</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2"> 170</a></span>&#160;<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>&amp; unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; forwardInsts)</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;{</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = lockSite-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <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>&#160; worklist.push_back(lockSite);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; {</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <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>&#160; worklist.pop_back();</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">if</span>(&amp;(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a3cb226930eeaf558575e09e5b65e0223">getFunExitBB</a>(fun)-&gt;back()) == I)</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">if</span> (forwardInsts.find(I)!=forwardInsts.end())</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; forwardInsts.insert(I);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">if</span> (isTDRelease(I) &amp;&amp; isAliasedLocks(lockSite, I))</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; unlockSet.insert(I);</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci lock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(lockSite)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci unlock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; }</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; worklist.push_back(*nit);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; }</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;}</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53"> 213</a></span>&#160;<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>&amp; unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; backwardInsts)</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;{</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = unlockSite-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* entryInst = &amp;(fun-&gt;getEntryBlock().back());</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; worklist.push_back(*it);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <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>&#160; worklist.pop_back();</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">if</span>(entryInst == I)</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">if</span> (backwardInsts.find(I)!=backwardInsts.end())</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; backwardInsts.insert(I);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">if</span> (isTDAcquire(I) &amp;&amp; isAliasedLocks(unlockSite, I))</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci lock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci unlock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(unlockSite)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; }</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; worklist.push_back(*nit);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; }</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160;}</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;</div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ae03db88ef0ad0da2c31cf1623b32165f"> 257</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct-&gt;getEntryProcs();</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <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>&#160; {</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> cxt;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a> t(cxt, tct-&gt;getSVFFun(*it));</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; pushToCTPWorkList(t);</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; }</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160;</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">while</span> (!clpList.empty())</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <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>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgNode = getTCG()-&gt;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>&#160; <span class="comment">// lzh TODO.</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordflow">if</span> (!isLockCandidateFun(cgNode-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = cgNode-&gt;<a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), neit = cgNode-&gt;<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>&#160; {</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <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>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#a750e50a9022451e406c4819979edffa5">directCallsBegin</a>(), ecit = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#acc4fcacefdc9be9a214dfcc455fe7970">directCallsEnd</a>();</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; cit != ecit; ++cit)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <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>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nCollecting CxtLocks: handling direct call:&quot;</span> &lt;&lt; **cit &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span> &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getFunction()-&gt;getName()</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; &lt;&lt; <span class="stringliteral">&quot;--&gt;&quot;</span> &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getFunction()-&gt;getName() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*cit)-&gt;getCallSite()));</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; }</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator ind = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#afbdb582d20ab953b2de1f3efacb74679">indirectCallsBegin</a>(), eind = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#a494bc8bacca5ca8d266286f3fb303495">indirectCallsEnd</a>();</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; ind != eind; ++ind)</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; {</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <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>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nCollecting CxtLocks: handling indirect call:&quot;</span> &lt;&lt; **ind &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getFunction()-&gt;getName() &lt;&lt; <span class="stringliteral">&quot;--&gt;&quot;</span> &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getFunction()-&gt;getName()</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*ind)-&gt;getCallSite()));</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; }</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;}</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680"> 306</a></span>&#160;<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>&amp; 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>&#160;{</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">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>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <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>&#160; {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; 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>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getFunction();</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; 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>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <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>&#160; <span class="keywordflow">if</span> (pushToCTPWorkList(newclp))</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis Process CallRet old clp --&quot;</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>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis Process CallRet new clp --&quot;</span>; newclp.dump());</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;}</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160;</div><div class="line"><a name="l00329"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe"> 329</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct-&gt;getEntryProcs();</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <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>&#160; {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> cxt;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> cxtstmt(cxt, &amp;((*it)-&gt;front().front()));</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; pushToCTSWorkList(cxtstmt);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="keywordflow">while</span> (!cxtStmtList.empty())</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <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>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; touchCxtStmt(cts);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <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>&#160; instToCxtStmtSet[curInst].insert(cts);</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nVisit cxtStmt: &quot;</span>);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <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>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nIts cxt lock sets: &quot;</span>);</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <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>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">if</span> (isTDFork(curInst))</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; {</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; handleFork(cts);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; }</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <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>&#160; {</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(hasCxtLock(cts) &amp;&amp; <span class="stringliteral">&quot;context-sensitive lock not found!!&quot;</span>);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordflow">if</span>(addCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; }</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <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>&#160; {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span>(removeCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; }</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallInst&gt;(curInst) &amp;&amp; !<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>&#160; {</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; handleCall(cts);</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;ReturnInst&gt;(curInst))</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; handleRet(cts);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; {</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; }</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; }</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160;}</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160;</div><div class="line"><a name="l00392"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a"> 392</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160;{</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a> &amp; lockset = getCxtLockfromCxtStmt(cts);</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nlock sets size = &quot;</span> &lt;&lt; lockset.size() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <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>&#160; {</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; (*it).dump();</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; }</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160;}</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160;</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160;</div><div class="line"><a name="l00405"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b"> 405</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;{</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast&lt;CallInst&gt;(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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160; <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">if</span>(getTCG()-&gt;hasThreadForkEdge(cbn))</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="keywordflow">for</span> (ThreadCallGraph::ForkEdgeSet::const_iterator cgIt = getTCG()-&gt;getForkEdgeBegin(cbn),</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; ecgIt = getTCG()-&gt;getForkEdgeEnd(cbn); cgIt != ecgIt; ++cgIt)</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; {</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)-&gt;getDstNode()-&gt;getFunction();</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; pushCxt(newCxt,call,callee);</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &amp;(callee-&gt;getEntryBlock().front()));</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; }</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;}</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a97b186f9417144557bb17c41d515a9f4"> 427</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160;{</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast&lt;CallInst&gt;(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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160; <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">if</span> (getTCG()-&gt;hasCallGraphEdge(cbn))</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; {</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">for</span> (PTACallGraph::CallGraphEdgeSet::const_iterator cgIt = getTCG()-&gt;getCallEdgeBegin(cbn), ecgIt = getTCG()-&gt;getCallEdgeEnd(cbn);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; cgIt != ecgIt; ++cgIt)</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; {</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)-&gt;getDstNode()-&gt;getFunction();</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <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>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; pushCxt(newCxt, call, callee);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &amp;(callee-&gt;getEntryBlock().front()));</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; }</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;}</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6"> 451</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160;{</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = tct-&gt;getSVFFun(curInst-&gt;getParent()-&gt;getParent());</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* curFunNode = getTCG()-&gt;getCallGraphNode(svffun);</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; </div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> it = curFunNode-&gt;<a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin(), eit = curFunNode-&gt;<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>&#160; {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <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>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;ThreadForkEdge&gt;(edge) || SVFUtil::isa&lt;ThreadJoinEdge&gt;(edge))</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)-&gt;directCallsBegin(), ecit = (edge)-&gt;directCallsEnd(); cit != ecit;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; ++cit)</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; {</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)-&gt;getCallSite();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; {</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <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>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; }</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; }</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)-&gt;indirectCallsBegin(), ecit = (edge)-&gt;indirectCallsEnd();</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; cit != ecit; ++cit)</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)-&gt;getCallSite();</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <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>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; }</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; }</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160;}</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div><div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c"> 500</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;{</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <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>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; }</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160;}</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160;</div><div class="line"><a name="l00516"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17"> 516</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17">LockAnalysis::pushCxt</a>(<a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160;{</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct-&gt;getSVFFun(callee);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct-&gt;getSVFFun(caller);</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()-&gt;getCallSiteID(cbn, svfcallee);</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; </div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160;<span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;<span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160;<span class="comment">// return;</span></div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="keywordflow">if</span> (tct-&gt;inSameCallGraphSCC(getTCG()-&gt;getCallGraphNode(svfcaller), getTCG()-&gt;getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; {</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; tct-&gt;pushCxt(cxt,csId);</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct-&gt;dumpCxt(cxt));</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;}</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;</div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb"> 535</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb">LockAnalysis::matchCxt</a>(<a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160;{</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct-&gt;getSVFFun(callee);</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct-&gt;getSVFFun(caller);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()-&gt;getCallSiteID(cbn, svfcallee);</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;<span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;<span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;<span class="comment">// return true;</span></div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordflow">if</span> (cxt.empty())</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">if</span> (tct-&gt;inSameCallGraphSCC(getTCG()-&gt;getCallGraphNode(svfcaller), getTCG()-&gt;getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keywordflow">if</span> (cxt.back() == csId)</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; cxt.pop_back();</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct-&gt;dumpCxt(cxt));</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160;}</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160;</div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa"> 566</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; numOfTotalQueries++;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keywordtype">bool</span> commonlock = <span class="keyword">false</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <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>&#160; <span class="keywordflow">if</span> (isInsideIntraLock(i1) &amp;&amp; isInsideIntraLock(i2))</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; commonlock = isProtectedByCommonCILock(i1,i2) ;</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; commonlock = isProtectedByCommonCxtLock(i1,i2);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> commonlock;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160;}</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160;</div><div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48"> 583</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) &amp;&amp; !isInsideCondIntraLock(i2))</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; {</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <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>&#160; {</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <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>&#160; {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordflow">if</span> (isAliasedLocks(*cil1, *cil2))</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; }</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; }</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160;}</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3e2e629a588b44ed39e529babb59a4f9"> 605</a></span>&#160;<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>&amp; cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2)</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160;{</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keywordflow">if</span> (alias(lockset1,lockset2))</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;}</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;</div><div class="line"><a name="l00620"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287"> 620</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <span class="keywordflow">if</span>(!hasCxtStmtfromInst(i1) || !hasCxtStmtfromInst(i2))</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset1 = getCxtStmtfromInst(i1);</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset2 = getCxtStmtfromInst(i2);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <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>&#160; {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt1 = *cts1;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <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>&#160; {</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2 = *cts2;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; }</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; }</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160;}</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;</div><div class="line"><a name="l00644"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3"> 644</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <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>&#160;</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordtype">bool</span> sameSpan = <span class="keyword">false</span>;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keywordflow">if</span> (isInsideIntraLock(i1) &amp;&amp; isInsideIntraLock(i2))</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; sameSpan = isInSameCISpan(i1, i2);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; sameSpan = isInSameCSSpan(i1, i2);</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> sameSpan;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;}</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160;</div><div class="line"><a name="l00662"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae"> 662</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) &amp;&amp; !isInsideCondIntraLock(i2))</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; {</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <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>&#160; {</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <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>&#160; {</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; <span class="keywordflow">if</span> (*cil1==*cil2)</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; }</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; }</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160;}</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;</div><div class="line"><a name="l00683"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8595b976bf60d161561e5494257aa179"> 683</a></span>&#160;<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>&amp; cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2)<span class="keyword"> const</span></div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <span class="keywordflow">if</span> (intersects(lockset1,lockset2))</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160;</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160;}</div><div class="line"><a name="l00697"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd"> 697</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="keywordflow">if</span>(!hasCxtStmtfromInst(I1) || !hasCxtStmtfromInst(I2))</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset1 = getCxtStmtfromInst(I1);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset2 = getCxtStmtfromInst(I2);</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <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>&#160; {</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt1 = *cts1;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <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>&#160; {</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2 = *cts2;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; }</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; }</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160;}</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160;</div><div class="line"><a name="l00718"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a935128c9952714fcc98febed491ee85d"> 718</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="comment">// Initialize the validator and perform validation.</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <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>&#160; 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>&#160; </div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <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>&#160; validator.<a class="code" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7">init</a>(tct-&gt;getSVFModule());</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; 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>&#160;}</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>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment"> * LocksetAnalysis.cpp</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment"> * Created on: 26 Aug 2015</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment"> * Author: pengd</span></div><div class="line"><a name="l00006"></a><span class="lineno"> 6</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00007"></a><span class="lineno"> 7</span>&#160;</div><div class="line"><a name="l00008"></a><span class="lineno"> 8</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LockAnalysis_8h.html">MTA/LockAnalysis.h</a>&quot;</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="MTA_8h.html">MTA/MTA.h</a>&quot;</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="MTAResultValidator_8h.html">MTA/MTAResultValidator.h</a>&quot;</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="SVFUtil_8h.html">Util/SVFUtil.h</a>&quot;</span></div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PTAStat_8h.html">MemoryModel/PTAStat.h</a>&quot;</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LockResultValidator_8h.html">MTA/LockResultValidator.h</a>&quot;</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;</div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;</div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;<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>&#160;<span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;</div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;</div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<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>&#160;{</div><div class="line"><a name="l00023"></a><span class="lineno"> 23</span>&#160;</div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<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>&#160;<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>&#160;{</div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<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>&#160; <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>&#160; {</div><div class="line"><a name="l00030"></a><span class="lineno"> 30</span>&#160; }</div><div class="line"><a name="l00031"></a><span class="lineno"><a class="line" href="classSVF_1_1RaceValidator.html#ab95520388bafe1efae63196400350690"> 31</a></span>&#160; <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>&#160; {</div><div class="line"><a name="l00033"></a><span class="lineno"> 33</span>&#160; <span class="keywordflow">return</span> lsa-&gt;isProtectedByCommonLock(I1, I2);</div><div class="line"><a name="l00034"></a><span class="lineno"> 34</span>&#160; }</div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<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>&#160; <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>&#160;};</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;} <span class="comment">// End namespace SVF</span></div><div class="line"><a name="l00040"></a><span class="lineno"> 40</span>&#160;</div><div class="line"><a name="l00041"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ad1516b6cb1dbd06b8dff04ae3c944621"> 41</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160; collectLockUnlocksites();</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160; buildCandidateFuncSetforLock();</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160; <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>&#160;</div><div class="line"><a name="l00049"></a><span class="lineno"> 49</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tIntra-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tIntra-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160; analyzeIntraProcedualLock();</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tCollect context-sensitive locks\n&quot;</span>);</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tCollect context-sensitive locks\n&quot;</span>);</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160; collectCxtLock();</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tInter-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\tInter-procedural LockAnalysis\n&quot;</span>);</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160; analyzeLockSpanCxtStmt();</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00061"></a><span class="lineno"> 61</span>&#160; <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>&#160; <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>&#160; <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>&#160; validateResults();</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;}</div><div class="line"><a name="l00066"></a><span class="lineno"> 66</span>&#160;</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160;</div><div class="line"><a name="l00071"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#aa8683de99ad02fb75b175b0bb54e5f7d"> 71</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct-&gt;getThreadCallGraph();</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1SVFModule.html#a709371b13dcf500277f8bc275bdb23c7">SVFModule::iterator</a> F = tct-&gt;getSVFModule()-&gt;begin(), E = tct-&gt;getSVFModule()-&gt;end(); F != E; ++F)</div><div class="line"><a name="l00075"></a><span class="lineno"> 75</span>&#160; {</div><div class="line"><a name="l00076"></a><span class="lineno"> 76</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a255af6ff30782cb9a548feadb0fe7d6b">inst_iterator</a> II = inst_begin((*F)-&gt;getLLVMFun()), EE = inst_end((*F)-&gt;getLLVMFun()); II != EE; ++II)</div><div class="line"><a name="l00077"></a><span class="lineno"> 77</span>&#160; {</div><div class="line"><a name="l00078"></a><span class="lineno"> 78</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a> *inst = &amp;*II;</div><div class="line"><a name="l00079"></a><span class="lineno"> 79</span>&#160; <span class="keywordflow">if</span> (tcg-&gt;<a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-&gt;<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>&#160; {</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160; unlocksites.insert(inst);</div><div class="line"><a name="l00082"></a><span class="lineno"> 82</span>&#160; }</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">if</span> (tcg-&gt;<a class="code" href="classSVF_1_1ThreadCallGraph.html#adcad8524a53baf256cd45503ec568c10">getThreadAPI</a>()-&gt;<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>&#160; {</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160; locksites.insert(inst);</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; }</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; }</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; }</div><div class="line"><a name="l00089"></a><span class="lineno"> 89</span>&#160;}</div><div class="line"><a name="l00090"></a><span class="lineno"> 90</span>&#160;</div><div class="line"><a name="l00094"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a271506d5032033efae684b0d729f5b3e"> 94</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00096"></a><span class="lineno"> 96</span>&#160;</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; <a class="code" href="classSVF_1_1ThreadCallGraph.html">ThreadCallGraph</a>* tcg=tct-&gt;getThreadCallGraph();</div><div class="line"><a name="l00098"></a><span class="lineno"> 98</span>&#160;</div><div class="line"><a name="l00099"></a><span class="lineno"> 99</span>&#160; <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>&#160; <a class="code" href="classSVF_1_1FIFOWorkList.html">FIFOWorkList&lt;const PTACallGraphNode*&gt;</a> worklist;</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160;</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <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>&#160; {</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun=(*it)-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-&gt;<a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct-&gt;getSVFFun(fun));</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</div><div class="line"><a name="l00107"></a><span class="lineno"> 107</span>&#160; {</div><div class="line"><a name="l00108"></a><span class="lineno"> 108</span>&#160; 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>&#160; visited.insert(cgnode);</div><div class="line"><a name="l00110"></a><span class="lineno"> 110</span>&#160; }</div><div class="line"><a name="l00111"></a><span class="lineno"> 111</span>&#160; }</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160; <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>&#160; {</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = (*it)-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgnode = tcg-&gt;<a class="code" href="classSVF_1_1PTACallGraph.html#aaab54c670518d9d6790707f76ea76aa1">getCallGraphNode</a>(tct-&gt;getSVFFun(fun));</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; <span class="keywordflow">if</span> (visited.find(cgnode) == visited.end())</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; {</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; 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>&#160; visited.insert(cgnode);</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; }</div><div class="line"><a name="l00121"></a><span class="lineno"> 121</span>&#160; }</div><div class="line"><a name="l00122"></a><span class="lineno"> 122</span>&#160; <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>&#160; {</div><div class="line"><a name="l00124"></a><span class="lineno"> 124</span>&#160; <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>&#160; lockcandidateFuncSet.insert(node-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>());</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ae5b113921530eee6afe58a65d8e5b3a7">InEdgeBegin</a>(), neit = node-&gt;<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>&#160; {</div><div class="line"><a name="l00128"></a><span class="lineno"> 128</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* srcNode = (*nit)-&gt;getSrcNode();</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160; <span class="keywordflow">if</span> (visited.find(srcNode) == visited.end())</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; {</div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; visited.insert(srcNode);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160; 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>&#160; }</div><div class="line"><a name="l00134"></a><span class="lineno"> 134</span>&#160; }</div><div class="line"><a name="l00135"></a><span class="lineno"> 135</span>&#160; }</div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160;}</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160;</div><div class="line"><a name="l00142"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8a34f7544f22a87e1caf010c34abda75"> 142</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160;</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="comment">// Identify the protected Instructions.</span></div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; <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>&#160; {</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; <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>&lt;<a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>&gt;(*it);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(lockSite &amp;&amp; <span class="stringliteral">&quot;Lock acquire instruction must be CallInst&quot;</span>);</div><div class="line"><a name="l00150"></a><span class="lineno"> 150</span>&#160;</div><div class="line"><a name="l00151"></a><span class="lineno"> 151</span>&#160; <span class="comment">// Perform forward traversal</span></div><div class="line"><a name="l00152"></a><span class="lineno"> 152</span>&#160; <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>&#160; <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>&#160; <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>&#160;</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160; <span class="keywordtype">bool</span> forward = intraForwardTraverse(lockSite,unlockSet,forwardInsts);</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="keywordtype">bool</span> backward = intraBackwardTraverse(unlockSet,backwardInsts);</div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160;</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <span class="keywordflow">if</span>(forward &amp;&amp; backward)</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; addIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(forward &amp;&amp; !backward)</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; addCondIntraLock(lockSite,forwardInsts);</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; }</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160;}</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160;</div><div class="line"><a name="l00170"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a6febb0bb12f4983cd54b3bd310ce65d2"> 170</a></span>&#160;<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>&amp; unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; forwardInsts)</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;{</div><div class="line"><a name="l00172"></a><span class="lineno"> 172</span>&#160;</div><div class="line"><a name="l00173"></a><span class="lineno"> 173</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = lockSite-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00174"></a><span class="lineno"> 174</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno"> 175</span>&#160; <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>&#160; worklist.push_back(lockSite);</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; {</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; <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>&#160; worklist.pop_back();</div><div class="line"><a name="l00181"></a><span class="lineno"> 181</span>&#160;</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; <span class="keywordflow">if</span>(&amp;(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a3cb226930eeaf558575e09e5b65e0223">getFunExitBB</a>(fun)-&gt;back()) == I)</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160; <span class="keywordflow">if</span> (forwardInsts.find(I)!=forwardInsts.end())</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00188"></a><span class="lineno"> 188</span>&#160; forwardInsts.insert(I);</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;</div><div class="line"><a name="l00190"></a><span class="lineno"> 190</span>&#160; <span class="keywordflow">if</span> (isTDRelease(I) &amp;&amp; isAliasedLocks(lockSite, I))</div><div class="line"><a name="l00191"></a><span class="lineno"> 191</span>&#160; {</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; unlockSet.insert(I);</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci lock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(lockSite)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci unlock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00196"></a><span class="lineno"> 196</span>&#160; }</div><div class="line"><a name="l00197"></a><span class="lineno"> 197</span>&#160;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; worklist.push_back(*nit);</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; }</div><div class="line"><a name="l00204"></a><span class="lineno"> 204</span>&#160; }</div><div class="line"><a name="l00205"></a><span class="lineno"> 205</span>&#160;</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160;}</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160;</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;</div><div class="line"><a name="l00213"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a5f693c893f3701e1e025881f91193d53"> 213</a></span>&#160;<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>&amp; unlockSet, <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; backwardInsts)</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160;{</div><div class="line"><a name="l00215"></a><span class="lineno"> 215</span>&#160;</div><div class="line"><a name="l00216"></a><span class="lineno"> 216</span>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160; <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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* fun = unlockSite-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* entryInst = &amp;(fun-&gt;getEntryBlock().back());</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; worklist.push_back(*it);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160;</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; <span class="keywordflow">while</span> (!worklist.empty())</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; {</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; <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>&#160; worklist.pop_back();</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160;</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">if</span>(entryInst == I)</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; <span class="comment">// Skip the visited Instructions.</span></div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; <span class="keywordflow">if</span> (backwardInsts.find(I)!=backwardInsts.end())</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160; backwardInsts.insert(I);</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;</div><div class="line"><a name="l00237"></a><span class="lineno"> 237</span>&#160; <span class="keywordflow">if</span> (isTDAcquire(I) &amp;&amp; isAliasedLocks(unlockSite, I))</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; {</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci lock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(I)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis ci unlock -- &quot;</span> &lt;&lt; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVFUtil::getSourceLoc</a>(unlockSite)&lt;&lt;<span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; }</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160;</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; worklist.push_back(*nit);</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; }</div><div class="line"><a name="l00250"></a><span class="lineno"> 250</span>&#160; }</div><div class="line"><a name="l00251"></a><span class="lineno"> 251</span>&#160; }</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160;</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00254"></a><span class="lineno"> 254</span>&#160;}</div><div class="line"><a name="l00255"></a><span class="lineno"> 255</span>&#160;</div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160;</div><div class="line"><a name="l00257"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ae03db88ef0ad0da2c31cf1623b32165f"> 257</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct-&gt;getEntryProcs();</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; <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>&#160; {</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> cxt;</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; <a class="code" href="classSVF_1_1CxtProc.html">CxtLockProc</a> t(cxt, tct-&gt;getSVFFun(*it));</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; pushToCTPWorkList(t);</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; }</div><div class="line"><a name="l00268"></a><span class="lineno"> 268</span>&#160;</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160; <span class="keywordflow">while</span> (!clpList.empty())</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; {</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <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>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* cgNode = getTCG()-&gt;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>&#160; <span class="comment">// lzh TODO.</span></div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordflow">if</span> (!isLockCandidateFun(cgNode-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00276"></a><span class="lineno"> 276</span>&#160;</div><div class="line"><a name="l00277"></a><span class="lineno"> 277</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> nit = cgNode-&gt;<a class="code" href="classSVF_1_1GenericNode.html#aa4f103330118c8976bf95e4bf53416eb">OutEdgeBegin</a>(), neit = cgNode-&gt;<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>&#160; {</div><div class="line"><a name="l00279"></a><span class="lineno"> 279</span>&#160; <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>&#160;</div><div class="line"><a name="l00281"></a><span class="lineno"> 281</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#a750e50a9022451e406c4819979edffa5">directCallsBegin</a>(), ecit = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#acc4fcacefdc9be9a214dfcc455fe7970">directCallsEnd</a>();</div><div class="line"><a name="l00282"></a><span class="lineno"> 282</span>&#160; cit != ecit; ++cit)</div><div class="line"><a name="l00283"></a><span class="lineno"> 283</span>&#160; {</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160; <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>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nCollecting CxtLocks: handling direct call:&quot;</span> &lt;&lt; **cit &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span> &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getFunction()-&gt;getName()</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; &lt;&lt; <span class="stringliteral">&quot;--&gt;&quot;</span> &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getFunction()-&gt;getName() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*cit)-&gt;getCallSite()));</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; }</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator ind = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#afbdb582d20ab953b2de1f3efacb74679">indirectCallsBegin</a>(), eind = cgEdge-&gt;<a class="code" href="classSVF_1_1PTACallGraphEdge.html#a494bc8bacca5ca8d266286f3fb303495">indirectCallsEnd</a>();</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; ind != eind; ++ind)</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160; {</div><div class="line"><a name="l00292"></a><span class="lineno"> 292</span>&#160; <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>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nCollecting CxtLocks: handling indirect call:&quot;</span> &lt;&lt; **ind &lt;&lt; <span class="stringliteral">&quot;\t&quot;</span></div><div class="line"><a name="l00294"></a><span class="lineno"> 294</span>&#160; &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ab47ca533c415841ef75456cbad439589">getSrcNode</a>()-&gt;getFunction()-&gt;getName() &lt;&lt; <span class="stringliteral">&quot;--&gt;&quot;</span> &lt;&lt; cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getFunction()-&gt;getName()</div><div class="line"><a name="l00295"></a><span class="lineno"> 295</span>&#160; &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00296"></a><span class="lineno"> 296</span>&#160; handleCallRelation(clp, cgEdge, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">getLLVMCallSite</a>((*ind)-&gt;getCallSite()));</div><div class="line"><a name="l00297"></a><span class="lineno"> 297</span>&#160; }</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160; }</div><div class="line"><a name="l00299"></a><span class="lineno"> 299</span>&#160; }</div><div class="line"><a name="l00300"></a><span class="lineno"> 300</span>&#160;}</div><div class="line"><a name="l00301"></a><span class="lineno"> 301</span>&#160;</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ab99ef73905f35d4c20ca408586fc8680"> 306</a></span>&#160;<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>&amp; 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>&#160;{</div><div class="line"><a name="l00308"></a><span class="lineno"> 308</span>&#160;</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">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>&#160;</div><div class="line"><a name="l00311"></a><span class="lineno"> 311</span>&#160; <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>&#160; {</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160; 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>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00315"></a><span class="lineno"> 315</span>&#160; }</div><div class="line"><a name="l00316"></a><span class="lineno"> 316</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = cgEdge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#aeaa31a2c8479e831b36ce2e2582ceb86">getDstNode</a>()-&gt;getFunction();</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; 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>&#160;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160; <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>&#160; <span class="keywordflow">if</span> (pushToCTPWorkList(newclp))</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160; {</div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis Process CallRet old clp --&quot;</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>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;LockAnalysis Process CallRet new clp --&quot;</span>; newclp.dump());</div><div class="line"><a name="l00325"></a><span class="lineno"> 325</span>&#160; }</div><div class="line"><a name="l00326"></a><span class="lineno"> 326</span>&#160;</div><div class="line"><a name="l00327"></a><span class="lineno"> 327</span>&#160;}</div><div class="line"><a name="l00328"></a><span class="lineno"> 328</span>&#160;</div><div class="line"><a name="l00329"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a00ccd89eff3fe8fec397df101f927cbe"> 329</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00331"></a><span class="lineno"> 331</span>&#160;</div><div class="line"><a name="l00332"></a><span class="lineno"> 332</span>&#160; <a class="code" href="classSVF_1_1LockAnalysis.html#a561bb2fbfbeee9117efad7c7c70871d8">FunSet</a> entryFuncSet = tct-&gt;getEntryProcs();</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160; <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>&#160; {</div><div class="line"><a name="l00335"></a><span class="lineno"> 335</span>&#160; <span class="keywordflow">if</span> (!isLockCandidateFun(*it))</div><div class="line"><a name="l00336"></a><span class="lineno"> 336</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> cxt;</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> cxtstmt(cxt, &amp;((*it)-&gt;front().front()));</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; pushToCTSWorkList(cxtstmt);</div><div class="line"><a name="l00340"></a><span class="lineno"> 340</span>&#160; }</div><div class="line"><a name="l00341"></a><span class="lineno"> 341</span>&#160;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <span class="keywordflow">while</span> (!cxtStmtList.empty())</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; {</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <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>&#160;</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; touchCxtStmt(cts);</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; <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>&#160; instToCxtStmtSet[curInst].insert(cts);</div><div class="line"><a name="l00349"></a><span class="lineno"> 349</span>&#160;</div><div class="line"><a name="l00350"></a><span class="lineno"> 350</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nVisit cxtStmt: &quot;</span>);</div><div class="line"><a name="l00351"></a><span class="lineno"> 351</span>&#160; <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>&#160;</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160; <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#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nIts cxt lock sets: &quot;</span>);</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; <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>&#160;</div><div class="line"><a name="l00356"></a><span class="lineno"> 356</span>&#160; <span class="keywordflow">if</span> (isTDFork(curInst))</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; {</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; handleFork(cts);</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; }</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <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>&#160; {</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(hasCxtLock(cts) &amp;&amp; <span class="stringliteral">&quot;context-sensitive lock not found!!&quot;</span>);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordflow">if</span>(addCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160; }</div><div class="line"><a name="l00366"></a><span class="lineno"> 366</span>&#160; <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>&#160; {</div><div class="line"><a name="l00368"></a><span class="lineno"> 368</span>&#160; <span class="keywordflow">if</span>(removeCxtStmtToSpan(cts,cts))</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; }</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallInst&gt;(curInst) &amp;&amp; !<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>&#160; {</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160; handleCall(cts);</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; }</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;ReturnInst&gt;(curInst))</div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; {</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; handleRet(cts);</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; }</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; {</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00382"></a><span class="lineno"> 382</span>&#160; }</div><div class="line"><a name="l00383"></a><span class="lineno"> 383</span>&#160;</div><div class="line"><a name="l00384"></a><span class="lineno"> 384</span>&#160; }</div><div class="line"><a name="l00385"></a><span class="lineno"> 385</span>&#160;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160;}</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160;</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160;</div><div class="line"><a name="l00392"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#ac1b42b0a53feae04f848e5b0828ff01a"> 392</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160;{</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a> &amp; lockset = getCxtLockfromCxtStmt(cts);</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nlock sets size = &quot;</span> &lt;&lt; lockset.size() &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>;</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <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>&#160; {</div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; (*it).dump();</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; }</div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160;}</div><div class="line"><a name="l00401"></a><span class="lineno"> 401</span>&#160;</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160;</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160;</div><div class="line"><a name="l00405"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a52e79d50288bfa2d146072be53ed058b"> 405</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160;{</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast&lt;CallInst&gt;(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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160; <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">if</span>(getTCG()-&gt;hasThreadForkEdge(cbn))</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; {</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; <span class="keywordflow">for</span> (ThreadCallGraph::ForkEdgeSet::const_iterator cgIt = getTCG()-&gt;getForkEdgeBegin(cbn),</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; ecgIt = getTCG()-&gt;getForkEdgeEnd(cbn); cgIt != ecgIt; ++cgIt)</div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; {</div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)-&gt;getDstNode()-&gt;getFunction();</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; pushCxt(newCxt,call,callee);</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &amp;(callee-&gt;getEntryBlock().front()));</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; }</div><div class="line"><a name="l00422"></a><span class="lineno"> 422</span>&#160; }</div><div class="line"><a name="l00423"></a><span class="lineno"> 423</span>&#160; handleIntra(cts);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160;}</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a97b186f9417144557bb17c41d515a9f4"> 427</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00428"></a><span class="lineno"> 428</span>&#160;{</div><div class="line"><a name="l00429"></a><span class="lineno"> 429</span>&#160;</div><div class="line"><a name="l00430"></a><span class="lineno"> 430</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#adc8b60ca7d60cf6c81feae20e4a04c63">CallInst</a>* call = SVFUtil::cast&lt;CallInst&gt;(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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160; <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; <span class="keywordflow">if</span> (getTCG()-&gt;hasCallGraphEdge(cbn))</div><div class="line"><a name="l00434"></a><span class="lineno"> 434</span>&#160; {</div><div class="line"><a name="l00435"></a><span class="lineno"> 435</span>&#160; <span class="keywordflow">for</span> (PTACallGraph::CallGraphEdgeSet::const_iterator cgIt = getTCG()-&gt;getCallEdgeBegin(cbn), ecgIt = getTCG()-&gt;getCallEdgeEnd(cbn);</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; cgIt != ecgIt; ++cgIt)</div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; {</div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = (*cgIt)-&gt;getDstNode()-&gt;getFunction();</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* callee = svfcallee-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>();</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; <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>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160; pushCxt(newCxt, call, callee);</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a> newCts(newCxt, &amp;(callee-&gt;getEntryBlock().front()));</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; }</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; }</div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160;}</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;</div><div class="line"><a name="l00451"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#acc3d402c68b9c22ab6d576b38c994fc6"> 451</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160;{</div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160;</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; <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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svffun = tct-&gt;getSVFFun(curInst-&gt;getParent()-&gt;getParent());</div><div class="line"><a name="l00457"></a><span class="lineno"> 457</span>&#160; <a class="code" href="classSVF_1_1PTACallGraphNode.html">PTACallGraphNode</a>* curFunNode = getTCG()-&gt;getCallGraphNode(svffun);</div><div class="line"><a name="l00458"></a><span class="lineno"> 458</span>&#160; </div><div class="line"><a name="l00459"></a><span class="lineno"> 459</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PTACallGraphNode.html#adf17f5699c9f40ffc8837e813e3af3ec">PTACallGraphNode::const_iterator</a> it = curFunNode-&gt;<a class="code" href="classSVF_1_1GenericNode.html#afc8b5f86d7795b6a0dfc0687d942d79b">getInEdges</a>().begin(), eit = curFunNode-&gt;<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>&#160; {</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <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>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;ThreadForkEdge&gt;(edge) || SVFUtil::isa&lt;ThreadJoinEdge&gt;(edge))</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)-&gt;directCallsBegin(), ecit = (edge)-&gt;directCallsEnd(); cit != ecit;</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; ++cit)</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; {</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)-&gt;getCallSite();</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160; {</div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <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>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00477"></a><span class="lineno"> 477</span>&#160; }</div><div class="line"><a name="l00478"></a><span class="lineno"> 478</span>&#160; }</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; }</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; <span class="keywordflow">for</span> (PTACallGraphEdge::CallInstSet::const_iterator cit = (edge)-&gt;indirectCallsBegin(), ecit = (edge)-&gt;indirectCallsEnd();</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; cit != ecit; ++cit)</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; {</div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a> newCxt = curCxt;</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a7875172ff434b2210eea7cecfbbd959e">Instruction</a>* inst = (*cit)-&gt;getCallSite();</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160; <span class="keywordflow">if</span> (matchCxt(newCxt, inst, curFunNode-&gt;<a class="code" href="classSVF_1_1PTACallGraphNode.html#a959445c97605953fbdebbbd999437a09">getFunction</a>()-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#ac4ae917ae35ac6fca652fe2dd90a8ac2">getLLVMFun</a>()))</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; {</div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; <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>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00493"></a><span class="lineno"> 493</span>&#160; }</div><div class="line"><a name="l00494"></a><span class="lineno"> 494</span>&#160; }</div><div class="line"><a name="l00495"></a><span class="lineno"> 495</span>&#160; }</div><div class="line"><a name="l00496"></a><span class="lineno"> 496</span>&#160; }</div><div class="line"><a name="l00497"></a><span class="lineno"> 497</span>&#160;}</div><div class="line"><a name="l00498"></a><span class="lineno"> 498</span>&#160;</div><div class="line"><a name="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a711760ebaed0437176f4f9d314e9929c"> 500</a></span>&#160;<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>&amp; cts)</div><div class="line"><a name="l00501"></a><span class="lineno"> 501</span>&#160;{</div><div class="line"><a name="l00502"></a><span class="lineno"> 502</span>&#160;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <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>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <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>&#160; <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>&#160; <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>&#160; {</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160; <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>&#160; markCxtStmtFlag(newCts, cts);</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; }</div><div class="line"><a name="l00513"></a><span class="lineno"> 513</span>&#160;}</div><div class="line"><a name="l00514"></a><span class="lineno"> 514</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno"> 515</span>&#160;</div><div class="line"><a name="l00516"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17"> 516</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a7d9fd3ddcadd84969b57491181983b17">LockAnalysis::pushCxt</a>(<a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160;{</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00519"></a><span class="lineno"> 519</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct-&gt;getSVFFun(callee);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct-&gt;getSVFFun(caller);</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()-&gt;getCallSiteID(cbn, svfcallee);</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; </div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160;<span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;<span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160;<span class="comment">// return;</span></div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; <span class="keywordflow">if</span> (tct-&gt;inSameCallGraphSCC(getTCG()-&gt;getCallGraphNode(svfcaller), getTCG()-&gt;getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; {</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160; tct-&gt;pushCxt(cxt,csId);</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct-&gt;dumpCxt(cxt));</div><div class="line"><a name="l00532"></a><span class="lineno"> 532</span>&#160; }</div><div class="line"><a name="l00533"></a><span class="lineno"> 533</span>&#160;}</div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160;</div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb"> 535</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a3299f1fe234e1d6b4341498575bddcbb">LockAnalysis::matchCxt</a>(<a class="code" href="namespaceSVF.html#a542c6d5483bfc74fa58b45ad06b65960">CallStrCxt</a>&amp; 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>&#160;{</div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a5faee14fa1dd41447bc73ac365fe33c1">Function</a>* caller = call-&gt;getParent()-&gt;getParent();</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcallee = tct-&gt;getSVFFun(callee);</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* svfcaller = tct-&gt;getSVFFun(caller);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <a class="code" href="classSVF_1_1CallICFGNode.html">CallICFGNode</a>* cbn = tct-&gt;getCallBlockNode(call);</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <a class="code" href="namespaceSVF.html#a03d88a0302bcd253387690f13f693f64">CallSiteID</a> csId = getTCG()-&gt;getCallSiteID(cbn, svfcallee);</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;<span class="comment">// /// handle calling context for candidate functions only</span></div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160;<span class="comment">// if (isLockCandidateFun(caller) == false)</span></div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;<span class="comment">// return true;</span></div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="keywordflow">if</span> (cxt.empty())</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160;</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; <span class="keywordflow">if</span> (tct-&gt;inSameCallGraphSCC(getTCG()-&gt;getCallGraphNode(svfcaller), getTCG()-&gt;getCallGraphNode(svfcallee)) == <span class="keyword">false</span>)</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; {</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <span class="keywordflow">if</span> (cxt.back() == csId)</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; cxt.pop_back();</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a217a1ccdaec1abb103cf6b0373631234">DMTA</a>, tct-&gt;dumpCxt(cxt));</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; }</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160;}</div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160;</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160;</div><div class="line"><a name="l00566"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4d4501d62bf51475662b6ba66e6380aa"> 566</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; numOfTotalQueries++;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; <span class="keywordtype">bool</span> commonlock = <span class="keyword">false</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; <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>&#160; <span class="keywordflow">if</span> (isInsideIntraLock(i1) &amp;&amp; isInsideIntraLock(i2))</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; commonlock = isProtectedByCommonCILock(i1,i2) ;</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; commonlock = isProtectedByCommonCxtLock(i1,i2);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> commonlock;</div><div class="line"><a name="l00578"></a><span class="lineno"> 578</span>&#160;}</div><div class="line"><a name="l00579"></a><span class="lineno"> 579</span>&#160;</div><div class="line"><a name="l00583"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a842ddef4d1cb9c45555d949375627a48"> 583</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160;</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) &amp;&amp; !isInsideCondIntraLock(i2))</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; {</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <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>&#160; {</div><div class="line"><a name="l00592"></a><span class="lineno"> 592</span>&#160; <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>&#160; {</div><div class="line"><a name="l00594"></a><span class="lineno"> 594</span>&#160; <span class="keywordflow">if</span> (isAliasedLocks(*cil1, *cil2))</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; }</div><div class="line"><a name="l00597"></a><span class="lineno"> 597</span>&#160; }</div><div class="line"><a name="l00598"></a><span class="lineno"> 598</span>&#160; }</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160;}</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a3e2e629a588b44ed39e529babb59a4f9"> 605</a></span>&#160;<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>&amp; cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2)</div><div class="line"><a name="l00606"></a><span class="lineno"> 606</span>&#160;{</div><div class="line"><a name="l00607"></a><span class="lineno"> 607</span>&#160; <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <span class="keywordflow">if</span> (alias(lockset1,lockset2))</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160;</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;}</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160;</div><div class="line"><a name="l00620"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a56405fa1fec68717958ed1c05dd34287"> 620</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00622"></a><span class="lineno"> 622</span>&#160; <span class="keywordflow">if</span>(!hasCxtStmtfromInst(i1) || !hasCxtStmtfromInst(i2))</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset1 = getCxtStmtfromInst(i1);</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset2 = getCxtStmtfromInst(i2);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <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>&#160; {</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt1 = *cts1;</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <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>&#160; {</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2 = *cts2;</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; }</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; }</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160;}</div><div class="line"><a name="l00639"></a><span class="lineno"> 639</span>&#160;</div><div class="line"><a name="l00640"></a><span class="lineno"> 640</span>&#160;</div><div class="line"><a name="l00644"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#af30d0dad3d17188de8c2cea9b004f3d3"> 644</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; <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>&#160;</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; <span class="keywordtype">bool</span> sameSpan = <span class="keyword">false</span>;</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <span class="keywordflow">if</span> (isInsideIntraLock(i1) &amp;&amp; isInsideIntraLock(i2))</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; sameSpan = isInSameCISpan(i1, i2);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; sameSpan = isInSameCSSpan(i1, i2);</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160;</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> sameSpan;</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;}</div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160;</div><div class="line"><a name="l00662"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a65aca2bc12fc34203b16549653943eae"> 662</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; <span class="keywordflow">if</span>(!isInsideCondIntraLock(i1) &amp;&amp; !isInsideCondIntraLock(i2))</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; {</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset1 = getIntraLockSet(i1);</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#ae682eb30763f0f52184eb36c95fc3811">InstSet</a>&amp; lockset2 = getIntraLockSet(i2);</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <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>&#160; {</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; <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>&#160; {</div><div class="line"><a name="l00672"></a><span class="lineno"> 672</span>&#160; <span class="keywordflow">if</span> (*cil1==*cil2)</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00674"></a><span class="lineno"> 674</span>&#160; }</div><div class="line"><a name="l00675"></a><span class="lineno"> 675</span>&#160; }</div><div class="line"><a name="l00676"></a><span class="lineno"> 676</span>&#160; }</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160;}</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;</div><div class="line"><a name="l00683"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a8595b976bf60d161561e5494257aa179"> 683</a></span>&#160;<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>&amp; cxtStmt1, <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2)<span class="keyword"> const</span></div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="keywordflow">if</span>(!hasCxtLockfromCxtStmt(cxtStmt1) || !hasCxtLockfromCxtStmt(cxtStmt2))</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset1 = getCxtLockfromCxtStmt(cxtStmt1);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a0716c155b42b3ae7a6c8d7593bb6ac83">CxtLockSet</a>&amp; lockset2 = getCxtLockfromCxtStmt(cxtStmt2);</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; <span class="keywordflow">if</span> (intersects(lockset1,lockset2))</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00691"></a><span class="lineno"> 691</span>&#160;</div><div class="line"><a name="l00692"></a><span class="lineno"> 692</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160;}</div><div class="line"><a name="l00697"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a4245d946dd694b59b5c8ef30b08cb1dd"> 697</a></span>&#160;<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>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="keywordflow">if</span>(!hasCxtStmtfromInst(I1) || !hasCxtStmtfromInst(I2))</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset1 = getCxtStmtfromInst(I1);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LockAnalysis.html#a42ed881d4cd79eae099266a9e171aeb2">CxtStmtSet</a>&amp; ctsset2 = getCxtStmtfromInst(I2);</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160;</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <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>&#160; {</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt1 = *cts1;</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <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>&#160; {</div><div class="line"><a name="l00709"></a><span class="lineno"> 709</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1CxtStmt.html">CxtStmt</a>&amp; cxtStmt2 = *cts2;</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <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>&#160; <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>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; }</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; }</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160;}</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160;</div><div class="line"><a name="l00718"></a><span class="lineno"><a class="line" href="classSVF_1_1LockAnalysis.html#a935128c9952714fcc98febed491ee85d"> 718</a></span>&#160;<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>&#160;{</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160;</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; <span class="comment">// Initialize the validator and perform validation.</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <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>&#160; 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>&#160; </div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <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>&#160; validator.<a class="code" href="classSVF_1_1RaceResultValidator.html#aec8b923a0da580113a13bf94ffb3ebd7">init</a>(tct-&gt;getSVFModule());</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; 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>&#160;}</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>
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
71
  <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 &amp; getInEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00182">GenericGraph.h:182</a></div></div>
72
72
  <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#l00169">SVFBasicTypes.h:169</a></div></div>
@@ -137,6 +137,7 @@ $(function() {
137
137
  <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>
138
138
  <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>
139
139
  <div class="ttc" id="classSVF_1_1CxtStmt_html_a3ce19b8f2de2e199ed4165dbe9d21f28"><div class="ttname"><a href="classSVF_1_1CxtStmt.html#a3ce19b8f2de2e199ed4165dbe9d21f28">SVF::CxtStmt::getContext</a></div><div class="ttdeci">const CallStrCxt &amp; getContext() const</div><div class="ttdoc">Return current context. </div><div class="ttdef"><b>Definition:</b> <a href="CxtStmt_8h_source.html#l00057">CxtStmt.h:57</a></div></div>
140
+ <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#l00364">ICFGNode.h:364</a></div></div>
140
141
  <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="BasicTypes_8h_source.html#l00249">BasicTypes.h:249</a></div></div>
141
142
  <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#l00219">SVFUtil.h:219</a></div></div>
142
143
  <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#l00025">LockAnalysis.cpp:25</a></div></div>
@@ -155,7 +156,6 @@ $(function() {
155
156
  <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#l00206">GenericGraph.h:206</a></div></div>
156
157
  <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>
157
158
  <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#l00150">LockResultValidator.cpp:150</a></div></div>
158
- <div class="ttc" id="classSVF_1_1CallBlockNode_html"><div class="ttname"><a href="classSVF_1_1CallBlockNode.html">SVF::CallBlockNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00364">ICFGNode.h:364</a></div></div>
159
159
  <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#l00166">MTAResultValidator.h:166</a></div></div>
160
160
  <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>
161
161
  <div class="ttc" id="namespaceSVF_html_a255af6ff30782cb9a548feadb0fe7d6b"><div class="ttname"><a href="namespaceSVF.html#a255af6ff30782cb9a548feadb0fe7d6b">SVF::inst_iterator</a></div><div class="ttdeci">llvm::inst_iterator inst_iterator</div><div class="ttdoc">LLVM Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00205">BasicTypes.h:205</a></div></div>