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
@@ -117,7 +117,7 @@ Static Public Member Functions</h2></td></tr>
117
117
  struct llvm::DOTGraphTraits&lt; VFG * &gt;</h3>
118
118
 
119
119
 
120
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00902">902</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
120
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00920">920</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
121
121
  </div><h2 class="groupheader">Member Typedef Documentation</h2>
122
122
  <a id="afd7d2c80916a68b53814e6de593bf520"></a>
123
123
  <h2 class="memtitle"><span class="permalink"><a href="#afd7d2c80916a68b53814e6de593bf520">&#9670;&nbsp;</a></span>NodeType</h2>
@@ -131,7 +131,7 @@ struct llvm::DOTGraphTraits&lt; VFG * &gt;</h3>
131
131
  </table>
132
132
  </div><div class="memdoc">
133
133
 
134
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00905">905</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
134
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00923">923</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
135
135
 
136
136
  </div>
137
137
  </div>
@@ -160,8 +160,8 @@ struct llvm::DOTGraphTraits&lt; VFG * &gt;</h3>
160
160
  </table>
161
161
  </div><div class="memdoc">
162
162
 
163
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00906">906</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
164
- <div class="fragment"><div class="line"><a name="l00906"></a><span class="lineno"> 906</span>&#160; :</div><div class="line"><a name="l00907"></a><span class="lineno"> 907</span>&#160; DOTGraphTraits&lt;PAG*&gt;(isSimple)</div><div class="line"><a name="l00908"></a><span class="lineno"> 908</span>&#160; {</div><div class="line"><a name="l00909"></a><span class="lineno"> 909</span>&#160; }</div></div><!-- fragment -->
163
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00924">924</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
164
+ <div class="fragment"><div class="line"><a name="l00924"></a><span class="lineno"> 924</span>&#160; :</div><div class="line"><a name="l00925"></a><span class="lineno"> 925</span>&#160; DOTGraphTraits&lt;PAG*&gt;(isSimple)</div><div class="line"><a name="l00926"></a><span class="lineno"> 926</span>&#160; {</div><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; }</div></div><!-- fragment -->
165
165
  </div>
166
166
  </div>
167
167
  <h2 class="groupheader">Member Function Documentation</h2>
@@ -201,8 +201,8 @@ struct llvm::DOTGraphTraits&lt; VFG * &gt;</h3>
201
201
 
202
202
  <p>Return label of a VFG node with MemSSA information. </p>
203
203
 
204
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00977">977</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
205
- <div class="fragment"><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; {</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160;</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; std::string str;</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtVFGNode</a>* stmtNode = SVFUtil::dyn_cast&lt;StmtVFGNode&gt;(node))</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; {</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; rawstr &lt;&lt; stmtNode-&gt;toString();</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; }</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1BinaryOPVFGNode.html">BinaryOPVFGNode</a>* bop = SVFUtil::dyn_cast&lt;BinaryOPVFGNode&gt;(node))</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; {</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; rawstr &lt;&lt; bop-&gt;toString();</div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; }</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1UnaryOPVFGNode.html">UnaryOPVFGNode</a>* uop = SVFUtil::dyn_cast&lt;UnaryOPVFGNode&gt;(node))</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; {</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; rawstr &lt;&lt; uop-&gt;toString();</div><div class="line"><a name="l00993"></a><span class="lineno"> 993</span>&#160; }</div><div class="line"><a name="l00994"></a><span class="lineno"> 994</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1CmpVFGNode.html">CmpVFGNode</a>* cmp = SVFUtil::dyn_cast&lt;CmpVFGNode&gt;(node))</div><div class="line"><a name="l00995"></a><span class="lineno"> 995</span>&#160; {</div><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; rawstr &lt;&lt; cmp-&gt;toString();</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160; }</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1PHIVFGNode.html">PHIVFGNode</a>* phi = SVFUtil::dyn_cast&lt;PHIVFGNode&gt;(node))</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; {</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; rawstr &lt;&lt; phi-&gt;toString();</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; }</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1FormalParmVFGNode.html">FormalParmVFGNode</a>* fp = SVFUtil::dyn_cast&lt;FormalParmVFGNode&gt;(node))</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; {</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; rawstr &lt;&lt; fp-&gt;toString();</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; }</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1ActualParmVFGNode.html">ActualParmVFGNode</a>* ap = SVFUtil::dyn_cast&lt;ActualParmVFGNode&gt;(node))</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; {</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; rawstr &lt;&lt; ap-&gt;toString();</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; }</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1NullPtrVFGNode.html">NullPtrVFGNode</a>* nptr = SVFUtil::dyn_cast&lt;NullPtrVFGNode&gt;(node))</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; {</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; rawstr &lt;&lt; nptr-&gt;toString();</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; }</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ActualRetVFGNode.html">ActualRetVFGNode</a>* ar = SVFUtil::dyn_cast&lt;ActualRetVFGNode&gt;(node))</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; {</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; rawstr &lt;&lt; ar-&gt;toString();</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; }</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FormalRetVFGNode.html">FormalRetVFGNode</a>* fr = SVFUtil::dyn_cast&lt;FormalRetVFGNode&gt;(node))</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; {</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; rawstr &lt;&lt; fr-&gt;toString();</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; }</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a>* mr = SVFUtil::dyn_cast&lt;MRSVFGNode&gt;(node))</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; {</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; rawstr &lt;&lt; mr-&gt;toString();</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; }</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else kinds of nodes do we have??&quot;</span>);</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; }</div><div class="ttc" id="classSVF_1_1BinaryOPVFGNode_html"><div class="ttname"><a href="classSVF_1_1BinaryOPVFGNode.html">SVF::BinaryOPVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00388">VFGNode.h:388</a></div></div>
204
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00995">995</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
205
+ <div class="fragment"><div class="line"><a name="l00996"></a><span class="lineno"> 996</span>&#160; {</div><div class="line"><a name="l00997"></a><span class="lineno"> 997</span>&#160;</div><div class="line"><a name="l00998"></a><span class="lineno"> 998</span>&#160; std::string str;</div><div class="line"><a name="l00999"></a><span class="lineno"> 999</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtVFGNode</a>* stmtNode = SVFUtil::dyn_cast&lt;StmtVFGNode&gt;(node))</div><div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160; {</div><div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160; rawstr &lt;&lt; stmtNode-&gt;toString();</div><div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160; }</div><div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1BinaryOPVFGNode.html">BinaryOPVFGNode</a>* bop = SVFUtil::dyn_cast&lt;BinaryOPVFGNode&gt;(node))</div><div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160; {</div><div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160; rawstr &lt;&lt; bop-&gt;toString();</div><div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; }</div><div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1UnaryOPVFGNode.html">UnaryOPVFGNode</a>* uop = SVFUtil::dyn_cast&lt;UnaryOPVFGNode&gt;(node))</div><div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160; {</div><div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160; rawstr &lt;&lt; uop-&gt;toString();</div><div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160; }</div><div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1CmpVFGNode.html">CmpVFGNode</a>* cmp = SVFUtil::dyn_cast&lt;CmpVFGNode&gt;(node))</div><div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160; {</div><div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160; rawstr &lt;&lt; cmp-&gt;toString();</div><div class="line"><a name="l01015"></a><span class="lineno"> 1015</span>&#160; }</div><div class="line"><a name="l01016"></a><span class="lineno"> 1016</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1PHIVFGNode.html">PHIVFGNode</a>* phi = SVFUtil::dyn_cast&lt;PHIVFGNode&gt;(node))</div><div class="line"><a name="l01017"></a><span class="lineno"> 1017</span>&#160; {</div><div class="line"><a name="l01018"></a><span class="lineno"> 1018</span>&#160; rawstr &lt;&lt; phi-&gt;toString();</div><div class="line"><a name="l01019"></a><span class="lineno"> 1019</span>&#160; }</div><div class="line"><a name="l01020"></a><span class="lineno"> 1020</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1FormalParmVFGNode.html">FormalParmVFGNode</a>* fp = SVFUtil::dyn_cast&lt;FormalParmVFGNode&gt;(node))</div><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160; {</div><div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160; rawstr &lt;&lt; fp-&gt;toString();</div><div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160; }</div><div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1ActualParmVFGNode.html">ActualParmVFGNode</a>* ap = SVFUtil::dyn_cast&lt;ActualParmVFGNode&gt;(node))</div><div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160; {</div><div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160; rawstr &lt;&lt; ap-&gt;toString();</div><div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; }</div><div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1NullPtrVFGNode.html">NullPtrVFGNode</a>* nptr = SVFUtil::dyn_cast&lt;NullPtrVFGNode&gt;(node))</div><div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160; {</div><div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160; rawstr &lt;&lt; nptr-&gt;toString();</div><div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160; }</div><div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ActualRetVFGNode.html">ActualRetVFGNode</a>* ar = SVFUtil::dyn_cast&lt;ActualRetVFGNode&gt;(node))</div><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; {</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; rawstr &lt;&lt; ar-&gt;toString();</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; }</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FormalRetVFGNode.html">FormalRetVFGNode</a>* fr = SVFUtil::dyn_cast&lt;FormalRetVFGNode&gt;(node))</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; {</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; rawstr &lt;&lt; fr-&gt;toString();</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; }</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1MRSVFGNode.html">MRSVFGNode</a>* mr = SVFUtil::dyn_cast&lt;MRSVFGNode&gt;(node))</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; {</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; rawstr &lt;&lt; mr-&gt;toString();</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; }</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else kinds of nodes do we have??&quot;</span>);</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; }</div><div class="ttc" id="classSVF_1_1BinaryOPVFGNode_html"><div class="ttname"><a href="classSVF_1_1BinaryOPVFGNode.html">SVF::BinaryOPVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00388">VFGNode.h:388</a></div></div>
206
206
  <div class="ttc" id="classSVF_1_1ActualParmVFGNode_html"><div class="ttname"><a href="classSVF_1_1ActualParmVFGNode.html">SVF::ActualParmVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00779">VFGNode.h:779</a></div></div>
207
207
  <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>
208
208
  <div class="ttc" id="classSVF_1_1PHIVFGNode_html"><div class="ttname"><a href="classSVF_1_1PHIVFGNode.html">SVF::PHIVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00572">VFGNode.h:572</a></div></div>
@@ -260,8 +260,8 @@ template&lt;class EdgeIter &gt; </div>
260
260
  </table>
261
261
  </div><div class="memdoc">
262
262
 
263
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l01119">1119</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
264
- <div class="fragment"><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; {</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; <a class="code" href="classSVF_1_1VFGEdge.html">VFGEdge</a>* edge = *(EI.getCurrent());</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(edge &amp;&amp; <span class="stringliteral">&quot;No edge found!!&quot;</span>);</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;DirectSVFGEdge&gt;(edge))</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; {</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=solid,color=red&quot;</span>;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=solid,color=blue&quot;</span>;</div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=solid&quot;</span>;</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; }</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;IndirectSVFGEdge&gt;(edge))</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; {</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallIndSVFGEdge&gt;(edge))</div><div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=dashed,color=red&quot;</span>;</div><div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetIndSVFGEdge&gt;(edge))</div><div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=dashed,color=blue&quot;</span>;</div><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=dashed&quot;</span>;</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; }</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; {</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else edge we have?&quot;</span>);</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; }</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; }</div><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>
263
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l01137">1137</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
264
+ <div class="fragment"><div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160; {</div><div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160; <a class="code" href="classSVF_1_1VFGEdge.html">VFGEdge</a>* edge = *(EI.getCurrent());</div><div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(edge &amp;&amp; <span class="stringliteral">&quot;No edge found!!&quot;</span>);</div><div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;DirectSVFGEdge&gt;(edge))</div><div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160; {</div><div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=solid,color=red&quot;</span>;</div><div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=solid,color=blue&quot;</span>;</div><div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=solid&quot;</span>;</div><div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160; }</div><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;IndirectSVFGEdge&gt;(edge))</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; {</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;CallIndSVFGEdge&gt;(edge))</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=dashed,color=red&quot;</span>;</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetIndSVFGEdge&gt;(edge))</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=dashed,color=blue&quot;</span>;</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;style=dashed&quot;</span>;</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; }</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; {</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else edge we have?&quot;</span>);</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; }</div><div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160; }</div><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>
265
265
  <div class="ttc" id="classSVF_1_1VFGEdge_html"><div class="ttname"><a href="classSVF_1_1VFGEdge.html">SVF::VFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00044">VFGEdge.h:44</a></div></div>
266
266
  </div><!-- fragment -->
267
267
  </div>
@@ -302,8 +302,8 @@ template&lt;class EdgeIter &gt; </div>
302
302
  </table>
303
303
  </div><div class="memdoc">
304
304
 
305
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l01149">1149</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
306
- <div class="fragment"><div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160; {</div><div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160; <a class="code" href="classSVF_1_1VFGEdge.html">VFGEdge</a>* edge = *(EI.getCurrent());</div><div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(edge &amp;&amp; <span class="stringliteral">&quot;No edge found!!&quot;</span>);</div><div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;</div><div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160; std::string str;</div><div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1CallDirSVFGEdge.html">CallDirSVFGEdge</a>* dirCall = SVFUtil::dyn_cast&lt;CallDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160; rawstr &lt;&lt; dirCall-&gt;getCallSiteId();</div><div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1RetDirSVFGEdge.html">RetDirSVFGEdge</a>* dirRet = SVFUtil::dyn_cast&lt;RetDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160; rawstr &lt;&lt; dirRet-&gt;getCallSiteId();</div><div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160;</div><div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160; }</div><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>
305
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l01167">1167</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
306
+ <div class="fragment"><div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160; {</div><div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160; <a class="code" href="classSVF_1_1VFGEdge.html">VFGEdge</a>* edge = *(EI.getCurrent());</div><div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(edge &amp;&amp; <span class="stringliteral">&quot;No edge found!!&quot;</span>);</div><div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;</div><div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160; std::string str;</div><div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160; <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1CallDirSVFGEdge.html">CallDirSVFGEdge</a>* dirCall = SVFUtil::dyn_cast&lt;CallDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; rawstr &lt;&lt; dirCall-&gt;getCallSiteId();</div><div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1RetDirSVFGEdge.html">RetDirSVFGEdge</a>* dirRet = SVFUtil::dyn_cast&lt;RetDirSVFGEdge&gt;(edge))</div><div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160; rawstr &lt;&lt; dirRet-&gt;getCallSiteId();</div><div class="line"><a name="l01178"></a><span class="lineno"> 1178</span>&#160;</div><div class="line"><a name="l01179"></a><span class="lineno"> 1179</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l01180"></a><span class="lineno"> 1180</span>&#160; }</div><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>
307
307
  <div class="ttc" id="classSVF_1_1CallDirSVFGEdge_html"><div class="ttname"><a href="classSVF_1_1CallDirSVFGEdge.html">SVF::CallDirSVFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00211">VFGEdge.h:211</a></div></div>
308
308
  <div class="ttc" id="classSVF_1_1VFGEdge_html"><div class="ttname"><a href="classSVF_1_1VFGEdge.html">SVF::VFGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGEdge_8h_source.html#l00044">VFGEdge.h:44</a></div></div>
309
309
  <div class="ttc" id="namespaceSVF_html_a726981481ac082dcda3e4921416b65a0"><div class="ttname"><a href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">SVF::raw_string_ostream</a></div><div class="ttdeci">llvm::raw_string_ostream raw_string_ostream</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00100">BasicTypes.h:100</a></div></div>
@@ -337,8 +337,8 @@ template&lt;class EdgeIter &gt; </div>
337
337
 
338
338
  <p>Return name of the graph. </p>
339
339
 
340
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00912">912</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
341
- <div class="fragment"><div class="line"><a name="l00913"></a><span class="lineno"> 913</span>&#160; {</div><div class="line"><a name="l00914"></a><span class="lineno"> 914</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;VFG&quot;</span>;</div><div class="line"><a name="l00915"></a><span class="lineno"> 915</span>&#160; }</div></div><!-- fragment -->
340
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00930">930</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
341
+ <div class="fragment"><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; {</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; <span class="keywordflow">return</span> <span class="stringliteral">&quot;VFG&quot;</span>;</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; }</div></div><!-- fragment -->
342
342
  </div>
343
343
  </div>
344
344
  <a id="a57d4a186a0319b73d69752564bf25b2a"></a>
@@ -375,8 +375,8 @@ template&lt;class EdgeIter &gt; </div>
375
375
  </table>
376
376
  </div><div class="memdoc">
377
377
 
378
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l01032">1032</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
379
- <div class="fragment"><div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160; {</div><div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160; std::string str;</div><div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;</div><div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtVFGNode</a>* stmtNode = SVFUtil::dyn_cast&lt;StmtVFGNode&gt;(node))</div><div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160; {</div><div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGEdge.html">PAGEdge</a>* edge = stmtNode-&gt;getPAGEdge();</div><div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;AddrPE&gt;(edge))</div><div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160; {</div><div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=green&quot;</span>;</div><div class="line"><a name="l01043"></a><span class="lineno"> 1043</span>&#160; }</div><div class="line"><a name="l01044"></a><span class="lineno"> 1044</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;CopyPE&gt;(edge))</div><div class="line"><a name="l01045"></a><span class="lineno"> 1045</span>&#160; {</div><div class="line"><a name="l01046"></a><span class="lineno"> 1046</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=black&quot;</span>;</div><div class="line"><a name="l01047"></a><span class="lineno"> 1047</span>&#160; }</div><div class="line"><a name="l01048"></a><span class="lineno"> 1048</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetPE&gt;(edge))</div><div class="line"><a name="l01049"></a><span class="lineno"> 1049</span>&#160; {</div><div class="line"><a name="l01050"></a><span class="lineno"> 1050</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=black,style=dotted&quot;</span>;</div><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; }</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;GepPE&gt;(edge))</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; {</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=purple&quot;</span>;</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; }</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;StorePE&gt;(edge))</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; {</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=blue&quot;</span>;</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; }</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;LoadPE&gt;(edge))</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; {</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=red&quot;</span>;</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; }</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; {</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(0 &amp;&amp; <span class="stringliteral">&quot;No such kind edge!!&quot;</span>);</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; }</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; }</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;CmpVFGNode&gt;(node))</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; {</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; }</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;BinaryOPVFGNode&gt;(node))</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; {</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; }</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;UnaryOPVFGNode&gt;(node))</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; {</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; }</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;PHIVFGNode&gt;(node))</div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; {</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=black&quot;</span>;</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; }</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;NullPtrVFGNode&gt;(node))</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; {</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; }</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;FormalParmVFGNode&gt;(node))</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; {</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; }</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;ActualParmVFGNode&gt;(node))</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; {</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; }</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;ActualRetVFGNode&gt;(node))</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; {</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; }</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;FormalRetVFGNode&gt;(node))</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; {</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; }</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;MRSVFGNode&gt;(node))</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; {</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=orange,penwidth=2&quot;</span>;</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; }</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;no such kind of node!!&quot;</span>);</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; }</div><div class="ttc" id="classSVF_1_1PAGEdge_html"><div class="ttname"><a href="classSVF_1_1PAGEdge.html">SVF::PAGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="PAGEdge_8h_source.html#l00047">PAGEdge.h:47</a></div></div>
378
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l01050">1050</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
379
+ <div class="fragment"><div class="line"><a name="l01051"></a><span class="lineno"> 1051</span>&#160; {</div><div class="line"><a name="l01052"></a><span class="lineno"> 1052</span>&#160; std::string str;</div><div class="line"><a name="l01053"></a><span class="lineno"> 1053</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l01054"></a><span class="lineno"> 1054</span>&#160;</div><div class="line"><a name="l01055"></a><span class="lineno"> 1055</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtVFGNode</a>* stmtNode = SVFUtil::dyn_cast&lt;StmtVFGNode&gt;(node))</div><div class="line"><a name="l01056"></a><span class="lineno"> 1056</span>&#160; {</div><div class="line"><a name="l01057"></a><span class="lineno"> 1057</span>&#160; <span class="keyword">const</span> <a class="code" href="classSVF_1_1PAGEdge.html">PAGEdge</a>* edge = stmtNode-&gt;getPAGEdge();</div><div class="line"><a name="l01058"></a><span class="lineno"> 1058</span>&#160; <span class="keywordflow">if</span> (SVFUtil::isa&lt;AddrPE&gt;(edge))</div><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160; {</div><div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=green&quot;</span>;</div><div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160; }</div><div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;CopyPE&gt;(edge))</div><div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160; {</div><div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=black&quot;</span>;</div><div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160; }</div><div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;RetPE&gt;(edge))</div><div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; {</div><div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=black,style=dotted&quot;</span>;</div><div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160; }</div><div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;GepPE&gt;(edge))</div><div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160; {</div><div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=purple&quot;</span>;</div><div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160; }</div><div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;StorePE&gt;(edge))</div><div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160; {</div><div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=blue&quot;</span>;</div><div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160; }</div><div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;LoadPE&gt;(edge))</div><div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160; {</div><div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=red&quot;</span>;</div><div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; }</div><div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160; {</div><div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(0 &amp;&amp; <span class="stringliteral">&quot;No such kind edge!!&quot;</span>);</div><div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160; }</div><div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160; }</div><div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;CmpVFGNode&gt;(node))</div><div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160; {</div><div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160; }</div><div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;BinaryOPVFGNode&gt;(node))</div><div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160; {</div><div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160; }</div><div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;UnaryOPVFGNode&gt;(node))</div><div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160; {</div><div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160; }</div><div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;PHIVFGNode&gt;(node))</div><div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; {</div><div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=black&quot;</span>;</div><div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160; }</div><div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;NullPtrVFGNode&gt;(node))</div><div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160; {</div><div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=grey&quot;</span>;</div><div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160; }</div><div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;FormalParmVFGNode&gt;(node))</div><div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160; {</div><div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160; }</div><div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;ActualParmVFGNode&gt;(node))</div><div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160; {</div><div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160; }</div><div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;ActualRetVFGNode&gt;(node))</div><div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160; {</div><div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160; }</div><div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;FormalRetVFGNode&gt;(node))</div><div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160; {</div><div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=yellow,penwidth=2&quot;</span>;</div><div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160; }</div><div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (SVFUtil::isa&lt;MRSVFGNode&gt;(node))</div><div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160; {</div><div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;color=orange,penwidth=2&quot;</span>;</div><div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160; }</div><div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;no such kind of node!!&quot;</span>);</div><div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160;</div><div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;&quot;</span>;</div><div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;</div><div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160; }</div><div class="ttc" id="classSVF_1_1PAGEdge_html"><div class="ttname"><a href="classSVF_1_1PAGEdge.html">SVF::PAGEdge</a></div><div class="ttdef"><b>Definition:</b> <a href="PAGEdge_8h_source.html#l00047">PAGEdge.h:47</a></div></div>
380
380
  <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>
381
381
  <div class="ttc" id="namespaceSVF_html_a726981481ac082dcda3e4921416b65a0"><div class="ttname"><a href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">SVF::raw_string_ostream</a></div><div class="ttdeci">llvm::raw_string_ostream raw_string_ostream</div><div class="ttdef"><b>Definition:</b> <a href="BasicTypes_8h_source.html#l00100">BasicTypes.h:100</a></div></div>
382
382
  <div class="ttc" id="classSVF_1_1StmtVFGNode_html"><div class="ttname"><a href="classSVF_1_1StmtVFGNode.html">SVF::StmtVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00114">VFGNode.h:114</a></div></div>
@@ -417,8 +417,8 @@ template&lt;class EdgeIter &gt; </div>
417
417
  </table>
418
418
  </div><div class="memdoc">
419
419
 
420
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00917">917</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
421
- <div class="fragment"><div class="line"><a name="l00918"></a><span class="lineno"> 918</span>&#160; {</div><div class="line"><a name="l00919"></a><span class="lineno"> 919</span>&#160; <span class="keywordflow">if</span> (isSimple())</div><div class="line"><a name="l00920"></a><span class="lineno"> 920</span>&#160; <span class="keywordflow">return</span> getSimpleNodeLabel(node, graph);</div><div class="line"><a name="l00921"></a><span class="lineno"> 921</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00922"></a><span class="lineno"> 922</span>&#160; <span class="keywordflow">return</span> getCompleteNodeLabel(node, graph);</div><div class="line"><a name="l00923"></a><span class="lineno"> 923</span>&#160; }</div></div><!-- fragment -->
420
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00935">935</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
421
+ <div class="fragment"><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; {</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; <span class="keywordflow">if</span> (isSimple())</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <span class="keywordflow">return</span> getSimpleNodeLabel(node, graph);</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; <span class="keywordflow">return</span> getCompleteNodeLabel(node, graph);</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; }</div></div><!-- fragment -->
422
422
  </div>
423
423
  </div>
424
424
  <a id="a0159404d5c5a7816a4b679c0f35a546e"></a>
@@ -457,8 +457,8 @@ template&lt;class EdgeIter &gt; </div>
457
457
 
458
458
  <p>Return label of a VFG node without MemSSA information. </p>
459
459
 
460
- <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00926">926</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
461
- <div class="fragment"><div class="line"><a name="l00927"></a><span class="lineno"> 927</span>&#160; {</div><div class="line"><a name="l00928"></a><span class="lineno"> 928</span>&#160; std::string str;</div><div class="line"><a name="l00929"></a><span class="lineno"> 929</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l00930"></a><span class="lineno"> 930</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtVFGNode</a>* stmtNode = SVFUtil::dyn_cast&lt;StmtVFGNode&gt;(node))</div><div class="line"><a name="l00931"></a><span class="lineno"> 931</span>&#160; {</div><div class="line"><a name="l00932"></a><span class="lineno"> 932</span>&#160; rawstr &lt;&lt; stmtNode-&gt;toString();</div><div class="line"><a name="l00933"></a><span class="lineno"> 933</span>&#160; }</div><div class="line"><a name="l00934"></a><span class="lineno"> 934</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1PHIVFGNode.html">PHIVFGNode</a>* tphi = SVFUtil::dyn_cast&lt;PHIVFGNode&gt;(node))</div><div class="line"><a name="l00935"></a><span class="lineno"> 935</span>&#160; {</div><div class="line"><a name="l00936"></a><span class="lineno"> 936</span>&#160; rawstr &lt;&lt; tphi-&gt;toString();</div><div class="line"><a name="l00937"></a><span class="lineno"> 937</span>&#160; }</div><div class="line"><a name="l00938"></a><span class="lineno"> 938</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1FormalParmVFGNode.html">FormalParmVFGNode</a>* fp = SVFUtil::dyn_cast&lt;FormalParmVFGNode&gt;(node))</div><div class="line"><a name="l00939"></a><span class="lineno"> 939</span>&#160; {</div><div class="line"><a name="l00940"></a><span class="lineno"> 940</span>&#160; rawstr &lt;&lt; fp-&gt;toString();</div><div class="line"><a name="l00941"></a><span class="lineno"> 941</span>&#160; }</div><div class="line"><a name="l00942"></a><span class="lineno"> 942</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1ActualParmVFGNode.html">ActualParmVFGNode</a>* ap = SVFUtil::dyn_cast&lt;ActualParmVFGNode&gt;(node))</div><div class="line"><a name="l00943"></a><span class="lineno"> 943</span>&#160; {</div><div class="line"><a name="l00944"></a><span class="lineno"> 944</span>&#160; rawstr &lt;&lt; ap-&gt;toString();</div><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; }</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ActualRetVFGNode.html">ActualRetVFGNode</a>* ar = SVFUtil::dyn_cast&lt;ActualRetVFGNode&gt;(node))</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; {</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; rawstr &lt;&lt; ar-&gt;toString();</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; }</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FormalRetVFGNode.html">FormalRetVFGNode</a>* fr = SVFUtil::dyn_cast&lt;FormalRetVFGNode&gt;(node))</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; {</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; rawstr &lt;&lt; fr-&gt;toString();</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; }</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;NullPtrVFGNode&gt;(node))</div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; {</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;NullPtr&quot;</span>;</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; }</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1BinaryOPVFGNode.html">BinaryOPVFGNode</a>* bop = SVFUtil::dyn_cast&lt;BinaryOPVFGNode&gt;(node))</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; {</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; rawstr &lt;&lt; bop-&gt;toString();</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; }</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1UnaryOPVFGNode.html">UnaryOPVFGNode</a>* uop = SVFUtil::dyn_cast&lt;UnaryOPVFGNode&gt;(node))</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; {</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; rawstr &lt;&lt; uop-&gt;toString();</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; }</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1CmpVFGNode.html">CmpVFGNode</a>* cmp = SVFUtil::dyn_cast&lt;CmpVFGNode&gt;(node))</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; {</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; rawstr &lt;&lt; cmp-&gt;toString();;</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; }</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else kinds of nodes do we have??&quot;</span>);</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160;</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; }</div><div class="ttc" id="classSVF_1_1BinaryOPVFGNode_html"><div class="ttname"><a href="classSVF_1_1BinaryOPVFGNode.html">SVF::BinaryOPVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00388">VFGNode.h:388</a></div></div>
460
+ <p class="definition">Definition at line <a class="el" href="VFG_8cpp_source.html#l00944">944</a> of file <a class="el" href="VFG_8cpp_source.html">VFG.cpp</a>.</p>
461
+ <div class="fragment"><div class="line"><a name="l00945"></a><span class="lineno"> 945</span>&#160; {</div><div class="line"><a name="l00946"></a><span class="lineno"> 946</span>&#160; std::string str;</div><div class="line"><a name="l00947"></a><span class="lineno"> 947</span>&#160; <a class="code" href="namespaceSVF.html#a726981481ac082dcda3e4921416b65a0">raw_string_ostream</a> rawstr(str);</div><div class="line"><a name="l00948"></a><span class="lineno"> 948</span>&#160; <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1StmtVFGNode.html">StmtVFGNode</a>* stmtNode = SVFUtil::dyn_cast&lt;StmtVFGNode&gt;(node))</div><div class="line"><a name="l00949"></a><span class="lineno"> 949</span>&#160; {</div><div class="line"><a name="l00950"></a><span class="lineno"> 950</span>&#160; rawstr &lt;&lt; stmtNode-&gt;toString();</div><div class="line"><a name="l00951"></a><span class="lineno"> 951</span>&#160; }</div><div class="line"><a name="l00952"></a><span class="lineno"> 952</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1PHIVFGNode.html">PHIVFGNode</a>* tphi = SVFUtil::dyn_cast&lt;PHIVFGNode&gt;(node))</div><div class="line"><a name="l00953"></a><span class="lineno"> 953</span>&#160; {</div><div class="line"><a name="l00954"></a><span class="lineno"> 954</span>&#160; rawstr &lt;&lt; tphi-&gt;toString();</div><div class="line"><a name="l00955"></a><span class="lineno"> 955</span>&#160; }</div><div class="line"><a name="l00956"></a><span class="lineno"> 956</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1FormalParmVFGNode.html">FormalParmVFGNode</a>* fp = SVFUtil::dyn_cast&lt;FormalParmVFGNode&gt;(node))</div><div class="line"><a name="l00957"></a><span class="lineno"> 957</span>&#160; {</div><div class="line"><a name="l00958"></a><span class="lineno"> 958</span>&#160; rawstr &lt;&lt; fp-&gt;toString();</div><div class="line"><a name="l00959"></a><span class="lineno"> 959</span>&#160; }</div><div class="line"><a name="l00960"></a><span class="lineno"> 960</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1ActualParmVFGNode.html">ActualParmVFGNode</a>* ap = SVFUtil::dyn_cast&lt;ActualParmVFGNode&gt;(node))</div><div class="line"><a name="l00961"></a><span class="lineno"> 961</span>&#160; {</div><div class="line"><a name="l00962"></a><span class="lineno"> 962</span>&#160; rawstr &lt;&lt; ap-&gt;toString();</div><div class="line"><a name="l00963"></a><span class="lineno"> 963</span>&#160; }</div><div class="line"><a name="l00964"></a><span class="lineno"> 964</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1ActualRetVFGNode.html">ActualRetVFGNode</a>* ar = SVFUtil::dyn_cast&lt;ActualRetVFGNode&gt;(node))</div><div class="line"><a name="l00965"></a><span class="lineno"> 965</span>&#160; {</div><div class="line"><a name="l00966"></a><span class="lineno"> 966</span>&#160; rawstr &lt;&lt; ar-&gt;toString();</div><div class="line"><a name="l00967"></a><span class="lineno"> 967</span>&#160; }</div><div class="line"><a name="l00968"></a><span class="lineno"> 968</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span> (<a class="code" href="classSVF_1_1FormalRetVFGNode.html">FormalRetVFGNode</a>* fr = SVFUtil::dyn_cast&lt;FormalRetVFGNode&gt;(node))</div><div class="line"><a name="l00969"></a><span class="lineno"> 969</span>&#160; {</div><div class="line"><a name="l00970"></a><span class="lineno"> 970</span>&#160; rawstr &lt;&lt; fr-&gt;toString();</div><div class="line"><a name="l00971"></a><span class="lineno"> 971</span>&#160; }</div><div class="line"><a name="l00972"></a><span class="lineno"> 972</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(SVFUtil::isa&lt;NullPtrVFGNode&gt;(node))</div><div class="line"><a name="l00973"></a><span class="lineno"> 973</span>&#160; {</div><div class="line"><a name="l00974"></a><span class="lineno"> 974</span>&#160; rawstr &lt;&lt; <span class="stringliteral">&quot;NullPtr&quot;</span>;</div><div class="line"><a name="l00975"></a><span class="lineno"> 975</span>&#160; }</div><div class="line"><a name="l00976"></a><span class="lineno"> 976</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1BinaryOPVFGNode.html">BinaryOPVFGNode</a>* bop = SVFUtil::dyn_cast&lt;BinaryOPVFGNode&gt;(node))</div><div class="line"><a name="l00977"></a><span class="lineno"> 977</span>&#160; {</div><div class="line"><a name="l00978"></a><span class="lineno"> 978</span>&#160; rawstr &lt;&lt; bop-&gt;toString();</div><div class="line"><a name="l00979"></a><span class="lineno"> 979</span>&#160; }</div><div class="line"><a name="l00980"></a><span class="lineno"> 980</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1UnaryOPVFGNode.html">UnaryOPVFGNode</a>* uop = SVFUtil::dyn_cast&lt;UnaryOPVFGNode&gt;(node))</div><div class="line"><a name="l00981"></a><span class="lineno"> 981</span>&#160; {</div><div class="line"><a name="l00982"></a><span class="lineno"> 982</span>&#160; rawstr &lt;&lt; uop-&gt;toString();</div><div class="line"><a name="l00983"></a><span class="lineno"> 983</span>&#160; }</div><div class="line"><a name="l00984"></a><span class="lineno"> 984</span>&#160; <span class="keywordflow">else</span> <span class="keywordflow">if</span>(<a class="code" href="classSVF_1_1CmpVFGNode.html">CmpVFGNode</a>* cmp = SVFUtil::dyn_cast&lt;CmpVFGNode&gt;(node))</div><div class="line"><a name="l00985"></a><span class="lineno"> 985</span>&#160; {</div><div class="line"><a name="l00986"></a><span class="lineno"> 986</span>&#160; rawstr &lt;&lt; cmp-&gt;toString();;</div><div class="line"><a name="l00987"></a><span class="lineno"> 987</span>&#160; }</div><div class="line"><a name="l00988"></a><span class="lineno"> 988</span>&#160; <span class="keywordflow">else</span></div><div class="line"><a name="l00989"></a><span class="lineno"> 989</span>&#160; <a class="code" href="util_8h.html#a07d17d6d5d1074c0969bc5d3c3d1d84a">assert</a>(<span class="keyword">false</span> &amp;&amp; <span class="stringliteral">&quot;what else kinds of nodes do we have??&quot;</span>);</div><div class="line"><a name="l00990"></a><span class="lineno"> 990</span>&#160;</div><div class="line"><a name="l00991"></a><span class="lineno"> 991</span>&#160; <span class="keywordflow">return</span> rawstr.str();</div><div class="line"><a name="l00992"></a><span class="lineno"> 992</span>&#160; }</div><div class="ttc" id="classSVF_1_1BinaryOPVFGNode_html"><div class="ttname"><a href="classSVF_1_1BinaryOPVFGNode.html">SVF::BinaryOPVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00388">VFGNode.h:388</a></div></div>
462
462
  <div class="ttc" id="classSVF_1_1ActualParmVFGNode_html"><div class="ttname"><a href="classSVF_1_1ActualParmVFGNode.html">SVF::ActualParmVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00779">VFGNode.h:779</a></div></div>
463
463
  <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>
464
464
  <div class="ttc" id="classSVF_1_1PHIVFGNode_html"><div class="ttname"><a href="classSVF_1_1PHIVFGNode.html">SVF::PHIVFGNode</a></div><div class="ttdef"><b>Definition:</b> <a href="VFGNode_8h_source.html#l00572">VFGNode.h:572</a></div></div>
@@ -109,7 +109,7 @@ struct std::hash&lt; SVF::PointsTo &gt;</h3>
109
109
  </div><div class="memdoc">
110
110
 
111
111
  <p class="definition">Definition at line <a class="el" href="PointsTo_8h_source.html#l00241">241</a> of file <a class="el" href="PointsTo_8h_source.html">PointsTo.h</a>.</p>
112
- <div class="fragment"><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">return</span> pt.<a class="code" href="classSVF_1_1PointsTo.html#afe275b31ea93a3ecea4e19660ceef0ae">hash</a>();</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; }</div><div class="ttc" id="classSVF_1_1PointsTo_html_afe275b31ea93a3ecea4e19660ceef0ae"><div class="ttname"><a href="classSVF_1_1PointsTo.html#afe275b31ea93a3ecea4e19660ceef0ae">SVF::PointsTo::hash</a></div><div class="ttdeci">size_t hash(void) const</div><div class="ttdoc">Return a hash of this set. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00270">PointsTo.cpp:270</a></div></div>
112
+ <div class="fragment"><div class="line"><a name="l00242"></a><span class="lineno"> 242</span>&#160; {</div><div class="line"><a name="l00243"></a><span class="lineno"> 243</span>&#160; <span class="keywordflow">return</span> pt.<a class="code" href="classSVF_1_1PointsTo.html#afe275b31ea93a3ecea4e19660ceef0ae">hash</a>();</div><div class="line"><a name="l00244"></a><span class="lineno"> 244</span>&#160; }</div><div class="ttc" id="classSVF_1_1PointsTo_html_afe275b31ea93a3ecea4e19660ceef0ae"><div class="ttname"><a href="classSVF_1_1PointsTo.html#afe275b31ea93a3ecea4e19660ceef0ae">SVF::PointsTo::hash</a></div><div class="ttdeci">size_t hash(void) const</div><div class="ttdoc">Return a hash of this set. </div><div class="ttdef"><b>Definition:</b> <a href="PointsTo_8cpp_source.html#l00305">PointsTo.cpp:305</a></div></div>
113
113
  </div><!-- fragment -->
114
114
  </div>
115
115
  </div>
@@ -160,9 +160,6 @@ public:
160
160
  bool isSatisfiableForAll();
161
161
  bool isSatisfiableForPairs();
162
162
 
163
- /// Get llvm value from a SVFGNode
164
- const Value* getLLVMValue(const SVFGNode* node) const;
165
-
166
163
  /// Get callsite ID and get returnsiteID from SVFGEdge
167
164
  //@{
168
165
  const CallBlockNode* getCallSite(const SVFGEdge* edge) const;
@@ -3,11 +3,16 @@
3
3
  #ifndef NODEIDALLOCATOR_H_
4
4
  #define NODEIDALLOCATOR_H_
5
5
 
6
+ #include "FastCluster/fastcluster.h"
6
7
  #include "Util/SVFBasicTypes.h"
8
+ #include "MemoryModel/PointsTo.h"
7
9
 
8
10
  namespace SVF
9
11
  {
10
12
 
13
+ // Forward declare for the Clusterer.
14
+ class BVDataPTAImpl;
15
+
11
16
  /// Allocates node IDs for objects and values, upon request, according to
12
17
  /// some strategy which can be user-defined.
13
18
  /// It is the job of SymbolTableInfo to tell the NodeIDAllocator when
@@ -65,6 +70,9 @@ public:
65
70
  /// Notify the allocator that all symbols have had IDs allocated.
66
71
  void endSymbolAllocation(void);
67
72
 
73
+ /// Returns the total number of memory objects.
74
+ NodeID getNumObjects(void) const { return numObjects; }
75
+
68
76
  private:
69
77
  /// Builds a node ID allocator with the strategy specified on the command line.
70
78
  NodeIDAllocator(void);
@@ -87,6 +95,92 @@ private:
87
95
 
88
96
  /// Single allocator.
89
97
  static NodeIDAllocator *allocator;
98
+
99
+ public:
100
+ /// Perform clustering given points-to sets with nodes allocated according to the
101
+ /// DENSE strategy.
102
+ class Clusterer
103
+ {
104
+ private:
105
+ /// Maps a pair of nodes to their (minimum) distance and the number of
106
+ /// times that distance occurs in a set of *unique* points-to sets.
107
+ typedef Map<NodePair, std::pair<unsigned, unsigned>> DistOccMap;
108
+
109
+ /// Statistics strings.
110
+ ///@{
111
+ static const std::string NumObjects;
112
+ static const std::string RegioningTime;
113
+ static const std::string DistanceMatrixTime;
114
+ static const std::string FastClusterTime;
115
+ static const std::string DendrogramTraversalTime;
116
+ static const std::string EvalTime;
117
+ static const std::string TotalTime;
118
+ static const std::string TheoreticalNumWords;
119
+ static const std::string OriginalBvNumWords;
120
+ static const std::string OriginalSbvNumWords;
121
+ static const std::string NewBvNumWords;
122
+ static const std::string NewSbvNumWords;
123
+ static const std::string NumRegions;
124
+ static const std::string NumGtIntRegions;
125
+ static const std::string LargestRegion;
126
+ static const std::string BestCandidate;
127
+ static const std::string NumNonTrivialRegionObjects;
128
+ ///@}
129
+
130
+ public:
131
+ /// Returns vector mapping previously allocated node IDs to a smarter allocation
132
+ /// based on the points-to sets in pta accessed through keys.
133
+ /// The second part of the keys pairs are the number of (potential) occurrences of that points-to set
134
+ /// or a subset, depending on the client's wish.
135
+ /// TODO: interfaces are getting unwieldy, an initialised object may be better.
136
+ /// TODO: kind of sucks pta can't be const here because getPts isn't.
137
+ static std::vector<NodeID> cluster(BVDataPTAImpl *pta, const std::vector<std::pair<NodeID, unsigned>> keys, std::vector<std::pair<hclust_fast_methods, std::vector<NodeID>>> &candidates, std::string evalSubtitle="");
138
+
139
+ // Returns a reverse node mapping for mapping generated by cluster().
140
+ static std::vector<NodeID> getReverseNodeMapping(const std::vector<NodeID> &nodeMapping);
141
+
142
+ /// Fills in *NumWords statistics in stats..
143
+ static void evaluate(const std::vector<NodeID> &nodeMap, const Map<PointsTo, unsigned> pointsToSets, Map<std::string, std::string> &stats, bool accountForOcc);
144
+
145
+ /// Prints statistics to SVFUtil::outs().
146
+ /// TODO: make stats const.
147
+ static void printStats(std::string title, Map<std::string, std::string> &stats);
148
+
149
+ private:
150
+ /// Returns an index into a condensed matrix (upper triangle, excluding diagonals) corresponding
151
+ /// to an nxn matrix.
152
+ static inline size_t condensedIndex(size_t n, size_t i, size_t j);
153
+
154
+ /// Returns the minimum number of bits required to represent pts in a perfect world.
155
+ static inline unsigned requiredBits(const PointsTo &pts);
156
+
157
+ /// Returns the minimum number of bits required to represent n items in a perfect world.
158
+ static inline unsigned requiredBits(const size_t n);
159
+
160
+ /// Builds the upper triangle of the distance matrix, as an array of length
161
+ /// (numObjects * (numObjects - 1)) / 2, as required by fastcluster.
162
+ /// Responsibility of caller to `delete`.
163
+ static inline double *getDistanceMatrix(const std::vector<std::pair<const PointsTo *, unsigned>> pointsToSets,
164
+ const size_t numObjects, const Map<NodeID, unsigned> &nodeMap,
165
+ double &distanceMatrixTime);
166
+
167
+ /// Traverses the dendrogram produced by fastcluster, making node o, where o is the nth leaf (per
168
+ /// recursive DFS) map to n. index is the dendrogram node to work off. The traversal should start
169
+ /// at the top, which is the "last" (consider that it is 2D) element of the dendrogram, numObjects - 1.
170
+ static inline void traverseDendrogram(std::vector<NodeID> &nodeMap, const int *dendrogram, const size_t numObjects, unsigned &allocCounter, Set<int> &visited, const int index, const std::vector<NodeID> &regionNodeMap);
171
+
172
+ /// Returns a vector mapping object IDs to a label such that if two objects appear
173
+ /// in the same points-to set, they have the same label. The "appear in the same
174
+ /// points-to set" is encoded by graph which is an adjacency list ensuring that
175
+ /// x in pt(p) and y in pt(p) -> x is reachable from y.
176
+ static inline std::vector<unsigned> regionObjects(const Map<NodeID, Set<NodeID>> &graph, size_t numObjects, size_t &numLabels);
177
+
178
+ // From all the candidates, returns the best mapping for pointsToSets (points-to set -> # occurences).
179
+ static inline std::pair<hclust_fast_methods, std::vector<NodeID>> determineBestMapping(
180
+ const std::vector<std::pair<hclust_fast_methods, std::vector<NodeID>>> &candidates,
181
+ Map<PointsTo, unsigned> pointsToSets, const std::string &evalSubtitle, double &evalTime);
182
+
183
+ };
90
184
  };
91
185
 
92
186
  } // namespace SVF
@@ -287,6 +287,9 @@ void mergePtsOccMaps(Map<Data, unsigned> &to, const Map<Data, unsigned> from)
287
287
  }
288
288
  }
289
289
 
290
+ /// Returns a string representation of a hclust method.
291
+ std::string hclustMethodToString(hclust_fast_methods method);
292
+
290
293
  /// Inserts an element into a Set/CondSet (with ::insert).
291
294
  template <typename Key, typename KeySet>
292
295
  inline void insertKey(const Key &key, KeySet &keySet)
@@ -411,6 +411,10 @@ protected:
411
411
  {
412
412
  return;
413
413
  }
414
+
415
+ /// Runs a Steensgaard analysis and performs clustering based on those
416
+ /// results set the global best mapping.
417
+ virtual void cluster(void) const;
414
418
  };
415
419
 
416
420
 
@@ -273,10 +273,19 @@ protected:
273
273
  }
274
274
  ///@}
275
275
 
276
+ /// Performs clustering based on ander, setting the global best mapping
277
+ /// accordingly.
278
+ virtual void cluster(void);
279
+ /// Sets the global best mapping as a plain mapping, i.e. n -> n.
280
+ virtual void plainMap(void) const;
281
+
276
282
  static FlowSensitive* fspta;
277
283
  SVFGBuilder memSSA;
278
284
  AndersenWaveDiff *ander;
279
285
 
286
+ /// Save candidate mappings for evaluation's sake.
287
+ std::vector<std::pair<hclust_fast_methods, std::vector<NodeID>>> candidateMappings;
288
+
280
289
  /// Statistics.
281
290
  //@{
282
291
  Size_t numOfProcessedAddr; /// Number of processed Addr node