svf-tools 1.0.782 → 1.0.783

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 (300) hide show
  1. package/SVF-doxygen/html/html/CDG_8h.html +2 -2
  2. package/SVF-doxygen/html/html/CDG_8h_source.html +2 -2
  3. package/SVF-doxygen/html/html/CFBasicBlockG_8cpp_source.html +152 -90
  4. package/SVF-doxygen/html/html/CFBasicBlockG_8h.html +3 -1
  5. package/SVF-doxygen/html/html/CFBasicBlockG_8h_source.html +601 -260
  6. package/SVF-doxygen/html/html/ConsGNode_8h_source.html +4 -4
  7. package/SVF-doxygen/html/html/WTO_8h_source.html +6 -6
  8. package/SVF-doxygen/html/html/annotated.html +325 -333
  9. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockEdge-members.html +19 -12
  10. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockEdge.html +219 -30
  11. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGBuilder-members.html +4 -3
  12. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGBuilder.html +147 -39
  13. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTOCycle.html +1 -1
  14. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTONode.html +1 -1
  15. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGraph-members.html +32 -28
  16. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGraph.html +382 -184
  17. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockNode-members.html +51 -41
  18. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockNode.html +1244 -159
  19. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode-members.html +34 -34
  20. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +65 -25
  21. package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.html +4 -5
  22. package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.png +0 -0
  23. package/SVF-doxygen/html/html/classSVF_1_1GenericGraph.html +3 -4
  24. package/SVF-doxygen/html/html/classSVF_1_1GenericGraph.png +0 -0
  25. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +10 -10
  26. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
  27. package/SVF-doxygen/html/html/classes.html +266 -276
  28. package/SVF-doxygen/html/html/dir_a10fe8a299b5f0831d187a9a2e1308ef.html +0 -2
  29. package/SVF-doxygen/html/html/dir_fc0329f850c815763e0c5b05933e8d55.html +0 -2
  30. package/SVF-doxygen/html/html/files.html +19 -21
  31. package/SVF-doxygen/html/html/functions.html +2 -33
  32. package/SVF-doxygen/html/html/functions_a.html +14 -16
  33. package/SVF-doxygen/html/html/functions_b.html +8 -9
  34. package/SVF-doxygen/html/html/functions_c.html +34 -31
  35. package/SVF-doxygen/html/html/functions_d.html +11 -13
  36. package/SVF-doxygen/html/html/functions_e.html +1 -1
  37. package/SVF-doxygen/html/html/functions_func.html +16 -18
  38. package/SVF-doxygen/html/html/functions_func_b.html +2 -3
  39. package/SVF-doxygen/html/html/functions_func_c.html +31 -31
  40. package/SVF-doxygen/html/html/functions_func_d.html +10 -12
  41. package/SVF-doxygen/html/html/functions_func_g.html +22 -59
  42. package/SVF-doxygen/html/html/functions_func_h.html +9 -12
  43. package/SVF-doxygen/html/html/functions_func_i.html +13 -26
  44. package/SVF-doxygen/html/html/functions_func_o.html +9 -9
  45. package/SVF-doxygen/html/html/functions_func_p.html +1 -1
  46. package/SVF-doxygen/html/html/functions_func_r.html +15 -15
  47. package/SVF-doxygen/html/html/functions_func_s.html +19 -28
  48. package/SVF-doxygen/html/html/functions_func_t.html +0 -2
  49. package/SVF-doxygen/html/html/functions_func_v.html +2 -3
  50. package/SVF-doxygen/html/html/functions_func_~.html +0 -12
  51. package/SVF-doxygen/html/html/functions_g.html +23 -60
  52. package/SVF-doxygen/html/html/functions_h.html +9 -12
  53. package/SVF-doxygen/html/html/functions_i.html +16 -44
  54. package/SVF-doxygen/html/html/functions_n.html +6 -8
  55. package/SVF-doxygen/html/html/functions_o.html +23 -27
  56. package/SVF-doxygen/html/html/functions_p.html +8 -12
  57. package/SVF-doxygen/html/html/functions_r.html +17 -17
  58. package/SVF-doxygen/html/html/functions_s.html +15 -32
  59. package/SVF-doxygen/html/html/functions_t.html +5 -7
  60. package/SVF-doxygen/html/html/functions_type_c.html +6 -3
  61. package/SVF-doxygen/html/html/functions_type_e.html +1 -1
  62. package/SVF-doxygen/html/html/functions_type_i.html +3 -18
  63. package/SVF-doxygen/html/html/functions_type_n.html +0 -2
  64. package/SVF-doxygen/html/html/functions_type_s.html +0 -6
  65. package/SVF-doxygen/html/html/functions_v.html +4 -5
  66. package/SVF-doxygen/html/html/functions_vars.html +2 -33
  67. package/SVF-doxygen/html/html/functions_vars_i.html +2 -2
  68. package/SVF-doxygen/html/html/functions_vars_o.html +2 -2
  69. package/SVF-doxygen/html/html/functions_w.html +8 -8
  70. package/SVF-doxygen/html/html/functions_~.html +0 -12
  71. package/SVF-doxygen/html/html/hierarchy.html +458 -469
  72. package/SVF-doxygen/html/html/namespaceSVF.html +7 -78
  73. package/SVF-doxygen/html/html/namespacemembers_g.html +3 -12
  74. package/SVF-doxygen/html/html/namespacemembers_n.html +1 -1
  75. package/SVF-doxygen/html/html/namespacemembers_type_g.html +0 -9
  76. package/SVF-doxygen/html/html/namespacemembers_type_n.html +1 -1
  77. package/SVF-doxygen/html/html/search/all_0.js +137 -147
  78. package/SVF-doxygen/html/html/search/all_1.js +484 -485
  79. package/SVF-doxygen/html/html/search/all_10.js +324 -324
  80. package/SVF-doxygen/html/html/search/all_11.js +224 -224
  81. package/SVF-doxygen/html/html/search/all_12.js +541 -546
  82. package/SVF-doxygen/html/html/search/all_13.js +190 -190
  83. package/SVF-doxygen/html/html/search/all_14.js +67 -67
  84. package/SVF-doxygen/html/html/search/all_15.js +170 -170
  85. package/SVF-doxygen/html/html/search/all_16.js +63 -63
  86. package/SVF-doxygen/html/html/search/all_17.js +1 -1
  87. package/SVF-doxygen/html/html/search/all_18.js +1 -1
  88. package/SVF-doxygen/html/html/search/all_19.js +11 -11
  89. package/SVF-doxygen/html/html/search/all_1a.js +172 -176
  90. package/SVF-doxygen/html/html/search/all_2.js +167 -167
  91. package/SVF-doxygen/html/html/search/all_3.js +640 -639
  92. package/SVF-doxygen/html/html/search/all_4.js +233 -234
  93. package/SVF-doxygen/html/html/search/all_5.js +121 -120
  94. package/SVF-doxygen/html/html/search/all_6.js +225 -225
  95. package/SVF-doxygen/html/html/search/all_7.js +1037 -1056
  96. package/SVF-doxygen/html/html/search/all_8.js +194 -195
  97. package/SVF-doxygen/html/html/search/all_9.js +607 -617
  98. package/SVF-doxygen/html/html/search/all_a.js +46 -46
  99. package/SVF-doxygen/html/html/search/all_b.js +26 -26
  100. package/SVF-doxygen/html/html/search/all_c.js +116 -116
  101. package/SVF-doxygen/html/html/search/all_d.js +196 -196
  102. package/SVF-doxygen/html/html/search/all_e.js +207 -207
  103. package/SVF-doxygen/html/html/search/all_f.js +116 -116
  104. package/SVF-doxygen/html/html/search/classes_0.js +26 -26
  105. package/SVF-doxygen/html/html/search/classes_1.js +9 -9
  106. package/SVF-doxygen/html/html/search/classes_10.js +73 -73
  107. package/SVF-doxygen/html/html/search/classes_11.js +15 -15
  108. package/SVF-doxygen/html/html/search/classes_12.js +2 -2
  109. package/SVF-doxygen/html/html/search/classes_13.js +10 -10
  110. package/SVF-doxygen/html/html/search/classes_14.js +14 -14
  111. package/SVF-doxygen/html/html/search/classes_15.js +1 -1
  112. package/SVF-doxygen/html/html/search/classes_2.js +80 -80
  113. package/SVF-doxygen/html/html/search/classes_3.js +37 -38
  114. package/SVF-doxygen/html/html/search/classes_4.js +9 -9
  115. package/SVF-doxygen/html/html/search/classes_5.js +28 -28
  116. package/SVF-doxygen/html/html/search/classes_6.js +104 -110
  117. package/SVF-doxygen/html/html/search/classes_7.js +33 -33
  118. package/SVF-doxygen/html/html/search/classes_8.js +56 -60
  119. package/SVF-doxygen/html/html/search/classes_9.js +1 -1
  120. package/SVF-doxygen/html/html/search/classes_a.js +12 -12
  121. package/SVF-doxygen/html/html/search/classes_b.js +29 -29
  122. package/SVF-doxygen/html/html/search/classes_c.js +6 -6
  123. package/SVF-doxygen/html/html/search/classes_d.js +18 -18
  124. package/SVF-doxygen/html/html/search/classes_e.js +36 -36
  125. package/SVF-doxygen/html/html/search/classes_f.js +25 -25
  126. package/SVF-doxygen/html/html/search/defines_0.js +3 -3
  127. package/SVF-doxygen/html/html/search/defines_1.js +2 -2
  128. package/SVF-doxygen/html/html/search/defines_2.js +30 -30
  129. package/SVF-doxygen/html/html/search/defines_3.js +21 -21
  130. package/SVF-doxygen/html/html/search/defines_4.js +2 -2
  131. package/SVF-doxygen/html/html/search/defines_5.js +4 -4
  132. package/SVF-doxygen/html/html/search/defines_6.js +2 -2
  133. package/SVF-doxygen/html/html/search/defines_7.js +5 -5
  134. package/SVF-doxygen/html/html/search/defines_8.js +11 -11
  135. package/SVF-doxygen/html/html/search/defines_9.js +9 -9
  136. package/SVF-doxygen/html/html/search/defines_a.js +2 -2
  137. package/SVF-doxygen/html/html/search/defines_b.js +1 -1
  138. package/SVF-doxygen/html/html/search/defines_c.js +3 -3
  139. package/SVF-doxygen/html/html/search/defines_d.js +2 -2
  140. package/SVF-doxygen/html/html/search/defines_e.js +7 -7
  141. package/SVF-doxygen/html/html/search/defines_f.js +3 -3
  142. package/SVF-doxygen/html/html/search/enums_0.js +3 -3
  143. package/SVF-doxygen/html/html/search/enums_1.js +2 -2
  144. package/SVF-doxygen/html/html/search/enums_10.js +1 -1
  145. package/SVF-doxygen/html/html/search/enums_11.js +1 -1
  146. package/SVF-doxygen/html/html/search/enums_2.js +8 -8
  147. package/SVF-doxygen/html/html/search/enums_3.js +1 -1
  148. package/SVF-doxygen/html/html/search/enums_4.js +3 -3
  149. package/SVF-doxygen/html/html/search/enums_5.js +1 -1
  150. package/SVF-doxygen/html/html/search/enums_6.js +2 -2
  151. package/SVF-doxygen/html/html/search/enums_7.js +2 -2
  152. package/SVF-doxygen/html/html/search/enums_8.js +4 -4
  153. package/SVF-doxygen/html/html/search/enums_9.js +1 -1
  154. package/SVF-doxygen/html/html/search/enums_a.js +1 -1
  155. package/SVF-doxygen/html/html/search/enums_b.js +7 -7
  156. package/SVF-doxygen/html/html/search/enums_c.js +1 -1
  157. package/SVF-doxygen/html/html/search/enums_d.js +4 -4
  158. package/SVF-doxygen/html/html/search/enums_e.js +2 -2
  159. package/SVF-doxygen/html/html/search/enums_f.js +4 -4
  160. package/SVF-doxygen/html/html/search/enumvalues_0.js +14 -14
  161. package/SVF-doxygen/html/html/search/enumvalues_1.js +14 -14
  162. package/SVF-doxygen/html/html/search/enumvalues_10.js +35 -35
  163. package/SVF-doxygen/html/html/search/enumvalues_11.js +3 -3
  164. package/SVF-doxygen/html/html/search/enumvalues_12.js +10 -10
  165. package/SVF-doxygen/html/html/search/enumvalues_13.js +1 -1
  166. package/SVF-doxygen/html/html/search/enumvalues_14.js +1 -1
  167. package/SVF-doxygen/html/html/search/enumvalues_15.js +3 -3
  168. package/SVF-doxygen/html/html/search/enumvalues_2.js +36 -36
  169. package/SVF-doxygen/html/html/search/enumvalues_3.js +13 -13
  170. package/SVF-doxygen/html/html/search/enumvalues_4.js +2 -2
  171. package/SVF-doxygen/html/html/search/enumvalues_5.js +47 -47
  172. package/SVF-doxygen/html/html/search/enumvalues_6.js +6 -6
  173. package/SVF-doxygen/html/html/search/enumvalues_7.js +9 -9
  174. package/SVF-doxygen/html/html/search/enumvalues_8.js +23 -23
  175. package/SVF-doxygen/html/html/search/enumvalues_9.js +6 -6
  176. package/SVF-doxygen/html/html/search/enumvalues_a.js +15 -15
  177. package/SVF-doxygen/html/html/search/enumvalues_b.js +11 -11
  178. package/SVF-doxygen/html/html/search/enumvalues_c.js +5 -5
  179. package/SVF-doxygen/html/html/search/enumvalues_d.js +18 -18
  180. package/SVF-doxygen/html/html/search/enumvalues_e.js +9 -9
  181. package/SVF-doxygen/html/html/search/enumvalues_f.js +45 -45
  182. package/SVF-doxygen/html/html/search/files_0.js +13 -13
  183. package/SVF-doxygen/html/html/search/files_1.js +7 -7
  184. package/SVF-doxygen/html/html/search/files_10.js +8 -8
  185. package/SVF-doxygen/html/html/search/files_11.js +8 -8
  186. package/SVF-doxygen/html/html/search/files_12.js +2 -2
  187. package/SVF-doxygen/html/html/search/files_2.js +53 -53
  188. package/SVF-doxygen/html/html/search/files_3.js +14 -14
  189. package/SVF-doxygen/html/html/search/files_4.js +5 -5
  190. package/SVF-doxygen/html/html/search/files_5.js +13 -13
  191. package/SVF-doxygen/html/html/search/files_6.js +9 -9
  192. package/SVF-doxygen/html/html/search/files_7.js +14 -16
  193. package/SVF-doxygen/html/html/search/files_8.js +13 -13
  194. package/SVF-doxygen/html/html/search/files_9.js +18 -18
  195. package/SVF-doxygen/html/html/search/files_a.js +3 -3
  196. package/SVF-doxygen/html/html/search/files_b.js +2 -2
  197. package/SVF-doxygen/html/html/search/files_c.js +20 -20
  198. package/SVF-doxygen/html/html/search/files_d.js +4 -4
  199. package/SVF-doxygen/html/html/search/files_e.js +62 -62
  200. package/SVF-doxygen/html/html/search/files_f.js +8 -8
  201. package/SVF-doxygen/html/html/search/functions_0.js +12 -12
  202. package/SVF-doxygen/html/html/search/functions_1.js +356 -357
  203. package/SVF-doxygen/html/html/search/functions_10.js +140 -140
  204. package/SVF-doxygen/html/html/search/functions_11.js +138 -138
  205. package/SVF-doxygen/html/html/search/functions_12.js +276 -279
  206. package/SVF-doxygen/html/html/search/functions_13.js +58 -58
  207. package/SVF-doxygen/html/html/search/functions_14.js +39 -39
  208. package/SVF-doxygen/html/html/search/functions_15.js +71 -71
  209. package/SVF-doxygen/html/html/search/functions_16.js +32 -32
  210. package/SVF-doxygen/html/html/search/functions_17.js +3 -3
  211. package/SVF-doxygen/html/html/search/functions_18.js +172 -176
  212. package/SVF-doxygen/html/html/search/functions_2.js +86 -86
  213. package/SVF-doxygen/html/html/search/functions_3.js +257 -257
  214. package/SVF-doxygen/html/html/search/functions_4.js +75 -75
  215. package/SVF-doxygen/html/html/search/functions_5.js +53 -53
  216. package/SVF-doxygen/html/html/search/functions_6.js +59 -59
  217. package/SVF-doxygen/html/html/search/functions_7.js +848 -858
  218. package/SVF-doxygen/html/html/search/functions_8.js +146 -147
  219. package/SVF-doxygen/html/html/search/functions_9.js +425 -429
  220. package/SVF-doxygen/html/html/search/functions_a.js +30 -30
  221. package/SVF-doxygen/html/html/search/functions_b.js +2 -2
  222. package/SVF-doxygen/html/html/search/functions_c.js +26 -26
  223. package/SVF-doxygen/html/html/search/functions_d.js +77 -77
  224. package/SVF-doxygen/html/html/search/functions_e.js +35 -35
  225. package/SVF-doxygen/html/html/search/functions_f.js +56 -56
  226. package/SVF-doxygen/html/html/search/namespaces_0.js +1 -1
  227. package/SVF-doxygen/html/html/search/namespaces_1.js +7 -7
  228. package/SVF-doxygen/html/html/search/related_0.js +2 -2
  229. package/SVF-doxygen/html/html/search/related_1.js +2 -2
  230. package/SVF-doxygen/html/html/search/related_2.js +2 -2
  231. package/SVF-doxygen/html/html/search/related_3.js +2 -2
  232. package/SVF-doxygen/html/html/search/related_4.js +2 -2
  233. package/SVF-doxygen/html/html/search/related_5.js +1 -1
  234. package/SVF-doxygen/html/html/search/related_6.js +2 -2
  235. package/SVF-doxygen/html/html/search/related_7.js +4 -4
  236. package/SVF-doxygen/html/html/search/related_8.js +2 -2
  237. package/SVF-doxygen/html/html/search/related_9.js +4 -4
  238. package/SVF-doxygen/html/html/search/related_a.js +19 -19
  239. package/SVF-doxygen/html/html/search/related_b.js +4 -4
  240. package/SVF-doxygen/html/html/search/related_c.js +1 -1
  241. package/SVF-doxygen/html/html/search/related_d.js +11 -11
  242. package/SVF-doxygen/html/html/search/related_e.js +2 -2
  243. package/SVF-doxygen/html/html/search/related_f.js +2 -2
  244. package/SVF-doxygen/html/html/search/typedefs_0.js +18 -18
  245. package/SVF-doxygen/html/html/search/typedefs_1.js +26 -26
  246. package/SVF-doxygen/html/html/search/typedefs_10.js +61 -63
  247. package/SVF-doxygen/html/html/search/typedefs_11.js +13 -13
  248. package/SVF-doxygen/html/html/search/typedefs_12.js +11 -11
  249. package/SVF-doxygen/html/html/search/typedefs_13.js +35 -35
  250. package/SVF-doxygen/html/html/search/typedefs_14.js +8 -8
  251. package/SVF-doxygen/html/html/search/typedefs_2.js +129 -128
  252. package/SVF-doxygen/html/html/search/typedefs_3.js +39 -39
  253. package/SVF-doxygen/html/html/search/typedefs_4.js +17 -17
  254. package/SVF-doxygen/html/html/search/typedefs_5.js +41 -41
  255. package/SVF-doxygen/html/html/search/typedefs_6.js +55 -58
  256. package/SVF-doxygen/html/html/search/typedefs_7.js +42 -46
  257. package/SVF-doxygen/html/html/search/typedefs_8.js +1 -1
  258. package/SVF-doxygen/html/html/search/typedefs_9.js +6 -6
  259. package/SVF-doxygen/html/html/search/typedefs_a.js +29 -29
  260. package/SVF-doxygen/html/html/search/typedefs_b.js +29 -29
  261. package/SVF-doxygen/html/html/search/typedefs_c.js +41 -41
  262. package/SVF-doxygen/html/html/search/typedefs_d.js +15 -15
  263. package/SVF-doxygen/html/html/search/typedefs_e.js +52 -52
  264. package/SVF-doxygen/html/html/search/typedefs_f.js +14 -14
  265. package/SVF-doxygen/html/html/search/variables_0.js +152 -162
  266. package/SVF-doxygen/html/html/search/variables_1.js +75 -75
  267. package/SVF-doxygen/html/html/search/variables_10.js +97 -97
  268. package/SVF-doxygen/html/html/search/variables_11.js +46 -46
  269. package/SVF-doxygen/html/html/search/variables_12.js +92 -92
  270. package/SVF-doxygen/html/html/search/variables_13.js +75 -75
  271. package/SVF-doxygen/html/html/search/variables_14.js +14 -14
  272. package/SVF-doxygen/html/html/search/variables_15.js +48 -48
  273. package/SVF-doxygen/html/html/search/variables_16.js +9 -9
  274. package/SVF-doxygen/html/html/search/variables_17.js +1 -1
  275. package/SVF-doxygen/html/html/search/variables_18.js +2 -2
  276. package/SVF-doxygen/html/html/search/variables_2.js +37 -37
  277. package/SVF-doxygen/html/html/search/variables_3.js +142 -142
  278. package/SVF-doxygen/html/html/search/variables_4.js +55 -55
  279. package/SVF-doxygen/html/html/search/variables_5.js +39 -39
  280. package/SVF-doxygen/html/html/search/variables_6.js +66 -66
  281. package/SVF-doxygen/html/html/search/variables_7.js +33 -33
  282. package/SVF-doxygen/html/html/search/variables_8.js +7 -7
  283. package/SVF-doxygen/html/html/search/variables_9.js +77 -77
  284. package/SVF-doxygen/html/html/search/variables_a.js +4 -4
  285. package/SVF-doxygen/html/html/search/variables_b.js +10 -10
  286. package/SVF-doxygen/html/html/search/variables_c.js +45 -45
  287. package/SVF-doxygen/html/html/search/variables_d.js +56 -56
  288. package/SVF-doxygen/html/html/search/variables_e.js +123 -123
  289. package/SVF-doxygen/html/html/search/variables_f.js +30 -30
  290. package/SVF-doxygen/html/html/structSVF_1_1CFBasicBlockEdge_1_1equalCFBBEdge-members.html +84 -0
  291. package/SVF-doxygen/html/html/structSVF_1_1CFBasicBlockEdge_1_1equalCFBBEdge.html +144 -0
  292. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +40 -40
  293. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CFBasicBlockNode_01_5_01_4_01_4.html +1 -1
  294. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +2 -2
  295. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockNode_01_5_01_4.html +1 -1
  296. package/package.json +1 -1
  297. package/svf/include/Graphs/CFBasicBlockG.h +342 -32
  298. package/svf/lib/Graphs/CFBasicBlockG.cpp +97 -36
  299. package/svf/include/Graphs/ICFGWrapper.h +0 -728
  300. package/svf/lib/Graphs/ICFGWrapper.cpp +0 -97
@@ -30,7 +30,7 @@
30
30
  #ifndef SVF_CFBASICBLOCKG_H
31
31
  #define SVF_CFBASICBLOCKG_H
32
32
  #include "Util/SVFUtil.h"
33
- #include "Graphs/ICFGNode.h"
33
+ #include "Graphs/ICFG.h"
34
34
  #include "Graphs/GenericGraph.h"
35
35
 
36
36
  namespace SVF
@@ -43,8 +43,33 @@ typedef GenericEdge<CFBasicBlockNode> GenericCFBasicBlockEdgeTy;
43
43
  class CFBasicBlockEdge : public GenericCFBasicBlockEdgeTy
44
44
  {
45
45
  public:
46
- CFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst) : GenericCFBasicBlockEdgeTy(src, dst, 0) {}
46
+ typedef struct equalCFBBEdge
47
+ {
48
+ bool
49
+ operator()(const CFBasicBlockEdge *lhs, const CFBasicBlockEdge *rhs) const
50
+ {
51
+ if (lhs->getSrcID() != rhs->getSrcID())
52
+ return lhs->getSrcID() < rhs->getSrcID();
53
+ else if (lhs->getDstID() != rhs->getDstID())
54
+ return lhs->getDstID() < rhs->getDstID();
55
+ else
56
+ return lhs->getICFGEdge() < rhs->getICFGEdge();
57
+ }
58
+ } equalICFGEdgeWrapper;
59
+
60
+ typedef OrderedSet<CFBasicBlockEdge *, equalICFGEdgeWrapper> CFBBEdgeSetTy;
61
+ typedef CFBBEdgeSetTy::iterator iterator;
62
+ typedef CFBBEdgeSetTy::const_iterator const_iterator;
63
+
64
+ private:
65
+ const ICFGEdge *_icfgEdge;
47
66
 
67
+ public:
68
+ CFBasicBlockEdge(CFBasicBlockNode* src, CFBasicBlockNode* dst,
69
+ const ICFGEdge* edge)
70
+ : GenericCFBasicBlockEdgeTy(src, dst, 0), _icfgEdge(edge)
71
+ {
72
+ }
48
73
 
49
74
  friend std::ostream &operator<<(std::ostream &o, const CFBasicBlockEdge &edge)
50
75
  {
@@ -54,20 +79,50 @@ public:
54
79
 
55
80
  virtual const std::string toString() const
56
81
  {
57
- return std::to_string(getSrcID()) + " --> " + std::to_string(getDstID());
82
+ return _icfgEdge->toString();
83
+ }
84
+
85
+ inline const ICFGEdge *getICFGEdge() const
86
+ {
87
+ return _icfgEdge;
88
+ }
89
+
90
+ using SVF::GenericEdge<NodeType>::operator==;
91
+ /// Add the hash function for std::set (we also can overload operator< to implement this)
92
+ // and duplicated elements in the set are not inserted (binary tree comparison)
93
+ //@{
94
+
95
+ virtual inline bool operator==(const CFBasicBlockEdge *rhs) const
96
+ {
97
+ return (rhs->getSrcID() == this->getSrcID() && rhs->getDstID() == this->getDstID() &&
98
+ rhs->getICFGEdge() == this->getICFGEdge());
58
99
  }
100
+ //@}
101
+
59
102
  };
60
103
 
61
104
  typedef GenericNode<CFBasicBlockNode, CFBasicBlockEdge> GenericCFBasicBlockNodeTy;
62
105
 
63
106
  class CFBasicBlockNode : public GenericCFBasicBlockNodeTy
64
107
  {
108
+ public:
109
+ typedef CFBasicBlockEdge::CFBBEdgeSetTy CFBBEdgeSetTy;
110
+ typedef CFBasicBlockEdge::CFBBEdgeSetTy ::iterator iterator;
111
+ typedef CFBasicBlockEdge::CFBBEdgeSetTy::const_iterator const_iterator;
112
+
65
113
  private:
66
- const SVFBasicBlock *_svfBasicBlock; /// Every CFBasicBlockNode holds a SVFBasicBlock
67
114
  std::vector<const ICFGNode *> _icfgNodes; /// Every CBFGNode holds a vector of ICFGNodes
115
+ CFBBEdgeSetTy InEdges; ///< all incoming edge of this node
116
+ CFBBEdgeSetTy OutEdges; ///< all outgoing edge of this node
68
117
 
69
118
  public:
70
- CFBasicBlockNode(u32_t id, const SVFBasicBlock *svfBasicBlock);
119
+ CFBasicBlockNode(std::vector<const ICFGNode*> icfgNodes)
120
+ : GenericCFBasicBlockNodeTy((*icfgNodes.begin())->getId(), 0),
121
+ _icfgNodes(SVFUtil::move(icfgNodes))
122
+ {
123
+ }
124
+
125
+ CFBasicBlockNode(const SVFBasicBlock* bb);
71
126
 
72
127
  friend std::ostream &operator<<(std::ostream &o, const CFBasicBlockNode &node)
73
128
  {
@@ -79,17 +134,20 @@ public:
79
134
 
80
135
  inline std::string getName() const
81
136
  {
82
- return _svfBasicBlock->getName();
137
+ assert(!_icfgNodes.empty() && "no ICFG nodes in CFBB");
138
+ return (*_icfgNodes.begin())->getBB()->getName();
83
139
  }
84
140
 
85
141
  inline const SVFBasicBlock *getSVFBasicBlock() const
86
142
  {
87
- return _svfBasicBlock;
143
+ assert(!_icfgNodes.empty() && "no ICFG nodes in CFBB");
144
+ return (*_icfgNodes.begin())->getBB();
88
145
  }
89
146
 
90
147
  inline const SVFFunction *getFunction() const
91
148
  {
92
- return _svfBasicBlock->getFunction();
149
+ assert(!_icfgNodes.empty() && "no ICFG nodes in CFBB");
150
+ return (*_icfgNodes.begin())->getFun();
93
151
  }
94
152
 
95
153
  inline std::vector<const ICFGNode *>::const_iterator begin() const
@@ -101,6 +159,187 @@ public:
101
159
  {
102
160
  return _icfgNodes.cend();
103
161
  }
162
+
163
+ inline void removeNode(const ICFGNode* node)
164
+ {
165
+ const auto it = std::find(_icfgNodes.begin(), _icfgNodes.end(), node);
166
+ assert(it != _icfgNodes.end() && "icfg node not in BB?");
167
+ _icfgNodes.erase(it);
168
+ }
169
+
170
+ inline void addNode(const ICFGNode* node)
171
+ {
172
+ _icfgNodes.push_back(node);
173
+ }
174
+
175
+ inline u32_t getICFGNodeNum() const
176
+ {
177
+ return _icfgNodes.size();
178
+ }
179
+
180
+ public:
181
+ /// Get incoming/outgoing edge set
182
+ ///@{
183
+ inline const CFBBEdgeSetTy &getOutEdges() const
184
+ {
185
+ return OutEdges;
186
+ }
187
+
188
+ inline const CFBBEdgeSetTy &getInEdges() const
189
+ {
190
+ return InEdges;
191
+ }
192
+ ///@}
193
+
194
+ /// Has incoming/outgoing edge set
195
+ //@{
196
+ inline bool hasIncomingEdge() const
197
+ {
198
+ return (InEdges.empty() == false);
199
+ }
200
+
201
+ inline bool hasOutgoingEdge() const
202
+ {
203
+ return (OutEdges.empty() == false);
204
+ }
205
+ //@}
206
+
207
+ /// iterators
208
+ //@{
209
+ inline iterator OutEdgeBegin()
210
+ {
211
+ return OutEdges.begin();
212
+ }
213
+
214
+ inline iterator OutEdgeEnd()
215
+ {
216
+ return OutEdges.end();
217
+ }
218
+
219
+ inline iterator InEdgeBegin()
220
+ {
221
+ return InEdges.begin();
222
+ }
223
+
224
+ inline iterator InEdgeEnd()
225
+ {
226
+ return InEdges.end();
227
+ }
228
+
229
+ inline const_iterator OutEdgeBegin() const
230
+ {
231
+ return OutEdges.begin();
232
+ }
233
+
234
+ inline const_iterator OutEdgeEnd() const
235
+ {
236
+ return OutEdges.end();
237
+ }
238
+
239
+ inline const_iterator InEdgeBegin() const
240
+ {
241
+ return InEdges.begin();
242
+ }
243
+
244
+ inline const_iterator InEdgeEnd() const
245
+ {
246
+ return InEdges.end();
247
+ }
248
+ //@}
249
+
250
+ /// Iterators used for SCC detection, overwrite it in child class if necessory
251
+ //@{
252
+ virtual inline iterator directOutEdgeBegin()
253
+ {
254
+ return OutEdges.begin();
255
+ }
256
+
257
+ virtual inline iterator directOutEdgeEnd()
258
+ {
259
+ return OutEdges.end();
260
+ }
261
+
262
+ virtual inline iterator directInEdgeBegin()
263
+ {
264
+ return InEdges.begin();
265
+ }
266
+
267
+ virtual inline iterator directInEdgeEnd()
268
+ {
269
+ return InEdges.end();
270
+ }
271
+
272
+ virtual inline const_iterator directOutEdgeBegin() const
273
+ {
274
+ return OutEdges.begin();
275
+ }
276
+
277
+ virtual inline const_iterator directOutEdgeEnd() const
278
+ {
279
+ return OutEdges.end();
280
+ }
281
+
282
+ virtual inline const_iterator directInEdgeBegin() const
283
+ {
284
+ return InEdges.begin();
285
+ }
286
+
287
+ virtual inline const_iterator directInEdgeEnd() const
288
+ {
289
+ return InEdges.end();
290
+ }
291
+ //@}
292
+
293
+ /// Add incoming and outgoing edges
294
+ //@{
295
+ inline bool addIncomingEdge(CFBasicBlockEdge *inEdge)
296
+ {
297
+ return InEdges.insert(inEdge).second;
298
+ }
299
+
300
+ inline bool addOutgoingEdge(CFBasicBlockEdge *outEdge)
301
+ {
302
+ return OutEdges.insert(outEdge).second;
303
+ }
304
+ //@}
305
+
306
+ /// Remove incoming and outgoing edges
307
+ ///@{
308
+ inline u32_t removeIncomingEdge(CFBasicBlockEdge *edge)
309
+ {
310
+ iterator it = InEdges.find(edge);
311
+ assert(it != InEdges.end() && "can not find in edge in SVFG node");
312
+ return InEdges.erase(edge);
313
+ }
314
+
315
+ inline u32_t removeOutgoingEdge(CFBasicBlockEdge *edge)
316
+ {
317
+ iterator it = OutEdges.find(edge);
318
+ assert(it != OutEdges.end() && "can not find out edge in SVFG node");
319
+ return OutEdges.erase(edge);
320
+ }
321
+ ///@}
322
+
323
+ /// Find incoming and outgoing edges
324
+ //@{
325
+ inline CFBasicBlockEdge *hasIncomingEdge(CFBasicBlockEdge *edge) const
326
+ {
327
+ const_iterator it = InEdges.find(edge);
328
+ if (it != InEdges.end())
329
+ return *it;
330
+ else
331
+ return nullptr;
332
+ }
333
+
334
+ inline CFBasicBlockEdge *hasOutgoingEdge(CFBasicBlockEdge *edge) const
335
+ {
336
+ const_iterator it = OutEdges.find(edge);
337
+ if (it != OutEdges.end())
338
+ return *it;
339
+ else
340
+ return nullptr;
341
+ }
342
+ //@}
104
343
  };
105
344
 
106
345
  typedef GenericGraph<CFBasicBlockNode, CFBasicBlockEdge> GenericCFBasicBlockGTy;
@@ -108,22 +347,14 @@ typedef GenericGraph<CFBasicBlockNode, CFBasicBlockEdge> GenericCFBasicBlockGTy;
108
347
  class CFBasicBlockGraph : public GenericCFBasicBlockGTy
109
348
  {
110
349
  friend class CFBasicBlockGBuilder;
111
-
112
- public:
113
- typedef Map<const SVFBasicBlock *, CFBasicBlockNode *> SVFBasicBlockToCFBasicBlockNodeMap;
114
-
115
350
  private:
116
- SVFBasicBlockToCFBasicBlockNodeMap _bbToNode;
117
- const SVFFunction *_svfFunction;
118
351
  u32_t _totalCFBasicBlockNode{0};
119
352
  u32_t _totalCFBasicBlockEdge{0};
353
+ Map<const SVFBasicBlock*, CFBasicBlockNode*> _bbToNode;
120
354
 
121
355
  public:
122
356
 
123
- CFBasicBlockGraph(const SVFFunction *svfFunction) : _svfFunction(svfFunction)
124
- {
125
-
126
- }
357
+ CFBasicBlockGraph() = default;
127
358
 
128
359
  ~CFBasicBlockGraph() override = default;
129
360
 
@@ -139,16 +370,31 @@ public:
139
370
  return getGNode(id);
140
371
  }
141
372
 
142
- inline CFBasicBlockNode *getCFBasicBlockNode(const SVFBasicBlock *bb) const
373
+ inline bool hasCFBasicBlockNode(NodeID id) const
143
374
  {
144
- auto it = _bbToNode.find(bb);
145
- if (it == _bbToNode.end()) return nullptr;
146
- return it->second;
375
+ return hasGNode(id);
147
376
  }
148
377
 
149
- inline bool hasCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst) const
378
+ inline CFBasicBlockNode* getCFBasicBlockNode(const SVFBasicBlock* bb) const
150
379
  {
151
- CFBasicBlockEdge edge(src, dst);
380
+ if (bb && _bbToNode.find(bb) != _bbToNode.end())
381
+ {
382
+ return _bbToNode.at(bb);
383
+ }
384
+ else
385
+ {
386
+ return nullptr;
387
+ }
388
+ }
389
+
390
+ inline bool hasCFBasicBlockNode(const SVFBasicBlock* bb) const
391
+ {
392
+ return bb && _bbToNode.find(bb) != _bbToNode.end();
393
+ }
394
+
395
+ bool hasCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst, ICFGEdge *icfgEdge)
396
+ {
397
+ CFBasicBlockEdge edge(src, dst, icfgEdge);
152
398
  CFBasicBlockEdge *outEdge = src->hasOutgoingEdge(&edge);
153
399
  CFBasicBlockEdge *inEdge = dst->hasIncomingEdge(&edge);
154
400
  if (outEdge && inEdge)
@@ -160,17 +406,79 @@ public:
160
406
  return false;
161
407
  }
162
408
 
163
- CFBasicBlockEdge* getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst);
409
+ inline bool hasCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst) const
410
+ {
411
+ for (const auto &e: src->getOutEdges())
412
+ {
413
+ if (e->getDstNode() == dst)
414
+ return true;
415
+ }
416
+ return false;
417
+ }
164
418
 
165
- CFBasicBlockEdge* getCFBasicBlockEdge(const SVFBasicBlock *src, const SVFBasicBlock *dst);
419
+ CFBasicBlockEdge* getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst, const ICFGEdge *icfgEdge);
166
420
 
167
- private:
421
+ std::vector<CFBasicBlockEdge*> getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst);
168
422
 
169
- /// Add a CFBasicBlockNode
170
- inline const CFBasicBlockNode* getOrAddCFBasicBlockNode(const SVFBasicBlock *bb);
423
+ /// Remove a ICFGEdgeWrapper
424
+ inline void removeCFBBEdge(CFBasicBlockEdge *edge)
425
+ {
426
+ if (edge->getDstNode()->hasIncomingEdge(edge))
427
+ {
428
+ edge->getDstNode()->removeIncomingEdge(edge);
429
+ }
430
+ if (edge->getSrcNode()->hasOutgoingEdge(edge))
431
+ {
432
+ edge->getSrcNode()->removeOutgoingEdge(edge);
433
+ }
434
+ delete edge;
435
+ _totalCFBasicBlockEdge--;
436
+ }
437
+
438
+ /// Remove a ICFGNodeWrapper
439
+ inline void removeCFBBNode(CFBasicBlockNode *node)
440
+ {
441
+ std::set<CFBasicBlockEdge *> temp;
442
+ for (CFBasicBlockEdge *e: node->getInEdges())
443
+ temp.insert(e);
444
+ for (CFBasicBlockEdge *e: node->getOutEdges())
445
+ temp.insert(e);
446
+ for (CFBasicBlockEdge *e: temp)
447
+ {
448
+ removeCFBBEdge(e);
449
+ }
450
+ removeGNode(node);
451
+ _totalCFBasicBlockNode--;
452
+ }
171
453
 
172
- inline const CFBasicBlockEdge *getOrAddCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst);
173
454
 
455
+ /// Remove node from nodeID
456
+ inline bool removeCFBBNode(NodeID id)
457
+ {
458
+ if (hasGNode(id))
459
+ {
460
+ removeCFBBNode(getGNode(id));
461
+ return true;
462
+ }
463
+ return false;
464
+ }
465
+
466
+ /// Add ICFGEdgeWrapper
467
+ inline bool addCFBBEdge(CFBasicBlockEdge *edge)
468
+ {
469
+ bool added1 = edge->getDstNode()->addIncomingEdge(edge);
470
+ bool added2 = edge->getSrcNode()->addOutgoingEdge(edge);
471
+ assert(added1 && added2 && "edge not added??");
472
+ _totalCFBasicBlockEdge++;
473
+ return true;
474
+ }
475
+
476
+ /// Add a ICFGNodeWrapper
477
+ virtual inline void addCFBBNode(CFBasicBlockNode *node)
478
+ {
479
+ addGNode(node->getId(), node);
480
+ _totalCFBasicBlockNode++;
481
+ }
174
482
  };
175
483
 
176
484
  class CFBasicBlockGBuilder
@@ -180,9 +488,11 @@ private:
180
488
  CFBasicBlockGraph* _CFBasicBlockG;
181
489
 
182
490
  public:
183
- CFBasicBlockGBuilder(const SVFFunction *func) : _CFBasicBlockG(new CFBasicBlockGraph(func)) {}
491
+ CFBasicBlockGBuilder() : _CFBasicBlockG() {}
492
+
493
+ virtual void build(SVFModule* module);
184
494
 
185
- void build();
495
+ virtual void build(ICFG* icfg);
186
496
 
187
497
  inline CFBasicBlockGraph* getCFBasicBlockGraph()
188
498
  {
@@ -32,13 +32,18 @@
32
32
 
33
33
  namespace SVF
34
34
  {
35
- CFBasicBlockNode::CFBasicBlockNode(u32_t id, const SVFBasicBlock *svfBasicBlock) : GenericCFBasicBlockNodeTy(id, 0),
36
- _svfBasicBlock(svfBasicBlock)
35
+ CFBasicBlockNode::CFBasicBlockNode(const SVFBasicBlock* svfBasicBlock)
36
+ : GenericCFBasicBlockNodeTy(
37
+ PAG::getPAG()
38
+ ->getICFG()
39
+ ->getICFGNode(*svfBasicBlock->getInstructionList().begin())
40
+ ->getId(),
41
+ 0)
37
42
  {
38
43
  for (auto it = svfBasicBlock->begin(); it != svfBasicBlock->end(); ++it)
39
44
  {
40
- const SVFInstruction *ins = *it;
41
- ICFGNode *icfgNode = PAG::getPAG()->getICFG()->getICFGNode(ins);
45
+ const SVFInstruction* ins = *it;
46
+ ICFGNode* icfgNode = PAG::getPAG()->getICFG()->getICFGNode(ins);
42
47
  _icfgNodes.push_back(icfgNode);
43
48
  }
44
49
  }
@@ -47,7 +52,7 @@ const std::string CFBasicBlockNode::toString() const
47
52
  {
48
53
  std::string rawStr;
49
54
  std::stringstream stringstream(rawStr);
50
- stringstream << "Block Name: " << _svfBasicBlock->getName() << "\n";
55
+ stringstream << "Block Name: " << getName() << "\n";
51
56
  for (const auto &icfgNode: _icfgNodes)
52
57
  {
53
58
  stringstream << icfgNode->toString() << "\n";
@@ -55,19 +60,14 @@ const std::string CFBasicBlockNode::toString() const
55
60
  return stringstream.str();
56
61
  }
57
62
 
58
- CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const SVFBasicBlock *src, const SVFBasicBlock *dst)
59
- {
60
- return getCFBasicBlockEdge(getCFBasicBlockNode(src), getCFBasicBlockNode(dst));
61
- }
62
-
63
- CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst)
63
+ CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst, const ICFGEdge* icfgEdge)
64
64
  {
65
65
  CFBasicBlockEdge *edge = nullptr;
66
66
  size_t counter = 0;
67
67
  for (auto iter = src->OutEdgeBegin();
68
68
  iter != src->OutEdgeEnd(); ++iter)
69
69
  {
70
- if ((*iter)->getDstID() == dst->getId())
70
+ if ((*iter)->getDstID() == dst->getId() && (*iter)->getICFGEdge() == icfgEdge)
71
71
  {
72
72
  counter++;
73
73
  edge = (*iter);
@@ -77,42 +77,103 @@ CFBasicBlockEdge* CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode
77
77
  return edge;
78
78
  }
79
79
 
80
- const CFBasicBlockNode* CFBasicBlockGraph::getOrAddCFBasicBlockNode(const SVFBasicBlock *bb)
80
+ std::vector<CFBasicBlockEdge*> CFBasicBlockGraph::getCFBasicBlockEdge(const CFBasicBlockNode *src, const CFBasicBlockNode *dst)
81
81
  {
82
- auto it = _bbToNode.find(bb);
83
- if (it != _bbToNode.end()) return it->second;
84
- CFBasicBlockNode *node = new CFBasicBlockNode(_totalCFBasicBlockNode++, bb);
85
- _bbToNode[bb] = node;
86
- addGNode(node->getId(), node);
87
- return node;
82
+ std::vector<CFBasicBlockEdge*> edges;
83
+ for (auto iter = src->OutEdgeBegin();
84
+ iter != src->OutEdgeEnd(); ++iter)
85
+ {
86
+ if ((*iter)->getDstID() == dst->getId())
87
+ {
88
+ edges.push_back(*iter);
89
+ }
90
+ }
91
+ return SVFUtil::move(edges);
88
92
  }
89
93
 
90
- const CFBasicBlockEdge* CFBasicBlockGraph::getOrAddCFBasicBlockEdge(CFBasicBlockNode *src, CFBasicBlockNode *dst)
94
+ void CFBasicBlockGBuilder::build(SVFModule* module)
91
95
  {
92
- if (const CFBasicBlockEdge *edge = getCFBasicBlockEdge(src, dst)) return edge;
93
- CFBasicBlockEdge *edge = new CFBasicBlockEdge(src, dst);
94
- bool added1 = edge->getDstNode()->addIncomingEdge(edge);
95
- bool added2 = edge->getSrcNode()->addOutgoingEdge(edge);
96
- (void) added1;
97
- (void) added2;
98
- assert(added1 && added2 && "edge not added??");
99
- _totalCFBasicBlockEdge++;
100
- return edge;
96
+ _CFBasicBlockG = new CFBasicBlockGraph();
97
+ Map<const SVFBasicBlock*, CFBasicBlockNode*> bbToNode;
98
+ for (const auto& func : *module)
99
+ {
100
+ for (const auto& bb : *func)
101
+ {
102
+ CFBasicBlockNode* pNode = new CFBasicBlockNode(bb);
103
+ bbToNode[bb] = pNode;
104
+ _CFBasicBlockG->addCFBBNode(pNode);
105
+ }
106
+ }
107
+
108
+ for (const auto& func : *module)
109
+ {
110
+ for (const auto& bb : *func)
111
+ {
112
+ for (const auto &succ: bb->getSuccessors())
113
+ {
114
+ ICFG *icfg = PAG::getPAG()->getICFG();
115
+ const ICFGNode *pred = icfg->getICFGNode(bb->getTerminator());
116
+ const ICFGEdge *edge = nullptr;
117
+ for (const auto &inst: succ->getInstructionList())
118
+ {
119
+ if (const ICFGEdge *e = icfg->getICFGEdge(pred, icfg->getICFGNode(inst), ICFGEdge::ICFGEdgeK::IntraCF))
120
+ {
121
+ edge = e;
122
+ break;
123
+ }
124
+ }
125
+ if (SVFUtil::isa<IntraCFGEdge>(edge))
126
+ {
127
+ CFBasicBlockEdge *pEdge = new CFBasicBlockEdge(bbToNode[bb], bbToNode[succ], edge);
128
+ _CFBasicBlockG->addCFBBEdge(pEdge);
129
+ }
130
+ }
131
+ }
132
+ }
133
+ _CFBasicBlockG->_bbToNode = bbToNode;
101
134
  }
102
135
 
103
- void CFBasicBlockGBuilder::build()
136
+ void CFBasicBlockGBuilder::build(ICFG* icfg)
104
137
  {
105
- for (const auto &bb: *_CFBasicBlockG->_svfFunction)
138
+ _CFBasicBlockG = new CFBasicBlockGraph();
139
+ Map<const SVFBasicBlock*, CFBasicBlockNode*> bbToNode;
140
+ for (const auto& node : *icfg)
106
141
  {
107
- _CFBasicBlockG->getOrAddCFBasicBlockNode(bb);
142
+ CFBasicBlockNode* pNode = nullptr;
143
+ if (const SVFBasicBlock* bb = node.second->getBB())
144
+ {
145
+ if (bbToNode.find(bb) == bbToNode.end())
146
+ {
147
+ pNode = new CFBasicBlockNode({node.second});
148
+ bbToNode[node.second->getBB()] = pNode;
149
+ _CFBasicBlockG->addCFBBNode(pNode);
150
+ }
151
+ else
152
+ {
153
+ pNode = bbToNode[node.second->getBB()];
154
+ pNode->addNode(node.second);
155
+ }
156
+ }
108
157
  }
109
- for (const auto &bb: *_CFBasicBlockG->_svfFunction)
158
+
159
+ for (const auto& node : *icfg)
110
160
  {
111
- for (const auto &succ: bb->getSuccessors())
161
+ for (const auto &succ: node.second->getOutEdges())
112
162
  {
113
- _CFBasicBlockG->getOrAddCFBasicBlockEdge(_CFBasicBlockG->getCFBasicBlockNode(bb),
114
- _CFBasicBlockG->getCFBasicBlockNode(succ));
163
+ const SVFFunction* node_fun = node.second->getFun();
164
+ const SVFFunction* succ_fun = succ->getDstNode()->getFun();
165
+ const SVFBasicBlock* node_bb = node.second->getBB();
166
+ const SVFBasicBlock* succ_bb = succ->getDstNode()->getBB();
167
+ if (node_fun == succ_fun)
168
+ {
169
+ if (node_bb != succ_bb)
170
+ {
171
+ CFBasicBlockEdge *pEdge = new CFBasicBlockEdge(bbToNode[node_bb], bbToNode[succ_bb], succ);
172
+ _CFBasicBlockG->addCFBBEdge(pEdge);
173
+ }
174
+ }
115
175
  }
116
176
  }
177
+ _CFBasicBlockG->_bbToNode = bbToNode;
117
178
  }
118
179
  }