svf-tools 1.0.781 → 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 (315) 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/ExtAPI_8cpp.html +50 -50
  8. package/SVF-doxygen/html/html/ExtAPI_8cpp_source.html +180 -181
  9. package/SVF-doxygen/html/html/ExtAPI_8h.html +6 -6
  10. package/SVF-doxygen/html/html/ExtAPI_8h_source.html +13 -13
  11. package/SVF-doxygen/html/html/LLVMModule_8cpp_source.html +1 -1
  12. package/SVF-doxygen/html/html/LLVMModule_8h_source.html +1 -1
  13. package/SVF-doxygen/html/html/LLVMUtil_8cpp_source.html +1 -1
  14. package/SVF-doxygen/html/html/SVFUtil_8h_source.html +7 -7
  15. package/SVF-doxygen/html/html/WTO_8h_source.html +6 -6
  16. package/SVF-doxygen/html/html/annotated.html +325 -333
  17. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockEdge-members.html +19 -12
  18. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockEdge.html +219 -30
  19. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGBuilder-members.html +4 -3
  20. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGBuilder.html +147 -39
  21. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTOCycle.html +1 -1
  22. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGWTONode.html +1 -1
  23. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGraph-members.html +32 -28
  24. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockGraph.html +382 -184
  25. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockNode-members.html +51 -41
  26. package/SVF-doxygen/html/html/classSVF_1_1CFBasicBlockNode.html +1244 -159
  27. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode-members.html +34 -34
  28. package/SVF-doxygen/html/html/classSVF_1_1ConstraintNode.html +65 -25
  29. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI-members.html +1 -1
  30. package/SVF-doxygen/html/html/classSVF_1_1ExtAPI.html +107 -107
  31. package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.html +4 -5
  32. package/SVF-doxygen/html/html/classSVF_1_1GenericEdge.png +0 -0
  33. package/SVF-doxygen/html/html/classSVF_1_1GenericGraph.html +3 -4
  34. package/SVF-doxygen/html/html/classSVF_1_1GenericGraph.png +0 -0
  35. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.html +10 -10
  36. package/SVF-doxygen/html/html/classSVF_1_1GenericNode.png +0 -0
  37. package/SVF-doxygen/html/html/classSVF_1_1LLVMModuleSet.html +1 -1
  38. package/SVF-doxygen/html/html/classes.html +266 -276
  39. package/SVF-doxygen/html/html/dir_a10fe8a299b5f0831d187a9a2e1308ef.html +0 -2
  40. package/SVF-doxygen/html/html/dir_fc0329f850c815763e0c5b05933e8d55.html +0 -2
  41. package/SVF-doxygen/html/html/files.html +19 -21
  42. package/SVF-doxygen/html/html/functions.html +2 -33
  43. package/SVF-doxygen/html/html/functions_a.html +14 -16
  44. package/SVF-doxygen/html/html/functions_b.html +8 -9
  45. package/SVF-doxygen/html/html/functions_c.html +34 -31
  46. package/SVF-doxygen/html/html/functions_d.html +11 -13
  47. package/SVF-doxygen/html/html/functions_e.html +1 -1
  48. package/SVF-doxygen/html/html/functions_func.html +16 -18
  49. package/SVF-doxygen/html/html/functions_func_b.html +2 -3
  50. package/SVF-doxygen/html/html/functions_func_c.html +31 -31
  51. package/SVF-doxygen/html/html/functions_func_d.html +10 -12
  52. package/SVF-doxygen/html/html/functions_func_g.html +22 -59
  53. package/SVF-doxygen/html/html/functions_func_h.html +9 -12
  54. package/SVF-doxygen/html/html/functions_func_i.html +13 -26
  55. package/SVF-doxygen/html/html/functions_func_o.html +9 -9
  56. package/SVF-doxygen/html/html/functions_func_p.html +1 -1
  57. package/SVF-doxygen/html/html/functions_func_r.html +15 -15
  58. package/SVF-doxygen/html/html/functions_func_s.html +20 -29
  59. package/SVF-doxygen/html/html/functions_func_t.html +0 -2
  60. package/SVF-doxygen/html/html/functions_func_v.html +2 -3
  61. package/SVF-doxygen/html/html/functions_func_~.html +0 -12
  62. package/SVF-doxygen/html/html/functions_g.html +23 -60
  63. package/SVF-doxygen/html/html/functions_h.html +9 -12
  64. package/SVF-doxygen/html/html/functions_i.html +16 -44
  65. package/SVF-doxygen/html/html/functions_n.html +6 -8
  66. package/SVF-doxygen/html/html/functions_o.html +23 -27
  67. package/SVF-doxygen/html/html/functions_p.html +8 -12
  68. package/SVF-doxygen/html/html/functions_r.html +17 -17
  69. package/SVF-doxygen/html/html/functions_s.html +16 -33
  70. package/SVF-doxygen/html/html/functions_t.html +5 -7
  71. package/SVF-doxygen/html/html/functions_type_c.html +6 -3
  72. package/SVF-doxygen/html/html/functions_type_e.html +1 -1
  73. package/SVF-doxygen/html/html/functions_type_i.html +3 -18
  74. package/SVF-doxygen/html/html/functions_type_n.html +0 -2
  75. package/SVF-doxygen/html/html/functions_type_s.html +0 -6
  76. package/SVF-doxygen/html/html/functions_v.html +4 -5
  77. package/SVF-doxygen/html/html/functions_vars.html +2 -33
  78. package/SVF-doxygen/html/html/functions_vars_i.html +2 -2
  79. package/SVF-doxygen/html/html/functions_vars_o.html +2 -2
  80. package/SVF-doxygen/html/html/functions_w.html +8 -8
  81. package/SVF-doxygen/html/html/functions_~.html +0 -12
  82. package/SVF-doxygen/html/html/globals_d.html +2 -2
  83. package/SVF-doxygen/html/html/globals_defs.html +2 -2
  84. package/SVF-doxygen/html/html/hierarchy.html +458 -469
  85. package/SVF-doxygen/html/html/namespaceSVF.html +7 -78
  86. package/SVF-doxygen/html/html/namespacemembers_g.html +3 -12
  87. package/SVF-doxygen/html/html/namespacemembers_n.html +1 -1
  88. package/SVF-doxygen/html/html/namespacemembers_type_g.html +0 -9
  89. package/SVF-doxygen/html/html/namespacemembers_type_n.html +1 -1
  90. package/SVF-doxygen/html/html/search/all_0.js +137 -147
  91. package/SVF-doxygen/html/html/search/all_1.js +484 -485
  92. package/SVF-doxygen/html/html/search/all_10.js +324 -324
  93. package/SVF-doxygen/html/html/search/all_11.js +224 -224
  94. package/SVF-doxygen/html/html/search/all_12.js +541 -546
  95. package/SVF-doxygen/html/html/search/all_13.js +190 -190
  96. package/SVF-doxygen/html/html/search/all_14.js +67 -67
  97. package/SVF-doxygen/html/html/search/all_15.js +170 -170
  98. package/SVF-doxygen/html/html/search/all_16.js +63 -63
  99. package/SVF-doxygen/html/html/search/all_17.js +1 -1
  100. package/SVF-doxygen/html/html/search/all_18.js +1 -1
  101. package/SVF-doxygen/html/html/search/all_19.js +11 -11
  102. package/SVF-doxygen/html/html/search/all_1a.js +172 -176
  103. package/SVF-doxygen/html/html/search/all_2.js +167 -167
  104. package/SVF-doxygen/html/html/search/all_3.js +640 -639
  105. package/SVF-doxygen/html/html/search/all_4.js +233 -234
  106. package/SVF-doxygen/html/html/search/all_5.js +121 -120
  107. package/SVF-doxygen/html/html/search/all_6.js +225 -225
  108. package/SVF-doxygen/html/html/search/all_7.js +1037 -1056
  109. package/SVF-doxygen/html/html/search/all_8.js +194 -195
  110. package/SVF-doxygen/html/html/search/all_9.js +607 -617
  111. package/SVF-doxygen/html/html/search/all_a.js +46 -46
  112. package/SVF-doxygen/html/html/search/all_b.js +26 -26
  113. package/SVF-doxygen/html/html/search/all_c.js +116 -116
  114. package/SVF-doxygen/html/html/search/all_d.js +196 -196
  115. package/SVF-doxygen/html/html/search/all_e.js +207 -207
  116. package/SVF-doxygen/html/html/search/all_f.js +116 -116
  117. package/SVF-doxygen/html/html/search/classes_0.js +26 -26
  118. package/SVF-doxygen/html/html/search/classes_1.js +9 -9
  119. package/SVF-doxygen/html/html/search/classes_10.js +73 -73
  120. package/SVF-doxygen/html/html/search/classes_11.js +15 -15
  121. package/SVF-doxygen/html/html/search/classes_12.js +2 -2
  122. package/SVF-doxygen/html/html/search/classes_13.js +10 -10
  123. package/SVF-doxygen/html/html/search/classes_14.js +14 -14
  124. package/SVF-doxygen/html/html/search/classes_15.js +1 -1
  125. package/SVF-doxygen/html/html/search/classes_2.js +80 -80
  126. package/SVF-doxygen/html/html/search/classes_3.js +37 -38
  127. package/SVF-doxygen/html/html/search/classes_4.js +9 -9
  128. package/SVF-doxygen/html/html/search/classes_5.js +28 -28
  129. package/SVF-doxygen/html/html/search/classes_6.js +104 -110
  130. package/SVF-doxygen/html/html/search/classes_7.js +33 -33
  131. package/SVF-doxygen/html/html/search/classes_8.js +56 -60
  132. package/SVF-doxygen/html/html/search/classes_9.js +1 -1
  133. package/SVF-doxygen/html/html/search/classes_a.js +12 -12
  134. package/SVF-doxygen/html/html/search/classes_b.js +29 -29
  135. package/SVF-doxygen/html/html/search/classes_c.js +6 -6
  136. package/SVF-doxygen/html/html/search/classes_d.js +18 -18
  137. package/SVF-doxygen/html/html/search/classes_e.js +36 -36
  138. package/SVF-doxygen/html/html/search/classes_f.js +25 -25
  139. package/SVF-doxygen/html/html/search/defines_0.js +3 -3
  140. package/SVF-doxygen/html/html/search/defines_1.js +2 -2
  141. package/SVF-doxygen/html/html/search/defines_2.js +30 -30
  142. package/SVF-doxygen/html/html/search/defines_3.js +21 -21
  143. package/SVF-doxygen/html/html/search/defines_4.js +2 -2
  144. package/SVF-doxygen/html/html/search/defines_5.js +4 -4
  145. package/SVF-doxygen/html/html/search/defines_6.js +2 -2
  146. package/SVF-doxygen/html/html/search/defines_7.js +5 -5
  147. package/SVF-doxygen/html/html/search/defines_8.js +11 -11
  148. package/SVF-doxygen/html/html/search/defines_9.js +9 -9
  149. package/SVF-doxygen/html/html/search/defines_a.js +2 -2
  150. package/SVF-doxygen/html/html/search/defines_b.js +1 -1
  151. package/SVF-doxygen/html/html/search/defines_c.js +3 -3
  152. package/SVF-doxygen/html/html/search/defines_d.js +2 -2
  153. package/SVF-doxygen/html/html/search/defines_e.js +7 -7
  154. package/SVF-doxygen/html/html/search/defines_f.js +3 -3
  155. package/SVF-doxygen/html/html/search/enums_0.js +3 -3
  156. package/SVF-doxygen/html/html/search/enums_1.js +2 -2
  157. package/SVF-doxygen/html/html/search/enums_10.js +1 -1
  158. package/SVF-doxygen/html/html/search/enums_11.js +1 -1
  159. package/SVF-doxygen/html/html/search/enums_2.js +8 -8
  160. package/SVF-doxygen/html/html/search/enums_3.js +1 -1
  161. package/SVF-doxygen/html/html/search/enums_4.js +3 -3
  162. package/SVF-doxygen/html/html/search/enums_5.js +1 -1
  163. package/SVF-doxygen/html/html/search/enums_6.js +2 -2
  164. package/SVF-doxygen/html/html/search/enums_7.js +2 -2
  165. package/SVF-doxygen/html/html/search/enums_8.js +4 -4
  166. package/SVF-doxygen/html/html/search/enums_9.js +1 -1
  167. package/SVF-doxygen/html/html/search/enums_a.js +1 -1
  168. package/SVF-doxygen/html/html/search/enums_b.js +7 -7
  169. package/SVF-doxygen/html/html/search/enums_c.js +1 -1
  170. package/SVF-doxygen/html/html/search/enums_d.js +4 -4
  171. package/SVF-doxygen/html/html/search/enums_e.js +2 -2
  172. package/SVF-doxygen/html/html/search/enums_f.js +4 -4
  173. package/SVF-doxygen/html/html/search/enumvalues_0.js +14 -14
  174. package/SVF-doxygen/html/html/search/enumvalues_1.js +14 -14
  175. package/SVF-doxygen/html/html/search/enumvalues_10.js +35 -35
  176. package/SVF-doxygen/html/html/search/enumvalues_11.js +3 -3
  177. package/SVF-doxygen/html/html/search/enumvalues_12.js +10 -10
  178. package/SVF-doxygen/html/html/search/enumvalues_13.js +1 -1
  179. package/SVF-doxygen/html/html/search/enumvalues_14.js +1 -1
  180. package/SVF-doxygen/html/html/search/enumvalues_15.js +3 -3
  181. package/SVF-doxygen/html/html/search/enumvalues_2.js +36 -36
  182. package/SVF-doxygen/html/html/search/enumvalues_3.js +13 -13
  183. package/SVF-doxygen/html/html/search/enumvalues_4.js +2 -2
  184. package/SVF-doxygen/html/html/search/enumvalues_5.js +47 -47
  185. package/SVF-doxygen/html/html/search/enumvalues_6.js +6 -6
  186. package/SVF-doxygen/html/html/search/enumvalues_7.js +9 -9
  187. package/SVF-doxygen/html/html/search/enumvalues_8.js +23 -23
  188. package/SVF-doxygen/html/html/search/enumvalues_9.js +6 -6
  189. package/SVF-doxygen/html/html/search/enumvalues_a.js +15 -15
  190. package/SVF-doxygen/html/html/search/enumvalues_b.js +11 -11
  191. package/SVF-doxygen/html/html/search/enumvalues_c.js +5 -5
  192. package/SVF-doxygen/html/html/search/enumvalues_d.js +18 -18
  193. package/SVF-doxygen/html/html/search/enumvalues_e.js +9 -9
  194. package/SVF-doxygen/html/html/search/enumvalues_f.js +45 -45
  195. package/SVF-doxygen/html/html/search/files_0.js +13 -13
  196. package/SVF-doxygen/html/html/search/files_1.js +7 -7
  197. package/SVF-doxygen/html/html/search/files_10.js +8 -8
  198. package/SVF-doxygen/html/html/search/files_11.js +8 -8
  199. package/SVF-doxygen/html/html/search/files_12.js +2 -2
  200. package/SVF-doxygen/html/html/search/files_2.js +53 -53
  201. package/SVF-doxygen/html/html/search/files_3.js +14 -14
  202. package/SVF-doxygen/html/html/search/files_4.js +5 -5
  203. package/SVF-doxygen/html/html/search/files_5.js +13 -13
  204. package/SVF-doxygen/html/html/search/files_6.js +9 -9
  205. package/SVF-doxygen/html/html/search/files_7.js +14 -16
  206. package/SVF-doxygen/html/html/search/files_8.js +13 -13
  207. package/SVF-doxygen/html/html/search/files_9.js +18 -18
  208. package/SVF-doxygen/html/html/search/files_a.js +3 -3
  209. package/SVF-doxygen/html/html/search/files_b.js +2 -2
  210. package/SVF-doxygen/html/html/search/files_c.js +20 -20
  211. package/SVF-doxygen/html/html/search/files_d.js +4 -4
  212. package/SVF-doxygen/html/html/search/files_e.js +62 -62
  213. package/SVF-doxygen/html/html/search/files_f.js +8 -8
  214. package/SVF-doxygen/html/html/search/functions_0.js +12 -12
  215. package/SVF-doxygen/html/html/search/functions_1.js +356 -357
  216. package/SVF-doxygen/html/html/search/functions_10.js +140 -140
  217. package/SVF-doxygen/html/html/search/functions_11.js +138 -138
  218. package/SVF-doxygen/html/html/search/functions_12.js +276 -279
  219. package/SVF-doxygen/html/html/search/functions_13.js +58 -58
  220. package/SVF-doxygen/html/html/search/functions_14.js +39 -39
  221. package/SVF-doxygen/html/html/search/functions_15.js +71 -71
  222. package/SVF-doxygen/html/html/search/functions_16.js +32 -32
  223. package/SVF-doxygen/html/html/search/functions_17.js +3 -3
  224. package/SVF-doxygen/html/html/search/functions_18.js +172 -176
  225. package/SVF-doxygen/html/html/search/functions_2.js +86 -86
  226. package/SVF-doxygen/html/html/search/functions_3.js +257 -257
  227. package/SVF-doxygen/html/html/search/functions_4.js +75 -75
  228. package/SVF-doxygen/html/html/search/functions_5.js +53 -53
  229. package/SVF-doxygen/html/html/search/functions_6.js +59 -59
  230. package/SVF-doxygen/html/html/search/functions_7.js +848 -858
  231. package/SVF-doxygen/html/html/search/functions_8.js +146 -147
  232. package/SVF-doxygen/html/html/search/functions_9.js +425 -429
  233. package/SVF-doxygen/html/html/search/functions_a.js +30 -30
  234. package/SVF-doxygen/html/html/search/functions_b.js +2 -2
  235. package/SVF-doxygen/html/html/search/functions_c.js +26 -26
  236. package/SVF-doxygen/html/html/search/functions_d.js +77 -77
  237. package/SVF-doxygen/html/html/search/functions_e.js +35 -35
  238. package/SVF-doxygen/html/html/search/functions_f.js +56 -56
  239. package/SVF-doxygen/html/html/search/namespaces_0.js +1 -1
  240. package/SVF-doxygen/html/html/search/namespaces_1.js +7 -7
  241. package/SVF-doxygen/html/html/search/related_0.js +2 -2
  242. package/SVF-doxygen/html/html/search/related_1.js +2 -2
  243. package/SVF-doxygen/html/html/search/related_2.js +2 -2
  244. package/SVF-doxygen/html/html/search/related_3.js +2 -2
  245. package/SVF-doxygen/html/html/search/related_4.js +2 -2
  246. package/SVF-doxygen/html/html/search/related_5.js +1 -1
  247. package/SVF-doxygen/html/html/search/related_6.js +2 -2
  248. package/SVF-doxygen/html/html/search/related_7.js +4 -4
  249. package/SVF-doxygen/html/html/search/related_8.js +2 -2
  250. package/SVF-doxygen/html/html/search/related_9.js +4 -4
  251. package/SVF-doxygen/html/html/search/related_a.js +19 -19
  252. package/SVF-doxygen/html/html/search/related_b.js +4 -4
  253. package/SVF-doxygen/html/html/search/related_c.js +1 -1
  254. package/SVF-doxygen/html/html/search/related_d.js +11 -11
  255. package/SVF-doxygen/html/html/search/related_e.js +2 -2
  256. package/SVF-doxygen/html/html/search/related_f.js +2 -2
  257. package/SVF-doxygen/html/html/search/typedefs_0.js +18 -18
  258. package/SVF-doxygen/html/html/search/typedefs_1.js +26 -26
  259. package/SVF-doxygen/html/html/search/typedefs_10.js +61 -63
  260. package/SVF-doxygen/html/html/search/typedefs_11.js +13 -13
  261. package/SVF-doxygen/html/html/search/typedefs_12.js +11 -11
  262. package/SVF-doxygen/html/html/search/typedefs_13.js +35 -35
  263. package/SVF-doxygen/html/html/search/typedefs_14.js +8 -8
  264. package/SVF-doxygen/html/html/search/typedefs_2.js +129 -128
  265. package/SVF-doxygen/html/html/search/typedefs_3.js +39 -39
  266. package/SVF-doxygen/html/html/search/typedefs_4.js +17 -17
  267. package/SVF-doxygen/html/html/search/typedefs_5.js +41 -41
  268. package/SVF-doxygen/html/html/search/typedefs_6.js +55 -58
  269. package/SVF-doxygen/html/html/search/typedefs_7.js +42 -46
  270. package/SVF-doxygen/html/html/search/typedefs_8.js +1 -1
  271. package/SVF-doxygen/html/html/search/typedefs_9.js +6 -6
  272. package/SVF-doxygen/html/html/search/typedefs_a.js +29 -29
  273. package/SVF-doxygen/html/html/search/typedefs_b.js +29 -29
  274. package/SVF-doxygen/html/html/search/typedefs_c.js +41 -41
  275. package/SVF-doxygen/html/html/search/typedefs_d.js +15 -15
  276. package/SVF-doxygen/html/html/search/typedefs_e.js +52 -52
  277. package/SVF-doxygen/html/html/search/typedefs_f.js +14 -14
  278. package/SVF-doxygen/html/html/search/variables_0.js +152 -162
  279. package/SVF-doxygen/html/html/search/variables_1.js +75 -75
  280. package/SVF-doxygen/html/html/search/variables_10.js +97 -97
  281. package/SVF-doxygen/html/html/search/variables_11.js +46 -46
  282. package/SVF-doxygen/html/html/search/variables_12.js +92 -92
  283. package/SVF-doxygen/html/html/search/variables_13.js +75 -75
  284. package/SVF-doxygen/html/html/search/variables_14.js +14 -14
  285. package/SVF-doxygen/html/html/search/variables_15.js +48 -48
  286. package/SVF-doxygen/html/html/search/variables_16.js +9 -9
  287. package/SVF-doxygen/html/html/search/variables_17.js +1 -1
  288. package/SVF-doxygen/html/html/search/variables_18.js +2 -2
  289. package/SVF-doxygen/html/html/search/variables_2.js +37 -37
  290. package/SVF-doxygen/html/html/search/variables_3.js +142 -142
  291. package/SVF-doxygen/html/html/search/variables_4.js +55 -55
  292. package/SVF-doxygen/html/html/search/variables_5.js +39 -39
  293. package/SVF-doxygen/html/html/search/variables_6.js +66 -66
  294. package/SVF-doxygen/html/html/search/variables_7.js +33 -33
  295. package/SVF-doxygen/html/html/search/variables_8.js +7 -7
  296. package/SVF-doxygen/html/html/search/variables_9.js +77 -77
  297. package/SVF-doxygen/html/html/search/variables_a.js +4 -4
  298. package/SVF-doxygen/html/html/search/variables_b.js +10 -10
  299. package/SVF-doxygen/html/html/search/variables_c.js +45 -45
  300. package/SVF-doxygen/html/html/search/variables_d.js +56 -56
  301. package/SVF-doxygen/html/html/search/variables_e.js +123 -123
  302. package/SVF-doxygen/html/html/search/variables_f.js +30 -30
  303. package/SVF-doxygen/html/html/structSVF_1_1CFBasicBlockEdge_1_1equalCFBBEdge-members.html +84 -0
  304. package/SVF-doxygen/html/html/structSVF_1_1CFBasicBlockEdge_1_1equalCFBBEdge.html +144 -0
  305. package/SVF-doxygen/html/html/structSVF_1_1DOTGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +40 -40
  306. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01Inverse_3_01SVF_1_1CFBasicBlockNode_01_5_01_4_01_4.html +1 -1
  307. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockGraph_01_5_01_4.html +2 -2
  308. package/SVF-doxygen/html/html/structSVF_1_1GenericGraphTraits_3_01SVF_1_1CFBasicBlockNode_01_5_01_4.html +1 -1
  309. package/package.json +1 -1
  310. package/svf/include/Graphs/CFBasicBlockG.h +342 -32
  311. package/svf/include/Util/ExtAPI.h +2 -2
  312. package/svf/lib/Graphs/CFBasicBlockG.cpp +97 -36
  313. package/svf/lib/Util/ExtAPI.cpp +14 -15
  314. package/svf/include/Graphs/ICFGWrapper.h +0 -728
  315. 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
  {
@@ -38,7 +38,7 @@
38
38
 
39
39
  /// For a more detailed explanation of how External APIs are handled in SVF, please refer to the SVF Wiki: https://github.com/SVF-tools/SVF/wiki/Handling-External-APIs-with-extapi.c
40
40
 
41
- #define DEFUALT_EXTAPI_BC_PATH "/svf-llvm/extapi.bc" // Default path to extapi.bc through the SVF build method(e.g. source ./build.sh)
41
+ #define DEFAULT_EXTAPI_BC_PATH "/svf-llvm/extapi.bc" // Default path to extapi.bc through the SVF build method(e.g. source ./build.sh)
42
42
 
43
43
  namespace SVF
44
44
  {
@@ -61,7 +61,7 @@ public:
61
61
  static void destory();
62
62
 
63
63
  // Set extapi.bc file path
64
- static void setExtBcPath(const std::string& path);
64
+ static bool setExtBcPath(const std::string& path);
65
65
 
66
66
  // Get extapi.bc file path
67
67
  std::string getExtBcPath();
@@ -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
  }