svf-tools 1.0.289 → 1.0.293

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 (275) hide show
  1. package/README.md +1 -0
  2. package/SVF-doxygen/html/html/AndersenHCD_8cpp_source.html +2 -2
  3. package/SVF-doxygen/html/html/AndersenHLCD_8cpp_source.html +2 -2
  4. package/SVF-doxygen/html/html/AndersenLCD_8cpp_source.html +2 -2
  5. package/SVF-doxygen/html/html/AndersenSCD_8cpp_source.html +1 -1
  6. package/SVF-doxygen/html/html/AndersenSFR_8cpp_source.html +3 -3
  7. package/SVF-doxygen/html/html/AndersenSFR_8h_source.html +2 -2
  8. package/SVF-doxygen/html/html/AndersenStat_8cpp_source.html +1 -1
  9. package/SVF-doxygen/html/html/AndersenWaveDiffWithType_8cpp_source.html +5 -5
  10. package/SVF-doxygen/html/html/AndersenWaveDiff_8cpp_source.html +3 -3
  11. package/SVF-doxygen/html/html/Andersen_8cpp_source.html +45 -29
  12. package/SVF-doxygen/html/html/Andersen_8h_source.html +50 -50
  13. package/SVF-doxygen/html/html/BasicTypes_8h_source.html +2 -2
  14. package/SVF-doxygen/html/html/ConditionalPT_8h_source.html +9 -9
  15. package/SVF-doxygen/html/html/ConsG_8cpp_source.html +1 -1
  16. package/SVF-doxygen/html/html/ContextDDA_8cpp_source.html +1 -1
  17. package/SVF-doxygen/html/html/ContextDDA_8h_source.html +1 -1
  18. package/SVF-doxygen/html/html/DDAClient_8cpp_source.html +3 -3
  19. package/SVF-doxygen/html/html/DDAStat_8cpp_source.html +1 -1
  20. package/SVF-doxygen/html/html/DDAVFSolver_8h_source.html +2 -2
  21. package/SVF-doxygen/html/html/DoubleFreeChecker_8cpp_source.html +2 -2
  22. package/SVF-doxygen/html/html/FSMPTA_8cpp_source.html +5 -5
  23. package/SVF-doxygen/html/html/FileChecker_8cpp_source.html +2 -2
  24. package/SVF-doxygen/html/html/FlowDDA_8cpp_source.html +1 -1
  25. package/SVF-doxygen/html/html/FlowDDA_8h_source.html +1 -1
  26. package/SVF-doxygen/html/html/FlowSensitiveStat_8cpp_source.html +1 -1
  27. package/SVF-doxygen/html/html/FlowSensitiveTBHC_8cpp_source.html +22 -22
  28. package/SVF-doxygen/html/html/FlowSensitive_8cpp_source.html +52 -32
  29. package/SVF-doxygen/html/html/FlowSensitive_8h_source.html +58 -55
  30. package/SVF-doxygen/html/html/ICFG_8cpp_source.html +1 -1
  31. package/SVF-doxygen/html/html/LeakChecker_8cpp_source.html +2 -2
  32. package/SVF-doxygen/html/html/LockResultValidator_8cpp_source.html +1 -1
  33. package/SVF-doxygen/html/html/MTAAnnotator_8cpp_source.html +4 -4
  34. package/SVF-doxygen/html/html/MTA_8cpp_source.html +1 -1
  35. package/SVF-doxygen/html/html/MemRegion_8cpp_source.html +1 -1
  36. package/SVF-doxygen/html/html/MutablePointsToDS_8h_source.html +2 -2
  37. package/SVF-doxygen/html/html/NodeIDAllocator_8cpp_source.html +64 -11
  38. package/SVF-doxygen/html/html/NodeIDAllocator_8h.html +5 -1
  39. package/SVF-doxygen/html/html/NodeIDAllocator_8h_source.html +52 -15
  40. package/SVF-doxygen/html/html/PAG_8cpp_source.html +1 -1
  41. package/SVF-doxygen/html/html/PersistentPointsToDS_8h_source.html +2 -2
  42. package/SVF-doxygen/html/html/PointerAnalysisImpl_8cpp_source.html +2 -2
  43. package/SVF-doxygen/html/html/PointerAnalysisImpl_8h_source.html +1 -1
  44. package/SVF-doxygen/html/html/PointerAnalysis_8h_source.html +1 -1
  45. package/SVF-doxygen/html/html/PointsTo_8cpp_source.html +34 -33
  46. package/SVF-doxygen/html/html/PointsTo_8h_source.html +32 -32
  47. package/SVF-doxygen/html/html/ProgSlice_8cpp_source.html +4 -12
  48. package/SVF-doxygen/html/html/ProgSlice_8h_source.html +33 -35
  49. package/SVF-doxygen/html/html/SVFGOPT_8cpp_source.html +1 -1
  50. package/SVF-doxygen/html/html/SVFG_8cpp_source.html +31 -36
  51. package/SVF-doxygen/html/html/SVFG_8h_source.html +19 -19
  52. package/SVF-doxygen/html/html/SVFUtil_8cpp_source.html +15 -7
  53. package/SVF-doxygen/html/html/SVFUtil_8h.html +3 -0
  54. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +10 -8
  55. package/SVF-doxygen/html/html/SaberAnnotator_8cpp_source.html +2 -2
  56. package/SVF-doxygen/html/html/SaberSVFGBuilder_8cpp_source.html +3 -3
  57. package/SVF-doxygen/html/html/SrcSnkDDA_8cpp_source.html +2 -2
  58. package/SVF-doxygen/html/html/SymbolTableInfo_8cpp_source.html +1 -1
  59. package/SVF-doxygen/html/html/TypeBasedHeapCloning_8cpp_source.html +3 -3
  60. package/SVF-doxygen/html/html/VFG_8cpp_source.html +17 -11
  61. package/SVF-doxygen/html/html/VersionedFlowSensitiveStat_8cpp_source.html +1 -1
  62. package/SVF-doxygen/html/html/VersionedFlowSensitive_8cpp_source.html +51 -43
  63. package/SVF-doxygen/html/html/VersionedFlowSensitive_8h_source.html +34 -33
  64. package/SVF-doxygen/html/html/WPAPass_8cpp_source.html +5 -5
  65. package/SVF-doxygen/html/html/annotated.html +2 -1
  66. package/SVF-doxygen/html/html/classSVF_1_1AddrPE.html +1 -1
  67. package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode-members.html +1 -1
  68. package/SVF-doxygen/html/html/classSVF_1_1AddrVFGNode.html +3 -3
  69. package/SVF-doxygen/html/html/classSVF_1_1Andersen-members.html +213 -212
  70. package/SVF-doxygen/html/html/classSVF_1_1Andersen.html +124 -72
  71. package/SVF-doxygen/html/html/classSVF_1_1AndersenBase.html +2 -2
  72. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD-members.html +223 -222
  73. package/SVF-doxygen/html/html/classSVF_1_1AndersenHCD.html +36 -34
  74. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD-members.html +232 -231
  75. package/SVF-doxygen/html/html/classSVF_1_1AndersenHLCD.html +21 -19
  76. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD-members.html +220 -219
  77. package/SVF-doxygen/html/html/classSVF_1_1AndersenLCD.html +38 -36
  78. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD-members.html +221 -220
  79. package/SVF-doxygen/html/html/classSVF_1_1AndersenSCD.html +11 -9
  80. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR-members.html +232 -231
  81. package/SVF-doxygen/html/html/classSVF_1_1AndersenSFR.html +6 -4
  82. package/SVF-doxygen/html/html/classSVF_1_1AndersenStat.html +1 -1
  83. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff-members.html +220 -219
  84. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiff.html +21 -19
  85. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiffWithType-members.html +227 -226
  86. package/SVF-doxygen/html/html/classSVF_1_1AndersenWaveDiffWithType.html +26 -24
  87. package/SVF-doxygen/html/html/classSVF_1_1ArgumentVFGNode.html +2 -3
  88. package/SVF-doxygen/html/html/classSVF_1_1BVDataPTAImpl.html +2 -2
  89. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPPE.html +1 -1
  90. package/SVF-doxygen/html/html/classSVF_1_1BinaryOPVFGNode.html +3 -4
  91. package/SVF-doxygen/html/html/classSVF_1_1CallBlockNode.html +1 -1
  92. package/SVF-doxygen/html/html/classSVF_1_1CallPE.html +1 -1
  93. package/SVF-doxygen/html/html/classSVF_1_1CmpPE.html +1 -1
  94. package/SVF-doxygen/html/html/classSVF_1_1CmpVFGNode.html +3 -4
  95. package/SVF-doxygen/html/html/classSVF_1_1ContextDDA.html +2 -2
  96. package/SVF-doxygen/html/html/classSVF_1_1CopyPE.html +1 -1
  97. package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode-members.html +1 -1
  98. package/SVF-doxygen/html/html/classSVF_1_1CopyVFGNode.html +3 -3
  99. package/SVF-doxygen/html/html/classSVF_1_1DDAStat.html +1 -1
  100. package/SVF-doxygen/html/html/classSVF_1_1DDAVFSolver.html +1 -1
  101. package/SVF-doxygen/html/html/classSVF_1_1DoubleFreeChecker.html +2 -2
  102. package/SVF-doxygen/html/html/classSVF_1_1FIObjPN.html +1 -1
  103. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA-members.html +110 -107
  104. package/SVF-doxygen/html/html/classSVF_1_1FSMPTA.html +12 -4
  105. package/SVF-doxygen/html/html/classSVF_1_1FileChecker.html +2 -2
  106. package/SVF-doxygen/html/html/classSVF_1_1FlowDDA.html +2 -2
  107. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive-members.html +109 -106
  108. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitive.html +286 -157
  109. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveStat.html +30 -30
  110. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC-members.html +121 -118
  111. package/SVF-doxygen/html/html/classSVF_1_1FlowSensitiveTBHC.html +36 -28
  112. package/SVF-doxygen/html/html/classSVF_1_1FormalOUTSVFGNode.html +2 -2
  113. package/SVF-doxygen/html/html/classSVF_1_1FunptrDDAClient.html +3 -3
  114. package/SVF-doxygen/html/html/classSVF_1_1GepObjPN.html +1 -1
  115. package/SVF-doxygen/html/html/classSVF_1_1GepPE.html +1 -1
  116. package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode-members.html +1 -1
  117. package/SVF-doxygen/html/html/classSVF_1_1GepVFGNode.html +3 -3
  118. package/SVF-doxygen/html/html/classSVF_1_1GepValPN.html +1 -1
  119. package/SVF-doxygen/html/html/classSVF_1_1InterPHIVFGNode.html +1 -1
  120. package/SVF-doxygen/html/html/classSVF_1_1IntraBlockNode.html +1 -1
  121. package/SVF-doxygen/html/html/classSVF_1_1IntraPHIVFGNode.html +1 -1
  122. package/SVF-doxygen/html/html/classSVF_1_1LeakChecker.html +2 -2
  123. package/SVF-doxygen/html/html/classSVF_1_1LoadPE.html +1 -1
  124. package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode-members.html +1 -1
  125. package/SVF-doxygen/html/html/classSVF_1_1LoadVFGNode.html +3 -3
  126. package/SVF-doxygen/html/html/classSVF_1_1LockResultValidator.html +1 -1
  127. package/SVF-doxygen/html/html/classSVF_1_1MRGenerator.html +2 -2
  128. package/SVF-doxygen/html/html/classSVF_1_1MTA.html +1 -1
  129. package/SVF-doxygen/html/html/classSVF_1_1MTAAnnotator.html +4 -4
  130. package/SVF-doxygen/html/html/classSVF_1_1MTASVFGBuilder.html +5 -5
  131. package/SVF-doxygen/html/html/classSVF_1_1MutablePTData.html +2 -2
  132. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator-members.html +11 -10
  133. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator.html +74 -34
  134. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer-members.html +109 -0
  135. package/SVF-doxygen/html/html/classSVF_1_1NodeIDAllocator_1_1Clusterer.html +1188 -0
  136. package/SVF-doxygen/html/html/classSVF_1_1NormalGepPE.html +1 -1
  137. package/SVF-doxygen/html/html/classSVF_1_1ObjPN.html +1 -1
  138. package/SVF-doxygen/html/html/classSVF_1_1PHIVFGNode.html +3 -4
  139. package/SVF-doxygen/html/html/classSVF_1_1PersistentIncDFPTData.html +2 -2
  140. package/SVF-doxygen/html/html/classSVF_1_1PersistentPTData.html +2 -2
  141. package/SVF-doxygen/html/html/classSVF_1_1PointsTo.html +77 -66
  142. package/SVF-doxygen/html/html/classSVF_1_1PointsTo_1_1PointsToIterator.html +32 -26
  143. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice-members.html +36 -37
  144. package/SVF-doxygen/html/html/classSVF_1_1ProgSlice.html +121 -153
  145. package/SVF-doxygen/html/html/classSVF_1_1RetBlockNode.html +1 -1
  146. package/SVF-doxygen/html/html/classSVF_1_1RetPE.html +1 -1
  147. package/SVF-doxygen/html/html/classSVF_1_1SVFFunction.html +4 -4
  148. package/SVF-doxygen/html/html/classSVF_1_1SVFG.html +49 -49
  149. package/SVF-doxygen/html/html/classSVF_1_1SVFGBuilder.html +3 -3
  150. package/SVF-doxygen/html/html/classSVF_1_1SVFGOPT.html +9 -9
  151. package/SVF-doxygen/html/html/classSVF_1_1SaberAnnotator.html +2 -2
  152. package/SVF-doxygen/html/html/classSVF_1_1SaberSVFGBuilder.html +6 -6
  153. package/SVF-doxygen/html/html/classSVF_1_1SrcSnkDDA.html +2 -2
  154. package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode-members.html +1 -1
  155. package/SVF-doxygen/html/html/classSVF_1_1StmtVFGNode.html +8 -9
  156. package/SVF-doxygen/html/html/classSVF_1_1StorePE.html +1 -1
  157. package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode-members.html +1 -1
  158. package/SVF-doxygen/html/html/classSVF_1_1StoreVFGNode.html +3 -3
  159. package/SVF-doxygen/html/html/classSVF_1_1SymbolTableInfo.html +1 -1
  160. package/SVF-doxygen/html/html/classSVF_1_1TDForkPE.html +1 -1
  161. package/SVF-doxygen/html/html/classSVF_1_1TDJoinPE.html +1 -1
  162. package/SVF-doxygen/html/html/classSVF_1_1TypeBasedHeapCloning.html +4 -4
  163. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPPE.html +1 -1
  164. package/SVF-doxygen/html/html/classSVF_1_1UnaryOPVFGNode.html +1 -1
  165. package/SVF-doxygen/html/html/classSVF_1_1VFGNode.html +1 -1
  166. package/SVF-doxygen/html/html/classSVF_1_1ValPN.html +1 -1
  167. package/SVF-doxygen/html/html/classSVF_1_1VariantGepPE.html +1 -1
  168. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive-members.html +132 -129
  169. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitive.html +171 -116
  170. package/SVF-doxygen/html/html/classSVF_1_1VersionedFlowSensitiveStat.html +37 -37
  171. package/SVF-doxygen/html/html/classSVF_1_1WPAPass.html +5 -5
  172. package/SVF-doxygen/html/html/classes.html +62 -62
  173. package/SVF-doxygen/html/html/functions_b.html +10 -5
  174. package/SVF-doxygen/html/html/functions_c.html +36 -22
  175. package/SVF-doxygen/html/html/functions_d.html +12 -0
  176. package/SVF-doxygen/html/html/functions_e.html +9 -3
  177. package/SVF-doxygen/html/html/functions_f.html +21 -18
  178. package/SVF-doxygen/html/html/functions_func_c.html +19 -10
  179. package/SVF-doxygen/html/html/functions_func_d.html +3 -0
  180. package/SVF-doxygen/html/html/functions_func_e.html +3 -0
  181. package/SVF-doxygen/html/html/functions_func_g.html +16 -10
  182. package/SVF-doxygen/html/html/functions_func_p.html +6 -2
  183. package/SVF-doxygen/html/html/functions_func_r.html +7 -1
  184. package/SVF-doxygen/html/html/functions_func_t.html +3 -0
  185. package/SVF-doxygen/html/html/functions_g.html +15 -9
  186. package/SVF-doxygen/html/html/functions_l.html +10 -7
  187. package/SVF-doxygen/html/html/functions_n.html +21 -3
  188. package/SVF-doxygen/html/html/functions_o.html +16 -8
  189. package/SVF-doxygen/html/html/functions_p.html +23 -17
  190. package/SVF-doxygen/html/html/functions_r.html +13 -6
  191. package/SVF-doxygen/html/html/functions_s.html +9 -9
  192. package/SVF-doxygen/html/html/functions_t.html +18 -9
  193. package/SVF-doxygen/html/html/functions_type_d.html +3 -0
  194. package/SVF-doxygen/html/html/functions_v.html +3 -3
  195. package/SVF-doxygen/html/html/functions_vars_b.html +3 -0
  196. package/SVF-doxygen/html/html/functions_vars_c.html +3 -0
  197. package/SVF-doxygen/html/html/functions_vars_d.html +6 -0
  198. package/SVF-doxygen/html/html/functions_vars_e.html +3 -0
  199. package/SVF-doxygen/html/html/functions_vars_f.html +3 -0
  200. package/SVF-doxygen/html/html/functions_vars_l.html +3 -0
  201. package/SVF-doxygen/html/html/functions_vars_n.html +18 -0
  202. package/SVF-doxygen/html/html/functions_vars_o.html +6 -0
  203. package/SVF-doxygen/html/html/functions_vars_r.html +3 -0
  204. package/SVF-doxygen/html/html/functions_vars_t.html +6 -0
  205. package/SVF-doxygen/html/html/functions_w.html +8 -6
  206. package/SVF-doxygen/html/html/globals_f.html +3 -3
  207. package/SVF-doxygen/html/html/hierarchy.html +413 -412
  208. package/SVF-doxygen/html/html/menudata.js +2 -0
  209. package/SVF-doxygen/html/html/namespaceSVF.html +8 -8
  210. package/SVF-doxygen/html/html/namespaceSVF_1_1SVFUtil.html +47 -16
  211. package/SVF-doxygen/html/html/namespacemembers_func.html +17 -10
  212. package/SVF-doxygen/html/html/namespacemembers_h.html +76 -0
  213. package/SVF-doxygen/html/html/search/all_10.js +9 -8
  214. package/SVF-doxygen/html/html/search/all_12.js +5 -2
  215. package/SVF-doxygen/html/html/search/all_13.js +7 -7
  216. package/SVF-doxygen/html/html/search/all_14.js +8 -5
  217. package/SVF-doxygen/html/html/search/all_15.js +1 -1
  218. package/SVF-doxygen/html/html/search/all_16.js +1 -1
  219. package/SVF-doxygen/html/html/search/all_17.js +1 -1
  220. package/SVF-doxygen/html/html/search/all_2.js +1 -0
  221. package/SVF-doxygen/html/html/search/all_3.js +4 -0
  222. package/SVF-doxygen/html/html/search/all_4.js +4 -0
  223. package/SVF-doxygen/html/html/search/all_5.js +2 -0
  224. package/SVF-doxygen/html/html/search/all_6.js +4 -3
  225. package/SVF-doxygen/html/html/search/all_7.js +4 -2
  226. package/SVF-doxygen/html/html/search/all_8.js +1 -0
  227. package/SVF-doxygen/html/html/search/all_c.js +4 -3
  228. package/SVF-doxygen/html/html/search/all_d.js +1 -1
  229. package/SVF-doxygen/html/html/search/all_e.js +9 -4
  230. package/SVF-doxygen/html/html/search/all_f.js +4 -2
  231. package/SVF-doxygen/html/html/search/classes_2.js +1 -0
  232. package/SVF-doxygen/html/html/search/functions_10.js +1 -1
  233. package/SVF-doxygen/html/html/search/functions_11.js +1 -0
  234. package/SVF-doxygen/html/html/search/functions_2.js +2 -0
  235. package/SVF-doxygen/html/html/search/functions_3.js +1 -0
  236. package/SVF-doxygen/html/html/search/functions_4.js +1 -0
  237. package/SVF-doxygen/html/html/search/functions_6.js +4 -2
  238. package/SVF-doxygen/html/html/search/functions_7.js +1 -0
  239. package/SVF-doxygen/html/html/search/functions_e.js +3 -2
  240. package/SVF-doxygen/html/html/search/functions_f.js +2 -0
  241. package/SVF-doxygen/html/html/search/typedefs_3.js +1 -0
  242. package/SVF-doxygen/html/html/search/variables_12.js +1 -0
  243. package/SVF-doxygen/html/html/search/variables_14.js +3 -1
  244. package/SVF-doxygen/html/html/search/variables_15.js +1 -1
  245. package/SVF-doxygen/html/html/search/variables_2.js +1 -0
  246. package/SVF-doxygen/html/html/search/variables_3.js +1 -0
  247. package/SVF-doxygen/html/html/search/variables_4.js +2 -0
  248. package/SVF-doxygen/html/html/search/variables_5.js +1 -0
  249. package/SVF-doxygen/html/html/search/variables_6.js +1 -0
  250. package/SVF-doxygen/html/html/search/variables_c.js +1 -0
  251. package/SVF-doxygen/html/html/search/variables_d.js +1 -1
  252. package/SVF-doxygen/html/html/search/variables_e.js +7 -2
  253. package/SVF-doxygen/html/html/search/variables_f.js +2 -0
  254. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ConstraintGraph_01_5_01_4.html +1 -1
  255. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01ICFG_01_5_01_4.html +1 -1
  256. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01SVFG_01_5_01_4.html +20 -20
  257. package/SVF-doxygen/html/html/structllvm_1_1DOTGraphTraits_3_01VFG_01_5_01_4.html +18 -18
  258. package/SVF-doxygen/html/html/structstd_1_1hash_3_01SVF_1_1PointsTo_01_4.html +1 -1
  259. package/include/SABER/ProgSlice.h +0 -3
  260. package/include/Util/NodeIDAllocator.h +94 -0
  261. package/include/Util/SVFUtil.h +3 -0
  262. package/include/WPA/Andersen.h +4 -0
  263. package/include/WPA/FlowSensitive.h +9 -0
  264. package/include/WPA/VersionedFlowSensitive.h +3 -0
  265. package/lib/Graphs/SVFG.cpp +0 -20
  266. package/lib/Graphs/VFG.cpp +18 -0
  267. package/lib/MemoryModel/PointsTo.cpp +76 -19
  268. package/lib/SABER/ProgSlice.cpp +0 -37
  269. package/lib/SABER/SaberAnnotator.cpp +1 -1
  270. package/lib/Util/NodeIDAllocator.cpp +548 -1
  271. package/lib/Util/SVFUtil.cpp +19 -0
  272. package/lib/WPA/Andersen.cpp +34 -0
  273. package/lib/WPA/FlowSensitive.cpp +70 -0
  274. package/lib/WPA/VersionedFlowSensitive.cpp +20 -0
  275. package/package.json +1 -1
@@ -66,9 +66,9 @@ $(function() {
66
66
  <div class="title">Andersen.cpp</div> </div>
67
67
  </div><!--header-->
68
68
  <div class="contents">
69
- <a href="Andersen_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">//===- Andersen.cpp -- Field-sensitive Andersen&#39;s analysis-------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</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="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></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;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> * Andersen.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> * Created on: Nov 12, 2013</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> */</span></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;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LLVMUtil_8h.html">SVF-FE/LLVMUtil.h</a>&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</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="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Steensgaard_8h.html">WPA/Steensgaard.h</a>&quot;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;</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"> 41</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a70e60ce2e6f4cfd575c6f5c974ca1081">AndersenBase::numOfProcessedAddr</a> = 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a9d7b6e602e1764f76583824dddebf985">AndersenBase::numOfProcessedCopy</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a25de7638a692832f0d4727815ff270f6">AndersenBase::numOfProcessedGep</a> = 0;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a5f1b0711583aa8947dfb4619658f1904">AndersenBase::numOfProcessedLoad</a> = 0;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ae18183a5d8ebd46fcdb9246bd643b150">AndersenBase::numOfProcessedStore</a> = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#aa31bc83cdeaa30dd0975976e29a5be12">AndersenBase::numOfSfrs</a> = 0;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ad21fc4e60abc4e6030880f8197e1c93f">AndersenBase::numOfFieldExpand</a> = 0;</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="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a6da6e1231a46fde6925493045b8b2490">AndersenBase::numOfSCCDetection</a> = 0;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a6b7d0e57f741c446d0bf178939960143">AndersenBase::timeOfSCCDetection</a> = 0;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">AndersenBase::timeOfSCCMerges</a> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">AndersenBase::timeOfCollapse</a> = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#abdc249ea291d0247f6b91a8fcc7df341">AndersenBase::AveragePointsToSetSize</a> = 0;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a7cfafe54d564c9401f435362d44d3f9c">AndersenBase::MaxPointsToSetSize</a> = 0;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">AndersenBase::timeOfProcessCopyGep</a> = 0;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a9fe738f1e11c80006d540f246a80bfdf">AndersenBase::timeOfProcessLoadStore</a> = 0;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a2afb49f513c9534fd051117b59dc056b">AndersenBase::timeOfUpdateCallGraph</a> = 0;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac"> 64</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>()</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;{</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; consCG = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintGraph.html">ConstraintGraph</a>(pag);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; setGraph(consCG);</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; stat = <span class="keyword">new</span> <a class="code" href="classSVF_1_1AndersenStat.html">AndersenStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_initial&quot;</span>);</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;</div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67"> 80</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>()</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;{</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_final&quot;</span>);</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a87516daebb3d1b5fee9037068d60e268">Options::PrintCGGraph</a>)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; consCG-&gt;print();</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a9128b7d4aaf4912b5db20aca4c22e852">BVDataPTAImpl::finalize</a>();</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_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751"> 94</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751">AndersenBase::analyze</a>()</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;{</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; initialize();</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; <span class="keywordtype">bool</span> readResultsFromFile = <span class="keyword">false</span>;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keywordflow">if</span>(!<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>()) {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; readResultsFromFile = this-&gt;readFromFile(<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a118dabc50024b5cd91095814ade47166">PointerAnalysis::finalize</a>();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; }</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span>(!readResultsFromFile)</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; <span class="comment">// Start solving constraints</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Start Solving Constraints\n&quot;</span>));</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; <span class="keywordtype">bool</span> limitTimerSet = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a757815a2c758695176120509ceb0ce70">SVFUtil::startAnalysisLimitTimer</a>(<a class="code" href="classSVF_1_1Options.html#a620fe156ba70f997eace0ccb0d2c9f67">Options::AnderTimeLimit</a>);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; initWorklist();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">do</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; numOfIteration++;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">if</span> (0 == numOfIteration % iterationForPrintStat)</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; printStat();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; reanalyze = <span class="keyword">false</span>;</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; solveWorklist();</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="keywordflow">if</span> (updateCallGraph(getIndirectCallsites()))</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;</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="keywordflow">while</span> (reanalyze);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="comment">// Analysis is finished, reset the alarm if we set it.</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVFUtil::stopAnalysisLimitTimer</a>(limitTimerSet);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Finish Solving Constraints\n&quot;</span>));</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; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; finalize();</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; }</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; this-&gt;writeToFile(<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;}</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e"> 143</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e">AndersenBase::cleanConsCG</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span>) {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; consCG-&gt;resetSubs(consCG-&gt;getRep(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> sub: consCG-&gt;getSubs(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; consCG-&gt;resetRep(sub);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; consCG-&gt;resetSubs(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; consCG-&gt;resetRep(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(!consCG-&gt;hasGNode(<span class="keywordtype">id</span>) &amp;&amp; <span class="stringliteral">&quot;this node should already have been merged to its field-insensitive base! &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;</div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39"> 152</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39">AndersenBase::normalizePointsTo</a>()</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;{</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <a class="code" href="classSVF_1_1PAG.html#a49da7e7d6273a0d8798166f95ce6bb16">PAG::MemObjToFieldsMap</a> &amp;memToFieldsMap = pag-&gt;getMemToFieldsMap();</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <a class="code" href="classSVF_1_1PAG.html#a80b31ccc3263c7d5d93aa1247eea0853">PAG::NodeLocationSetMap</a> &amp;GepObjNodeMap = pag-&gt;getGepObjNodeMap();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="comment">// clear GepObjNodeMap/memToFieldsMap/nodeToSubsMap/nodeToRepMap</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="comment">// for redundant gepnodes and remove those nodes from pag</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n: redundantGepNodes) {</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> base = pag-&gt;getBaseObjNode(n);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a> *gepNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a>&gt;(pag-&gt;getPAGNode(n));</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(gepNode &amp;&amp; <span class="stringliteral">&quot;Not a gep node in redundantGepNodes set&quot;</span>);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a> ls = gepNode-&gt;<a class="code" href="classSVF_1_1GepObjPN.html#aeb05e3a512e89c7af36c675e0efeec7e">getLocationSet</a>();</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; GepObjNodeMap.erase(std::make_pair(base, ls));</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; memToFieldsMap[base].reset(n);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; cleanConsCG(n);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; pag-&gt;removeGNode(gepNode);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;}</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548"> 175</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548">Andersen::initialize</a>()</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;{</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; resetData();</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; setDiffOpt(<a class="code" href="classSVF_1_1Options.html#acf7262c0b0bd91e6dab56a631be51206">Options::PtsDiff</a>);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; setPWCOpt(<a class="code" href="classSVF_1_1Options.html#a69579e2f37962afdbb292a36782511ed">Options::MergePWC</a>);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>();</div><div class="line"><a name="l00182"></a><span class="lineno"> 182</span>&#160; processAllAddr();</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;}</div><div class="line"><a name="l00184"></a><span class="lineno"> 184</span>&#160;</div><div class="line"><a name="l00188"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c"> 188</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">Andersen::finalize</a>()</div><div class="line"><a name="l00189"></a><span class="lineno"> 189</span>&#160;{</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160; <span class="comment">// sanitizePts();</span></div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>();</div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160;}</div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160;</div><div class="line"><a name="l00199"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1"> 199</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">Andersen::processNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160;{</div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <span class="comment">// sub nodes do not need to be processed</span></div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <span class="keywordflow">if</span> (sccRepNode(nodeId) != nodeId)</div><div class="line"><a name="l00203"></a><span class="lineno"> 203</span>&#160; <span class="keywordflow">return</span>;</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; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00206"></a><span class="lineno"> 206</span>&#160; <span class="keywordtype">double</span> insertStart = stat-&gt;getClk();</div><div class="line"><a name="l00207"></a><span class="lineno"> 207</span>&#160; handleLoadStore(node);</div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <span class="keywordtype">double</span> insertEnd = stat-&gt;getClk();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160; timeOfProcessLoadStore += (insertEnd - insertStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;</div><div class="line"><a name="l00211"></a><span class="lineno"> 211</span>&#160; <span class="keywordtype">double</span> propStart = stat-&gt;getClk();</div><div class="line"><a name="l00212"></a><span class="lineno"> 212</span>&#160; handleCopyGep(node);</div><div class="line"><a name="l00213"></a><span class="lineno"> 213</span>&#160; <span class="keywordtype">double</span> propEnd = stat-&gt;getClk();</div><div class="line"><a name="l00214"></a><span class="lineno"> 214</span>&#160; timeOfProcessCopyGep += (propEnd - propStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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;</div><div class="line"><a name="l00220"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e"> 220</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e">Andersen::handleCopyGep</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node)</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160;{</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; computeDiffPts(nodeId);</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160;</div><div class="line"><a name="l00225"></a><span class="lineno"> 225</span>&#160; <span class="keywordflow">if</span> (!getDiffPts(nodeId).<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00226"></a><span class="lineno"> 226</span>&#160; {</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ab77173aa8af6155b569f20ff0cdcec72">getCopyOutEdges</a>())</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; processCopy(nodeId, edge);</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">getGepOutEdges</a>())</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160; {</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* gepEdge = SVFUtil::dyn_cast&lt;GepCGEdge&gt;(edge))</div><div class="line"><a name="l00232"></a><span class="lineno"> 232</span>&#160; processGep(nodeId, gepEdge);</div><div class="line"><a name="l00233"></a><span class="lineno"> 233</span>&#160; }</div><div class="line"><a name="l00234"></a><span class="lineno"> 234</span>&#160; }</div><div class="line"><a name="l00235"></a><span class="lineno"> 235</span>&#160;}</div><div class="line"><a name="l00236"></a><span class="lineno"> 236</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd"> 240</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd">Andersen::handleLoadStore</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> *node)</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160;{</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> piter = getPts(nodeId).begin(), epiter =</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; getPts(nodeId).end(); piter != epiter; ++piter)</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; {</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd = *piter;</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; <span class="comment">// handle load</span></div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#af69c7e623ab5a36644b6aeabaa1a1e28">outgoingLoadsBegin</a>(),</div><div class="line"><a name="l00249"></a><span class="lineno"> 249</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a134e8ed040d7749c2b9a02662115f746">outgoingLoadsEnd</a>(); it != eit; ++it)</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; <span class="keywordflow">if</span> (processLoad(ptd, *it))</div><div class="line"><a name="l00252"></a><span class="lineno"> 252</span>&#160; pushIntoWorklist(ptd);</div><div class="line"><a name="l00253"></a><span class="lineno"> 253</span>&#160; }</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; <span class="comment">// handle store</span></div><div class="line"><a name="l00256"></a><span class="lineno"> 256</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a5a90b39f9e5769bde44a673806270714">incomingStoresBegin</a>(),</div><div class="line"><a name="l00257"></a><span class="lineno"> 257</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a8d58f5224728bb6811f12c94826167f6">incomingStoresEnd</a>(); it != eit; ++it)</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; <span class="keywordflow">if</span> (processStore(ptd, *it))</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; pushIntoWorklist((*it)-&gt;getSrcID());</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; }</div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160;}</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160;</div><div class="line"><a name="l00268"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10"> 268</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">Andersen::processAllAddr</a>()</div><div class="line"><a name="l00269"></a><span class="lineno"> 269</span>&#160;{</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">ConstraintGraph::const_iterator</a> nodeIt = consCG-&gt;begin(), nodeEit = consCG-&gt;end(); nodeIt != nodeEit; nodeIt++)</div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; {</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> * cgNode = nodeIt-&gt;second;</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19c1ed324f65f4cc58dd2fd21ed4a971">incomingAddrsBegin</a>(), eit = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ae8ac9ad8e766b961c7ce06d7219f37af">incomingAddrsEnd</a>();</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; processAddr(SVFUtil::cast&lt;AddrCGEdge&gt;(*it));</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;}</div><div class="line"><a name="l00278"></a><span class="lineno"> 278</span>&#160;</div><div class="line"><a name="l00282"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c"> 282</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c">Andersen::processAddr</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrCGEdge.html">AddrCGEdge</a>* addr)</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; numOfProcessedAddr++;</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160;</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">if</span>(addPts(dst,src))</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; pushIntoWorklist(dst);</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160;}</div><div class="line"><a name="l00291"></a><span class="lineno"> 291</span>&#160;</div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de"> 297</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">Andersen::processLoad</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* load)</div><div class="line"><a name="l00298"></a><span class="lineno"> 298</span>&#160;{</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160; numOfProcessedLoad++;</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; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = load-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00309"></a><span class="lineno"> 309</span>&#160; <span class="keywordflow">return</span> addCopyEdge(node, dst);</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;</div><div class="line"><a name="l00317"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024"> 317</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">Andersen::processStore</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* store)</div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160;{</div><div class="line"><a name="l00322"></a><span class="lineno"> 322</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00323"></a><span class="lineno"> 323</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; numOfProcessedStore++;</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; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = store-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00329"></a><span class="lineno"> 329</span>&#160; <span class="keywordflow">return</span> addCopyEdge(src, node);</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="l00337"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2"> 337</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">Andersen::processCopy</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge)</div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160;{</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; numOfProcessedCopy++;</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; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((SVFUtil::isa&lt;CopyCGEdge&gt;(edge)) &amp;&amp; <span class="stringliteral">&quot;not copy/call/ret ??&quot;</span>);</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(node);</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160;</div><div class="line"><a name="l00345"></a><span class="lineno"> 345</span>&#160; <span class="keywordtype">bool</span> changed = unionPts(dst, srcPts);</div><div class="line"><a name="l00346"></a><span class="lineno"> 346</span>&#160; <span class="keywordflow">if</span> (changed)</div><div class="line"><a name="l00347"></a><span class="lineno"> 347</span>&#160; pushIntoWorklist(dst);</div><div class="line"><a name="l00348"></a><span class="lineno"> 348</span>&#160; <span class="keywordflow">return</span> changed;</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;</div><div class="line"><a name="l00357"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f"> 357</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">Andersen::processGep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160;{</div><div class="line"><a name="l00359"></a><span class="lineno"> 359</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00360"></a><span class="lineno"> 360</span>&#160; <span class="keywordflow">return</span> processGepPts(srcPts, edge);</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;</div><div class="line"><a name="l00366"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e"> 366</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e">Andersen::processGepPts</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</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; numOfProcessedGep++;</div><div class="line"><a name="l00369"></a><span class="lineno"> 369</span>&#160;</div><div class="line"><a name="l00370"></a><span class="lineno"> 370</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00371"></a><span class="lineno"> 371</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;VariantGepCGEdge&gt;(edge))</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; <span class="comment">// If a pointer is connected by a variant gep edge,</span></div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="comment">// then set this memory object to be field insensitive,</span></div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="comment">// unless the object is a black hole/constant.</span></div><div class="line"><a name="l00376"></a><span class="lineno"> 376</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00377"></a><span class="lineno"> 377</span>&#160; {</div><div class="line"><a name="l00378"></a><span class="lineno"> 378</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00379"></a><span class="lineno"> 379</span>&#160; {</div><div class="line"><a name="l00380"></a><span class="lineno"> 380</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00381"></a><span class="lineno"> 381</span>&#160; <span class="keywordflow">continue</span>;</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; <span class="keywordflow">if</span> (!isFieldInsensitive(o))</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; setObjFieldInsensitive(o);</div><div class="line"><a name="l00387"></a><span class="lineno"> 387</span>&#160; consCG-&gt;addNodeToBeCollapsed(consCG-&gt;getBaseObjNode(o));</div><div class="line"><a name="l00388"></a><span class="lineno"> 388</span>&#160; }</div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160;</div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">// Add the field-insensitive node into pts.</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG-&gt;getFIObjNode(o);</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(baseId);</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; }</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1NormalGepCGEdge.html">NormalGepCGEdge</a>* normalGepEdge = SVFUtil::dyn_cast&lt;NormalGepCGEdge&gt;(edge))</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; {</div><div class="line"><a name="l00397"></a><span class="lineno"> 397</span>&#160; <span class="comment">// TODO: after the node is set to field insensitive, handling invariant</span></div><div class="line"><a name="l00398"></a><span class="lineno"> 398</span>&#160; <span class="comment">// gep edge may lose precision because offsets here are ignored, and the</span></div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="comment">// base object is always returned.</span></div><div class="line"><a name="l00400"></a><span class="lineno"> 400</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</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; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; {</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="keywordflow">continue</span>;</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;</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; <span class="keywordflow">if</span> (!matchType(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>(), o, normalGepEdge)) <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160;</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldSrcPtdNode = consCG-&gt;getGepObjNode(o, normalGepEdge-&gt;getLocationSet());</div><div class="line"><a name="l00411"></a><span class="lineno"> 411</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(fieldSrcPtdNode);</div><div class="line"><a name="l00412"></a><span class="lineno"> 412</span>&#160; addTypeForGepObjNode(fieldSrcPtdNode, normalGepEdge);</div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; }</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="keywordflow">else</span></div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Andersen::processGepPts: New type GEP edge type?&quot;</span>);</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; }</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160;</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00421"></a><span class="lineno"> 421</span>&#160; <span class="keywordflow">if</span> (unionPts(dstId, tmpDstPts))</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; pushIntoWorklist(dstId);</div><div class="line"><a name="l00424"></a><span class="lineno"> 424</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00425"></a><span class="lineno"> 425</span>&#160; }</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160;</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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="l00433"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98"> 433</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98">Andersen::collapsePWCNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</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="comment">// If a node is a PWC node, collapse all its points-to tarsget.</span></div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="comment">// collapseNodePts() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00437"></a><span class="lineno"> 437</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00438"></a><span class="lineno"> 438</span>&#160; <span class="keywordflow">if</span> (mergePWC() &amp;&amp; consCG-&gt;isPWCNode(nodeId) &amp;&amp; collapseNodePts(nodeId))</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160;}</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f"> 442</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f">Andersen::collapseFields</a>()</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160;{</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160; <span class="keywordflow">while</span> (consCG-&gt;hasNodesToBeCollapsed())</div><div class="line"><a name="l00445"></a><span class="lineno"> 445</span>&#160; {</div><div class="line"><a name="l00446"></a><span class="lineno"> 446</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node = consCG-&gt;getNextCollapseNode();</div><div class="line"><a name="l00447"></a><span class="lineno"> 447</span>&#160; <span class="comment">// collapseField() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00448"></a><span class="lineno"> 448</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160; <span class="keywordflow">if</span> (collapseField(node))</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; }</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="comment">/*</span></div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;<span class="comment"> * Merge constraint graph nodes based on SCC cycle detected.</span></div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef"> 457</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">Andersen::mergeSccCycle</a>()</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; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> revTopoOrder;</div><div class="line"><a name="l00460"></a><span class="lineno"> 460</span>&#160; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> &amp; topoOrder = getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00461"></a><span class="lineno"> 461</span>&#160; <span class="keywordflow">while</span> (!topoOrder.empty())</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; {</div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId = topoOrder.top();</div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; topoOrder.pop();</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; revTopoOrder.push(repNodeId);</div><div class="line"><a name="l00466"></a><span class="lineno"> 466</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>&amp; subNodes = getSCCDetector()-&gt;subNodes(repNodeId);</div><div class="line"><a name="l00467"></a><span class="lineno"> 467</span>&#160; <span class="comment">// merge sub nodes to rep node</span></div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160; mergeSccNodes(repNodeId, subNodes);</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160; }</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; <span class="comment">// restore the topological order for later solving.</span></div><div class="line"><a name="l00472"></a><span class="lineno"> 472</span>&#160; <span class="keywordflow">while</span> (!revTopoOrder.empty())</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160; {</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = revTopoOrder.top();</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; revTopoOrder.pop();</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; topoOrder.push(nodeId);</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;</div><div class="line"><a name="l00485"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a"> 485</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">Andersen::mergeSccNodes</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>&amp; subNodes)</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; <span class="keywordflow">for</span> (NodeBS::iterator nodeIt = subNodes.begin(); nodeIt != subNodes.end(); nodeIt++)</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; {</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subNodeId = *nodeIt;</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; <span class="keywordflow">if</span> (subNodeId != repNodeId)</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; {</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; mergeNodeToRep(subNodeId, repNodeId);</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="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e"> 500</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">Andersen::collapseNodePts</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</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; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; nodePts = getPts(nodeId);</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> ptsClone = nodePts;</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> ptsIt = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), ptsEit = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>(); ptsIt != ptsEit; ptsIt++)</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; {</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; <span class="keywordflow">if</span> (isFieldInsensitive(*ptsIt))</div><div class="line"><a name="l00509"></a><span class="lineno"> 509</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00510"></a><span class="lineno"> 510</span>&#160;</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160; <span class="keywordflow">if</span> (collapseField(*ptsIt))</div><div class="line"><a name="l00512"></a><span class="lineno"> 512</span>&#160; changed = <span class="keyword">true</span>;</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; <span class="keywordflow">return</span> changed;</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"> 516</span>&#160;</div><div class="line"><a name="l00520"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61"> 520</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">Andersen::collapseField</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160;{</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(nodeId))</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160;</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160; <span class="keywordtype">double</span> start = stat-&gt;getClk();</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; <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00534"></a><span class="lineno"> 534</span>&#160; setObjFieldInsensitive(nodeId);</div><div class="line"><a name="l00535"></a><span class="lineno"> 535</span>&#160;</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160; <span class="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00537"></a><span class="lineno"> 537</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG-&gt;getFIObjNode(nodeId);</div><div class="line"><a name="l00538"></a><span class="lineno"> 538</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseRepNodeId = consCG-&gt;sccRepNode(baseId);</div><div class="line"><a name="l00539"></a><span class="lineno"> 539</span>&#160; <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &amp; allFields = consCG-&gt;getAllFieldsObjNode(baseId);</div><div class="line"><a name="l00540"></a><span class="lineno"> 540</span>&#160; <span class="keywordflow">for</span> (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; {</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160; <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; {</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160; <span class="comment">// use the reverse pts of this field node to find all pointers point to it</span></div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = getRevPts(fieldId);</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : revPts)</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; {</div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00550"></a><span class="lineno"> 550</span>&#160; clearPts(o, fieldId);</div><div class="line"><a name="l00551"></a><span class="lineno"> 551</span>&#160; addPts(o, baseId);</div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; pushIntoWorklist(o);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160;</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; }</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldRepNodeId = consCG-&gt;sccRepNode(fieldId);</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">if</span> (fieldRepNodeId != baseRepNodeId){</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; mergeNodeToRep(fieldRepNodeId, baseRepNodeId);</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; <span class="comment">// gep node fieldId becomes redundant if it is merged to its base node who is set as field-insensitive</span></div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; redundantGepNodes.set(fieldId);</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; }</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; }</div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; }</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160;</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isPWCNode(baseRepNodeId))</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160; <span class="keywordflow">if</span> (collapseNodePts(baseRepNodeId))</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160;</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="keywordtype">double</span> end = stat-&gt;getClk();</div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; timeOfCollapse += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160;</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;}</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160;</div><div class="line"><a name="l00580"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc"> 580</a></span>&#160;<a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a>&amp; <a class="code" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">Andersen::SCCDetect</a>()</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;{</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; numOfSCCDetection++;</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160;</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; <span class="keywordtype">double</span> sccStart = stat-&gt;getClk();</div><div class="line"><a name="l00585"></a><span class="lineno"> 585</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#aaa932894d00b69cfa741f9987a9cc6b8">WPAConstraintSolver::SCCDetect</a>();</div><div class="line"><a name="l00586"></a><span class="lineno"> 586</span>&#160; <span class="keywordtype">double</span> sccEnd = stat-&gt;getClk();</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; timeOfSCCDetection += (sccEnd - sccStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160; <span class="keywordtype">double</span> mergeStart = stat-&gt;getClk();</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; mergeSccCycle();</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="keywordtype">double</span> mergeEnd = stat-&gt;getClk();</div><div class="line"><a name="l00595"></a><span class="lineno"> 595</span>&#160;</div><div class="line"><a name="l00596"></a><span class="lineno"> 596</span>&#160; timeOfSCCMerges += (mergeEnd - mergeStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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; <span class="keywordflow">return</span> getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00599"></a><span class="lineno"> 599</span>&#160;}</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160;</div><div class="line"><a name="l00604"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"> 604</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b">Andersen::updateCallGraph</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointerAnalysis.html#afc2e412fe96c1fad268ba0255a2042e7">CallSiteToFunPtrMap</a>&amp; callsites)</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160;{</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="keywordtype">double</span> cgUpdateStart = stat-&gt;getClk();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#aa9661d26d1ae9c829a9296d1b6d874f4">CallEdgeMap</a> newEdges;</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160; onTheFlyCallGraphSolve(callsites,newEdges);</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> cpySrcNodes; </div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160; <span class="keywordflow">for</span>(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )</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; <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVFUtil::getLLVMCallSite</a>(it-&gt;first-&gt;getCallSite());</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160; <span class="keywordflow">for</span>(FunctionSet::iterator cit = it-&gt;second.begin(), ecit = it-&gt;second.end(); cit!=ecit; ++cit)</div><div class="line"><a name="l00616"></a><span class="lineno"> 616</span>&#160; {</div><div class="line"><a name="l00617"></a><span class="lineno"> 617</span>&#160; connectCaller2CalleeParams(cs,*cit,cpySrcNodes);</div><div class="line"><a name="l00618"></a><span class="lineno"> 618</span>&#160; }</div><div class="line"><a name="l00619"></a><span class="lineno"> 619</span>&#160; }</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160; <span class="keywordflow">for</span>(NodePairSet::iterator it = cpySrcNodes.begin(), eit = cpySrcNodes.end(); it!=eit; ++it)</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; pushIntoWorklist(it-&gt;first);</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160; }</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; <span class="keywordtype">double</span> cgUpdateEnd = stat-&gt;getClk();</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; timeOfUpdateCallGraph += (cgUpdateEnd - cgUpdateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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="keywordflow">return</span> (!newEdges.empty());</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160;}</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"><a class="line" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07"> 631</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07">Andersen::heapAllocatorViaIndCall</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160;{</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(cs) == <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;not an indirect callsite?&quot;</span>);</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00636"></a><span class="lineno"> 636</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret;</div><div class="line"><a name="l00637"></a><span class="lineno"> 637</span>&#160; CallSite2DummyValPN::const_iterator it = callsite2DummyValPN.find(cs);</div><div class="line"><a name="l00638"></a><span class="lineno"> 638</span>&#160; <span class="keywordflow">if</span>(it != callsite2DummyValPN.end())</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; srcret = sccRepNode(it-&gt;second);</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; }</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; {</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> valNode = pag-&gt;addDummyValNode();</div><div class="line"><a name="l00645"></a><span class="lineno"> 645</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objNode = pag-&gt;addDummyObjNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a9b7d53a345875e4e6c72eb23ac6475de">getType</a>());</div><div class="line"><a name="l00646"></a><span class="lineno"> 646</span>&#160; addPts(valNode,objNode);</div><div class="line"><a name="l00647"></a><span class="lineno"> 647</span>&#160; callsite2DummyValPN.insert(std::make_pair(cs,valNode));</div><div class="line"><a name="l00648"></a><span class="lineno"> 648</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(valNode),valNode);</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(objNode),objNode);</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; srcret = valNode;</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; }</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160;</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160;}</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160;</div><div class="line"><a name="l00661"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf"> 661</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf">Andersen::connectCaller2CalleeParams</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* F, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160;{</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(F);</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160;</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;connect parameters from indirect callsite &quot;</span> &lt;&lt; *cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>() &lt;&lt; <span class="stringliteral">&quot; to callee &quot;</span> &lt;&lt; *F &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160;</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160; <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* callBlockNode = pag-&gt;getICFG()-&gt;getCallBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</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">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a19b96a872d9096037f20e25122e469ea">SVFUtil::isHeapAllocExtFunViaRet</a>(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</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; heapAllocatorViaIndCall(cs,cpySrcNodes);</div><div class="line"><a name="l00673"></a><span class="lineno"> 673</span>&#160; }</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; <span class="keywordflow">if</span> (pag-&gt;funHasRet(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</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="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* fun_return = pag-&gt;getFunRet(F);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160; <span class="keywordflow">if</span> (cs_return-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() &amp;&amp; fun_return-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; {</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret = sccRepNode(fun_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160; {</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; }</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; }</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160; {</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;not a pointer ignored\n&quot;</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; }</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160;</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keywordflow">if</span> (pag-&gt;hasCallSiteArgsMap(callBlockNode) &amp;&amp; pag-&gt;hasFunArgsList(F))</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; {</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160;</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <span class="comment">// connect actual and formal param</span></div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>&amp; csArgList = pag-&gt;getCallSiteArgsList(callBlockNode);</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>&amp; funArgList = pag-&gt;getFunArgsList(F);</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; <span class="comment">//Go through the fixed parameters.</span></div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot; args:&quot;</span>);</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; PAG::PAGNodeList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; PAG::PAGNodeList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();</div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; <span class="keywordflow">for</span> (; funArgIt != funArgEit; ++csArgIt, ++funArgIt)</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="comment">//Some programs (e.g. Linux kernel) leave unneeded parameters empty.</span></div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; <span class="keywordflow">if</span> (csArgIt == csArgEit)</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; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot; !! not enough args\n&quot;</span>);</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160; }</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt ;</div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *fun_arg = *funArgIt;</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">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() &amp;&amp; fun_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</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; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;process actual parm &quot;</span> &lt;&lt; cs_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#a2a9a5feb62138307b0b6f901cb5e0e0f">toString</a>() &lt;&lt; <span class="stringliteral">&quot; \n&quot;</span>);</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstFA = sccRepNode(fun_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00720"></a><span class="lineno"> 720</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcAA, dstFA))</div><div class="line"><a name="l00721"></a><span class="lineno"> 721</span>&#160; {</div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; cpySrcNodes.insert(std::make_pair(srcAA,dstFA));</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; }</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; }</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160;</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="comment">//Any remaining actual args must be varargs.</span></div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <span class="keywordflow">if</span> (F-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">isVarArg</a>())</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160; {</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vaF = sccRepNode(pag-&gt;getVarargNode(F));</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n varargs:&quot;</span>);</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <span class="keywordflow">for</span> (; csArgIt != csArgEit; ++csArgIt)</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; {</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt;</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="keywordflow">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; <span class="keywordflow">if</span> (addCopyEdge(vnAA,vaF))</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; {</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; cpySrcNodes.insert(std::make_pair(vnAA,vaF));</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160; }</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; }</div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; }</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; }</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; <span class="keywordflow">if</span>(csArgIt != csArgEit)</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; {</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;too many args to non-vararg func.&quot;</span>);</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;(&quot;</span> + <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>()) + <span class="stringliteral">&quot;)&quot;</span>);</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; }</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; }</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160;}</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160;</div><div class="line"><a name="l00756"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e"> 756</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">Andersen::mergeSrcToTgt</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160;{</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160;</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; <span class="keywordflow">if</span>(nodeId==newRepId)</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160;</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; updatePropaPts(newRepId, nodeId);</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; unionPts(newRepId,nodeId);</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160;</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00768"></a><span class="lineno"> 768</span>&#160; <span class="keywordtype">bool</span> gepInsideScc = consCG-&gt;moveEdgesToRepNode(node, consCG-&gt;getConstraintNode(newRepId));</div><div class="line"><a name="l00769"></a><span class="lineno"> 769</span>&#160;</div><div class="line"><a name="l00771"></a><span class="lineno"> 771</span>&#160; updateNodeRepAndSubs(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(),newRepId);</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160;</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160; consCG-&gt;removeConstraintNode(node);</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160;</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; <span class="keywordflow">return</span> gepInsideScc;</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160;}</div><div class="line"><a name="l00777"></a><span class="lineno"> 777</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160;<span class="comment"> * Merge a node to its rep node based on SCC detection</span></div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00780"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848"> 780</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">Andersen::mergeNodeToRep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId,<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00781"></a><span class="lineno"> 781</span>&#160;{</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160;</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160; <span class="keywordtype">bool</span> gepInsideScc = mergeSrcToTgt(nodeId,newRepId);</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160; <span class="keywordflow">if</span> (gepInsideScc || node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a0ffe4f1ca1a6f70466cc1c6b3b12c90d">isPWCNode</a>())</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; consCG-&gt;setPWCNode(newRepId);</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;}</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160;</div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160;<span class="comment"> * Updates subnodes of its rep, and rep node of its subs</span></div><div class="line"><a name="l00795"></a><span class="lineno"> 795</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00796"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18"> 796</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">Andersen::updateNodeRepAndSubs</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160;{</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; consCG-&gt;setRep(nodeId,newRepId);</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> repSubs;</div><div class="line"><a name="l00800"></a><span class="lineno"> 800</span>&#160; repSubs.set(nodeId);</div><div class="line"><a name="l00802"></a><span class="lineno"> 802</span>&#160; <span class="comment">// update nodeToSubsMap, union its subs with its rep Subs</span></div><div class="line"><a name="l00803"></a><span class="lineno"> 803</span>&#160; <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>&amp; nodeSubs = consCG-&gt;sccSubNodes(nodeId);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <span class="keywordflow">for</span>(NodeBS::iterator sit = nodeSubs.begin(), esit = nodeSubs.end(); sit!=esit; ++sit)</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; {</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subId = *sit;</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160; consCG-&gt;setRep(subId,newRepId);</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160; }</div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160; repSubs |= nodeSubs;</div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160; consCG-&gt;setSubs(newRepId,repSubs);</div><div class="line"><a name="l00811"></a><span class="lineno"> 811</span>&#160; consCG-&gt;resetSubs(nodeId);</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160;}</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160;</div><div class="line"><a name="l00817"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a"> 817</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">Andersen::dumpTopLevelPtsTo</a>()</div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160;{</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="keywordflow">for</span> (OrderedNodeSet::iterator nIter = this-&gt;getAllValidPtrs().begin();</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; nIter != this-&gt;getAllValidPtrs().end(); ++nIter)</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; {</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* node = getPAG()-&gt;getPAGNode(*nIter);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; <span class="keywordflow">if</span> (getPAG()-&gt;isValidTopLevelPtr(node))</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; {</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts = this-&gt;getPts(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nNodeID &quot;</span> &lt;&lt; node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160;</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160; <span class="keywordflow">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00829"></a><span class="lineno"> 829</span>&#160; {</div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: {empty}\n\n&quot;</span>;</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; }</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; {</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: { &quot;</span>;</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160;</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; multiset&lt;Size_t&gt; line;</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> it = pts.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), eit = pts.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>();</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; {</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; line.insert(*it);</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; }</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <span class="keywordflow">for</span> (multiset&lt;Size_t&gt;::const_iterator it = line.begin(); it != line.end(); ++it)</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; *it &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;}\n\n&quot;</span>;</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; }</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160; }</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160; }</div><div class="line"><a name="l00848"></a><span class="lineno"> 848</span>&#160;</div><div class="line"><a name="l00849"></a><span class="lineno"> 849</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>().flush();</div><div class="line"><a name="l00850"></a><span class="lineno"> 850</span>&#160;}</div><div class="line"><a name="l00851"></a><span class="lineno"> 851</span>&#160;</div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
69
+ <a href="Andersen_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">//===- Andersen.cpp -- Field-sensitive Andersen&#39;s analysis-------------------//</span></div><div class="line"><a name="l00002"></a><span class="lineno"> 2</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00003"></a><span class="lineno"> 3</span>&#160;<span class="comment">// SVF: Static Value-Flow Analysis</span></div><div class="line"><a name="l00004"></a><span class="lineno"> 4</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00005"></a><span class="lineno"> 5</span>&#160;<span class="comment">// Copyright (C) &lt;2013-2017&gt; &lt;Yulei Sui&gt;</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="comment">// This program is free software: you can redistribute it and/or modify</span></div><div class="line"><a name="l00009"></a><span class="lineno"> 9</span>&#160;<span class="comment">// it under the terms of the GNU General Public License as published by</span></div><div class="line"><a name="l00010"></a><span class="lineno"> 10</span>&#160;<span class="comment">// the Free Software Foundation, either version 3 of the License, or</span></div><div class="line"><a name="l00011"></a><span class="lineno"> 11</span>&#160;<span class="comment">// (at your option) any later version.</span></div><div class="line"><a name="l00012"></a><span class="lineno"> 12</span>&#160;</div><div class="line"><a name="l00013"></a><span class="lineno"> 13</span>&#160;<span class="comment">// This program is distributed in the hope that it will be useful,</span></div><div class="line"><a name="l00014"></a><span class="lineno"> 14</span>&#160;<span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div><div class="line"><a name="l00015"></a><span class="lineno"> 15</span>&#160;<span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span></div><div class="line"><a name="l00016"></a><span class="lineno"> 16</span>&#160;<span class="comment">// GNU General Public License for more details.</span></div><div class="line"><a name="l00017"></a><span class="lineno"> 17</span>&#160;</div><div class="line"><a name="l00018"></a><span class="lineno"> 18</span>&#160;<span class="comment">// You should have received a copy of the GNU General Public License</span></div><div class="line"><a name="l00019"></a><span class="lineno"> 19</span>&#160;<span class="comment">// along with this program. If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div><div class="line"><a name="l00020"></a><span class="lineno"> 20</span>&#160;<span class="comment">//</span></div><div class="line"><a name="l00021"></a><span class="lineno"> 21</span>&#160;<span class="comment">//===----------------------------------------------------------------------===//</span></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;<span class="comment">/*</span></div><div class="line"><a name="l00024"></a><span class="lineno"> 24</span>&#160;<span class="comment"> * Andersen.cpp</span></div><div class="line"><a name="l00025"></a><span class="lineno"> 25</span>&#160;<span class="comment"> *</span></div><div class="line"><a name="l00026"></a><span class="lineno"> 26</span>&#160;<span class="comment"> * Created on: Nov 12, 2013</span></div><div class="line"><a name="l00027"></a><span class="lineno"> 27</span>&#160;<span class="comment"> * Author: Yulei Sui</span></div><div class="line"><a name="l00028"></a><span class="lineno"> 28</span>&#160;<span class="comment"> */</span></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;<span class="preprocessor">#include &quot;<a class="code" href="Options_8h.html">Util/Options.h</a>&quot;</span></div><div class="line"><a name="l00031"></a><span class="lineno"> 31</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="LLVMUtil_8h.html">SVF-FE/LLVMUtil.h</a>&quot;</span></div><div class="line"><a name="l00032"></a><span class="lineno"> 32</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="PointsTo_8h.html">MemoryModel/PointsTo.h</a>&quot;</span></div><div class="line"><a name="l00033"></a><span class="lineno"> 33</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="l00034"></a><span class="lineno"> 34</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Andersen_8h.html">WPA/Andersen.h</a>&quot;</span></div><div class="line"><a name="l00035"></a><span class="lineno"> 35</span>&#160;<span class="preprocessor">#include &quot;<a class="code" href="Steensgaard_8h.html">WPA/Steensgaard.h</a>&quot;</span></div><div class="line"><a name="l00036"></a><span class="lineno"> 36</span>&#160;</div><div class="line"><a name="l00037"></a><span class="lineno"> 37</span>&#160;<span class="keyword">using namespace </span><a class="code" href="namespaceSVF.html">SVF</a>;</div><div class="line"><a name="l00038"></a><span class="lineno"> 38</span>&#160;<span class="keyword">using namespace </span>SVFUtil;</div><div class="line"><a name="l00039"></a><span class="lineno"> 39</span>&#160;</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"> 41</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a70e60ce2e6f4cfd575c6f5c974ca1081">AndersenBase::numOfProcessedAddr</a> = 0;</div><div class="line"><a name="l00042"></a><span class="lineno"> 42</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a9d7b6e602e1764f76583824dddebf985">AndersenBase::numOfProcessedCopy</a> = 0;</div><div class="line"><a name="l00043"></a><span class="lineno"> 43</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a25de7638a692832f0d4727815ff270f6">AndersenBase::numOfProcessedGep</a> = 0;</div><div class="line"><a name="l00044"></a><span class="lineno"> 44</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a5f1b0711583aa8947dfb4619658f1904">AndersenBase::numOfProcessedLoad</a> = 0;</div><div class="line"><a name="l00045"></a><span class="lineno"> 45</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ae18183a5d8ebd46fcdb9246bd643b150">AndersenBase::numOfProcessedStore</a> = 0;</div><div class="line"><a name="l00046"></a><span class="lineno"> 46</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#aa31bc83cdeaa30dd0975976e29a5be12">AndersenBase::numOfSfrs</a> = 0;</div><div class="line"><a name="l00047"></a><span class="lineno"> 47</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#ad21fc4e60abc4e6030880f8197e1c93f">AndersenBase::numOfFieldExpand</a> = 0;</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="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a6da6e1231a46fde6925493045b8b2490">AndersenBase::numOfSCCDetection</a> = 0;</div><div class="line"><a name="l00050"></a><span class="lineno"> 50</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a6b7d0e57f741c446d0bf178939960143">AndersenBase::timeOfSCCDetection</a> = 0;</div><div class="line"><a name="l00051"></a><span class="lineno"> 51</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">AndersenBase::timeOfSCCMerges</a> = 0;</div><div class="line"><a name="l00052"></a><span class="lineno"> 52</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">AndersenBase::timeOfCollapse</a> = 0;</div><div class="line"><a name="l00053"></a><span class="lineno"> 53</span>&#160;</div><div class="line"><a name="l00054"></a><span class="lineno"> 54</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#abdc249ea291d0247f6b91a8fcc7df341">AndersenBase::AveragePointsToSetSize</a> = 0;</div><div class="line"><a name="l00055"></a><span class="lineno"> 55</span>&#160;<a class="code" href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">Size_t</a> <a class="code" href="classSVF_1_1AndersenBase.html#a7cfafe54d564c9401f435362d44d3f9c">AndersenBase::MaxPointsToSetSize</a> = 0;</div><div class="line"><a name="l00056"></a><span class="lineno"> 56</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">AndersenBase::timeOfProcessCopyGep</a> = 0;</div><div class="line"><a name="l00057"></a><span class="lineno"> 57</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a9fe738f1e11c80006d540f246a80bfdf">AndersenBase::timeOfProcessLoadStore</a> = 0;</div><div class="line"><a name="l00058"></a><span class="lineno"> 58</span>&#160;<span class="keywordtype">double</span> <a class="code" href="classSVF_1_1AndersenBase.html#a2afb49f513c9534fd051117b59dc056b">AndersenBase::timeOfUpdateCallGraph</a> = 0;</div><div class="line"><a name="l00059"></a><span class="lineno"> 59</span>&#160;</div><div class="line"><a name="l00060"></a><span class="lineno"> 60</span>&#160;</div><div class="line"><a name="l00064"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac"> 64</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>()</div><div class="line"><a name="l00065"></a><span class="lineno"> 65</span>&#160;{</div><div class="line"><a name="l00067"></a><span class="lineno"> 67</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">PointerAnalysis::initialize</a>();</div><div class="line"><a name="l00069"></a><span class="lineno"> 69</span>&#160; consCG = <span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintGraph.html">ConstraintGraph</a>(pag);</div><div class="line"><a name="l00070"></a><span class="lineno"> 70</span>&#160; setGraph(consCG);</div><div class="line"><a name="l00072"></a><span class="lineno"> 72</span>&#160; stat = <span class="keyword">new</span> <a class="code" href="classSVF_1_1AndersenStat.html">AndersenStat</a>(<span class="keyword">this</span>);</div><div class="line"><a name="l00073"></a><span class="lineno"> 73</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00074"></a><span class="lineno"> 74</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_initial&quot;</span>);</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;</div><div class="line"><a name="l00080"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67"> 80</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>()</div><div class="line"><a name="l00081"></a><span class="lineno"> 81</span>&#160;{</div><div class="line"><a name="l00083"></a><span class="lineno"> 83</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">Options::ConsCGDotGraph</a>)</div><div class="line"><a name="l00084"></a><span class="lineno"> 84</span>&#160; consCG-&gt;dump(<span class="stringliteral">&quot;consCG_final&quot;</span>);</div><div class="line"><a name="l00085"></a><span class="lineno"> 85</span>&#160;</div><div class="line"><a name="l00086"></a><span class="lineno"> 86</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a87516daebb3d1b5fee9037068d60e268">Options::PrintCGGraph</a>)</div><div class="line"><a name="l00087"></a><span class="lineno"> 87</span>&#160; consCG-&gt;print();</div><div class="line"><a name="l00088"></a><span class="lineno"> 88</span>&#160; <a class="code" href="classSVF_1_1BVDataPTAImpl.html#a9128b7d4aaf4912b5db20aca4c22e852">BVDataPTAImpl::finalize</a>();</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_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751"> 94</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751">AndersenBase::analyze</a>()</div><div class="line"><a name="l00095"></a><span class="lineno"> 95</span>&#160;{</div><div class="line"><a name="l00097"></a><span class="lineno"> 97</span>&#160; initialize();</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; <span class="keywordtype">bool</span> readResultsFromFile = <span class="keyword">false</span>;</div><div class="line"><a name="l00100"></a><span class="lineno"> 100</span>&#160; <span class="keywordflow">if</span>(!<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>()) {</div><div class="line"><a name="l00101"></a><span class="lineno"> 101</span>&#160; readResultsFromFile = this-&gt;readFromFile(<a class="code" href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">Options::ReadAnder</a>);</div><div class="line"><a name="l00102"></a><span class="lineno"> 102</span>&#160; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00103"></a><span class="lineno"> 103</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#a118dabc50024b5cd91095814ade47166">PointerAnalysis::finalize</a>();</div><div class="line"><a name="l00104"></a><span class="lineno"> 104</span>&#160; }</div><div class="line"><a name="l00105"></a><span class="lineno"> 105</span>&#160;</div><div class="line"><a name="l00106"></a><span class="lineno"> 106</span>&#160; <span class="keywordflow">if</span>(!readResultsFromFile)</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; <span class="comment">// Start solving constraints</span></div><div class="line"><a name="l00109"></a><span class="lineno"> 109</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Start Solving Constraints\n&quot;</span>));</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; <span class="keywordtype">bool</span> limitTimerSet = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a757815a2c758695176120509ceb0ce70">SVFUtil::startAnalysisLimitTimer</a>(<a class="code" href="classSVF_1_1Options.html#a620fe156ba70f997eace0ccb0d2c9f67">Options::AnderTimeLimit</a>);</div><div class="line"><a name="l00112"></a><span class="lineno"> 112</span>&#160;</div><div class="line"><a name="l00113"></a><span class="lineno"> 113</span>&#160; initWorklist();</div><div class="line"><a name="l00114"></a><span class="lineno"> 114</span>&#160; <span class="keywordflow">do</span></div><div class="line"><a name="l00115"></a><span class="lineno"> 115</span>&#160; {</div><div class="line"><a name="l00116"></a><span class="lineno"> 116</span>&#160; numOfIteration++;</div><div class="line"><a name="l00117"></a><span class="lineno"> 117</span>&#160; <span class="keywordflow">if</span> (0 == numOfIteration % iterationForPrintStat)</div><div class="line"><a name="l00118"></a><span class="lineno"> 118</span>&#160; printStat();</div><div class="line"><a name="l00119"></a><span class="lineno"> 119</span>&#160;</div><div class="line"><a name="l00120"></a><span class="lineno"> 120</span>&#160; reanalyze = <span class="keyword">false</span>;</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; solveWorklist();</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="keywordflow">if</span> (updateCallGraph(getIndirectCallsites()))</div><div class="line"><a name="l00125"></a><span class="lineno"> 125</span>&#160; reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00126"></a><span class="lineno"> 126</span>&#160;</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="keywordflow">while</span> (reanalyze);</div><div class="line"><a name="l00129"></a><span class="lineno"> 129</span>&#160;</div><div class="line"><a name="l00130"></a><span class="lineno"> 130</span>&#160; <span class="comment">// Analysis is finished, reset the alarm if we set it.</span></div><div class="line"><a name="l00131"></a><span class="lineno"> 131</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVFUtil::stopAnalysisLimitTimer</a>(limitTimerSet);</div><div class="line"><a name="l00132"></a><span class="lineno"> 132</span>&#160;</div><div class="line"><a name="l00133"></a><span class="lineno"> 133</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; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVFUtil::pasMsg</a>(<span class="stringliteral">&quot;Finish Solving Constraints\n&quot;</span>));</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; <span class="comment">// Finalize the analysis</span></div><div class="line"><a name="l00136"></a><span class="lineno"> 136</span>&#160; finalize();</div><div class="line"><a name="l00137"></a><span class="lineno"> 137</span>&#160; }</div><div class="line"><a name="l00138"></a><span class="lineno"> 138</span>&#160;</div><div class="line"><a name="l00139"></a><span class="lineno"> 139</span>&#160; <span class="keywordflow">if</span> (!<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>.<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00140"></a><span class="lineno"> 140</span>&#160; this-&gt;writeToFile(<a class="code" href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">Options::WriteAnder</a>);</div><div class="line"><a name="l00141"></a><span class="lineno"> 141</span>&#160;}</div><div class="line"><a name="l00142"></a><span class="lineno"> 142</span>&#160;</div><div class="line"><a name="l00143"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e"> 143</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#aebfe0c7238eb24f74f105b950b86cb5e">AndersenBase::cleanConsCG</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> <span class="keywordtype">id</span>) {</div><div class="line"><a name="l00144"></a><span class="lineno"> 144</span>&#160; consCG-&gt;resetSubs(consCG-&gt;getRep(<span class="keywordtype">id</span>));</div><div class="line"><a name="l00145"></a><span class="lineno"> 145</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> sub: consCG-&gt;getSubs(<span class="keywordtype">id</span>))</div><div class="line"><a name="l00146"></a><span class="lineno"> 146</span>&#160; consCG-&gt;resetRep(sub);</div><div class="line"><a name="l00147"></a><span class="lineno"> 147</span>&#160; consCG-&gt;resetSubs(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00148"></a><span class="lineno"> 148</span>&#160; consCG-&gt;resetRep(<span class="keywordtype">id</span>);</div><div class="line"><a name="l00149"></a><span class="lineno"> 149</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(!consCG-&gt;hasGNode(<span class="keywordtype">id</span>) &amp;&amp; <span class="stringliteral">&quot;this node should already have been merged to its field-insensitive base! &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;</div><div class="line"><a name="l00152"></a><span class="lineno"><a class="line" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39"> 152</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1AndersenBase.html#af37392229dab0a1f2f807a12186c3b39">AndersenBase::normalizePointsTo</a>()</div><div class="line"><a name="l00153"></a><span class="lineno"> 153</span>&#160;{</div><div class="line"><a name="l00154"></a><span class="lineno"> 154</span>&#160; <a class="code" href="classSVF_1_1PAG.html#a49da7e7d6273a0d8798166f95ce6bb16">PAG::MemObjToFieldsMap</a> &amp;memToFieldsMap = pag-&gt;getMemToFieldsMap();</div><div class="line"><a name="l00155"></a><span class="lineno"> 155</span>&#160; <a class="code" href="classSVF_1_1PAG.html#a80b31ccc3263c7d5d93aa1247eea0853">PAG::NodeLocationSetMap</a> &amp;GepObjNodeMap = pag-&gt;getGepObjNodeMap();</div><div class="line"><a name="l00156"></a><span class="lineno"> 156</span>&#160;</div><div class="line"><a name="l00157"></a><span class="lineno"> 157</span>&#160; <span class="comment">// clear GepObjNodeMap/memToFieldsMap/nodeToSubsMap/nodeToRepMap</span></div><div class="line"><a name="l00158"></a><span class="lineno"> 158</span>&#160; <span class="comment">// for redundant gepnodes and remove those nodes from pag</span></div><div class="line"><a name="l00159"></a><span class="lineno"> 159</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> n: redundantGepNodes) {</div><div class="line"><a name="l00160"></a><span class="lineno"> 160</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> base = pag-&gt;getBaseObjNode(n);</div><div class="line"><a name="l00161"></a><span class="lineno"> 161</span>&#160; <a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a> *gepNode = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVFUtil::dyn_cast</a>&lt;<a class="code" href="classSVF_1_1GepObjPN.html">GepObjPN</a>&gt;(pag-&gt;getPAGNode(n));</div><div class="line"><a name="l00162"></a><span class="lineno"> 162</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(gepNode &amp;&amp; <span class="stringliteral">&quot;Not a gep node in redundantGepNodes set&quot;</span>);</div><div class="line"><a name="l00163"></a><span class="lineno"> 163</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1LocationSet.html">LocationSet</a> ls = gepNode-&gt;<a class="code" href="classSVF_1_1GepObjPN.html#aeb05e3a512e89c7af36c675e0efeec7e">getLocationSet</a>();</div><div class="line"><a name="l00164"></a><span class="lineno"> 164</span>&#160; GepObjNodeMap.erase(std::make_pair(base, ls));</div><div class="line"><a name="l00165"></a><span class="lineno"> 165</span>&#160; memToFieldsMap[base].reset(n);</div><div class="line"><a name="l00166"></a><span class="lineno"> 166</span>&#160; cleanConsCG(n);</div><div class="line"><a name="l00167"></a><span class="lineno"> 167</span>&#160;</div><div class="line"><a name="l00168"></a><span class="lineno"> 168</span>&#160; pag-&gt;removeGNode(gepNode);</div><div class="line"><a name="l00169"></a><span class="lineno"> 169</span>&#160; }</div><div class="line"><a name="l00170"></a><span class="lineno"> 170</span>&#160;}</div><div class="line"><a name="l00171"></a><span class="lineno"> 171</span>&#160;</div><div class="line"><a name="l00175"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548"> 175</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548">Andersen::initialize</a>()</div><div class="line"><a name="l00176"></a><span class="lineno"> 176</span>&#160;{</div><div class="line"><a name="l00177"></a><span class="lineno"> 177</span>&#160; resetData();</div><div class="line"><a name="l00178"></a><span class="lineno"> 178</span>&#160; setDiffOpt(<a class="code" href="classSVF_1_1Options.html#acf7262c0b0bd91e6dab56a631be51206">Options::PtsDiff</a>);</div><div class="line"><a name="l00179"></a><span class="lineno"> 179</span>&#160; setPWCOpt(<a class="code" href="classSVF_1_1Options.html#a69579e2f37962afdbb292a36782511ed">Options::MergePWC</a>);</div><div class="line"><a name="l00180"></a><span class="lineno"> 180</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">AndersenBase::initialize</a>();</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> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>) cluster();</div><div class="line"><a name="l00183"></a><span class="lineno"> 183</span>&#160;</div><div class="line"><a name="l00185"></a><span class="lineno"> 185</span>&#160; processAllAddr();</div><div class="line"><a name="l00186"></a><span class="lineno"> 186</span>&#160;}</div><div class="line"><a name="l00187"></a><span class="lineno"> 187</span>&#160;</div><div class="line"><a name="l00191"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c"> 191</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">Andersen::finalize</a>()</div><div class="line"><a name="l00192"></a><span class="lineno"> 192</span>&#160;{</div><div class="line"><a name="l00193"></a><span class="lineno"> 193</span>&#160; <span class="comment">// TODO: check -stat too.</span></div><div class="line"><a name="l00194"></a><span class="lineno"> 194</span>&#160; <span class="comment">// TODO: broken</span></div><div class="line"><a name="l00195"></a><span class="lineno"> 195</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">Options::ClusterAnder</a>)</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; <a class="code" href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">Map&lt;std::string, std::string&gt;</a> stats;</div><div class="line"><a name="l00198"></a><span class="lineno"> 198</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PTData.html">PTDataTy</a> *ptd = getPTDataTy();</div><div class="line"><a name="l00199"></a><span class="lineno"> 199</span>&#160; <span class="comment">// TODO: should we use liveOnly?</span></div><div class="line"><a name="l00200"></a><span class="lineno"> 200</span>&#160; <span class="comment">// TODO: parameterise final arg.</span></div><div class="line"><a name="l00201"></a><span class="lineno"> 201</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">NodeIDAllocator::Clusterer::evaluate</a>(*<a class="code" href="classSVF_1_1PointsTo.html#a6c1885ddfcc72604463f7c4ea94d2f74">PointsTo::getCurrentBestNodeMapping</a>(), ptd-&gt;<a class="code" href="classSVF_1_1PTData.html#adbe2b955f119871b54dc502de84b94c4">getAllPts</a>(<span class="keyword">true</span>), stats, <span class="keyword">true</span>);</div><div class="line"><a name="l00202"></a><span class="lineno"> 202</span>&#160; <a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">NodeIDAllocator::Clusterer::printStats</a>(<span class="stringliteral">&quot;post-main&quot;</span>, stats);</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="l00207"></a><span class="lineno"> 207</span>&#160; <span class="comment">// sanitizePts();</span></div><div class="line"><a name="l00208"></a><span class="lineno"> 208</span>&#160; <a class="code" href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">AndersenBase::finalize</a>();</div><div class="line"><a name="l00209"></a><span class="lineno"> 209</span>&#160;}</div><div class="line"><a name="l00210"></a><span class="lineno"> 210</span>&#160;</div><div class="line"><a name="l00214"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1"> 214</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">Andersen::processNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</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; <span class="comment">// sub nodes do not need to be processed</span></div><div class="line"><a name="l00217"></a><span class="lineno"> 217</span>&#160; <span class="keywordflow">if</span> (sccRepNode(nodeId) != nodeId)</div><div class="line"><a name="l00218"></a><span class="lineno"> 218</span>&#160; <span class="keywordflow">return</span>;</div><div class="line"><a name="l00219"></a><span class="lineno"> 219</span>&#160;</div><div class="line"><a name="l00220"></a><span class="lineno"> 220</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00221"></a><span class="lineno"> 221</span>&#160; <span class="keywordtype">double</span> insertStart = stat-&gt;getClk();</div><div class="line"><a name="l00222"></a><span class="lineno"> 222</span>&#160; handleLoadStore(node);</div><div class="line"><a name="l00223"></a><span class="lineno"> 223</span>&#160; <span class="keywordtype">double</span> insertEnd = stat-&gt;getClk();</div><div class="line"><a name="l00224"></a><span class="lineno"> 224</span>&#160; timeOfProcessLoadStore += (insertEnd - insertStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</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="keywordtype">double</span> propStart = stat-&gt;getClk();</div><div class="line"><a name="l00227"></a><span class="lineno"> 227</span>&#160; handleCopyGep(node);</div><div class="line"><a name="l00228"></a><span class="lineno"> 228</span>&#160; <span class="keywordtype">double</span> propEnd = stat-&gt;getClk();</div><div class="line"><a name="l00229"></a><span class="lineno"> 229</span>&#160; timeOfProcessCopyGep += (propEnd - propStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00230"></a><span class="lineno"> 230</span>&#160;}</div><div class="line"><a name="l00231"></a><span class="lineno"> 231</span>&#160;</div><div class="line"><a name="l00235"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e"> 235</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e">Andersen::handleCopyGep</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node)</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; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00238"></a><span class="lineno"> 238</span>&#160; computeDiffPts(nodeId);</div><div class="line"><a name="l00239"></a><span class="lineno"> 239</span>&#160;</div><div class="line"><a name="l00240"></a><span class="lineno"> 240</span>&#160; <span class="keywordflow">if</span> (!getDiffPts(nodeId).<a class="code" href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a>())</div><div class="line"><a name="l00241"></a><span class="lineno"> 241</span>&#160; {</div><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ab77173aa8af6155b569f20ff0cdcec72">getCopyOutEdges</a>())</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; processCopy(nodeId, edge);</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge : node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">getGepOutEdges</a>())</div><div class="line"><a name="l00245"></a><span class="lineno"> 245</span>&#160; {</div><div class="line"><a name="l00246"></a><span class="lineno"> 246</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* gepEdge = SVFUtil::dyn_cast&lt;GepCGEdge&gt;(edge))</div><div class="line"><a name="l00247"></a><span class="lineno"> 247</span>&#160; processGep(nodeId, gepEdge);</div><div class="line"><a name="l00248"></a><span class="lineno"> 248</span>&#160; }</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="l00255"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd"> 255</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd">Andersen::handleLoadStore</a>(<a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> *node)</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"> 257</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>();</div><div class="line"><a name="l00258"></a><span class="lineno"> 258</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> piter = getPts(nodeId).begin(), epiter =</div><div class="line"><a name="l00259"></a><span class="lineno"> 259</span>&#160; getPts(nodeId).end(); piter != epiter; ++piter)</div><div class="line"><a name="l00260"></a><span class="lineno"> 260</span>&#160; {</div><div class="line"><a name="l00261"></a><span class="lineno"> 261</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> ptd = *piter;</div><div class="line"><a name="l00262"></a><span class="lineno"> 262</span>&#160; <span class="comment">// handle load</span></div><div class="line"><a name="l00263"></a><span class="lineno"> 263</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#af69c7e623ab5a36644b6aeabaa1a1e28">outgoingLoadsBegin</a>(),</div><div class="line"><a name="l00264"></a><span class="lineno"> 264</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a134e8ed040d7749c2b9a02662115f746">outgoingLoadsEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00265"></a><span class="lineno"> 265</span>&#160; {</div><div class="line"><a name="l00266"></a><span class="lineno"> 266</span>&#160; <span class="keywordflow">if</span> (processLoad(ptd, *it))</div><div class="line"><a name="l00267"></a><span class="lineno"> 267</span>&#160; pushIntoWorklist(ptd);</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;</div><div class="line"><a name="l00270"></a><span class="lineno"> 270</span>&#160; <span class="comment">// handle store</span></div><div class="line"><a name="l00271"></a><span class="lineno"> 271</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a5a90b39f9e5769bde44a673806270714">incomingStoresBegin</a>(),</div><div class="line"><a name="l00272"></a><span class="lineno"> 272</span>&#160; eit = node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a8d58f5224728bb6811f12c94826167f6">incomingStoresEnd</a>(); it != eit; ++it)</div><div class="line"><a name="l00273"></a><span class="lineno"> 273</span>&#160; {</div><div class="line"><a name="l00274"></a><span class="lineno"> 274</span>&#160; <span class="keywordflow">if</span> (processStore(ptd, *it))</div><div class="line"><a name="l00275"></a><span class="lineno"> 275</span>&#160; pushIntoWorklist((*it)-&gt;getSrcID());</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; }</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;</div><div class="line"><a name="l00283"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10"> 283</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">Andersen::processAllAddr</a>()</div><div class="line"><a name="l00284"></a><span class="lineno"> 284</span>&#160;{</div><div class="line"><a name="l00285"></a><span class="lineno"> 285</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">ConstraintGraph::const_iterator</a> nodeIt = consCG-&gt;begin(), nodeEit = consCG-&gt;end(); nodeIt != nodeEit; nodeIt++)</div><div class="line"><a name="l00286"></a><span class="lineno"> 286</span>&#160; {</div><div class="line"><a name="l00287"></a><span class="lineno"> 287</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a> * cgNode = nodeIt-&gt;second;</div><div class="line"><a name="l00288"></a><span class="lineno"> 288</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">ConstraintNode::const_iterator</a> it = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a19c1ed324f65f4cc58dd2fd21ed4a971">incomingAddrsBegin</a>(), eit = cgNode-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#ae8ac9ad8e766b961c7ce06d7219f37af">incomingAddrsEnd</a>();</div><div class="line"><a name="l00289"></a><span class="lineno"> 289</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00290"></a><span class="lineno"> 290</span>&#160; processAddr(SVFUtil::cast&lt;AddrCGEdge&gt;(*it));</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;}</div><div class="line"><a name="l00293"></a><span class="lineno"> 293</span>&#160;</div><div class="line"><a name="l00297"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c"> 297</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c">Andersen::processAddr</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1AddrCGEdge.html">AddrCGEdge</a>* addr)</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; numOfProcessedAddr++;</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; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00302"></a><span class="lineno"> 302</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = addr-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00303"></a><span class="lineno"> 303</span>&#160; <span class="keywordflow">if</span>(addPts(dst,src))</div><div class="line"><a name="l00304"></a><span class="lineno"> 304</span>&#160; pushIntoWorklist(dst);</div><div class="line"><a name="l00305"></a><span class="lineno"> 305</span>&#160;}</div><div class="line"><a name="l00306"></a><span class="lineno"> 306</span>&#160;</div><div class="line"><a name="l00312"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de"> 312</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">Andersen::processLoad</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* load)</div><div class="line"><a name="l00313"></a><span class="lineno"> 313</span>&#160;{</div><div class="line"><a name="l00317"></a><span class="lineno"> 317</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00318"></a><span class="lineno"> 318</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00319"></a><span class="lineno"> 319</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00320"></a><span class="lineno"> 320</span>&#160;</div><div class="line"><a name="l00321"></a><span class="lineno"> 321</span>&#160; numOfProcessedLoad++;</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="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = load-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00324"></a><span class="lineno"> 324</span>&#160; <span class="keywordflow">return</span> addCopyEdge(node, dst);</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="l00332"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024"> 332</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">Andersen::processStore</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* store)</div><div class="line"><a name="l00333"></a><span class="lineno"> 333</span>&#160;{</div><div class="line"><a name="l00337"></a><span class="lineno"> 337</span>&#160;<span class="comment">// if (pag-&gt;isBlkObjOrConstantObj(node) || isNonPointerObj(node))</span></div><div class="line"><a name="l00338"></a><span class="lineno"> 338</span>&#160; <span class="keywordflow">if</span> (pag-&gt;isConstantObj(node) || isNonPointerObj(node))</div><div class="line"><a name="l00339"></a><span class="lineno"> 339</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</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; numOfProcessedStore++;</div><div class="line"><a name="l00342"></a><span class="lineno"> 342</span>&#160;</div><div class="line"><a name="l00343"></a><span class="lineno"> 343</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> src = store-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>();</div><div class="line"><a name="l00344"></a><span class="lineno"> 344</span>&#160; <span class="keywordflow">return</span> addCopyEdge(src, node);</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;</div><div class="line"><a name="l00352"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2"> 352</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">Andersen::processCopy</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node, <span class="keyword">const</span> <a class="code" href="classSVF_1_1ConstraintEdge.html">ConstraintEdge</a>* edge)</div><div class="line"><a name="l00353"></a><span class="lineno"> 353</span>&#160;{</div><div class="line"><a name="l00354"></a><span class="lineno"> 354</span>&#160; numOfProcessedCopy++;</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; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>((SVFUtil::isa&lt;CopyCGEdge&gt;(edge)) &amp;&amp; <span class="stringliteral">&quot;not copy/call/ret ??&quot;</span>);</div><div class="line"><a name="l00357"></a><span class="lineno"> 357</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dst = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00358"></a><span class="lineno"> 358</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(node);</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="keywordtype">bool</span> changed = unionPts(dst, srcPts);</div><div class="line"><a name="l00361"></a><span class="lineno"> 361</span>&#160; <span class="keywordflow">if</span> (changed)</div><div class="line"><a name="l00362"></a><span class="lineno"> 362</span>&#160; pushIntoWorklist(dst);</div><div class="line"><a name="l00363"></a><span class="lineno"> 363</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00364"></a><span class="lineno"> 364</span>&#160;}</div><div class="line"><a name="l00365"></a><span class="lineno"> 365</span>&#160;</div><div class="line"><a name="l00372"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f"> 372</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">Andersen::processGep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a>, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</div><div class="line"><a name="l00373"></a><span class="lineno"> 373</span>&#160;{</div><div class="line"><a name="l00374"></a><span class="lineno"> 374</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; srcPts = getDiffPts(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>());</div><div class="line"><a name="l00375"></a><span class="lineno"> 375</span>&#160; <span class="keywordflow">return</span> processGepPts(srcPts, edge);</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;</div><div class="line"><a name="l00381"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e"> 381</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e">Andersen::processGepPts</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts, <span class="keyword">const</span> <a class="code" href="classSVF_1_1GepCGEdge.html">GepCGEdge</a>* edge)</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; numOfProcessedGep++;</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; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> tmpDstPts;</div><div class="line"><a name="l00386"></a><span class="lineno"> 386</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;VariantGepCGEdge&gt;(edge))</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; <span class="comment">// If a pointer is connected by a variant gep edge,</span></div><div class="line"><a name="l00389"></a><span class="lineno"> 389</span>&#160; <span class="comment">// then set this memory object to be field insensitive,</span></div><div class="line"><a name="l00390"></a><span class="lineno"> 390</span>&#160; <span class="comment">// unless the object is a black hole/constant.</span></div><div class="line"><a name="l00391"></a><span class="lineno"> 391</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00392"></a><span class="lineno"> 392</span>&#160; {</div><div class="line"><a name="l00393"></a><span class="lineno"> 393</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00394"></a><span class="lineno"> 394</span>&#160; {</div><div class="line"><a name="l00395"></a><span class="lineno"> 395</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00396"></a><span class="lineno"> 396</span>&#160; <span class="keywordflow">continue</span>;</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;</div><div class="line"><a name="l00399"></a><span class="lineno"> 399</span>&#160; <span class="keywordflow">if</span> (!isFieldInsensitive(o))</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; setObjFieldInsensitive(o);</div><div class="line"><a name="l00402"></a><span class="lineno"> 402</span>&#160; consCG-&gt;addNodeToBeCollapsed(consCG-&gt;getBaseObjNode(o));</div><div class="line"><a name="l00403"></a><span class="lineno"> 403</span>&#160; }</div><div class="line"><a name="l00404"></a><span class="lineno"> 404</span>&#160;</div><div class="line"><a name="l00405"></a><span class="lineno"> 405</span>&#160; <span class="comment">// Add the field-insensitive node into pts.</span></div><div class="line"><a name="l00406"></a><span class="lineno"> 406</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG-&gt;getFIObjNode(o);</div><div class="line"><a name="l00407"></a><span class="lineno"> 407</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(baseId);</div><div class="line"><a name="l00408"></a><span class="lineno"> 408</span>&#160; }</div><div class="line"><a name="l00409"></a><span class="lineno"> 409</span>&#160; }</div><div class="line"><a name="l00410"></a><span class="lineno"> 410</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<span class="keyword">const</span> <a class="code" href="classSVF_1_1NormalGepCGEdge.html">NormalGepCGEdge</a>* normalGepEdge = SVFUtil::dyn_cast&lt;NormalGepCGEdge&gt;(edge))</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="comment">// TODO: after the node is set to field insensitive, handling invariant</span></div><div class="line"><a name="l00413"></a><span class="lineno"> 413</span>&#160; <span class="comment">// gep edge may lose precision because offsets here are ignored, and the</span></div><div class="line"><a name="l00414"></a><span class="lineno"> 414</span>&#160; <span class="comment">// base object is always returned.</span></div><div class="line"><a name="l00415"></a><span class="lineno"> 415</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : pts)</div><div class="line"><a name="l00416"></a><span class="lineno"> 416</span>&#160; {</div><div class="line"><a name="l00417"></a><span class="lineno"> 417</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(o))</div><div class="line"><a name="l00418"></a><span class="lineno"> 418</span>&#160; {</div><div class="line"><a name="l00419"></a><span class="lineno"> 419</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(o);</div><div class="line"><a name="l00420"></a><span class="lineno"> 420</span>&#160; <span class="keywordflow">continue</span>;</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; <span class="keywordflow">if</span> (!matchType(edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">getSrcID</a>(), o, normalGepEdge)) <span class="keywordflow">continue</span>;</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; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldSrcPtdNode = consCG-&gt;getGepObjNode(o, normalGepEdge-&gt;getLocationSet());</div><div class="line"><a name="l00426"></a><span class="lineno"> 426</span>&#160; tmpDstPts.<a class="code" href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">set</a>(fieldSrcPtdNode);</div><div class="line"><a name="l00427"></a><span class="lineno"> 427</span>&#160; addTypeForGepObjNode(fieldSrcPtdNode, normalGepEdge);</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="keywordflow">else</span></div><div class="line"><a name="l00431"></a><span class="lineno"> 431</span>&#160; {</div><div class="line"><a name="l00432"></a><span class="lineno"> 432</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;Andersen::processGepPts: New type GEP edge type?&quot;</span>);</div><div class="line"><a name="l00433"></a><span class="lineno"> 433</span>&#160; }</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; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstId = edge-&gt;<a class="code" href="classSVF_1_1GenericEdge.html#ad9edb45e74ae675d9da82f5acf02d56e">getDstID</a>();</div><div class="line"><a name="l00436"></a><span class="lineno"> 436</span>&#160; <span class="keywordflow">if</span> (unionPts(dstId, tmpDstPts))</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; pushIntoWorklist(dstId);</div><div class="line"><a name="l00439"></a><span class="lineno"> 439</span>&#160; <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"><a name="l00440"></a><span class="lineno"> 440</span>&#160; }</div><div class="line"><a name="l00441"></a><span class="lineno"> 441</span>&#160;</div><div class="line"><a name="l00442"></a><span class="lineno"> 442</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00443"></a><span class="lineno"> 443</span>&#160;}</div><div class="line"><a name="l00444"></a><span class="lineno"> 444</span>&#160;</div><div class="line"><a name="l00448"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98"> 448</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98">Andersen::collapsePWCNode</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00449"></a><span class="lineno"> 449</span>&#160;{</div><div class="line"><a name="l00450"></a><span class="lineno"> 450</span>&#160; <span class="comment">// If a node is a PWC node, collapse all its points-to tarsget.</span></div><div class="line"><a name="l00451"></a><span class="lineno"> 451</span>&#160; <span class="comment">// collapseNodePts() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00452"></a><span class="lineno"> 452</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00453"></a><span class="lineno"> 453</span>&#160; <span class="keywordflow">if</span> (mergePWC() &amp;&amp; consCG-&gt;isPWCNode(nodeId) &amp;&amp; collapseNodePts(nodeId))</div><div class="line"><a name="l00454"></a><span class="lineno"> 454</span>&#160; reanalyze = <span class="keyword">true</span>;</div><div class="line"><a name="l00455"></a><span class="lineno"> 455</span>&#160;}</div><div class="line"><a name="l00456"></a><span class="lineno"> 456</span>&#160;</div><div class="line"><a name="l00457"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f"> 457</a></span>&#160;<span class="keyword">inline</span> <span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f">Andersen::collapseFields</a>()</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">while</span> (consCG-&gt;hasNodesToBeCollapsed())</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="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> node = consCG-&gt;getNextCollapseNode();</div><div class="line"><a name="l00462"></a><span class="lineno"> 462</span>&#160; <span class="comment">// collapseField() may change the points-to set of the nodes which have been processed</span></div><div class="line"><a name="l00463"></a><span class="lineno"> 463</span>&#160; <span class="comment">// before, in this case, we may need to re-do the analysis.</span></div><div class="line"><a name="l00464"></a><span class="lineno"> 464</span>&#160; <span class="keywordflow">if</span> (collapseField(node))</div><div class="line"><a name="l00465"></a><span class="lineno"> 465</span>&#160; reanalyze = <span class="keyword">true</span>;</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;}</div><div class="line"><a name="l00468"></a><span class="lineno"> 468</span>&#160;</div><div class="line"><a name="l00469"></a><span class="lineno"> 469</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00470"></a><span class="lineno"> 470</span>&#160;<span class="comment"> * Merge constraint graph nodes based on SCC cycle detected.</span></div><div class="line"><a name="l00471"></a><span class="lineno"> 471</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00472"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef"> 472</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">Andersen::mergeSccCycle</a>()</div><div class="line"><a name="l00473"></a><span class="lineno"> 473</span>&#160;{</div><div class="line"><a name="l00474"></a><span class="lineno"> 474</span>&#160; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> revTopoOrder;</div><div class="line"><a name="l00475"></a><span class="lineno"> 475</span>&#160; <a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a> &amp; topoOrder = getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00476"></a><span class="lineno"> 476</span>&#160; <span class="keywordflow">while</span> (!topoOrder.empty())</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; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId = topoOrder.top();</div><div class="line"><a name="l00479"></a><span class="lineno"> 479</span>&#160; topoOrder.pop();</div><div class="line"><a name="l00480"></a><span class="lineno"> 480</span>&#160; revTopoOrder.push(repNodeId);</div><div class="line"><a name="l00481"></a><span class="lineno"> 481</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>&amp; subNodes = getSCCDetector()-&gt;subNodes(repNodeId);</div><div class="line"><a name="l00482"></a><span class="lineno"> 482</span>&#160; <span class="comment">// merge sub nodes to rep node</span></div><div class="line"><a name="l00483"></a><span class="lineno"> 483</span>&#160; mergeSccNodes(repNodeId, subNodes);</div><div class="line"><a name="l00484"></a><span class="lineno"> 484</span>&#160; }</div><div class="line"><a name="l00485"></a><span class="lineno"> 485</span>&#160;</div><div class="line"><a name="l00486"></a><span class="lineno"> 486</span>&#160; <span class="comment">// restore the topological order for later solving.</span></div><div class="line"><a name="l00487"></a><span class="lineno"> 487</span>&#160; <span class="keywordflow">while</span> (!revTopoOrder.empty())</div><div class="line"><a name="l00488"></a><span class="lineno"> 488</span>&#160; {</div><div class="line"><a name="l00489"></a><span class="lineno"> 489</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId = revTopoOrder.top();</div><div class="line"><a name="l00490"></a><span class="lineno"> 490</span>&#160; revTopoOrder.pop();</div><div class="line"><a name="l00491"></a><span class="lineno"> 491</span>&#160; topoOrder.push(nodeId);</div><div class="line"><a name="l00492"></a><span class="lineno"> 492</span>&#160; }</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="l00500"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a"> 500</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">Andersen::mergeSccNodes</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> repNodeId, <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>&amp; subNodes)</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; <span class="keywordflow">for</span> (NodeBS::iterator nodeIt = subNodes.begin(); nodeIt != subNodes.end(); nodeIt++)</div><div class="line"><a name="l00503"></a><span class="lineno"> 503</span>&#160; {</div><div class="line"><a name="l00504"></a><span class="lineno"> 504</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subNodeId = *nodeIt;</div><div class="line"><a name="l00505"></a><span class="lineno"> 505</span>&#160; <span class="keywordflow">if</span> (subNodeId != repNodeId)</div><div class="line"><a name="l00506"></a><span class="lineno"> 506</span>&#160; {</div><div class="line"><a name="l00507"></a><span class="lineno"> 507</span>&#160; mergeNodeToRep(subNodeId, repNodeId);</div><div class="line"><a name="l00508"></a><span class="lineno"> 508</span>&#160; }</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;}</div><div class="line"><a name="l00511"></a><span class="lineno"> 511</span>&#160;</div><div class="line"><a name="l00515"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e"> 515</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">Andersen::collapseNodePts</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00516"></a><span class="lineno"> 516</span>&#160;{</div><div class="line"><a name="l00517"></a><span class="lineno"> 517</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00518"></a><span class="lineno"> 518</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; nodePts = getPts(nodeId);</div><div class="line"><a name="l00520"></a><span class="lineno"> 520</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a> ptsClone = nodePts;</div><div class="line"><a name="l00521"></a><span class="lineno"> 521</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> ptsIt = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), ptsEit = ptsClone.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>(); ptsIt != ptsEit; ptsIt++)</div><div class="line"><a name="l00522"></a><span class="lineno"> 522</span>&#160; {</div><div class="line"><a name="l00523"></a><span class="lineno"> 523</span>&#160; <span class="keywordflow">if</span> (isFieldInsensitive(*ptsIt))</div><div class="line"><a name="l00524"></a><span class="lineno"> 524</span>&#160; <span class="keywordflow">continue</span>;</div><div class="line"><a name="l00525"></a><span class="lineno"> 525</span>&#160;</div><div class="line"><a name="l00526"></a><span class="lineno"> 526</span>&#160; <span class="keywordflow">if</span> (collapseField(*ptsIt))</div><div class="line"><a name="l00527"></a><span class="lineno"> 527</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00528"></a><span class="lineno"> 528</span>&#160; }</div><div class="line"><a name="l00529"></a><span class="lineno"> 529</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00530"></a><span class="lineno"> 530</span>&#160;}</div><div class="line"><a name="l00531"></a><span class="lineno"> 531</span>&#160;</div><div class="line"><a name="l00535"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61"> 535</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">Andersen::collapseField</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId)</div><div class="line"><a name="l00536"></a><span class="lineno"> 536</span>&#160;{</div><div class="line"><a name="l00541"></a><span class="lineno"> 541</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isBlkObjOrConstantObj(nodeId))</div><div class="line"><a name="l00542"></a><span class="lineno"> 542</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00543"></a><span class="lineno"> 543</span>&#160;</div><div class="line"><a name="l00544"></a><span class="lineno"> 544</span>&#160; <span class="keywordtype">bool</span> changed = <span class="keyword">false</span>;</div><div class="line"><a name="l00545"></a><span class="lineno"> 545</span>&#160;</div><div class="line"><a name="l00546"></a><span class="lineno"> 546</span>&#160; <span class="keywordtype">double</span> start = stat-&gt;getClk();</div><div class="line"><a name="l00547"></a><span class="lineno"> 547</span>&#160;</div><div class="line"><a name="l00548"></a><span class="lineno"> 548</span>&#160; <span class="comment">// set base node field-insensitive.</span></div><div class="line"><a name="l00549"></a><span class="lineno"> 549</span>&#160; setObjFieldInsensitive(nodeId);</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="comment">// replace all occurrences of each field with the field-insensitive node</span></div><div class="line"><a name="l00552"></a><span class="lineno"> 552</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseId = consCG-&gt;getFIObjNode(nodeId);</div><div class="line"><a name="l00553"></a><span class="lineno"> 553</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> baseRepNodeId = consCG-&gt;sccRepNode(baseId);</div><div class="line"><a name="l00554"></a><span class="lineno"> 554</span>&#160; <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> &amp; allFields = consCG-&gt;getAllFieldsObjNode(baseId);</div><div class="line"><a name="l00555"></a><span class="lineno"> 555</span>&#160; <span class="keywordflow">for</span> (NodeBS::iterator fieldIt = allFields.begin(), fieldEit = allFields.end(); fieldIt != fieldEit; fieldIt++)</div><div class="line"><a name="l00556"></a><span class="lineno"> 556</span>&#160; {</div><div class="line"><a name="l00557"></a><span class="lineno"> 557</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldId = *fieldIt;</div><div class="line"><a name="l00558"></a><span class="lineno"> 558</span>&#160; <span class="keywordflow">if</span> (fieldId != baseId)</div><div class="line"><a name="l00559"></a><span class="lineno"> 559</span>&#160; {</div><div class="line"><a name="l00560"></a><span class="lineno"> 560</span>&#160; <span class="comment">// use the reverse pts of this field node to find all pointers point to it</span></div><div class="line"><a name="l00561"></a><span class="lineno"> 561</span>&#160; <span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">NodeSet</a> revPts = getRevPts(fieldId);</div><div class="line"><a name="l00562"></a><span class="lineno"> 562</span>&#160; <span class="keywordflow">for</span> (<span class="keyword">const</span> <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> o : revPts)</div><div class="line"><a name="l00563"></a><span class="lineno"> 563</span>&#160; {</div><div class="line"><a name="l00564"></a><span class="lineno"> 564</span>&#160; <span class="comment">// change the points-to target from field to base node</span></div><div class="line"><a name="l00565"></a><span class="lineno"> 565</span>&#160; clearPts(o, fieldId);</div><div class="line"><a name="l00566"></a><span class="lineno"> 566</span>&#160; addPts(o, baseId);</div><div class="line"><a name="l00567"></a><span class="lineno"> 567</span>&#160; pushIntoWorklist(o);</div><div class="line"><a name="l00568"></a><span class="lineno"> 568</span>&#160;</div><div class="line"><a name="l00569"></a><span class="lineno"> 569</span>&#160; changed = <span class="keyword">true</span>;</div><div class="line"><a name="l00570"></a><span class="lineno"> 570</span>&#160; }</div><div class="line"><a name="l00571"></a><span class="lineno"> 571</span>&#160; <span class="comment">// merge field node into base node, including edges and pts.</span></div><div class="line"><a name="l00572"></a><span class="lineno"> 572</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> fieldRepNodeId = consCG-&gt;sccRepNode(fieldId);</div><div class="line"><a name="l00573"></a><span class="lineno"> 573</span>&#160; <span class="keywordflow">if</span> (fieldRepNodeId != baseRepNodeId){</div><div class="line"><a name="l00574"></a><span class="lineno"> 574</span>&#160; mergeNodeToRep(fieldRepNodeId, baseRepNodeId);</div><div class="line"><a name="l00575"></a><span class="lineno"> 575</span>&#160;</div><div class="line"><a name="l00576"></a><span class="lineno"> 576</span>&#160; <span class="comment">// gep node fieldId becomes redundant if it is merged to its base node who is set as field-insensitive</span></div><div class="line"><a name="l00577"></a><span class="lineno"> 577</span>&#160; redundantGepNodes.set(fieldId);</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="l00580"></a><span class="lineno"> 580</span>&#160; }</div><div class="line"><a name="l00581"></a><span class="lineno"> 581</span>&#160;</div><div class="line"><a name="l00582"></a><span class="lineno"> 582</span>&#160; <span class="keywordflow">if</span> (consCG-&gt;isPWCNode(baseRepNodeId))</div><div class="line"><a name="l00583"></a><span class="lineno"> 583</span>&#160; <span class="keywordflow">if</span> (collapseNodePts(baseRepNodeId))</div><div class="line"><a name="l00584"></a><span class="lineno"> 584</span>&#160; changed = <span class="keyword">true</span>;</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="keywordtype">double</span> end = stat-&gt;getClk();</div><div class="line"><a name="l00587"></a><span class="lineno"> 587</span>&#160; timeOfCollapse += (end - start) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00588"></a><span class="lineno"> 588</span>&#160;</div><div class="line"><a name="l00589"></a><span class="lineno"> 589</span>&#160; <span class="keywordflow">return</span> changed;</div><div class="line"><a name="l00590"></a><span class="lineno"> 590</span>&#160;}</div><div class="line"><a name="l00591"></a><span class="lineno"> 591</span>&#160;</div><div class="line"><a name="l00595"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc"> 595</a></span>&#160;<a class="code" href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">NodeStack</a>&amp; <a class="code" href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">Andersen::SCCDetect</a>()</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; numOfSCCDetection++;</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="keywordtype">double</span> sccStart = stat-&gt;getClk();</div><div class="line"><a name="l00600"></a><span class="lineno"> 600</span>&#160; <a class="code" href="classSVF_1_1WPASolver.html#aaa932894d00b69cfa741f9987a9cc6b8">WPAConstraintSolver::SCCDetect</a>();</div><div class="line"><a name="l00601"></a><span class="lineno"> 601</span>&#160; <span class="keywordtype">double</span> sccEnd = stat-&gt;getClk();</div><div class="line"><a name="l00602"></a><span class="lineno"> 602</span>&#160;</div><div class="line"><a name="l00603"></a><span class="lineno"> 603</span>&#160; timeOfSCCDetection += (sccEnd - sccStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00604"></a><span class="lineno"> 604</span>&#160;</div><div class="line"><a name="l00605"></a><span class="lineno"> 605</span>&#160; <span class="keywordtype">double</span> mergeStart = stat-&gt;getClk();</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; mergeSccCycle();</div><div class="line"><a name="l00608"></a><span class="lineno"> 608</span>&#160;</div><div class="line"><a name="l00609"></a><span class="lineno"> 609</span>&#160; <span class="keywordtype">double</span> mergeEnd = stat-&gt;getClk();</div><div class="line"><a name="l00610"></a><span class="lineno"> 610</span>&#160;</div><div class="line"><a name="l00611"></a><span class="lineno"> 611</span>&#160; timeOfSCCMerges += (mergeEnd - mergeStart)/<a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00612"></a><span class="lineno"> 612</span>&#160;</div><div class="line"><a name="l00613"></a><span class="lineno"> 613</span>&#160; <span class="keywordflow">return</span> getSCCDetector()-&gt;topoNodeStack();</div><div class="line"><a name="l00614"></a><span class="lineno"> 614</span>&#160;}</div><div class="line"><a name="l00615"></a><span class="lineno"> 615</span>&#160;</div><div class="line"><a name="l00619"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"> 619</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b">Andersen::updateCallGraph</a>(<span class="keyword">const</span> <a class="code" href="classSVF_1_1PointerAnalysis.html#afc2e412fe96c1fad268ba0255a2042e7">CallSiteToFunPtrMap</a>&amp; callsites)</div><div class="line"><a name="l00620"></a><span class="lineno"> 620</span>&#160;{</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="keywordtype">double</span> cgUpdateStart = stat-&gt;getClk();</div><div class="line"><a name="l00623"></a><span class="lineno"> 623</span>&#160;</div><div class="line"><a name="l00624"></a><span class="lineno"> 624</span>&#160; <a class="code" href="classSVF_1_1PointerAnalysis.html#aa9661d26d1ae9c829a9296d1b6d874f4">CallEdgeMap</a> newEdges;</div><div class="line"><a name="l00625"></a><span class="lineno"> 625</span>&#160; onTheFlyCallGraphSolve(callsites,newEdges);</div><div class="line"><a name="l00626"></a><span class="lineno"> 626</span>&#160; <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> cpySrcNodes; </div><div class="line"><a name="l00627"></a><span class="lineno"> 627</span>&#160; <span class="keywordflow">for</span>(CallEdgeMap::iterator it = newEdges.begin(), eit = newEdges.end(); it!=eit; ++it )</div><div class="line"><a name="l00628"></a><span class="lineno"> 628</span>&#160; {</div><div class="line"><a name="l00629"></a><span class="lineno"> 629</span>&#160; <a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs = <a class="code" href="namespaceSVF_1_1SVFUtil.html#a202de7ad2bea0311e2f75894c030e7a9">SVFUtil::getLLVMCallSite</a>(it-&gt;first-&gt;getCallSite());</div><div class="line"><a name="l00630"></a><span class="lineno"> 630</span>&#160; <span class="keywordflow">for</span>(FunctionSet::iterator cit = it-&gt;second.begin(), ecit = it-&gt;second.end(); cit!=ecit; ++cit)</div><div class="line"><a name="l00631"></a><span class="lineno"> 631</span>&#160; {</div><div class="line"><a name="l00632"></a><span class="lineno"> 632</span>&#160; connectCaller2CalleeParams(cs,*cit,cpySrcNodes);</div><div class="line"><a name="l00633"></a><span class="lineno"> 633</span>&#160; }</div><div class="line"><a name="l00634"></a><span class="lineno"> 634</span>&#160; }</div><div class="line"><a name="l00635"></a><span class="lineno"> 635</span>&#160; <span class="keywordflow">for</span>(NodePairSet::iterator it = cpySrcNodes.begin(), eit = cpySrcNodes.end(); it!=eit; ++it)</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; pushIntoWorklist(it-&gt;first);</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; <span class="keywordtype">double</span> cgUpdateEnd = stat-&gt;getClk();</div><div class="line"><a name="l00641"></a><span class="lineno"> 641</span>&#160; timeOfUpdateCallGraph += (cgUpdateEnd - cgUpdateStart) / <a class="code" href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a>;</div><div class="line"><a name="l00642"></a><span class="lineno"> 642</span>&#160;</div><div class="line"><a name="l00643"></a><span class="lineno"> 643</span>&#160; <span class="keywordflow">return</span> (!newEdges.empty());</div><div class="line"><a name="l00644"></a><span class="lineno"> 644</span>&#160;}</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"><a class="line" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07"> 646</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07">Andersen::heapAllocatorViaIndCall</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</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; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVFUtil::getCallee</a>(cs) == <span class="keyword">nullptr</span> &amp;&amp; <span class="stringliteral">&quot;not an indirect callsite?&quot;</span>);</div><div class="line"><a name="l00649"></a><span class="lineno"> 649</span>&#160; <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00650"></a><span class="lineno"> 650</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00651"></a><span class="lineno"> 651</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret;</div><div class="line"><a name="l00652"></a><span class="lineno"> 652</span>&#160; CallSite2DummyValPN::const_iterator it = callsite2DummyValPN.find(cs);</div><div class="line"><a name="l00653"></a><span class="lineno"> 653</span>&#160; <span class="keywordflow">if</span>(it != callsite2DummyValPN.end())</div><div class="line"><a name="l00654"></a><span class="lineno"> 654</span>&#160; {</div><div class="line"><a name="l00655"></a><span class="lineno"> 655</span>&#160; srcret = sccRepNode(it-&gt;second);</div><div class="line"><a name="l00656"></a><span class="lineno"> 656</span>&#160; }</div><div class="line"><a name="l00657"></a><span class="lineno"> 657</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00658"></a><span class="lineno"> 658</span>&#160; {</div><div class="line"><a name="l00659"></a><span class="lineno"> 659</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> valNode = pag-&gt;addDummyValNode();</div><div class="line"><a name="l00660"></a><span class="lineno"> 660</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> objNode = pag-&gt;addDummyObjNode(cs.<a class="code" href="classSVF_1_1CallSite.html#a9b7d53a345875e4e6c72eb23ac6475de">getType</a>());</div><div class="line"><a name="l00661"></a><span class="lineno"> 661</span>&#160; addPts(valNode,objNode);</div><div class="line"><a name="l00662"></a><span class="lineno"> 662</span>&#160; callsite2DummyValPN.insert(std::make_pair(cs,valNode));</div><div class="line"><a name="l00663"></a><span class="lineno"> 663</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(valNode),valNode);</div><div class="line"><a name="l00664"></a><span class="lineno"> 664</span>&#160; consCG-&gt;addConstraintNode(<span class="keyword">new</span> <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>(objNode),objNode);</div><div class="line"><a name="l00665"></a><span class="lineno"> 665</span>&#160; srcret = valNode;</div><div class="line"><a name="l00666"></a><span class="lineno"> 666</span>&#160; }</div><div class="line"><a name="l00667"></a><span class="lineno"> 667</span>&#160;</div><div class="line"><a name="l00668"></a><span class="lineno"> 668</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00669"></a><span class="lineno"> 669</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00670"></a><span class="lineno"> 670</span>&#160; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</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;</div><div class="line"><a name="l00676"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf"> 676</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf">Andersen::connectCaller2CalleeParams</a>(<a class="code" href="classSVF_1_1CallSite.html">CallSite</a> cs, <span class="keyword">const</span> <a class="code" href="classSVF_1_1SVFFunction.html">SVFFunction</a>* F, <a class="code" href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">NodePairSet</a> &amp;cpySrcNodes)</div><div class="line"><a name="l00677"></a><span class="lineno"> 677</span>&#160;{</div><div class="line"><a name="l00678"></a><span class="lineno"> 678</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(F);</div><div class="line"><a name="l00679"></a><span class="lineno"> 679</span>&#160;</div><div class="line"><a name="l00680"></a><span class="lineno"> 680</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;connect parameters from indirect callsite &quot;</span> &lt;&lt; *cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>() &lt;&lt; <span class="stringliteral">&quot; to callee &quot;</span> &lt;&lt; *F &lt;&lt; <span class="stringliteral">&quot;\n&quot;</span>);</div><div class="line"><a name="l00681"></a><span class="lineno"> 681</span>&#160;</div><div class="line"><a name="l00682"></a><span class="lineno"> 682</span>&#160; <a class="code" href="classSVF_1_1CallBlockNode.html">CallBlockNode</a>* callBlockNode = pag-&gt;getICFG()-&gt;getCallBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00683"></a><span class="lineno"> 683</span>&#160; <a class="code" href="classSVF_1_1RetBlockNode.html">RetBlockNode</a>* retBlockNode = pag-&gt;getICFG()-&gt;getRetBlockNode(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>());</div><div class="line"><a name="l00684"></a><span class="lineno"> 684</span>&#160;</div><div class="line"><a name="l00685"></a><span class="lineno"> 685</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="namespaceSVF_1_1SVFUtil.html#a19b96a872d9096037f20e25122e469ea">SVFUtil::isHeapAllocExtFunViaRet</a>(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</div><div class="line"><a name="l00686"></a><span class="lineno"> 686</span>&#160; {</div><div class="line"><a name="l00687"></a><span class="lineno"> 687</span>&#160; heapAllocatorViaIndCall(cs,cpySrcNodes);</div><div class="line"><a name="l00688"></a><span class="lineno"> 688</span>&#160; }</div><div class="line"><a name="l00689"></a><span class="lineno"> 689</span>&#160;</div><div class="line"><a name="l00690"></a><span class="lineno"> 690</span>&#160; <span class="keywordflow">if</span> (pag-&gt;funHasRet(F) &amp;&amp; pag-&gt;callsiteHasRet(retBlockNode))</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="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* cs_return = pag-&gt;getCallSiteRet(retBlockNode);</div><div class="line"><a name="l00693"></a><span class="lineno"> 693</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* fun_return = pag-&gt;getFunRet(F);</div><div class="line"><a name="l00694"></a><span class="lineno"> 694</span>&#160; <span class="keywordflow">if</span> (cs_return-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() &amp;&amp; fun_return-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00695"></a><span class="lineno"> 695</span>&#160; {</div><div class="line"><a name="l00696"></a><span class="lineno"> 696</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstrec = sccRepNode(cs_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00697"></a><span class="lineno"> 697</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcret = sccRepNode(fun_return-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00698"></a><span class="lineno"> 698</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcret, dstrec))</div><div class="line"><a name="l00699"></a><span class="lineno"> 699</span>&#160; {</div><div class="line"><a name="l00700"></a><span class="lineno"> 700</span>&#160; cpySrcNodes.insert(std::make_pair(srcret,dstrec));</div><div class="line"><a name="l00701"></a><span class="lineno"> 701</span>&#160; }</div><div class="line"><a name="l00702"></a><span class="lineno"> 702</span>&#160; }</div><div class="line"><a name="l00703"></a><span class="lineno"> 703</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00704"></a><span class="lineno"> 704</span>&#160; {</div><div class="line"><a name="l00705"></a><span class="lineno"> 705</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;not a pointer ignored\n&quot;</span>);</div><div class="line"><a name="l00706"></a><span class="lineno"> 706</span>&#160; }</div><div class="line"><a name="l00707"></a><span class="lineno"> 707</span>&#160; }</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="keywordflow">if</span> (pag-&gt;hasCallSiteArgsMap(callBlockNode) &amp;&amp; pag-&gt;hasFunArgsList(F))</div><div class="line"><a name="l00710"></a><span class="lineno"> 710</span>&#160; {</div><div class="line"><a name="l00711"></a><span class="lineno"> 711</span>&#160;</div><div class="line"><a name="l00712"></a><span class="lineno"> 712</span>&#160; <span class="comment">// connect actual and formal param</span></div><div class="line"><a name="l00713"></a><span class="lineno"> 713</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>&amp; csArgList = pag-&gt;getCallSiteArgsList(callBlockNode);</div><div class="line"><a name="l00714"></a><span class="lineno"> 714</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">PAG::PAGNodeList</a>&amp; funArgList = pag-&gt;getFunArgsList(F);</div><div class="line"><a name="l00715"></a><span class="lineno"> 715</span>&#160; <span class="comment">//Go through the fixed parameters.</span></div><div class="line"><a name="l00716"></a><span class="lineno"> 716</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot; args:&quot;</span>);</div><div class="line"><a name="l00717"></a><span class="lineno"> 717</span>&#160; PAG::PAGNodeList::const_iterator funArgIt = funArgList.begin(), funArgEit = funArgList.end();</div><div class="line"><a name="l00718"></a><span class="lineno"> 718</span>&#160; PAG::PAGNodeList::const_iterator csArgIt = csArgList.begin(), csArgEit = csArgList.end();</div><div class="line"><a name="l00719"></a><span class="lineno"> 719</span>&#160; <span class="keywordflow">for</span> (; funArgIt != funArgEit; ++csArgIt, ++funArgIt)</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">//Some programs (e.g. Linux kernel) leave unneeded parameters empty.</span></div><div class="line"><a name="l00722"></a><span class="lineno"> 722</span>&#160; <span class="keywordflow">if</span> (csArgIt == csArgEit)</div><div class="line"><a name="l00723"></a><span class="lineno"> 723</span>&#160; {</div><div class="line"><a name="l00724"></a><span class="lineno"> 724</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot; !! not enough args\n&quot;</span>);</div><div class="line"><a name="l00725"></a><span class="lineno"> 725</span>&#160; <span class="keywordflow">break</span>;</div><div class="line"><a name="l00726"></a><span class="lineno"> 726</span>&#160; }</div><div class="line"><a name="l00727"></a><span class="lineno"> 727</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt ;</div><div class="line"><a name="l00728"></a><span class="lineno"> 728</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *fun_arg = *funArgIt;</div><div class="line"><a name="l00729"></a><span class="lineno"> 729</span>&#160;</div><div class="line"><a name="l00730"></a><span class="lineno"> 730</span>&#160; <span class="keywordflow">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>() &amp;&amp; fun_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00731"></a><span class="lineno"> 731</span>&#160; {</div><div class="line"><a name="l00732"></a><span class="lineno"> 732</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;process actual parm &quot;</span> &lt;&lt; cs_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#a2a9a5feb62138307b0b6f901cb5e0e0f">toString</a>() &lt;&lt; <span class="stringliteral">&quot; \n&quot;</span>);</div><div class="line"><a name="l00733"></a><span class="lineno"> 733</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> srcAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00734"></a><span class="lineno"> 734</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> dstFA = sccRepNode(fun_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00735"></a><span class="lineno"> 735</span>&#160; <span class="keywordflow">if</span>(addCopyEdge(srcAA, dstFA))</div><div class="line"><a name="l00736"></a><span class="lineno"> 736</span>&#160; {</div><div class="line"><a name="l00737"></a><span class="lineno"> 737</span>&#160; cpySrcNodes.insert(std::make_pair(srcAA,dstFA));</div><div class="line"><a name="l00738"></a><span class="lineno"> 738</span>&#160; }</div><div class="line"><a name="l00739"></a><span class="lineno"> 739</span>&#160; }</div><div class="line"><a name="l00740"></a><span class="lineno"> 740</span>&#160; }</div><div class="line"><a name="l00741"></a><span class="lineno"> 741</span>&#160;</div><div class="line"><a name="l00742"></a><span class="lineno"> 742</span>&#160; <span class="comment">//Any remaining actual args must be varargs.</span></div><div class="line"><a name="l00743"></a><span class="lineno"> 743</span>&#160; <span class="keywordflow">if</span> (F-&gt;<a class="code" href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">isVarArg</a>())</div><div class="line"><a name="l00744"></a><span class="lineno"> 744</span>&#160; {</div><div class="line"><a name="l00745"></a><span class="lineno"> 745</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vaF = sccRepNode(pag-&gt;getVarargNode(F));</div><div class="line"><a name="l00746"></a><span class="lineno"> 746</span>&#160; <a class="code" href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a>(<a class="code" href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a>, <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\n varargs:&quot;</span>);</div><div class="line"><a name="l00747"></a><span class="lineno"> 747</span>&#160; <span class="keywordflow">for</span> (; csArgIt != csArgEit; ++csArgIt)</div><div class="line"><a name="l00748"></a><span class="lineno"> 748</span>&#160; {</div><div class="line"><a name="l00749"></a><span class="lineno"> 749</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a> *cs_arg = *csArgIt;</div><div class="line"><a name="l00750"></a><span class="lineno"> 750</span>&#160; <span class="keywordflow">if</span> (cs_arg-&gt;<a class="code" href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">isPointer</a>())</div><div class="line"><a name="l00751"></a><span class="lineno"> 751</span>&#160; {</div><div class="line"><a name="l00752"></a><span class="lineno"> 752</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> vnAA = sccRepNode(cs_arg-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00753"></a><span class="lineno"> 753</span>&#160; <span class="keywordflow">if</span> (addCopyEdge(vnAA,vaF))</div><div class="line"><a name="l00754"></a><span class="lineno"> 754</span>&#160; {</div><div class="line"><a name="l00755"></a><span class="lineno"> 755</span>&#160; cpySrcNodes.insert(std::make_pair(vnAA,vaF));</div><div class="line"><a name="l00756"></a><span class="lineno"> 756</span>&#160; }</div><div class="line"><a name="l00757"></a><span class="lineno"> 757</span>&#160; }</div><div class="line"><a name="l00758"></a><span class="lineno"> 758</span>&#160; }</div><div class="line"><a name="l00759"></a><span class="lineno"> 759</span>&#160; }</div><div class="line"><a name="l00760"></a><span class="lineno"> 760</span>&#160; <span class="keywordflow">if</span>(csArgIt != csArgEit)</div><div class="line"><a name="l00761"></a><span class="lineno"> 761</span>&#160; {</div><div class="line"><a name="l00762"></a><span class="lineno"> 762</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;too many args to non-vararg func.&quot;</span>);</div><div class="line"><a name="l00763"></a><span class="lineno"> 763</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">writeWrnMsg</a>(<span class="stringliteral">&quot;(&quot;</span> + <a class="code" href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">getSourceLoc</a>(cs.<a class="code" href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">getInstruction</a>()) + <span class="stringliteral">&quot;)&quot;</span>);</div><div class="line"><a name="l00764"></a><span class="lineno"> 764</span>&#160; }</div><div class="line"><a name="l00765"></a><span class="lineno"> 765</span>&#160; }</div><div class="line"><a name="l00766"></a><span class="lineno"> 766</span>&#160;}</div><div class="line"><a name="l00767"></a><span class="lineno"> 767</span>&#160;</div><div class="line"><a name="l00771"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e"> 771</a></span>&#160;<span class="keywordtype">bool</span> <a class="code" href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">Andersen::mergeSrcToTgt</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00772"></a><span class="lineno"> 772</span>&#160;{</div><div class="line"><a name="l00773"></a><span class="lineno"> 773</span>&#160;</div><div class="line"><a name="l00774"></a><span class="lineno"> 774</span>&#160; <span class="keywordflow">if</span>(nodeId==newRepId)</div><div class="line"><a name="l00775"></a><span class="lineno"> 775</span>&#160; <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"><a name="l00776"></a><span class="lineno"> 776</span>&#160;</div><div class="line"><a name="l00778"></a><span class="lineno"> 778</span>&#160; updatePropaPts(newRepId, nodeId);</div><div class="line"><a name="l00779"></a><span class="lineno"> 779</span>&#160; unionPts(newRepId,nodeId);</div><div class="line"><a name="l00780"></a><span class="lineno"> 780</span>&#160;</div><div class="line"><a name="l00782"></a><span class="lineno"> 782</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00783"></a><span class="lineno"> 783</span>&#160; <span class="keywordtype">bool</span> gepInsideScc = consCG-&gt;moveEdgesToRepNode(node, consCG-&gt;getConstraintNode(newRepId));</div><div class="line"><a name="l00784"></a><span class="lineno"> 784</span>&#160;</div><div class="line"><a name="l00786"></a><span class="lineno"> 786</span>&#160; updateNodeRepAndSubs(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>(),newRepId);</div><div class="line"><a name="l00787"></a><span class="lineno"> 787</span>&#160;</div><div class="line"><a name="l00788"></a><span class="lineno"> 788</span>&#160; consCG-&gt;removeConstraintNode(node);</div><div class="line"><a name="l00789"></a><span class="lineno"> 789</span>&#160;</div><div class="line"><a name="l00790"></a><span class="lineno"> 790</span>&#160; <span class="keywordflow">return</span> gepInsideScc;</div><div class="line"><a name="l00791"></a><span class="lineno"> 791</span>&#160;}</div><div class="line"><a name="l00792"></a><span class="lineno"> 792</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00793"></a><span class="lineno"> 793</span>&#160;<span class="comment"> * Merge a node to its rep node based on SCC detection</span></div><div class="line"><a name="l00794"></a><span class="lineno"> 794</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00795"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848"> 795</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">Andersen::mergeNodeToRep</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId,<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00796"></a><span class="lineno"> 796</span>&#160;{</div><div class="line"><a name="l00797"></a><span class="lineno"> 797</span>&#160;</div><div class="line"><a name="l00798"></a><span class="lineno"> 798</span>&#160; <a class="code" href="classSVF_1_1ConstraintNode.html">ConstraintNode</a>* node = consCG-&gt;getConstraintNode(nodeId);</div><div class="line"><a name="l00799"></a><span class="lineno"> 799</span>&#160; <span class="keywordtype">bool</span> gepInsideScc = mergeSrcToTgt(nodeId,newRepId);</div><div class="line"><a name="l00804"></a><span class="lineno"> 804</span>&#160; <span class="keywordflow">if</span> (gepInsideScc || node-&gt;<a class="code" href="classSVF_1_1ConstraintNode.html#a0ffe4f1ca1a6f70466cc1c6b3b12c90d">isPWCNode</a>())</div><div class="line"><a name="l00805"></a><span class="lineno"> 805</span>&#160; consCG-&gt;setPWCNode(newRepId);</div><div class="line"><a name="l00806"></a><span class="lineno"> 806</span>&#160;}</div><div class="line"><a name="l00807"></a><span class="lineno"> 807</span>&#160;</div><div class="line"><a name="l00808"></a><span class="lineno"> 808</span>&#160;<span class="comment">/*</span></div><div class="line"><a name="l00809"></a><span class="lineno"> 809</span>&#160;<span class="comment"> * Updates subnodes of its rep, and rep node of its subs</span></div><div class="line"><a name="l00810"></a><span class="lineno"> 810</span>&#160;<span class="comment"> */</span></div><div class="line"><a name="l00811"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18"> 811</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">Andersen::updateNodeRepAndSubs</a>(<a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> nodeId, <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> newRepId)</div><div class="line"><a name="l00812"></a><span class="lineno"> 812</span>&#160;{</div><div class="line"><a name="l00813"></a><span class="lineno"> 813</span>&#160; consCG-&gt;setRep(nodeId,newRepId);</div><div class="line"><a name="l00814"></a><span class="lineno"> 814</span>&#160; <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a> repSubs;</div><div class="line"><a name="l00815"></a><span class="lineno"> 815</span>&#160; repSubs.set(nodeId);</div><div class="line"><a name="l00817"></a><span class="lineno"> 817</span>&#160; <span class="comment">// update nodeToSubsMap, union its subs with its rep Subs</span></div><div class="line"><a name="l00818"></a><span class="lineno"> 818</span>&#160; <a class="code" href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">NodeBS</a>&amp; nodeSubs = consCG-&gt;sccSubNodes(nodeId);</div><div class="line"><a name="l00819"></a><span class="lineno"> 819</span>&#160; <span class="keywordflow">for</span>(NodeBS::iterator sit = nodeSubs.begin(), esit = nodeSubs.end(); sit!=esit; ++sit)</div><div class="line"><a name="l00820"></a><span class="lineno"> 820</span>&#160; {</div><div class="line"><a name="l00821"></a><span class="lineno"> 821</span>&#160; <a class="code" href="namespaceSVF.html#a43a65e0d33af3c743294f7a1139d2301">NodeID</a> subId = *sit;</div><div class="line"><a name="l00822"></a><span class="lineno"> 822</span>&#160; consCG-&gt;setRep(subId,newRepId);</div><div class="line"><a name="l00823"></a><span class="lineno"> 823</span>&#160; }</div><div class="line"><a name="l00824"></a><span class="lineno"> 824</span>&#160; repSubs |= nodeSubs;</div><div class="line"><a name="l00825"></a><span class="lineno"> 825</span>&#160; consCG-&gt;setSubs(newRepId,repSubs);</div><div class="line"><a name="l00826"></a><span class="lineno"> 826</span>&#160; consCG-&gt;resetSubs(nodeId);</div><div class="line"><a name="l00827"></a><span class="lineno"> 827</span>&#160;}</div><div class="line"><a name="l00828"></a><span class="lineno"> 828</span>&#160;</div><div class="line"><a name="l00829"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf"> 829</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf">Andersen::cluster</a>(<span class="keywordtype">void</span>)<span class="keyword"> const</span></div><div class="line"><a name="l00830"></a><span class="lineno"> 830</span>&#160;<span class="keyword"></span>{</div><div class="line"><a name="l00831"></a><span class="lineno"> 831</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<a class="code" href="classSVF_1_1Options.html#adfc1a5c6098d3867e29fc65ca9ffa1cc">Options::MaxFieldLimit</a> == 0 &amp;&amp; <span class="stringliteral">&quot;Andersen::cluster: clustering for Andersen&#39;s is currently only supported in field-insesnsitive analysis&quot;</span>);</div><div class="line"><a name="l00832"></a><span class="lineno"> 832</span>&#160; <a class="code" href="classSVF_1_1Steensgaard.html">Steensgaard</a> *steens = <a class="code" href="classSVF_1_1Steensgaard.html#a33714348b5ed79d579039014f3092b87">Steensgaard::createSteensgaard</a>(pag);</div><div class="line"><a name="l00833"></a><span class="lineno"> 833</span>&#160; std::vector&lt;std::pair&lt;unsigned, unsigned&gt;&gt; keys;</div><div class="line"><a name="l00834"></a><span class="lineno"> 834</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">PAG::iterator</a> pit = pag-&gt;begin(); pit != pag-&gt;end(); ++pit)</div><div class="line"><a name="l00835"></a><span class="lineno"> 835</span>&#160; {</div><div class="line"><a name="l00836"></a><span class="lineno"> 836</span>&#160; keys.push_back(std::make_pair(pit-&gt;first, 1));</div><div class="line"><a name="l00837"></a><span class="lineno"> 837</span>&#160; }</div><div class="line"><a name="l00838"></a><span class="lineno"> 838</span>&#160;</div><div class="line"><a name="l00839"></a><span class="lineno"> 839</span>&#160; std::vector&lt;std::pair&lt;hclust_fast_methods, std::vector&lt;NodeID&gt;&gt;&gt; candidates;</div><div class="line"><a name="l00840"></a><span class="lineno"> 840</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> nodeMapping =</div><div class="line"><a name="l00841"></a><span class="lineno"> 841</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">NodeIDAllocator::Clusterer::cluster</a>(steens, keys, candidates, <span class="stringliteral">&quot;aux-steens&quot;</span>));</div><div class="line"><a name="l00842"></a><span class="lineno"> 842</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">PointsTo::MappingPtr</a> reverseNodeMapping =</div><div class="line"><a name="l00843"></a><span class="lineno"> 843</span>&#160; std::make_shared&lt;std::vector&lt;NodeID&gt;&gt;(<a class="code" href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">NodeIDAllocator::Clusterer::getReverseNodeMapping</a>(*nodeMapping));</div><div class="line"><a name="l00844"></a><span class="lineno"> 844</span>&#160;</div><div class="line"><a name="l00845"></a><span class="lineno"> 845</span>&#160; <a class="code" href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">PointsTo::setCurrentBestNodeMapping</a>(nodeMapping, reverseNodeMapping);</div><div class="line"><a name="l00846"></a><span class="lineno"> 846</span>&#160;}</div><div class="line"><a name="l00847"></a><span class="lineno"> 847</span>&#160;</div><div class="line"><a name="l00851"></a><span class="lineno"><a class="line" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a"> 851</a></span>&#160;<span class="keywordtype">void</span> <a class="code" href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">Andersen::dumpTopLevelPtsTo</a>()</div><div class="line"><a name="l00852"></a><span class="lineno"> 852</span>&#160;{</div><div class="line"><a name="l00853"></a><span class="lineno"> 853</span>&#160; <span class="keywordflow">for</span> (OrderedNodeSet::iterator nIter = this-&gt;getAllValidPtrs().begin();</div><div class="line"><a name="l00854"></a><span class="lineno"> 854</span>&#160; nIter != this-&gt;getAllValidPtrs().end(); ++nIter)</div><div class="line"><a name="l00855"></a><span class="lineno"> 855</span>&#160; {</div><div class="line"><a name="l00856"></a><span class="lineno"> 856</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGNode.html">PAGNode</a>* node = getPAG()-&gt;getPAGNode(*nIter);</div><div class="line"><a name="l00857"></a><span class="lineno"> 857</span>&#160; <span class="keywordflow">if</span> (getPAG()-&gt;isValidTopLevelPtr(node))</div><div class="line"><a name="l00858"></a><span class="lineno"> 858</span>&#160; {</div><div class="line"><a name="l00859"></a><span class="lineno"> 859</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PointsTo.html">PointsTo</a>&amp; pts = this-&gt;getPts(node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>());</div><div class="line"><a name="l00860"></a><span class="lineno"> 860</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\nNodeID &quot;</span> &lt;&lt; node-&gt;<a class="code" href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">getId</a>() &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00861"></a><span class="lineno"> 861</span>&#160;</div><div class="line"><a name="l00862"></a><span class="lineno"> 862</span>&#160; <span class="keywordflow">if</span> (pts.<a class="code" href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">empty</a>())</div><div class="line"><a name="l00863"></a><span class="lineno"> 863</span>&#160; {</div><div class="line"><a name="l00864"></a><span class="lineno"> 864</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: {empty}\n\n&quot;</span>;</div><div class="line"><a name="l00865"></a><span class="lineno"> 865</span>&#160; }</div><div class="line"><a name="l00866"></a><span class="lineno"> 866</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00867"></a><span class="lineno"> 867</span>&#160; {</div><div class="line"><a name="l00868"></a><span class="lineno"> 868</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;\t\tPointsTo: { &quot;</span>;</div><div class="line"><a name="l00869"></a><span class="lineno"> 869</span>&#160;</div><div class="line"><a name="l00870"></a><span class="lineno"> 870</span>&#160; multiset&lt;Size_t&gt; line;</div><div class="line"><a name="l00871"></a><span class="lineno"> 871</span>&#160; <span class="keywordflow">for</span> (<a class="code" href="classSVF_1_1PointsTo_1_1PointsToIterator.html">PointsTo::iterator</a> it = pts.<a class="code" href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">begin</a>(), eit = pts.<a class="code" href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">end</a>();</div><div class="line"><a name="l00872"></a><span class="lineno"> 872</span>&#160; it != eit; ++it)</div><div class="line"><a name="l00873"></a><span class="lineno"> 873</span>&#160; {</div><div class="line"><a name="l00874"></a><span class="lineno"> 874</span>&#160; line.insert(*it);</div><div class="line"><a name="l00875"></a><span class="lineno"> 875</span>&#160; }</div><div class="line"><a name="l00876"></a><span class="lineno"> 876</span>&#160; <span class="keywordflow">for</span> (multiset&lt;Size_t&gt;::const_iterator it = line.begin(); it != line.end(); ++it)</div><div class="line"><a name="l00877"></a><span class="lineno"> 877</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; *it &lt;&lt; <span class="stringliteral">&quot; &quot;</span>;</div><div class="line"><a name="l00878"></a><span class="lineno"> 878</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>() &lt;&lt; <span class="stringliteral">&quot;}\n\n&quot;</span>;</div><div class="line"><a name="l00879"></a><span class="lineno"> 879</span>&#160; }</div><div class="line"><a name="l00880"></a><span class="lineno"> 880</span>&#160; }</div><div class="line"><a name="l00881"></a><span class="lineno"> 881</span>&#160; }</div><div class="line"><a name="l00882"></a><span class="lineno"> 882</span>&#160;</div><div class="line"><a name="l00883"></a><span class="lineno"> 883</span>&#160; <a class="code" href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">outs</a>().flush();</div><div class="line"><a name="l00884"></a><span class="lineno"> 884</span>&#160;}</div><div class="line"><a name="l00885"></a><span class="lineno"> 885</span>&#160;</div><div class="ttc" id="Andersen_8h_html"><div class="ttname"><a href="Andersen_8h.html">Andersen.h</a></div></div>
70
70
  <div class="ttc" id="classSVF_1_1AndersenBase_html_aae14de6fbca9280d8d0290326aa493f0"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#aae14de6fbca9280d8d0290326aa493f0">SVF::AndersenBase::timeOfProcessCopyGep</a></div><div class="ttdeci">static double timeOfProcessCopyGep</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00142">Andersen.h:142</a></div></div>
71
- <div class="ttc" id="classSVF_1_1Andersen_html_af4a0d960ef198047517bb32ee1e24a61"><div class="ttname"><a href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">SVF::Andersen::collapseField</a></div><div class="ttdeci">bool collapseField(NodeID nodeId)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00520">Andersen.cpp:520</a></div></div>
71
+ <div class="ttc" id="classSVF_1_1Andersen_html_af4a0d960ef198047517bb32ee1e24a61"><div class="ttname"><a href="classSVF_1_1Andersen.html#af4a0d960ef198047517bb32ee1e24a61">SVF::Andersen::collapseField</a></div><div class="ttdeci">bool collapseField(NodeID nodeId)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00535">Andersen.cpp:535</a></div></div>
72
72
  <div class="ttc" id="classSVF_1_1PAGNode_html_a2a9a5feb62138307b0b6f901cb5e0e0f"><div class="ttname"><a href="classSVF_1_1PAGNode.html#a2a9a5feb62138307b0b6f901cb5e0e0f">SVF::PAGNode::toString</a></div><div class="ttdeci">virtual const std::string toString() const</div><div class="ttdef"><b>Definition:</b> <a href="PAG_8cpp_source.html#l00046">PAG.cpp:46</a></div></div>
73
73
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a891816407a4c6346f56bc01a67b78aac"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a891816407a4c6346f56bc01a67b78aac">SVF::AndersenBase::initialize</a></div><div class="ttdeci">virtual void initialize() override</div><div class="ttdoc">Initialize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00064">Andersen.cpp:64</a></div></div>
74
74
  <div class="ttc" id="namespaceSVF_html_a212231734fa43d5c7414137deaac7df3"><div class="ttname"><a href="namespaceSVF.html#a212231734fa43d5c7414137deaac7df3">SVF::NodeSet</a></div><div class="ttdeci">Set&lt; NodeID &gt; NodeSet</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00116">SVFBasicTypes.h:116</a></div></div>
@@ -79,16 +79,18 @@ $(function() {
79
79
  <div class="ttc" id="classSVF_1_1ConstraintGraph_html"><div class="ttname"><a href="classSVF_1_1ConstraintGraph.html">SVF::ConstraintGraph</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsG_8h_source.html#l00044">ConsG.h:44</a></div></div>
80
80
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a609eea630a8f88fe9eaba15ce7e48738"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a609eea630a8f88fe9eaba15ce7e48738">SVF::SVFUtil::pasMsg</a></div><div class="ttdeci">std::string pasMsg(std::string msg)</div><div class="ttdoc">Print each pass/phase message by converting a string into blue string output. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00101">SVFUtil.cpp:101</a></div></div>
81
81
  <div class="ttc" id="namespaceSVF_html_a1811127aebdb9c926e39d155e20b3dc0"><div class="ttname"><a href="namespaceSVF.html#a1811127aebdb9c926e39d155e20b3dc0">SVF::NodeStack</a></div><div class="ttdeci">std::stack&lt; NodeID &gt; NodeStack</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00121">SVFBasicTypes.h:121</a></div></div>
82
+ <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_acbbc5c04c79846fe1cc46a3bd5a65aba"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#acbbc5c04c79846fe1cc46a3bd5a65aba">SVF::NodeIDAllocator::Clusterer::evaluate</a></div><div class="ttdeci">static void evaluate(const std::vector&lt; NodeID &gt; &amp;nodeMap, const Map&lt; PointsTo, unsigned &gt; pointsToSets, Map&lt; std::string, std::string &gt; &amp;stats, bool accountForOcc)</div><div class="ttdoc">Fills in *NumWords statistics in stats.. </div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00560">NodeIDAllocator.cpp:560</a></div></div>
82
83
  <div class="ttc" id="classSVF_1_1NormalGepCGEdge_html"><div class="ttname"><a href="classSVF_1_1NormalGepCGEdge.html">SVF::NormalGepCGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsGEdge_8h_source.html#l00265">ConsGEdge.h:265</a></div></div>
83
84
  <div class="ttc" id="util_8h_html_a07d17d6d5d1074c0969bc5d3c3d1d84a"><div class="ttname"><a href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a></div><div class="ttdeci">#define assert(ex)</div><div class="ttdef"><b>Definition:</b> <a href="util_8h_source.html#l00141">util.h:141</a></div></div>
84
85
  <div class="ttc" id="classSVF_1_1PointsTo_1_1PointsToIterator_html"><div class="ttname"><a href="classSVF_1_1PointsTo_1_1PointsToIterator.html">SVF::PointsTo::PointsToIterator</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00174">PointsTo.h:174</a></div></div>
85
86
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_ab1868f04de44f6fe1e9ac14f3d4ee56b"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#ab1868f04de44f6fe1e9ac14f3d4ee56b">SVF::ConstraintNode::const_iterator</a></div><div class="ttdeci">ConstraintEdge::ConstraintEdgeSetTy::const_iterator const_iterator</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00045">ConsGNode.h:45</a></div></div>
86
87
  <div class="ttc" id="classSVF_1_1GenericEdge_html_ae6792506a0150a9400d635eceab7f9e7"><div class="ttname"><a href="classSVF_1_1GenericEdge.html#ae6792506a0150a9400d635eceab7f9e7">SVF::GenericEdge::getSrcID</a></div><div class="ttdeci">NodeID getSrcID() const</div><div class="ttdoc">get methods of the components </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00073">GenericGraph.h:73</a></div></div>
87
88
  <div class="ttc" id="classSVF_1_1SVFFunction_html"><div class="ttname"><a href="classSVF_1_1SVFFunction.html">SVF::SVFFunction</a></div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00233">BasicTypes.h:233</a></div></div>
88
- <div class="ttc" id="classSVF_1_1Andersen_html_a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"><div class="ttname"><a href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b">SVF::Andersen::updateCallGraph</a></div><div class="ttdeci">virtual bool updateCallGraph(const CallSiteToFunPtrMap &amp;callsites)</div><div class="ttdoc">Update call graph for the input indirect callsites. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00604">Andersen.cpp:604</a></div></div>
89
+ <div class="ttc" id="classSVF_1_1Andersen_html_a6c60b761ddf3d6bf08c8a9c3f6fd9f0b"><div class="ttname"><a href="classSVF_1_1Andersen.html#a6c60b761ddf3d6bf08c8a9c3f6fd9f0b">SVF::Andersen::updateCallGraph</a></div><div class="ttdeci">virtual bool updateCallGraph(const CallSiteToFunPtrMap &amp;callsites)</div><div class="ttdoc">Update call graph for the input indirect callsites. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00619">Andersen.cpp:619</a></div></div>
89
90
  <div class="ttc" id="classSVF_1_1GepCGEdge_html"><div class="ttname"><a href="classSVF_1_1GepCGEdge.html">SVF::GepCGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsGEdge_8h_source.html#l00225">ConsGEdge.h:225</a></div></div>
90
91
  <div class="ttc" id="classSVF_1_1WPASolver_html_aaa932894d00b69cfa741f9987a9cc6b8"><div class="ttname"><a href="classSVF_1_1WPASolver.html#aaa932894d00b69cfa741f9987a9cc6b8">SVF::WPASolver::SCCDetect</a></div><div class="ttdeci">virtual NodeStack &amp; SCCDetect()</div><div class="ttdoc">SCC detection. </div><div class="ttdef"><b>Definition:</b> <a href="WPASolver_8h_source.html#l00091">WPASolver.h:91</a></div></div>
91
92
  <div class="ttc" id="cuddInt_8c_html_a5beb39637a978181c7c17714ac96672e"><div class="ttname"><a href="cuddInt_8c.html#a5beb39637a978181c7c17714ac96672e">empty</a></div><div class="ttdeci">static DdNode * empty</div><div class="ttdef"><b>Definition:</b> <a href="cuddInt_8c_source.html#l28567">cuddInt.c:28567</a></div></div>
93
+ <div class="ttc" id="classSVF_1_1Options_html_adfc1a5c6098d3867e29fc65ca9ffa1cc"><div class="ttname"><a href="classSVF_1_1Options.html#adfc1a5c6098d3867e29fc65ca9ffa1cc">SVF::Options::MaxFieldLimit</a></div><div class="ttdeci">static const llvm::cl::opt&lt; unsigned &gt; MaxFieldLimit</div><div class="ttdoc">Maximum number of field derivations for an object. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00034">Options.h:34</a></div></div>
92
94
  <div class="ttc" id="classSVF_1_1CallSite_html_ab36a6a35eea673d4bdca615efc4336b1"><div class="ttname"><a href="classSVF_1_1CallSite.html#ab36a6a35eea673d4bdca615efc4336b1">SVF::CallSite::getInstruction</a></div><div class="ttdeci">CallBase * getInstruction() const</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00320">BasicTypes.h:320</a></div></div>
93
95
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a28c0ede7e4765d2a686fc8ae0f5641a4"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a28c0ede7e4765d2a686fc8ae0f5641a4">SVF::SVFUtil::getSourceLoc</a></div><div class="ttdeci">std::string getSourceLoc(const Value *val)</div><div class="ttdoc">Return source code including line number and file name from debug information. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00269">SVFUtil.cpp:269</a></div></div>
94
96
  <div class="ttc" id="namespaceSVF_html_ac82022f3f81965c3ce9b26c299f537a7"><div class="ttname"><a href="namespaceSVF.html#ac82022f3f81965c3ce9b26c299f537a7">SVF::NodePairSet</a></div><div class="ttdeci">Set&lt; NodePair &gt; NodePairSet</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00117">SVFBasicTypes.h:117</a></div></div>
@@ -96,57 +98,67 @@ $(function() {
96
98
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a02c5a50b214d36921e1404784e76704d"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a02c5a50b214d36921e1404784e76704d">SVF::AndersenBase::timeOfSCCMerges</a></div><div class="ttdeci">static double timeOfSCCMerges</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00138">Andersen.h:138</a></div></div>
97
99
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_a5a90b39f9e5769bde44a673806270714"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#a5a90b39f9e5769bde44a673806270714">SVF::ConstraintNode::incomingStoresBegin</a></div><div class="ttdeci">const_iterator incomingStoresBegin() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00283">ConsGNode.h:283</a></div></div>
98
100
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a944966086ecb716184c8cdcc43db5751"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a944966086ecb716184c8cdcc43db5751">SVF::AndersenBase::analyze</a></div><div class="ttdeci">virtual void analyze() override</div><div class="ttdoc">Andersen analysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00094">Andersen.cpp:94</a></div></div>
101
+ <div class="ttc" id="namespaceSVF_html_a8234d4b959abc9123993bcff4eee34c1"><div class="ttname"><a href="namespaceSVF.html#a8234d4b959abc9123993bcff4eee34c1">SVF::Map</a></div><div class="ttdeci">std::unordered_map&lt; Key, Value, Hash, KeyEqual, Allocator &gt; Map</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00101">SVFBasicTypes.h:101</a></div></div>
99
102
  <div class="ttc" id="classSVF_1_1GenericGraph_html_a5dfa3f178d4abf37177d0d74ff4c6a97"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#a5dfa3f178d4abf37177d0d74ff4c6a97">SVF::GenericGraph&lt; ConstraintNode, ConstraintEdge &gt;::const_iterator</a></div><div class="ttdeci">IDToNodeMapTy::const_iterator const_iterator</div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00338">GenericGraph.h:338</a></div></div>
100
103
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a9d7b6e602e1764f76583824dddebf985"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a9d7b6e602e1764f76583824dddebf985">SVF::AndersenBase::numOfProcessedCopy</a></div><div class="ttdeci">static Size_t numOfProcessedCopy</div><div class="ttdoc">Number of processed Addr edge. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00129">Andersen.h:129</a></div></div>
101
- <div class="ttc" id="classSVF_1_1Andersen_html_acd54e3edace1f41511c8f0a6a68dac18"><div class="ttname"><a href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">SVF::Andersen::updateNodeRepAndSubs</a></div><div class="ttdeci">void updateNodeRepAndSubs(NodeID nodeId, NodeID newRepId)</div><div class="ttdoc">Updates subnodes of its rep, and rep node of its subs. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00796">Andersen.cpp:796</a></div></div>
102
- <div class="ttc" id="classSVF_1_1Andersen_html_aca095e135edb5d27efe76bb7ee71184c"><div class="ttname"><a href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c">SVF::Andersen::processAddr</a></div><div class="ttdeci">virtual void processAddr(const AddrCGEdge *addr)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00282">Andersen.cpp:282</a></div></div>
104
+ <div class="ttc" id="classSVF_1_1Andersen_html_acd54e3edace1f41511c8f0a6a68dac18"><div class="ttname"><a href="classSVF_1_1Andersen.html#acd54e3edace1f41511c8f0a6a68dac18">SVF::Andersen::updateNodeRepAndSubs</a></div><div class="ttdeci">void updateNodeRepAndSubs(NodeID nodeId, NodeID newRepId)</div><div class="ttdoc">Updates subnodes of its rep, and rep node of its subs. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00811">Andersen.cpp:811</a></div></div>
105
+ <div class="ttc" id="classSVF_1_1Andersen_html_aca095e135edb5d27efe76bb7ee71184c"><div class="ttname"><a href="classSVF_1_1Andersen.html#aca095e135edb5d27efe76bb7ee71184c">SVF::Andersen::processAddr</a></div><div class="ttdeci">virtual void processAddr(const AddrCGEdge *addr)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00297">Andersen.cpp:297</a></div></div>
103
106
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a077caa1b10ab84d101d79fc7ea50db2d"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a077caa1b10ab84d101d79fc7ea50db2d">SVF::SVFUtil::writeWrnMsg</a></div><div class="ttdeci">void writeWrnMsg(std::string msg)</div><div class="ttdoc">Writes a message run through wrnMsg. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00069">SVFUtil.cpp:69</a></div></div>
104
- <div class="ttc" id="classSVF_1_1Andersen_html_ac22a6946de30bc5887b9e4ec9259764f"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f">SVF::Andersen::collapseFields</a></div><div class="ttdeci">void collapseFields()</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00442">Andersen.cpp:442</a></div></div>
107
+ <div class="ttc" id="classSVF_1_1Andersen_html_ac22a6946de30bc5887b9e4ec9259764f"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac22a6946de30bc5887b9e4ec9259764f">SVF::Andersen::collapseFields</a></div><div class="ttdeci">void collapseFields()</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00457">Andersen.cpp:457</a></div></div>
108
+ <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_ac10cbda6a84ce890c9946a5ff35800b7"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#ac10cbda6a84ce890c9946a5ff35800b7">SVF::NodeIDAllocator::Clusterer::printStats</a></div><div class="ttdeci">static void printStats(std::string title, Map&lt; std::string, std::string &gt; &amp;stats)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00678">NodeIDAllocator.cpp:678</a></div></div>
105
109
  <div class="ttc" id="classSVF_1_1AndersenBase_html_abdc249ea291d0247f6b91a8fcc7df341"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#abdc249ea291d0247f6b91a8fcc7df341">SVF::AndersenBase::AveragePointsToSetSize</a></div><div class="ttdeci">static Size_t AveragePointsToSetSize</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00140">Andersen.h:140</a></div></div>
106
- <div class="ttc" id="classSVF_1_1Andersen_html_ac262d42d45dc6130cb031d5b0ed1f024"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">SVF::Andersen::processStore</a></div><div class="ttdeci">virtual bool processStore(NodeID node, const ConstraintEdge *load)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00317">Andersen.cpp:317</a></div></div>
110
+ <div class="ttc" id="classSVF_1_1Andersen_html_ac262d42d45dc6130cb031d5b0ed1f024"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac262d42d45dc6130cb031d5b0ed1f024">SVF::Andersen::processStore</a></div><div class="ttdeci">virtual bool processStore(NodeID node, const ConstraintEdge *load)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00332">Andersen.cpp:332</a></div></div>
111
+ <div class="ttc" id="classSVF_1_1PTData_html"><div class="ttname"><a href="classSVF_1_1PTData.html">SVF::PTData</a></div><div class="ttdef"><b>Definition:</b> <a href="AbstractPointsToDS_8h_source.html#l00040">AbstractPointsToDS.h:40</a></div></div>
107
112
  <div class="ttc" id="classSVF_1_1Options_html_a69a7d0431c0ddfefed1cb97f3571303a"><div class="ttname"><a href="classSVF_1_1Options.html#a69a7d0431c0ddfefed1cb97f3571303a">SVF::Options::ConsCGDotGraph</a></div><div class="ttdeci">static const llvm::cl::opt&lt; bool &gt; ConsCGDotGraph</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00220">Options.h:220</a></div></div>
108
113
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a118dabc50024b5cd91095814ade47166"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a118dabc50024b5cd91095814ade47166">SVF::PointerAnalysis::finalize</a></div><div class="ttdeci">virtual void finalize()</div><div class="ttdoc">Finalization of a pointer analysis, including checking alias correctness. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8cpp_source.html#l00222">PointerAnalysis.cpp:222</a></div></div>
114
+ <div class="ttc" id="classSVF_1_1PointsTo_html_a849f670b38cb6f65fc23707a212591c7"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a849f670b38cb6f65fc23707a212591c7">SVF::PointsTo::MappingPtr</a></div><div class="ttdeci">std::shared_ptr&lt; std::vector&lt; NodeID &gt; &gt; MappingPtr</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00041">PointsTo.h:41</a></div></div>
109
115
  <div class="ttc" id="classSVF_1_1PointsTo_html_aa53962e561399bf493d1f2b9137356f6"><div class="ttname"><a href="classSVF_1_1PointsTo.html#aa53962e561399bf493d1f2b9137356f6">SVF::PointsTo::begin</a></div><div class="ttdeci">const_iterator begin(void) const</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00127">PointsTo.h:127</a></div></div>
110
116
  <div class="ttc" id="classSVF_1_1AndersenBase_html_aa31bc83cdeaa30dd0975976e29a5be12"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#aa31bc83cdeaa30dd0975976e29a5be12">SVF::AndersenBase::numOfSfrs</a></div><div class="ttdeci">static Size_t numOfSfrs</div><div class="ttdoc">Number of processed Store edge. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00133">Andersen.h:133</a></div></div>
111
- <div class="ttc" id="classSVF_1_1Andersen_html_a1caa6fa0740f4fa789d960a5a6fcb9c1"><div class="ttname"><a href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">SVF::Andersen::processNode</a></div><div class="ttdeci">virtual void processNode(NodeID nodeId)</div><div class="ttdoc">Override WPASolver function in order to use the default solver. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00199">Andersen.cpp:199</a></div></div>
112
- <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a757815a2c758695176120509ceb0ce70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a757815a2c758695176120509ceb0ce70">SVF::SVFUtil::startAnalysisLimitTimer</a></div><div class="ttdeci">bool startAnalysisLimitTimer(unsigned timeLimit)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00403">SVFUtil.cpp:403</a></div></div>
113
- <div class="ttc" id="classSVF_1_1Andersen_html_a7b1b9e9b25b5643440aca77e23a8de07"><div class="ttname"><a href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07">SVF::Andersen::heapAllocatorViaIndCall</a></div><div class="ttdeci">void heapAllocatorViaIndCall(CallSite cs, NodePairSet &amp;cpySrcNodes)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00631">Andersen.cpp:631</a></div></div>
114
- <div class="ttc" id="classSVF_1_1Andersen_html_a43858bd242c7f2c5f33c3c0f6445376a"><div class="ttname"><a href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">SVF::Andersen::dumpTopLevelPtsTo</a></div><div class="ttdeci">void dumpTopLevelPtsTo()</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00817">Andersen.cpp:817</a></div></div>
117
+ <div class="ttc" id="classSVF_1_1GenericGraph_html_ac213302cf5c7cdf3b66f7b18649d0fbc"><div class="ttname"><a href="classSVF_1_1GenericGraph.html#ac213302cf5c7cdf3b66f7b18649d0fbc">SVF::GenericGraph&lt; PAGNode, PAGEdge &gt;::iterator</a></div><div class="ttdeci">IDToNodeMapTy::iterator iterator</div><div class="ttdoc">Node Iterators. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00337">GenericGraph.h:337</a></div></div>
118
+ <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a33d502a0bd49307cd824e34b73157b9b"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a33d502a0bd49307cd824e34b73157b9b">SVF::NodeIDAllocator::Clusterer::cluster</a></div><div class="ttdeci">static std::vector&lt; NodeID &gt; cluster(BVDataPTAImpl *pta, const std::vector&lt; std::pair&lt; NodeID, unsigned &gt;&gt; keys, std::vector&lt; std::pair&lt; hclust_fast_methods, std::vector&lt; NodeID &gt;&gt;&gt; &amp;candidates, std::string evalSubtitle=&quot;&quot;)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00174">NodeIDAllocator.cpp:174</a></div></div>
119
+ <div class="ttc" id="classSVF_1_1Andersen_html_a1caa6fa0740f4fa789d960a5a6fcb9c1"><div class="ttname"><a href="classSVF_1_1Andersen.html#a1caa6fa0740f4fa789d960a5a6fcb9c1">SVF::Andersen::processNode</a></div><div class="ttdeci">virtual void processNode(NodeID nodeId)</div><div class="ttdoc">Override WPASolver function in order to use the default solver. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00214">Andersen.cpp:214</a></div></div>
120
+ <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a757815a2c758695176120509ceb0ce70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a757815a2c758695176120509ceb0ce70">SVF::SVFUtil::startAnalysisLimitTimer</a></div><div class="ttdeci">bool startAnalysisLimitTimer(unsigned timeLimit)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00422">SVFUtil.cpp:422</a></div></div>
121
+ <div class="ttc" id="classSVF_1_1Andersen_html_a7b1b9e9b25b5643440aca77e23a8de07"><div class="ttname"><a href="classSVF_1_1Andersen.html#a7b1b9e9b25b5643440aca77e23a8de07">SVF::Andersen::heapAllocatorViaIndCall</a></div><div class="ttdeci">void heapAllocatorViaIndCall(CallSite cs, NodePairSet &amp;cpySrcNodes)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00646">Andersen.cpp:646</a></div></div>
122
+ <div class="ttc" id="classSVF_1_1Andersen_html_a43858bd242c7f2c5f33c3c0f6445376a"><div class="ttname"><a href="classSVF_1_1Andersen.html#a43858bd242c7f2c5f33c3c0f6445376a">SVF::Andersen::dumpTopLevelPtsTo</a></div><div class="ttdeci">void dumpTopLevelPtsTo()</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00851">Andersen.cpp:851</a></div></div>
115
123
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a5f1b0711583aa8947dfb4619658f1904"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a5f1b0711583aa8947dfb4619658f1904">SVF::AndersenBase::numOfProcessedLoad</a></div><div class="ttdeci">static Size_t numOfProcessedLoad</div><div class="ttdoc">Number of processed Gep edge. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00131">Andersen.h:131</a></div></div>
116
124
  <div class="ttc" id="namespaceSVF_html_a2db29836a72e8d86e9baa6d8d55d2978"><div class="ttname"><a href="namespaceSVF.html#a2db29836a72e8d86e9baa6d8d55d2978">SVF::Size_t</a></div><div class="ttdeci">signed long Size_t</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00078">SVFBasicTypes.h:78</a></div></div>
117
125
  <div class="ttc" id="classSVF_1_1Andersen_html_a20617a69c112ad423b1b5021e48a8548"><div class="ttname"><a href="classSVF_1_1Andersen.html#a20617a69c112ad423b1b5021e48a8548">SVF::Andersen::initialize</a></div><div class="ttdeci">virtual void initialize()</div><div class="ttdoc">Initialize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00175">Andersen.cpp:175</a></div></div>
118
126
  <div class="ttc" id="classSVF_1_1PointsTo_html_ac4688413177b49b37dbbfd3ed188d59b"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ac4688413177b49b37dbbfd3ed188d59b">SVF::PointsTo::empty</a></div><div class="ttdeci">bool empty(void) const</div><div class="ttdoc">Returns true if set is empty. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00094">PointsTo.cpp:94</a></div></div>
119
127
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a70e60ce2e6f4cfd575c6f5c974ca1081"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a70e60ce2e6f4cfd575c6f5c974ca1081">SVF::AndersenBase::numOfProcessedAddr</a></div><div class="ttdeci">static Size_t numOfProcessedAddr</div><div class="ttdoc">Statistics. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00128">Andersen.h:128</a></div></div>
128
+ <div class="ttc" id="classSVF_1_1Steensgaard_html_a33714348b5ed79d579039014f3092b87"><div class="ttname"><a href="classSVF_1_1Steensgaard.html#a33714348b5ed79d579039014f3092b87">SVF::Steensgaard::createSteensgaard</a></div><div class="ttdeci">static Steensgaard * createSteensgaard(PAG *_pag)</div><div class="ttdoc">Create an singleton instance. </div><div class="ttdef"><b>Definition:</b> <a href="Steensgaard_8h_source.html#l00035">Steensgaard.h:35</a></div></div>
120
129
  <div class="ttc" id="classSVF_1_1RetBlockNode_html"><div class="ttname"><a href="classSVF_1_1RetBlockNode.html">SVF::RetBlockNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ICFGNode_8h_source.html#l00459">ICFGNode.h:459</a></div></div>
121
130
  <div class="ttc" id="classSVF_1_1PAG_html_a1aedb70211aa31a4741615e611d64397"><div class="ttname"><a href="classSVF_1_1PAG.html#a1aedb70211aa31a4741615e611d64397">SVF::PAG::PAGNodeList</a></div><div class="ttdeci">std::vector&lt; const PAGNode * &gt; PAGNodeList</div><div class="ttdef"><b>Definition:</b> <a href="PAG_8h_source.html#l00057">PAG.h:57</a></div></div>
122
131
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a6b7d0e57f741c446d0bf178939960143"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a6b7d0e57f741c446d0bf178939960143">SVF::AndersenBase::timeOfSCCDetection</a></div><div class="ttdeci">static double timeOfSCCDetection</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00137">Andersen.h:137</a></div></div>
132
+ <div class="ttc" id="classSVF_1_1Steensgaard_html"><div class="ttname"><a href="classSVF_1_1Steensgaard.html">SVF::Steensgaard</a></div><div class="ttdef"><b>Definition:</b> <a href="Steensgaard_8h_source.html#l00020">Steensgaard.h:20</a></div></div>
123
133
  <div class="ttc" id="classSVF_1_1Options_html_a98a521e5c99c5248eae8f8234453b116"><div class="ttname"><a href="classSVF_1_1Options.html#a98a521e5c99c5248eae8f8234453b116">SVF::Options::ReadAnder</a></div><div class="ttdeci">static const llvm::cl::opt&lt; std ::string &gt; ReadAnder</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00226">Options.h:226</a></div></div>
124
134
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a145abbd2958629718fbca41d25c3124d"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a145abbd2958629718fbca41d25c3124d">SVF::SVFUtil::getCallee</a></div><div class="ttdeci">const SVFFunction * getCallee(const CallSite cs)</div><div class="ttdoc">Return callee of a callsite. Return null if this is an indirect call. </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00257">SVFUtil.h:257</a></div></div>
125
135
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_a0ffe4f1ca1a6f70466cc1c6b3b12c90d"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#a0ffe4f1ca1a6f70466cc1c6b3b12c90d">SVF::ConstraintNode::isPWCNode</a></div><div class="ttdeci">bool isPWCNode() const</div><div class="ttdoc">Whether a node involves in PWC, if so, all its points-to elements should become field-insensitive. </div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00094">ConsGNode.h:94</a></div></div>
126
136
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_a8d58f5224728bb6811f12c94826167f6"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#a8d58f5224728bb6811f12c94826167f6">SVF::ConstraintNode::incomingStoresEnd</a></div><div class="ttdeci">const_iterator incomingStoresEnd() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00287">ConsGNode.h:287</a></div></div>
127
137
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a2afb49f513c9534fd051117b59dc056b"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a2afb49f513c9534fd051117b59dc056b">SVF::AndersenBase::timeOfUpdateCallGraph</a></div><div class="ttdeci">static double timeOfUpdateCallGraph</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00144">Andersen.h:144</a></div></div>
138
+ <div class="ttc" id="classSVF_1_1PointsTo_html_a6c1885ddfcc72604463f7c4ea94d2f74"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a6c1885ddfcc72604463f7c4ea94d2f74">SVF::PointsTo::getCurrentBestNodeMapping</a></div><div class="ttdeci">static MappingPtr getCurrentBestNodeMapping(void)</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00345">PointsTo.cpp:345</a></div></div>
128
139
  <div class="ttc" id="PointsTo_8h_html"><div class="ttname"><a href="PointsTo_8h.html">PointsTo.h</a></div></div>
129
140
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a19b96a872d9096037f20e25122e469ea"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a19b96a872d9096037f20e25122e469ea">SVF::SVFUtil::isHeapAllocExtFunViaRet</a></div><div class="ttdeci">bool isHeapAllocExtFunViaRet(const SVFFunction *fun)</div><div class="ttdoc">Return true if the call is a heap allocator/reallocator. </div><div class="ttdef"><b>Definition:</b> <a href="LLVMUtil_8h_source.html#l00082">LLVMUtil.h:82</a></div></div>
130
141
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a28a1c3571cdee5e05004b29ace364e67"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a28a1c3571cdee5e05004b29ace364e67">SVF::AndersenBase::finalize</a></div><div class="ttdeci">virtual void finalize() override</div><div class="ttdoc">Finalize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00080">Andersen.cpp:80</a></div></div>
131
- <div class="ttc" id="classSVF_1_1Andersen_html_ac4afe532655c3f311143ebbe15175ca2"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">SVF::Andersen::processCopy</a></div><div class="ttdeci">virtual bool processCopy(NodeID node, const ConstraintEdge *edge)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00337">Andersen.cpp:337</a></div></div>
142
+ <div class="ttc" id="classSVF_1_1Andersen_html_ac4afe532655c3f311143ebbe15175ca2"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac4afe532655c3f311143ebbe15175ca2">SVF::Andersen::processCopy</a></div><div class="ttdeci">virtual bool processCopy(NodeID node, const ConstraintEdge *edge)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00352">Andersen.cpp:352</a></div></div>
132
143
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_a134e8ed040d7749c2b9a02662115f746"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#a134e8ed040d7749c2b9a02662115f746">SVF::ConstraintNode::outgoingLoadsEnd</a></div><div class="ttdeci">const_iterator outgoingLoadsEnd() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00262">ConsGNode.h:262</a></div></div>
133
- <div class="ttc" id="classSVF_1_1PointsTo_html_ab196d86cfb48d1c5d27a0c03c7497afa"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">SVF::PointsTo::set</a></div><div class="ttdeci">void set(u32_t n)</div><div class="ttdoc">Inserts n in the set. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00137">PointsTo.cpp:137</a></div></div>
144
+ <div class="ttc" id="classSVF_1_1PointsTo_html_ab196d86cfb48d1c5d27a0c03c7497afa"><div class="ttname"><a href="classSVF_1_1PointsTo.html#ab196d86cfb48d1c5d27a0c03c7497afa">SVF::PointsTo::set</a></div><div class="ttdeci">void set(u32_t n)</div><div class="ttdoc">Inserts n in the set. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00149">PointsTo.cpp:149</a></div></div>
134
145
  <div class="ttc" id="classSVF_1_1ConstraintNode_html"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html">SVF::ConstraintNode</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00040">ConsGNode.h:40</a></div></div>
135
146
  <div class="ttc" id="SVFBasicTypes_8h_html_a1aeda3370621dc00e9a0fe8e7aabc736"><div class="ttname"><a href="SVFBasicTypes_8h.html#a1aeda3370621dc00e9a0fe8e7aabc736">TIMEINTERVAL</a></div><div class="ttdeci">#define TIMEINTERVAL</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00171">SVFBasicTypes.h:171</a></div></div>
136
147
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_ab77173aa8af6155b569f20ff0cdcec72"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#ab77173aa8af6155b569f20ff0cdcec72">SVF::ConstraintNode::getCopyOutEdges</a></div><div class="ttdeci">const ConstraintEdge::ConstraintEdgeSetTy &amp; getCopyOutEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00128">ConsGNode.h:128</a></div></div>
137
- <div class="ttc" id="classSVF_1_1Andersen_html_a3f0048155f0b3a6899dac6f30553aa9e"><div class="ttname"><a href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">SVF::Andersen::collapseNodePts</a></div><div class="ttdeci">bool collapseNodePts(NodeID nodeId)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00500">Andersen.cpp:500</a></div></div>
138
- <div class="ttc" id="classSVF_1_1Andersen_html_a36729160041bc3a3e2b0a92b29062848"><div class="ttname"><a href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">SVF::Andersen::mergeNodeToRep</a></div><div class="ttdeci">virtual void mergeNodeToRep(NodeID nodeId, NodeID newRepId)</div><div class="ttdoc">Merge sub node to its rep. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00780">Andersen.cpp:780</a></div></div>
148
+ <div class="ttc" id="classSVF_1_1Andersen_html_a3f0048155f0b3a6899dac6f30553aa9e"><div class="ttname"><a href="classSVF_1_1Andersen.html#a3f0048155f0b3a6899dac6f30553aa9e">SVF::Andersen::collapseNodePts</a></div><div class="ttdeci">bool collapseNodePts(NodeID nodeId)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00515">Andersen.cpp:515</a></div></div>
149
+ <div class="ttc" id="classSVF_1_1Andersen_html_a36729160041bc3a3e2b0a92b29062848"><div class="ttname"><a href="classSVF_1_1Andersen.html#a36729160041bc3a3e2b0a92b29062848">SVF::Andersen::mergeNodeToRep</a></div><div class="ttdeci">virtual void mergeNodeToRep(NodeID nodeId, NodeID newRepId)</div><div class="ttdoc">Merge sub node to its rep. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00795">Andersen.cpp:795</a></div></div>
139
150
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a85ab6b592fefc45a0674d3295e01638f"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a85ab6b592fefc45a0674d3295e01638f">SVF::SVFUtil::outs</a></div><div class="ttdeci">raw_ostream &amp; outs()</div><div class="ttdoc">Overwrite llvm::outs() </div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8h_source.html#l00049">SVFUtil.h:49</a></div></div>
140
151
  <div class="ttc" id="classSVF_1_1Options_html_a4c7eb57066c80c62ef394d644833214a"><div class="ttname"><a href="classSVF_1_1Options.html#a4c7eb57066c80c62ef394d644833214a">SVF::Options::WriteAnder</a></div><div class="ttdeci">static const llvm::cl::opt&lt; std ::string &gt; WriteAnder</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00224">Options.h:224</a></div></div>
141
- <div class="ttc" id="classSVF_1_1Andersen_html_ae79bff0e9c49f15e7db00ed605824d98"><div class="ttname"><a href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98">SVF::Andersen::collapsePWCNode</a></div><div class="ttdeci">void collapsePWCNode(NodeID nodeId)</div><div class="ttdoc">Collapse a field object into its base for field insensitive anlaysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00433">Andersen.cpp:433</a></div></div>
152
+ <div class="ttc" id="classSVF_1_1Andersen_html_ae79bff0e9c49f15e7db00ed605824d98"><div class="ttname"><a href="classSVF_1_1Andersen.html#ae79bff0e9c49f15e7db00ed605824d98">SVF::Andersen::collapsePWCNode</a></div><div class="ttdeci">void collapsePWCNode(NodeID nodeId)</div><div class="ttdoc">Collapse a field object into its base for field insensitive anlaysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00448">Andersen.cpp:448</a></div></div>
142
153
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_a19d3d2c996ba821227a836717e5443c8"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#a19d3d2c996ba821227a836717e5443c8">SVF::ConstraintNode::getGepOutEdges</a></div><div class="ttdeci">const ConstraintEdge::ConstraintEdgeSetTy &amp; getGepOutEdges() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00136">ConsGNode.h:136</a></div></div>
143
154
  <div class="ttc" id="Options_8h_html"><div class="ttname"><a href="Options_8h.html">Options.h</a></div></div>
144
- <div class="ttc" id="classSVF_1_1Andersen_html_a0f32ba8cb1109c257552fa775a007ffd"><div class="ttname"><a href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd">SVF::Andersen::handleLoadStore</a></div><div class="ttdeci">virtual void handleLoadStore(ConstraintNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00240">Andersen.cpp:240</a></div></div>
145
- <div class="ttc" id="classSVF_1_1Andersen_html_abc20264231658b99998bc4af1f03a4de"><div class="ttname"><a href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">SVF::Andersen::processLoad</a></div><div class="ttdeci">virtual bool processLoad(NodeID node, const ConstraintEdge *load)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00297">Andersen.cpp:297</a></div></div>
155
+ <div class="ttc" id="classSVF_1_1Andersen_html_ae1ff65a411f2c4dfee0973ad4af48daf"><div class="ttname"><a href="classSVF_1_1Andersen.html#ae1ff65a411f2c4dfee0973ad4af48daf">SVF::Andersen::cluster</a></div><div class="ttdeci">virtual void cluster(void) const</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00829">Andersen.cpp:829</a></div></div>
156
+ <div class="ttc" id="classSVF_1_1Andersen_html_a0f32ba8cb1109c257552fa775a007ffd"><div class="ttname"><a href="classSVF_1_1Andersen.html#a0f32ba8cb1109c257552fa775a007ffd">SVF::Andersen::handleLoadStore</a></div><div class="ttdeci">virtual void handleLoadStore(ConstraintNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00255">Andersen.cpp:255</a></div></div>
157
+ <div class="ttc" id="classSVF_1_1Andersen_html_abc20264231658b99998bc4af1f03a4de"><div class="ttname"><a href="classSVF_1_1Andersen.html#abc20264231658b99998bc4af1f03a4de">SVF::Andersen::processLoad</a></div><div class="ttdeci">virtual bool processLoad(NodeID node, const ConstraintEdge *load)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00312">Andersen.cpp:312</a></div></div>
146
158
  <div class="ttc" id="SVFBasicTypes_8h_html_adbfc4364261f019dc6cf33234a5177d2"><div class="ttname"><a href="SVFBasicTypes_8h.html#adbfc4364261f019dc6cf33234a5177d2">DAndersen</a></div><div class="ttdeci">#define DAndersen</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00162">SVFBasicTypes.h:162</a></div></div>
147
- <div class="ttc" id="classSVF_1_1Andersen_html_a1ba1e1e36af289982146de06cf06ab0a"><div class="ttname"><a href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">SVF::Andersen::mergeSccNodes</a></div><div class="ttdeci">void mergeSccNodes(NodeID repNodeId, const NodeBS &amp;subNodes)</div><div class="ttdoc">Merge sub node in a SCC cycle to their rep node. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00485">Andersen.cpp:485</a></div></div>
159
+ <div class="ttc" id="classSVF_1_1Andersen_html_a1ba1e1e36af289982146de06cf06ab0a"><div class="ttname"><a href="classSVF_1_1Andersen.html#a1ba1e1e36af289982146de06cf06ab0a">SVF::Andersen::mergeSccNodes</a></div><div class="ttdeci">void mergeSccNodes(NodeID repNodeId, const NodeBS &amp;subNodes)</div><div class="ttdoc">Merge sub node in a SCC cycle to their rep node. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00500">Andersen.cpp:500</a></div></div>
148
160
  <div class="ttc" id="SVFBasicTypes_8h_html_a2c64190a065f342897573a3ef4973adb"><div class="ttname"><a href="SVFBasicTypes_8h.html#a2c64190a065f342897573a3ef4973adb">DGENERAL</a></div><div class="ttdeci">#define DGENERAL</div><div class="ttdoc">General debug flag is for each phase of a pass, it is often in a colorful output format. </div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00149">SVFBasicTypes.h:149</a></div></div>
149
- <div class="ttc" id="classSVF_1_1Andersen_html_a5a90e681e46c52ffd3debf02910c7ecf"><div class="ttname"><a href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf">SVF::Andersen::connectCaller2CalleeParams</a></div><div class="ttdeci">void connectCaller2CalleeParams(CallSite cs, const SVFFunction *F, NodePairSet &amp;cpySrcNodes)</div><div class="ttdoc">Connect formal and actual parameters for indirect callsites. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00661">Andersen.cpp:661</a></div></div>
161
+ <div class="ttc" id="classSVF_1_1Andersen_html_a5a90e681e46c52ffd3debf02910c7ecf"><div class="ttname"><a href="classSVF_1_1Andersen.html#a5a90e681e46c52ffd3debf02910c7ecf">SVF::Andersen::connectCaller2CalleeParams</a></div><div class="ttdeci">void connectCaller2CalleeParams(CallSite cs, const SVFFunction *F, NodePairSet &amp;cpySrcNodes)</div><div class="ttdoc">Connect formal and actual parameters for indirect callsites. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00676">Andersen.cpp:676</a></div></div>
150
162
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_af69c7e623ab5a36644b6aeabaa1a1e28"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#af69c7e623ab5a36644b6aeabaa1a1e28">SVF::ConstraintNode::outgoingLoadsBegin</a></div><div class="ttdeci">const_iterator outgoingLoadsBegin() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00258">ConsGNode.h:258</a></div></div>
151
163
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_afc2e412fe96c1fad268ba0255a2042e7"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#afc2e412fe96c1fad268ba0255a2042e7">SVF::PointerAnalysis::CallSiteToFunPtrMap</a></div><div class="ttdeci">PAG::CallSiteToFunPtrMap CallSiteToFunPtrMap</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8h_source.html#l00109">PointerAnalysis.h:109</a></div></div>
152
164
  <div class="ttc" id="classSVF_1_1PAGNode_html"><div class="ttname"><a href="classSVF_1_1PAGNode.html">SVF::PAGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="PAGNode_8h_source.html#l00046">PAGNode.h:46</a></div></div>
@@ -154,11 +166,12 @@ $(function() {
154
166
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a7cfafe54d564c9401f435362d44d3f9c"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a7cfafe54d564c9401f435362d44d3f9c">SVF::AndersenBase::MaxPointsToSetSize</a></div><div class="ttdeci">static Size_t MaxPointsToSetSize</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00141">Andersen.h:141</a></div></div>
155
167
  <div class="ttc" id="Steensgaard_8h_html"><div class="ttname"><a href="Steensgaard_8h.html">Steensgaard.h</a></div></div>
156
168
  <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>
157
- <div class="ttc" id="classSVF_1_1Andersen_html_ac6b1efcaadfed48c226701ecf6bac55e"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e">SVF::Andersen::processGepPts</a></div><div class="ttdeci">virtual bool processGepPts(const PointsTo &amp;pts, const GepCGEdge *edge)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00366">Andersen.cpp:366</a></div></div>
169
+ <div class="ttc" id="classSVF_1_1Andersen_html_ac6b1efcaadfed48c226701ecf6bac55e"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac6b1efcaadfed48c226701ecf6bac55e">SVF::Andersen::processGepPts</a></div><div class="ttdeci">virtual bool processGepPts(const PointsTo &amp;pts, const GepCGEdge *edge)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00381">Andersen.cpp:381</a></div></div>
158
170
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a25de7638a692832f0d4727815ff270f6"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a25de7638a692832f0d4727815ff270f6">SVF::AndersenBase::numOfProcessedGep</a></div><div class="ttdeci">static Size_t numOfProcessedGep</div><div class="ttdoc">Number of processed Copy edge. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00130">Andersen.h:130</a></div></div>
159
- <div class="ttc" id="classSVF_1_1Andersen_html_ad90c8cf193bd81870ce8dd88c9580e2c"><div class="ttname"><a href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">SVF::Andersen::finalize</a></div><div class="ttdeci">virtual void finalize()</div><div class="ttdoc">Finalize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00188">Andersen.cpp:188</a></div></div>
171
+ <div class="ttc" id="classSVF_1_1Andersen_html_ad90c8cf193bd81870ce8dd88c9580e2c"><div class="ttname"><a href="classSVF_1_1Andersen.html#ad90c8cf193bd81870ce8dd88c9580e2c">SVF::Andersen::finalize</a></div><div class="ttdeci">virtual void finalize()</div><div class="ttdoc">Finalize analysis. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00191">Andersen.cpp:191</a></div></div>
160
172
  <div class="ttc" id="namespaceSVF_html"><div class="ttname"><a href="namespaceSVF.html">SVF</a></div><div class="ttdoc">for isBitcode </div><div class="ttdef"><b>Definition:</b> <a href="ContextDDA_8h_source.html#l00016">ContextDDA.h:16</a></div></div>
161
173
  <div class="ttc" id="classSVF_1_1CallSite_html"><div class="ttname"><a href="classSVF_1_1CallSite.html">SVF::CallSite</a></div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00313">BasicTypes.h:313</a></div></div>
174
+ <div class="ttc" id="classSVF_1_1Options_html_a8459d43a21bcf8a50fc55d14fcf5a81e"><div class="ttname"><a href="classSVF_1_1Options.html#a8459d43a21bcf8a50fc55d14fcf5a81e">SVF::Options::ClusterAnder</a></div><div class="ttdeci">static const llvm::cl::opt&lt; bool &gt; ClusterAnder</div><div class="ttdoc">Whether to stage Andersen&amp;#39;s with Steensgaard and cluster based on that data. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00037">Options.h:37</a></div></div>
162
175
  <div class="ttc" id="classSVF_1_1GepObjPN_html"><div class="ttname"><a href="classSVF_1_1GepObjPN.html">SVF::GepObjPN</a></div><div class="ttdef"><b>Definition:</b> <a href="PAGNode_8h_source.html#l00454">PAGNode.h:454</a></div></div>
163
176
  <div class="ttc" id="classSVF_1_1GenericNode_html_ac3e55ef37aefb411ea4c87b1aa3b1895"><div class="ttname"><a href="classSVF_1_1GenericNode.html#ac3e55ef37aefb411ea4c87b1aa3b1895">SVF::GenericNode::getId</a></div><div class="ttdeci">NodeID getId() const</div><div class="ttdoc">Get ID. </div><div class="ttdef"><b>Definition:</b> <a href="GenericGraph_8h_source.html#l00164">GenericGraph.h:164</a></div></div>
164
177
  <div class="ttc" id="classSVF_1_1CallSite_html_a9b7d53a345875e4e6c72eb23ac6475de"><div class="ttname"><a href="classSVF_1_1CallSite.html#a9b7d53a345875e4e6c72eb23ac6475de">SVF::CallSite::getType</a></div><div class="ttdeci">Type * getType() const</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00323">BasicTypes.h:323</a></div></div>
@@ -166,27 +179,29 @@ $(function() {
166
179
  <div class="ttc" id="namespaceSVF_html_a740396763e377643790c8b803ab3e4ea"><div class="ttname"><a href="namespaceSVF.html#a740396763e377643790c8b803ab3e4ea">SVF::NodeBS</a></div><div class="ttdeci">llvm::SparseBitVector NodeBS</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00087">SVFBasicTypes.h:87</a></div></div>
167
180
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_a19c1ed324f65f4cc58dd2fd21ed4a971"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#a19c1ed324f65f4cc58dd2fd21ed4a971">SVF::ConstraintNode::incomingAddrsBegin</a></div><div class="ttdeci">const_iterator incomingAddrsBegin() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00249">ConsGNode.h:249</a></div></div>
168
181
  <div class="ttc" id="SVFBasicTypes_8h_html_a7a295e02c56a93cf9206dd9d3b18dd17"><div class="ttname"><a href="SVFBasicTypes_8h.html#a7a295e02c56a93cf9206dd9d3b18dd17">DPAGBuild</a></div><div class="ttdeci">#define DPAGBuild</div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00151">SVFBasicTypes.h:151</a></div></div>
169
- <div class="ttc" id="classSVF_1_1Andersen_html_a31ea24432ff42ab86a4728f2bde571bc"><div class="ttname"><a href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">SVF::Andersen::SCCDetect</a></div><div class="ttdeci">virtual NodeStack &amp; SCCDetect()</div><div class="ttdoc">SCC detection. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00580">Andersen.cpp:580</a></div></div>
182
+ <div class="ttc" id="classSVF_1_1Andersen_html_a31ea24432ff42ab86a4728f2bde571bc"><div class="ttname"><a href="classSVF_1_1Andersen.html#a31ea24432ff42ab86a4728f2bde571bc">SVF::Andersen::SCCDetect</a></div><div class="ttdeci">virtual NodeStack &amp; SCCDetect()</div><div class="ttdoc">SCC detection. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00595">Andersen.cpp:595</a></div></div>
170
183
  <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a8182be247907420db00837cef9bcfa70"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a8182be247907420db00837cef9bcfa70">SVF::SVFUtil::dyn_cast</a></div><div class="ttdeci">LLVM_NODISCARD std::enable_if&lt;!is_simple_type&lt; Y &gt;::value, typename cast_retty&lt; X, const Y &gt;::ret_type &gt;::type dyn_cast(const Y &amp;Val)</div><div class="ttdef"><b>Definition:</b> <a href="Casting_8h_source.html#l00343">Casting.h:343</a></div></div>
171
184
  <div class="ttc" id="classSVF_1_1AndersenBase_html_ad40b196c2c699bd115529b806d20de25"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#ad40b196c2c699bd115529b806d20de25">SVF::AndersenBase::timeOfCollapse</a></div><div class="ttdeci">static double timeOfCollapse</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00139">Andersen.h:139</a></div></div>
172
185
  <div class="ttc" id="classSVF_1_1Options_html_a620fe156ba70f997eace0ccb0d2c9f67"><div class="ttname"><a href="classSVF_1_1Options.html#a620fe156ba70f997eace0ccb0d2c9f67">SVF::Options::AnderTimeLimit</a></div><div class="ttdeci">static const llvm::cl::opt&lt; unsigned &gt; AnderTimeLimit</div><div class="ttdoc">Time limit for the Andersen&amp;#39;s analyses. </div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00071">Options.h:71</a></div></div>
173
- <div class="ttc" id="classSVF_1_1Andersen_html_ae6b1e54a389abc68994219e39539127e"><div class="ttname"><a href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">SVF::Andersen::mergeSrcToTgt</a></div><div class="ttdeci">virtual bool mergeSrcToTgt(NodeID srcId, NodeID tgtId)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00756">Andersen.cpp:756</a></div></div>
186
+ <div class="ttc" id="classSVF_1_1Andersen_html_ae6b1e54a389abc68994219e39539127e"><div class="ttname"><a href="classSVF_1_1Andersen.html#ae6b1e54a389abc68994219e39539127e">SVF::Andersen::mergeSrcToTgt</a></div><div class="ttdeci">virtual bool mergeSrcToTgt(NodeID srcId, NodeID tgtId)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00771">Andersen.cpp:771</a></div></div>
174
187
  <div class="ttc" id="classSVF_1_1SVFFunction_html_a3c1fa59deae39c75c72c97e47326d982"><div class="ttname"><a href="classSVF_1_1SVFFunction.html#a3c1fa59deae39c75c72c97e47326d982">SVF::SVFFunction::isVarArg</a></div><div class="ttdeci">bool isVarArg() const</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00270">BasicTypes.h:270</a></div></div>
175
188
  <div class="ttc" id="classSVF_1_1ConstraintNode_html_ae8ac9ad8e766b961c7ce06d7219f37af"><div class="ttname"><a href="classSVF_1_1ConstraintNode.html#ae8ac9ad8e766b961c7ce06d7219f37af">SVF::ConstraintNode::incomingAddrsEnd</a></div><div class="ttdeci">const_iterator incomingAddrsEnd() const</div><div class="ttdef"><b>Definition:</b> <a href="ConsGNode_8h_source.html#l00253">ConsGNode.h:253</a></div></div>
176
- <div class="ttc" id="classSVF_1_1Andersen_html_ac86ffd334568e4df5c08b3c827018bef"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">SVF::Andersen::mergeSccCycle</a></div><div class="ttdeci">void mergeSccCycle()</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00457">Andersen.cpp:457</a></div></div>
189
+ <div class="ttc" id="classSVF_1_1Andersen_html_ac86ffd334568e4df5c08b3c827018bef"><div class="ttname"><a href="classSVF_1_1Andersen.html#ac86ffd334568e4df5c08b3c827018bef">SVF::Andersen::mergeSccCycle</a></div><div class="ttdeci">void mergeSccCycle()</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00472">Andersen.cpp:472</a></div></div>
177
190
  <div class="ttc" id="classSVF_1_1AndersenStat_html"><div class="ttname"><a href="classSVF_1_1AndersenStat.html">SVF::AndersenStat</a></div><div class="ttdef"><b>Definition:</b> <a href="WPAStat_8h_source.html#l00049">WPAStat.h:49</a></div></div>
178
191
  <div class="ttc" id="classSVF_1_1Options_html_acf7262c0b0bd91e6dab56a631be51206"><div class="ttname"><a href="classSVF_1_1Options.html#acf7262c0b0bd91e6dab56a631be51206">SVF::Options::PtsDiff</a></div><div class="ttdeci">static const llvm::cl::opt&lt; bool &gt; PtsDiff</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00227">Options.h:227</a></div></div>
179
- <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a168f7f7a3a8c70dbf2b5b4269cd4c7c5"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVF::SVFUtil::stopAnalysisLimitTimer</a></div><div class="ttdeci">void stopAnalysisLimitTimer(bool limitTimerSet)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00424">SVFUtil.cpp:424</a></div></div>
192
+ <div class="ttc" id="namespaceSVF_1_1SVFUtil_html_a168f7f7a3a8c70dbf2b5b4269cd4c7c5"><div class="ttname"><a href="namespaceSVF_1_1SVFUtil.html#a168f7f7a3a8c70dbf2b5b4269cd4c7c5">SVF::SVFUtil::stopAnalysisLimitTimer</a></div><div class="ttdeci">void stopAnalysisLimitTimer(bool limitTimerSet)</div><div class="ttdef"><b>Definition:</b> <a href="SVFUtil_8cpp_source.html#l00443">SVFUtil.cpp:443</a></div></div>
180
193
  <div class="ttc" id="classSVF_1_1AndersenBase_html_ae18183a5d8ebd46fcdb9246bd643b150"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#ae18183a5d8ebd46fcdb9246bd643b150">SVF::AndersenBase::numOfProcessedStore</a></div><div class="ttdeci">static Size_t numOfProcessedStore</div><div class="ttdoc">Number of processed Load edge. </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00132">Andersen.h:132</a></div></div>
181
194
  <div class="ttc" id="classSVF_1_1AddrCGEdge_html"><div class="ttname"><a href="classSVF_1_1AddrCGEdge.html">SVF::AddrCGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsGEdge_8h_source.html#l00093">ConsGEdge.h:93</a></div></div>
182
195
  <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>
183
196
  <div class="ttc" id="classSVF_1_1PAG_html_a49da7e7d6273a0d8798166f95ce6bb16"><div class="ttname"><a href="classSVF_1_1PAG.html#a49da7e7d6273a0d8798166f95ce6bb16">SVF::PAG::MemObjToFieldsMap</a></div><div class="ttdeci">Map&lt; NodeID, NodeBS &gt; MemObjToFieldsMap</div><div class="ttdef"><b>Definition:</b> <a href="PAG_8h_source.html#l00054">PAG.h:54</a></div></div>
184
197
  <div class="ttc" id="classSVF_1_1ConstraintEdge_html"><div class="ttname"><a href="classSVF_1_1ConstraintEdge.html">SVF::ConstraintEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="ConsGEdge_8h_source.html#l00048">ConsGEdge.h:48</a></div></div>
185
198
  <div class="ttc" id="classSVF_1_1Options_html_a87516daebb3d1b5fee9037068d60e268"><div class="ttname"><a href="classSVF_1_1Options.html#a87516daebb3d1b5fee9037068d60e268">SVF::Options::PrintCGGraph</a></div><div class="ttdeci">static const llvm::cl::opt&lt; bool &gt; PrintCGGraph</div><div class="ttdef"><b>Definition:</b> <a href="Options_8h_source.html#l00222">Options.h:222</a></div></div>
199
+ <div class="ttc" id="classSVF_1_1PTData_html_adbe2b955f119871b54dc502de84b94c4"><div class="ttname"><a href="classSVF_1_1PTData.html#adbe2b955f119871b54dc502de84b94c4">SVF::PTData::getAllPts</a></div><div class="ttdeci">virtual Map&lt; DataSet, unsigned &gt; getAllPts(bool liveOnly) const =0</div></div>
186
200
  <div class="ttc" id="classSVF_1_1PointsTo_html"><div class="ttname"><a href="classSVF_1_1PointsTo.html">SVF::PointsTo</a></div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00027">PointsTo.h:27</a></div></div>
187
- <div class="ttc" id="classSVF_1_1Andersen_html_aa697d4a6fe09dd6e50abb09228b3567f"><div class="ttname"><a href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">SVF::Andersen::processGep</a></div><div class="ttdeci">virtual bool processGep(NodeID node, const GepCGEdge *edge)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00357">Andersen.cpp:357</a></div></div>
188
- <div class="ttc" id="classSVF_1_1Andersen_html_adccf6acf63abc9cafc92b2148396fd10"><div class="ttname"><a href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">SVF::Andersen::processAllAddr</a></div><div class="ttdeci">void processAllAddr()</div><div class="ttdoc">handling various constraints </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00268">Andersen.cpp:268</a></div></div>
201
+ <div class="ttc" id="classSVF_1_1Andersen_html_aa697d4a6fe09dd6e50abb09228b3567f"><div class="ttname"><a href="classSVF_1_1Andersen.html#aa697d4a6fe09dd6e50abb09228b3567f">SVF::Andersen::processGep</a></div><div class="ttdeci">virtual bool processGep(NodeID node, const GepCGEdge *edge)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00372">Andersen.cpp:372</a></div></div>
202
+ <div class="ttc" id="classSVF_1_1Andersen_html_adccf6acf63abc9cafc92b2148396fd10"><div class="ttname"><a href="classSVF_1_1Andersen.html#adccf6acf63abc9cafc92b2148396fd10">SVF::Andersen::processAllAddr</a></div><div class="ttdeci">void processAllAddr()</div><div class="ttdoc">handling various constraints </div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00283">Andersen.cpp:283</a></div></div>
189
203
  <div class="ttc" id="classSVF_1_1GepObjPN_html_aeb05e3a512e89c7af36c675e0efeec7e"><div class="ttname"><a href="classSVF_1_1GepObjPN.html#aeb05e3a512e89c7af36c675e0efeec7e">SVF::GepObjPN::getLocationSet</a></div><div class="ttdeci">const LocationSet &amp; getLocationSet() const</div><div class="ttdoc">offset of the mem object </div><div class="ttdef"><b>Definition:</b> <a href="PAGNode_8h_source.html#l00492">PAGNode.h:492</a></div></div>
204
+ <div class="ttc" id="classSVF_1_1PointsTo_html_a84eca4c7fc833f8ca4d119cd4da08ca8"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a84eca4c7fc833f8ca4d119cd4da08ca8">SVF::PointsTo::setCurrentBestNodeMapping</a></div><div class="ttdeci">static void setCurrentBestNodeMapping(MappingPtr newCurrentBestNodeMapping, MappingPtr newCurrentBestReverseNodeMapping)</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00355">PointsTo.cpp:355</a></div></div>
190
205
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a9fe738f1e11c80006d540f246a80bfdf"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a9fe738f1e11c80006d540f246a80bfdf">SVF::AndersenBase::timeOfProcessLoadStore</a></div><div class="ttdeci">static double timeOfProcessLoadStore</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00143">Andersen.h:143</a></div></div>
191
206
  <div class="ttc" id="SVFBasicTypes_8h_html_a173ce1b9b505fdadf5613b663749d3b0"><div class="ttname"><a href="SVFBasicTypes_8h.html#a173ce1b9b505fdadf5613b663749d3b0">DBOUT</a></div><div class="ttdeci">#define DBOUT(TYPE, X)</div><div class="ttdoc">LLVM debug macros, define type of your DEBUG model of each pass. </div><div class="ttdef"><b>Definition:</b> <a href="SVFBasicTypes_8h_source.html#l00144">SVFBasicTypes.h:144</a></div></div>
192
207
  <div class="ttc" id="classSVF_1_1PointerAnalysis_html_a431ec4f85eb0f029e5740b92fd9ceb32"><div class="ttname"><a href="classSVF_1_1PointerAnalysis.html#a431ec4f85eb0f029e5740b92fd9ceb32">SVF::PointerAnalysis::initialize</a></div><div class="ttdeci">virtual void initialize()</div><div class="ttdoc">Initialization of a pointer analysis, including building symbol table and PAG etc. </div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysis_8cpp_source.html#l00116">PointerAnalysis.cpp:116</a></div></div>
@@ -194,8 +209,9 @@ $(function() {
194
209
  <div class="ttc" id="classSVF_1_1PointsTo_html_a8f741cdffbf3c5fe0f602cdca677dee6"><div class="ttname"><a href="classSVF_1_1PointsTo.html#a8f741cdffbf3c5fe0f602cdca677dee6">SVF::PointsTo::end</a></div><div class="ttdeci">const_iterator end(void) const</div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8h_source.html#l00128">PointsTo.h:128</a></div></div>
195
210
  <div class="ttc" id="classSVF_1_1PAGNode_html_afa5f1f6b3b7ffff2c417d58db7ef6bc2"><div class="ttname"><a href="classSVF_1_1PAGNode.html#afa5f1f6b3b7ffff2c417d58db7ef6bc2">SVF::PAGNode::isPointer</a></div><div class="ttdeci">virtual bool isPointer() const</div><div class="ttdoc">Whether it is a pointer. </div><div class="ttdef"><b>Definition:</b> <a href="PAGNode_8h_source.html#l00115">PAGNode.h:115</a></div></div>
196
211
  <div class="ttc" id="classSVF_1_1AndersenBase_html_ad21fc4e60abc4e6030880f8197e1c93f"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#ad21fc4e60abc4e6030880f8197e1c93f">SVF::AndersenBase::numOfFieldExpand</a></div><div class="ttdeci">static Size_t numOfFieldExpand</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00134">Andersen.h:134</a></div></div>
197
- <div class="ttc" id="classSVF_1_1Andersen_html_ab069683dd6ca563113efbde2813ab35e"><div class="ttname"><a href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e">SVF::Andersen::handleCopyGep</a></div><div class="ttdeci">virtual void handleCopyGep(ConstraintNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00220">Andersen.cpp:220</a></div></div>
212
+ <div class="ttc" id="classSVF_1_1Andersen_html_ab069683dd6ca563113efbde2813ab35e"><div class="ttname"><a href="classSVF_1_1Andersen.html#ab069683dd6ca563113efbde2813ab35e">SVF::Andersen::handleCopyGep</a></div><div class="ttdeci">virtual void handleCopyGep(ConstraintNode *node)</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8cpp_source.html#l00235">Andersen.cpp:235</a></div></div>
198
213
  <div class="ttc" id="LLVMUtil_8h_html"><div class="ttname"><a href="LLVMUtil_8h.html">LLVMUtil.h</a></div></div>
214
+ <div class="ttc" id="classSVF_1_1NodeIDAllocator_1_1Clusterer_html_a36b25188130f4c21d145c950a70d616f"><div class="ttname"><a href="classSVF_1_1NodeIDAllocator_1_1Clusterer.html#a36b25188130f4c21d145c950a70d616f">SVF::NodeIDAllocator::Clusterer::getReverseNodeMapping</a></div><div class="ttdeci">static std::vector&lt; NodeID &gt; getReverseNodeMapping(const std::vector&lt; NodeID &gt; &amp;nodeMapping)</div><div class="ttdef"><b>Definition:</b> <a href="NodeIDAllocator_8cpp_source.html#l00385">NodeIDAllocator.cpp:385</a></div></div>
199
215
  <div class="ttc" id="classSVF_1_1BVDataPTAImpl_html_a9128b7d4aaf4912b5db20aca4c22e852"><div class="ttname"><a href="classSVF_1_1BVDataPTAImpl.html#a9128b7d4aaf4912b5db20aca4c22e852">SVF::BVDataPTAImpl::finalize</a></div><div class="ttdeci">virtual void finalize()</div><div class="ttdoc">Finalization of pointer analysis, and normalize points-to information to Bit Vector representation...</div><div class="ttdef"><b>Definition:</b> <a href="PointerAnalysisImpl_8h_source.html#l00168">PointerAnalysisImpl.h:168</a></div></div>
200
216
  <div class="ttc" id="classSVF_1_1AndersenBase_html_a6da6e1231a46fde6925493045b8b2490"><div class="ttname"><a href="classSVF_1_1AndersenBase.html#a6da6e1231a46fde6925493045b8b2490">SVF::AndersenBase::numOfSCCDetection</a></div><div class="ttdeci">static Size_t numOfSCCDetection</div><div class="ttdef"><b>Definition:</b> <a href="Andersen_8h_source.html#l00136">Andersen.h:136</a></div></div>
201
217
  </div><!-- fragment --></div><!-- contents -->